Gắn nhãn dữ liệu phân đoạn ngữ nghĩa và đào tạo mô hình bằng Amazon SageMaker

Nút nguồn: 1551223

Trong thị giác máy tính, phân đoạn ngữ nghĩa là nhiệm vụ phân loại mọi pixel trong một hình ảnh với một lớp từ một tập hợp nhãn đã biết sao cho các pixel có cùng nhãn chia sẻ các đặc điểm nhất định. Nó tạo ra một mặt nạ phân đoạn của các hình ảnh đầu vào. Ví dụ: các hình ảnh sau đây hiển thị mặt nạ phân đoạn của cat nhãn.

Trong tháng mười một 2018, Amazon SageMaker công bố sự ra mắt của thuật toán phân đoạn ngữ nghĩa SageMaker. Với thuật toán này, bạn có thể huấn luyện các mô hình của mình bằng tập dữ liệu công khai hoặc tập dữ liệu của riêng bạn. Tập dữ liệu phân đoạn hình ảnh phổ biến bao gồm tập dữ liệu Đối tượng chung trong ngữ cảnh (COCO) và Lớp đối tượng trực quan PASCAL (PASCAL VOC), nhưng các lớp nhãn của chúng bị giới hạn và bạn có thể muốn đào tạo mô hình trên các đối tượng mục tiêu không được bao gồm trong bộ dữ liệu công khai. Trong trường hợp này, bạn có thể sử dụng Sự thật về mặt đất của Amazon SageMaker để gắn nhãn tập dữ liệu của riêng bạn.

Trong bài đăng này, tôi chứng minh các giải pháp sau:

  • Sử dụng Ground Truth để gắn nhãn tập dữ liệu phân đoạn ngữ nghĩa
  • Chuyển đổi kết quả từ Ground Truth sang định dạng đầu vào bắt buộc cho thuật toán phân đoạn ngữ nghĩa tích hợp sẵn của SageMaker
  • Sử dụng thuật toán phân đoạn ngữ nghĩa để đào tạo mô hình và thực hiện suy luận

Ghi nhãn dữ liệu phân đoạn ngữ nghĩa

Để xây dựng mô hình học máy cho phân đoạn ngữ nghĩa, chúng ta cần gắn nhãn tập dữ liệu ở cấp pixel. Ground Truth cung cấp cho bạn tùy chọn sử dụng các trình chú thích của con người thông qua Amazon Mechanical Turk, nhà cung cấp bên thứ ba, hoặc lực lượng lao động tư nhân của bạn. Để tìm hiểu thêm về lực lượng lao động, hãy tham khảo Tạo và quản lý lực lượng lao động. Nếu bạn không muốn tự mình quản lý lực lượng lao động dán nhãn, Amazon SageMaker Ground Truth Plus là một lựa chọn tuyệt vời khác như một dịch vụ ghi nhãn dữ liệu chìa khóa trao tay mới cho phép bạn tạo bộ dữ liệu đào tạo chất lượng cao một cách nhanh chóng và giảm chi phí lên đến 40%. Đối với bài đăng này, tôi chỉ cho bạn cách gắn nhãn tập dữ liệu theo cách thủ công với tính năng tự động phân đoạn Ground Truth và gắn nhãn nguồn lực cộng đồng với lực lượng lao động Mechanical Turk.

Ghi nhãn thủ công với Ground Truth

Vào tháng 2019 năm XNUMX, Ground Truth đã thêm tính năng tự động phân đoạn vào giao diện người dùng gắn nhãn phân đoạn ngữ nghĩa để tăng thông lượng gắn nhãn và cải thiện độ chính xác. Để biết thêm thông tin, hãy tham khảo Tự động phân đoạn các đối tượng khi thực hiện gắn nhãn phân đoạn ngữ nghĩa với Amazon SageMaker Ground Truth. Với tính năng mới này, bạn có thể đẩy nhanh quá trình gắn nhãn của mình trên các tác vụ phân đoạn. Thay vì vẽ một đa giác vừa khít hoặc sử dụng công cụ cọ vẽ để chụp một đối tượng trong hình ảnh, bạn chỉ vẽ bốn điểm: ở trên cùng, dưới cùng, ngoài cùng bên trái và ngoài cùng bên phải của đối tượng. Ground Truth lấy bốn điểm này làm đầu vào và sử dụng thuật toán Deep Extreme Cut (DEXTR) để tạo ra một mặt nạ vừa khít xung quanh đối tượng. Để có hướng dẫn sử dụng Ground Truth để gắn nhãn phân đoạn ngữ nghĩa hình ảnh, hãy tham khảo Phân đoạn ngữ nghĩa hình ảnh. Sau đây là một ví dụ về cách công cụ phân đoạn tự động tạo mặt nạ phân đoạn tự động sau khi bạn chọn bốn điểm cực trị của một đối tượng.

Dán nhãn nguồn lực cộng đồng với lực lượng lao động Cơ khí Turk

Nếu bạn có một tập dữ liệu lớn và bạn không muốn tự mình gắn nhãn hàng trăm hoặc hàng nghìn hình ảnh theo cách thủ công, bạn có thể sử dụng Mechanical Turk, cung cấp lực lượng lao động theo yêu cầu, có thể mở rộng, để hoàn thành các công việc mà con người có thể làm tốt hơn máy tính. Phần mềm Mechanical Turk chính thức hóa các lời mời làm việc cho hàng nghìn công nhân sẵn sàng làm công việc từng phần một cách thuận tiện cho họ. Phần mềm cũng truy xuất công việc đã thực hiện và biên dịch nó cho bạn, người yêu cầu, người trả tiền cho công nhân để có công việc đạt yêu cầu (chỉ). Để bắt đầu với Mechanical Turk, hãy tham khảo Giới thiệu về Amazon Mechanical Turk.

Tạo công việc ghi nhãn

Sau đây là một ví dụ về công việc gắn nhãn Mechanical Turk cho tập dữ liệu rùa biển. Bộ dữ liệu rùa biển lấy từ cuộc thi Kaggle Nhận diện khuôn mặt rùa biểnvà tôi đã chọn 300 hình ảnh của tập dữ liệu cho mục đích trình diễn. Rùa biển không phải là lớp phổ biến trong các tập dữ liệu công cộng nên nó có thể đại diện cho một tình huống yêu cầu dán nhãn cho một tập dữ liệu lớn.

  1. Trên bảng điều khiển SageMaker, chọn Công việc gắn nhãn trong khung điều hướng.
  2. Chọn Tạo công việc dán nhãn.
  3. Nhập tên cho công việc của bạn.
  4. Trong Thiết lập dữ liệu đầu vào, lựa chọn Thiết lập dữ liệu tự động.
    Điều này tạo ra một bản kê khai dữ liệu đầu vào.
  5. Trong Vị trí S3 cho các tập dữ liệu đầu vào, nhập đường dẫn cho tập dữ liệu.
  6. Trong Nhiệm vụ, chọn Hình ảnh.
  7. Trong Lựa chọn công việc, lựa chọn Phân đoạn ngữ nghĩa.
  8. Trong Các loại công nhân, lựa chọn Amazon Mechanical Turk.
  9. Định cấu hình cài đặt của bạn cho thời gian chờ tác vụ, thời gian hết hạn tác vụ và giá mỗi tác vụ.
  10. Thêm nhãn (cho bài đăng này, sea turtle), và cung cấp hướng dẫn ghi nhãn.
  11. Chọn Tạo.

Sau khi thiết lập công việc gắn nhãn, bạn có thể kiểm tra tiến trình gắn nhãn trên bảng điều khiển SageMaker. Khi nó được đánh dấu là hoàn thành, bạn có thể chọn công việc để kiểm tra kết quả và sử dụng chúng cho các bước tiếp theo.

Chuyển đổi tập dữ liệu

Sau khi nhận được kết quả từ Ground Truth, bạn có thể sử dụng các thuật toán tích hợp sẵn của SageMaker để đào tạo mô hình trên tập dữ liệu này. Đầu tiên, bạn cần chuẩn bị tập dữ liệu được gắn nhãn làm giao diện đầu vào được yêu cầu cho thuật toán phân đoạn ngữ nghĩa SageMaker.

Các kênh dữ liệu đầu vào được yêu cầu

Phân đoạn ngữ nghĩa SageMaker hy vọng tập dữ liệu đào tạo của bạn sẽ được lưu trữ trên Dịch vụ lưu trữ đơn giản của Amazon (Amazon S3). Tập dữ liệu trong Amazon S3 dự kiến ​​sẽ được trình bày trong hai kênh, một kênh dành cho train và một cho validation, sử dụng bốn thư mục, hai cho hình ảnh và hai cho chú thích. Chú thích được mong đợi là hình ảnh PNG không nén. Tập dữ liệu cũng có thể có một bản đồ nhãn mô tả cách các ánh xạ chú thích được thiết lập. Nếu không, thuật toán sử dụng giá trị mặc định. Đối với suy luận, một điểm cuối chấp nhận hình ảnh có image/jpeg loại nội dung. Sau đây là cấu trúc bắt buộc của các kênh dữ liệu:

s3://bucket_name |- train | - image1.jpg | - image2.jpg |- validation | - image3.jpg | - image4.jpg |- train_annotation | - image1.png | - image2.png |- validation_annotation | - image3.png | - image4.png |- label_map | - train_label_map.json | - validation_label_map.json

Mọi hình ảnh JPG trong thư mục tàu và xác thực có một hình ảnh nhãn PNG tương ứng có cùng tên trong train_annotationvalidation_annotation các thư mục. Quy ước đặt tên này giúp thuật toán liên kết một nhãn với hình ảnh tương ứng của nó trong quá trình huấn luyện. Tàu, train_annotation, xác thực và validation_annotation các kênh là bắt buộc. Các chú thích là hình ảnh PNG một kênh. Định dạng hoạt động miễn là siêu dữ liệu (chế độ) trong hình ảnh giúp thuật toán đọc hình ảnh chú thích thành một số nguyên không dấu 8 bit kênh đơn.

Đầu ra từ công việc ghi nhãn Sự thật Mặt đất

Kết quả đầu ra được tạo từ công việc gắn nhãn Ground Truth có cấu trúc thư mục sau:

s3://turtle2022/labelturtles/ |- activelearning |- annotation-tool |- annotations | - consolidated-annotation | - consolidation-request | - consolidation-response | - output | -0_2022-02-10T17:40:03.294994.png | -0_2022-02-10T17:41:04.530266.png | - intermediate | - worker-response |- intermediate |- manifests | - output | - output.manifest

Các mặt nạ phân đoạn được lưu trong s3://turtle2022/labelturtles/annotations/consolidated-annotation/output. Mỗi hình ảnh chú thích là một tệp .png được đặt tên theo chỉ mục của hình ảnh nguồn và thời gian hoàn thành việc gắn nhãn hình ảnh này. Ví dụ: sau đây là hình ảnh nguồn (Image_1.jpg) và mặt nạ phân đoạn của nó được tạo bởi lực lượng lao động Mechanical Turk (0_2022-02-10T17: 41: 04.724225.png). Lưu ý rằng chỉ số của mặt nạ khác với số trong tên ảnh nguồn.

Tệp kê khai đầu ra từ công việc gắn nhãn nằm trong /manifests/output/output.manifest tập tin. Đó là một tệp JSON và mỗi dòng ghi lại một ánh xạ giữa hình ảnh nguồn và nhãn của nó và siêu dữ liệu khác. Dòng JSON sau ghi lại một ánh xạ giữa hình ảnh nguồn được hiển thị và chú thích của nó:

{"source-ref":"s3://turtle2022/Image_1.jpg","labelturtles-ref":"s3://turtle2022/labelturtles/annotations/consolidated-annotation/output/0_2022-02-10T17:41:04.724225.png","labelturtles-ref-metadata":{"internal-color-map":{"0":{"class-name":"BACKGROUND","hex-color":"#ffffff","confidence":0.25988},"1":{"class-name":"Turtle","hex-color":"#2ca02c","confidence":0.25988}},"type":"groundtruth/semantic-segmentation","human-annotated":"yes","creation-date":"2022-02-10T17:41:04.801793","job-name":"labeling-job/labelturtles"}}

Hình ảnh nguồn được gọi là Image_1.jpg và tên của chú thích là 0_2022-02-10T17: 41: 04.724225.png. Để chuẩn bị dữ liệu dưới dạng các định dạng kênh dữ liệu yêu cầu của thuật toán phân đoạn ngữ nghĩa SageMaker, chúng ta cần thay đổi tên chú thích để nó có cùng tên với các ảnh JPG nguồn. Và chúng ta cũng cần chia tập dữ liệu thành trainvalidation thư mục cho hình ảnh nguồn và các chú thích.

Chuyển đổi đầu ra từ công việc ghi nhãn Sự thật về mặt đất thành định dạng đầu vào được yêu cầu

Để chuyển đổi đầu ra, hãy hoàn thành các bước sau:

  1. Tải xuống tất cả các tệp từ công việc gắn nhãn từ Amazon S3 vào một thư mục cục bộ:
    !aws s3 cp s3://turtle2022/ Seaturtles --recursive

  2. Đọc tệp kê khai và thay đổi tên của chú thích thành các tên giống như các hình ảnh nguồn:
    import os
    import re label_job='labelturtles'
    manifest_path=dir_name+'/'+label_job+'/'+'manifests/output/output.manifest' file = open(manifest_path, "r") txt=file.readlines()
    output_path=dir_name+'/'+label_job+'/'+'annotations/consolidated-annotation/output'
    S3_name='turtle2022/'
    im_list=[]
    for i in range(len(txt)): string = txt[i] try: im_name = re.search(S3_name+'(.+)'+'.jpg', string).group(1) print(im_name) im_png=im_name+'.png' im_list.append(im_name) annotation_name = re.search('output/(.+?)"', string).group(1) os.rename(annotation_name, im_png) except AttributeError: pass

  3. Tách tập dữ liệu đào tạo và xác thực:
    import numpy as np
    from random import sample # Prints list of random items of given length
    train_num=len(im_list)*0.8
    test_num=len(im_list)*0.2
    train_name=sample(im_list,int(train_num))
    test_name = list(set(im_list) - set(train_name))

  4. Tạo một thư mục ở định dạng bắt buộc cho các kênh dữ liệu thuật toán phân đoạn ngữ nghĩa:
    os.chdir('./semantic_segmentation_pascalvoc_2022-01-11')
    os.mkdir('train')
    os.mkdir('validation')
    os.mkdir('train_annotation')
    os.mkdir('validation_annotation')

  5. Di chuyển hình ảnh đoàn tàu và xác thực và chú thích của chúng vào các thư mục đã tạo.
    1. Đối với hình ảnh, hãy sử dụng mã sau:
      for i in range(len(train_name)): train_im=train_name[i]+'.jpg' train_im_path=dir_name+'/'+train_im train_new_path='train/'+train_im shutil.move(train_im_path,train_new_path) train_annotation=train_name[i]+'.png' train_annotation_path=dir_name+'/labelturtles/annotations/consolidated-annotation/output/'+train_annotation train_annotation_new_path='train_annotation/'+train_annotation shutil.move(train_annotation_path,train_annotation_new_path)

    2. Đối với chú thích, hãy sử dụng mã sau:
      for i in range(len(test_name)): val_im=test_name[i]+'.jpg' val_im_path=dir_name+'/'+val_im val_new_path='validation/'+val_im shutil.move(val_im_path,val_new_path) val_annotation=test_name[i]+'.png' val_annotation_path=dir_name+'/labelturtles/annotations/consolidated-annotation/output/'+val_annotation val_annotation_new_path='validation_annotationT/'+val_annotation shutil.move(val_annotation_path,val_annotation_new_path)

  6. Tải lên tập dữ liệu đào tạo và xác thực cũng như tập dữ liệu chú thích của chúng lên Amazon S3:
    !aws s3 cp train s3://turtle2022/train/ --recursive
    !aws s3 cp train_annotation s3://turtle2022/train_annotation/ --recursive
    !aws s3 cp validation s3://turtle2022/validation/ --recursive
    !aws s3 cp validation_annotation s3://turtle2022/validation_annotation/ --recursive

Đào tạo mô hình phân đoạn ngữ nghĩa của SageMaker

Trong phần này, chúng tôi hướng dẫn các bước để đào tạo mô hình phân đoạn ngữ nghĩa của bạn.

Làm theo sổ tay mẫu và thiết lập kênh dữ liệu

Bạn có thể làm theo hướng dẫn trong Thuật toán Phân đoạn ngữ nghĩa hiện đã có trong Amazon SageMaker để triển khai thuật toán phân đoạn ngữ nghĩa cho tập dữ liệu được gắn nhãn của bạn. Mẫu này máy tính xách tay hiển thị một ví dụ end-to-end giới thiệu thuật toán. Trong sổ tay này, bạn học cách đào tạo và lưu trữ mô hình phân đoạn ngữ nghĩa bằng cách sử dụng mạng tích hợp đầy đủ (FCN) thuật toán sử dụng Bộ dữ liệu Pascal VOC cho tập huấn. Bởi vì tôi không có kế hoạch đào tạo một mô hình từ bộ dữ liệu Pascal VOC, tôi đã bỏ qua Bước 3 (chuẩn bị dữ liệu) trong sổ ghi chép này. Thay vào đó, tôi trực tiếp tạo train_channel, train_annotation_channe, validation_channelvalidation_annotation_channel bằng cách sử dụng các vị trí S3 nơi tôi đã lưu trữ hình ảnh và chú thích của mình:

Train_channel=’s3://turtle2022/train’
train_annotation_channel=’s3://turtle2022/train_annotation’
validation_channel=’s3://turtle2022/validation’
validation_annotation_channel=’s3://turtle2022/validation_annotation’

Điều chỉnh siêu tham số cho tập dữ liệu của riêng bạn trong công cụ ước tính SageMaker

Tôi đã theo dõi sổ ghi chép và tạo một đối tượng ước tính SageMaker (ss_estimator) để đào tạo thuật toán phân đoạn của tôi. Một điều chúng tôi cần tùy chỉnh cho tập dữ liệu mới là ss_estimator.set_hyperparameters: chúng ta cần thay đổi num_classes=21 đến num_classes=2 (turtlebackground), và tôi cũng đã thay đổi epochs=10 đến epochs=30 bởi vì 10 chỉ dành cho mục đích demo. Sau đó, tôi sử dụng phiên bản p3.2xlarge để đào tạo mô hình bằng cách thiết lập instance_type="ml.p3.2xlarge". Khóa đào tạo hoàn thành trong 8 phút. Tốt nhất MIOU (Giao điểm trung bình qua Liên minh) là 0.846 đạt được ở kỷ nguyên 11 với pix_acc (phần trăm pixel trong hình ảnh của bạn được phân loại chính xác) là 0.925, đây là một kết quả khá tốt cho tập dữ liệu nhỏ này.

Kết quả suy luận mô hình

Tôi đã lưu trữ mô hình trên một phiên bản ml.c5.xlarge chi phí thấp:

training_job_name = 'ss-notebook-demo-2022-02-12-03-37-27-151'
ss_estimator = sagemaker.estimator.Estimator.attach(training_job_name)
ss_predictor = ss_estimator.deploy(initial_instance_count=1, instance_type="ml.c5.xlarge")

Cuối cùng, tôi đã chuẩn bị một bộ thử nghiệm gồm 10 hình ảnh con rùa để xem kết quả suy luận của mô hình phân đoạn được đào tạo:

import os path = "testturtle/"
img_path_list=[]
files = os.listdir(path) for file in files: if file.endswith(('.jpg', '.png', 'jpeg')): img_path = path + file img_path_list.append(img_path) colnum=5
fig, axs = plt.subplots(2, colnum, figsize=(20, 10)) for i in range(len(img_path_list)): print(img_path_list[i]) img = mpimg.imread(img_path_list[i]) with open(img_path_list[i], "rb") as imfile: imbytes = imfile.read() cls_mask = ss_predictor.predict(imbytes) axs[int(i/colnum),i%colnum].imshow(img, cmap='gray') axs[int(i/colnum),i%colnum].imshow(np.ma.masked_equal(cls_mask,0), cmap='jet', alpha=0.8) plt.show()

Các hình ảnh sau đây cho thấy kết quả.

Mặt nạ phân đoạn của rùa biển trông chính xác và tôi hài lòng với kết quả này được đào tạo trên tập dữ liệu 300 hình ảnh được gắn nhãn bởi các công nhân của Mechanical Turk. Bạn cũng có thể khám phá các mạng khả dụng khác như mạng phân tích cú pháp kim tự tháp (PSP) or DeepLab-V3 trong sổ tay mẫu với tập dữ liệu của bạn.

Làm sạch

Xóa điểm cuối khi bạn đã hoàn thành việc đó để tránh phát sinh chi phí tiếp tục:

ss_predictor.delete_endpoint()

Kết luận

Trong bài đăng này, tôi đã chỉ ra cách tùy chỉnh việc ghi nhãn dữ liệu phân đoạn ngữ nghĩa và đào tạo mô hình bằng cách sử dụng SageMaker. Trước tiên, bạn có thể thiết lập công việc gắn nhãn bằng công cụ tự động phân đoạn hoặc sử dụng lực lượng lao động Cơ khí (cũng như các tùy chọn khác). Nếu bạn có hơn 5,000 đối tượng, bạn cũng có thể sử dụng tính năng ghi nhãn dữ liệu tự động. Sau đó, bạn chuyển đổi các kết quả đầu ra từ công việc gắn nhãn Sự thật Mặt đất của mình sang các định dạng đầu vào bắt buộc cho đào tạo phân đoạn ngữ nghĩa tích hợp sẵn của SageMaker. Sau đó, bạn có thể sử dụng một phiên bản máy tính tăng tốc (chẳng hạn như p2 hoặc p3) để đào tạo mô hình phân đoạn ngữ nghĩa với những điều sau máy tính xách tay và triển khai mô hình đến một phiên bản hiệu quả hơn về chi phí (chẳng hạn như ml.c5.xlarge). Cuối cùng, bạn có thể xem lại kết quả suy luận trên tập dữ liệu thử nghiệm của mình bằng một vài dòng mã.

Bắt đầu với phân đoạn ngữ nghĩa SageMaker ghi nhãn dữ liệuđào tạo người mẫu với bộ dữ liệu yêu thích của bạn!


Lưu ý

Kara Yang là Nhà khoa học dữ liệu trong Dịch vụ chuyên nghiệp của AWS. Cô ấy đam mê giúp khách hàng đạt được mục tiêu kinh doanh của họ bằng các dịch vụ đám mây AWS. Cô đã giúp các tổ chức xây dựng các giải pháp ML trên nhiều ngành như sản xuất, ô tô, môi trường bền vững và hàng không vũ trụ.

Dấu thời gian:

Thêm từ Học máy AWS