AmazonSageMakerを使用したセマンティックセグメンテーションデータのラベリングとモデルトレーニング

ソースノード: 1551223

コンピュータビジョンでは、セマンティックセグメンテーションは、同じラベルを持つピクセルが特定の特性を共有するように、既知のラベルセットからのクラスで画像内のすべてのピクセルを分類するタスクです。 入力画像のセグメンテーションマスクを生成します。 たとえば、次の画像は、 cat ラベル。

11月2018では、 アマゾンセージメーカー SageMakerセマンティックセグメンテーションアルゴリズムの立ち上げを発表しました。 このアルゴリズムを使用すると、パブリックデータセットまたは独自のデータセットを使用してモデルをトレーニングできます。 人気のある画像セグメンテーションデータセットには、Common Objects in Context(COCO)データセットとPASCAL Visual Object Classes(PASCAL VOC)が含まれますが、それらのラベルのクラスは制限されているため、公開データセット。 この場合、あなたは使用することができます Amazon SageMakerグラウンドトゥルース 独自のデータセットにラベルを付けます。

この投稿では、次のソリューションを示します。

  • GroundTruthを使用してセマンティックセグメンテーションデータセットにラベルを付ける
  • GroundTruthからの結果をSageMakerの組み込みセマンティックセグメンテーションアルゴリズムに必要な入力形式に変換する
  • セマンティックセグメンテーションアルゴリズムを使用してモデルをトレーニングし、推論を実行する

セマンティックセグメンテーションデータラベリング

セマンティックセグメンテーションの機械学習モデルを構築するには、データセットにピクセルレベルでラベルを付ける必要があります。 Ground Truthは、人間のアノテーターを使用するオプションを提供します Amazon Mechanical Turk、サードパーティベンダー、またはあなた自身の民間労働力。 労働力の詳細については、を参照してください。 労働力の作成と管理。 ラベリングの労働力を自分で管理したくない場合は、 Amazon SageMaker グラウンド トゥルース プラス は、高品質のトレーニングデータセットをすばやく作成し、コストを最大40%削減できる、新しいターンキーデータラベリングサービスとしてのもうXNUMXつの優れたオプションです。 この投稿では、Ground Truthの自動セグメント機能を使用してデータセットに手動でラベルを付け、MechanicalTurkの従業員を使用してクラウドソーシングにラベルを付ける方法を紹介します。

GroundTruthによる手動ラベル付け

2019年XNUMX月、Ground Truthは、セマンティックセグメンテーションラベリングユーザーインターフェースに自動セグメンテーション機能を追加して、ラベリングスループットを向上させ、精度を向上させました。 詳細については、を参照してください。 Amazon SageMakerGroundTruthでセマンティックセグメンテーションラベリングを実行する際のオブジェクトの自動セグメンテーション。 この新機能を使用すると、セグメンテーションタスクのラベル付けプロセスを高速化できます。 ぴったりとフィットするポリゴンを描画したり、ブラシツールを使用して画像内のオブジェクトをキャプチャしたりする代わりに、オブジェクトの最上部、最下部、左端、右端のXNUMXつのポイントのみを描画します。 Ground Truthは、これらのXNUMXつのポイントを入力として受け取り、Deep Extreme Cut(DEXTR)アルゴリズムを使用して、オブジェクトの周囲にぴったりとフィットするマスクを生成します。 画像のセマンティックセグメンテーションラベリングにGroundTruthを使用するチュートリアルについては、以下を参照してください。 画像セマンティックセグメンテーション。 以下は、オブジェクトのXNUMXつの極値点を選択した後、自動セグメンテーションツールがセグメンテーションマスクを自動的に生成する方法の例です。

MechanicalTurkの労働力によるクラウドソーシングのラベリング

大規模なデータセットがあり、数百または数千の画像に手動でラベルを付けたくない場合は、Mechanical Turkを使用できます。MechanicalTurkは、オンデマンドでスケーラブルな人間の労働力を提供し、人間がコンピューターよりも優れた仕事を完了できるようにします。 Mechanical Turkソフトウェアは、都合の良いときに断片的な仕事をしたいと思っている何千人もの労働者への求人を形式化します。 ソフトウェアはまた、実行された作業を取得し、それをコンパイルします。要求者は、満足のいく作業に対して労働者に支払います(のみ)。 Mechanical Turkの使用を開始するには、以下を参照してください。 AmazonMechanicalTurkの紹介.

ラベリングジョブを作成する

以下は、ウミガメのデータセットに対するMechanicalTurkのラベル付けジョブの例です。 ウミガメのデータセットはKaggleコンテストのものです ウミガメの顔検出、およびデモンストレーションの目的でデータセットの300枚の画像を選択しました。 ウミガメは公開データセットでは一般的なクラスではないため、大規模なデータセットにラベルを付ける必要がある状況を表すことができます。

  1. SageMakerコンソールで、 ラベル付けジョブ ナビゲーションペインに表示されます。
  2. 選択する ラベル付けジョブを作成する.
  3. 仕事の名前を入力してください。
  4. 入力データの設定選択 自動データ設定.
    これにより、入力データのマニフェストが生成されます。
  5. 入力データセットのS3の場所、データセットのパスを入力します。
  6. タスクカテゴリ、選択する 画像.
  7. タスクの選択選択 セマンティックセグメンテーション.
  8. 労働者のタイプ選択 Amazon Mechanical Turk.
  9. タスクのタイムアウト、タスクの有効期限、およびタスクごとの価格の設定を構成します。
  10. ラベルを追加します(この投稿では、 sea turtle)、およびラベル付けの指示を提供します。
  11. 選択する 創造する.

ラベリングジョブを設定した後、SageMakerコンソールでラベリングの進行状況を確認できます。 完了としてマークされたら、ジョブを選択して結果を確認し、次のステップに使用できます。

データセット変換

Ground Truthから出力を取得したら、SageMakerの組み込みアルゴリズムを使用して、このデータセットでモデルをトレーニングできます。 まず、SageMakerセマンティックセグメンテーションアルゴリズムの要求された入力インターフェイスとして、ラベル付けされたデータセットを準備する必要があります。

要求された入力データチャネル

SageMakerセマンティックセグメンテーションは、トレーニングデータセットがに保存されることを期待しています Amazon シンプル ストレージ サービス (Amazon S3)。 Amazon S3のデータセットは、XNUMXつのチャネルで提示されることが期待されています。 train と1つの validation、XNUMXつのディレクトリを使用します。XNUMXつは画像用、XNUMXつは注釈用です。 注釈は非圧縮のPNG画像であることが期待されます。 データセットには、注釈マッピングがどのように確立されるかを説明するラベルマップが含まれている場合もあります。 そうでない場合、アルゴリズムはデフォルトを使用します。 推論のために、エンドポイントは image/jpeg コンテンツタイプ。 データチャネルに必要な構造は次のとおりです。

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

トレインディレクトリと検証ディレクトリのすべてのJPG画像には、同じ名前の対応するPNGラベル画像があります。 train_annotation & validation_annotation ディレクトリ。 この命名規則は、アルゴリズムがトレーニング中にラベルを対応する画像に関連付けるのに役立ちます。 列車、 train_annotation、検証、および validation_annotation チャネルは必須です。 注釈はシングルチャンネルPNG画像です。 この形式は、画像のメタデータ(モード)が、アルゴリズムが注釈画像を単一チャネルの8ビット符号なし整数に読み取るのに役立つ限り機能します。

GroundTruthラベリングジョブからの出力

Ground Truthラベリングジョブから生成された出力は、次のフォルダー構造になります。

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

セグメンテーションマスクはに保存されます s3://turtle2022/labelturtles/annotations/consolidated-annotation/output。 各注釈画像は、ソース画像のインデックスとこの画像のラベル付けが完了した時刻にちなんで名付けられた.pngファイルです。 たとえば、以下は、Mechanical Turkの労働力(1_0-2022-02T10:17:41.png)によって生成されたソース画像(Image_04.724225.jpg)とそのセグメンテーションマスクです。 マスクのインデックスがソースイメージ名の番号とは異なることに注意してください。

ラベリングジョブからの出力マニフェストは、 /manifests/output/output.manifest ファイル。 これはJSONファイルであり、各行はソース画像とそのラベルおよびその他のメタデータ間のマッピングを記録します。 次のJSON行は、表示されたソース画像とその注釈の間のマッピングを記録します。

{"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"}}

ソース画像の名前はImage_1.jpgで、注釈の名前は0_2022-02-10T17:41:04.724225.pngです。 SageMakerセマンティックセグメンテーションアルゴリズムに必要なデータチャネル形式としてデータを準備するには、ソースJPG画像と同じ名前になるようにアノテーション名を変更する必要があります。 また、データセットをに分割する必要があります train & validation ソース画像と注釈のディレクトリ。

GroundTruthラベリングジョブからの出力を要求された入力形式に変換します

出力を変換するには、次の手順を実行します。

  1. ラベリングジョブのすべてのファイルをAmazonS3からローカルディレクトリにダウンロードします。
    !aws s3 cp s3://turtle2022/ Seaturtles --recursive

  2. マニフェストファイルを読み取り、注釈の名前をソース画像と同じ名前に変更します。
    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. トレインと検証のデータセットを分割します。
    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. セマンティックセグメンテーションアルゴリズムのデータチャネルに必要な形式でディレクトリを作成します。
    os.chdir('./semantic_segmentation_pascalvoc_2022-01-11')
    os.mkdir('train')
    os.mkdir('validation')
    os.mkdir('train_annotation')
    os.mkdir('validation_annotation')

  5. トレインイメージと検証イメージ、およびそれらの注釈を、作成されたディレクトリに移動します。
    1. 画像の場合は、次のコードを使用します。
      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. アノテーションには、次のコードを使用します。
      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. トレインと検証のデータセットとそれらのアノテーションデータセットをAmazonS3にアップロードします。
    !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

SageMakerセマンティックセグメンテーションモデルのトレーニング

このセクションでは、セマンティックセグメンテーションモデルをトレーニングする手順について説明します。

サンプルノートブックに従って、データチャネルを設定します

あなたはの指示に従うことができます セマンティックセグメンテーションアルゴリズムがAmazonSageMakerで利用可能になりました ラベル付けされたデータセットにセマンティックセグメンテーションアルゴリズムを実装します。 このサンプル ノート は、アルゴリズムを紹介するエンドツーエンドの例を示しています。 ノートブックでは、完全畳み込みネットワークを使用してセマンティックセグメンテーションモデルをトレーニングおよびホストする方法を学習します(FCN)を使用したアルゴリズム PascalVOCデータセット トレーニング用。 Pascal VOCデータセットからモデルをトレーニングする予定はないため、このノートブックのステップ3(データの準備)をスキップしました。 代わりに、私は直接作成しました train_channel, train_annotation_channe, validation_channel, validation_annotation_channel 画像と注釈を保存したS3の場所を使用する:

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

SageMakerEstimatorで独自のデータセットのハイパーパラメーターを調整します

ノートブックをフォローして、SageMaker推定オブジェクトを作成しました(ss_estimator)セグメンテーションアルゴリズムをトレーニングします。 新しいデータセット用にカスタマイズする必要があることのXNUMXつは、 ss_estimator.set_hyperparameters:変更する必要があります num_classes=21 〜へ num_classes=2 (turtle & background)、そして私も変更しました epochs=10 〜へ epochs=30 10はデモ目的のみであるためです。 次に、設定してモデルトレーニングにp3.2xlargeインスタンスを使用しました instance_type="ml.p3.2xlarge"。 トレーニングは8分で完了しました。 最高の みお (ユニオン上の平均交差)0.846は、エポック11で達成されます。 pix_acc (正しく分類された画像内のピクセルの割合)0.925。これは、この小さなデータセットにとってはかなり良い結果です。

モデル推論の結果

低コストのml.c5.xlargeインスタンスでモデルをホストしました。

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")

最後に、トレーニングされたセグメンテーションモデルの推論結果を確認するために、10個のカメ画像のテストセットを準備しました。

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()

次の画像は結果を示しています。

ウミガメのセグメンテーションマスクは正確に見えます。MechanicalTurkのワーカーによってラベル付けされた300枚の画像データセットでトレーニングされたこの結果に満足しています。 また、次のような他の利用可能なネットワークを探索することもできます ピラミッドシーン解析ネットワーク(PSP) or DeepLab-V3 データセットを含むサンプルノートブック。

クリーンアップ

継続的なコストが発生しないように、終了したらエンドポイントを削除します。

ss_predictor.delete_endpoint()

まとめ

この投稿では、SageMakerを使用してセマンティックセグメンテーションデータのラベル付けとモデルトレーニングをカスタマイズする方法を示しました。 まず、自動セグメンテーションツールを使用してラベリングジョブを設定するか、Mechanical Turkの従業員(およびその他のオプション)を使用できます。 5,000を超えるオブジェクトがある場合は、自動データラベル付けを使用することもできます。 次に、Ground Truthラベリングジョブからの出力を、SageMakerの組み込みセマンティックセグメンテーショントレーニングに必要な入力形式に変換します。 その後、高速コンピューティングインスタンス(p2やp3など)を使用して、次のセマンティックセグメンテーションモデルをトレーニングできます。 ノート モデルをより費用効果の高いインスタンス(ml.c5.xlargeなど)にデプロイします。 最後に、数行のコードを使用して、テストデータセットの推論結果を確認できます。

SageMakerセマンティックセグメンテーションを始めましょう データラベリング & モデルトレーニング お気に入りのデータセットで!


著者について

カラヤン AWSProfessionalServicesのデータサイエンティストです。 彼女は、AWSクラウドサービスを使用して顧客がビジネス目標を達成できるよう支援することに情熱を注いでいます。 彼女は、組織が製造、自動車、環境の持続可能性、航空宇宙などの複数の業界にわたってMLソリューションを構築するのを支援してきました。

タイムスタンプ:

より多くの AWS機械学習