Amazon SageMaker Ground Truth は、機械学習用の高精度なトレーニングデータセットを構築するお手伝いをします。SageMaker Ground Truth を使用すると、パブリックおよびプライベートでラベル付けを行う作業者に簡単にアクセスでき、一般的なラベル付けタスクのための組み込みワークフローとインターフェイスが提供されます。Ground Truth は自動ラベル付け機能を使用して、ラベル付けコストを最大 70% 下げることができます。人間がラベルを作成したデータから Ground Truth をトレーニングすることにより機能するため、サービスはデータを独立してラベル付けすることを学習します。
組み込みワークフローに加えて、Ground Truth ではカスタムワークフローをアップロードするオプションがあります。カスタムワークフローは、人間のラベル作成者にラベル付け作業を完了するためのすべての指示と必要なツールを与える HTML インターフェイスから構成されています。また、前処理と後処理の AWS Lambda 関数も作成します。
- 前処理 Lambda 関数は、HTML インターフェイスへの入力をカスタマイズできるように支援します。
- 後処理 Lambda 関数は、データの処理を支援します。たとえば、その主な使用の 1 つは、精度向上のためのアルゴリズムをホストして、Ground Truth に対して人間が提供するラベルの質を評価する方法を指示します。
アルゴリズムは、同じデータが複数の人間のラベル作成者に提供されるときに、それが「正しい」かの同意を得るために使用されます。これはまた、質の低いデータを提供するラベル作成者も識別し、強調を押さえます。Amazon SageMaker コンソールを使用して、HTML インターフェイスと前と後処理 Lambda 関数をアップロードすることもできます。
正常に HTML インターフェイスを組み込むために、前と後処理の Lambda 関数は カスタムラベル付けワークフローの作成 で指定された入出力仕様を遵守しなければなりません。すべての可動部分をセットアップし、それらが互いに正常にやり取りできるようにするためには、何回か繰り返す必要があることが考えられます。
この記事では、カスタム HTML テンプレートと Lambda 関数のサンプルを使用して、カスタムワークフローをセットアップするプロセスを順に説明していきます。サンプルの Lambda 関数は、AWS Serverless Application Repository で見つかる場合があります。 これらの Lambda 関数は AWS アカウントに容易にデプロイでき、AWS Lambda コンソールで直接、変更できます。ソースコードは aws-sagemaker-ground-truth-recipe GitHub repo にあります。
この記事では、インスタンスセグメンテーションのカスタムラベル付けジョブを作成します。しかし、まず AWS Serverless Application Repository から AWS アカウントに Lambda 関数をデプロイします。
重要な Lambda 関数
Serverless Application Repository ホームページで、左側のメニューから「使用可能なアプリケーション」を選択し、Ground Truthを検索します。 aws-sagemaker-ground-truth-recipe を選択します。
アプリケーションの詳細ページで、[デプロイ] を選択します。ユーザーが IAM ロールを作成するための権限をもっていることを確認します。ユーザーが権限をもっていない場合、デプロイが失敗します。
このアプリケーションをデプロイするには、数分間かかる場合があります。ステータス画面が表示されるまで待ちます。ステータス画面には、4 つの AWS リソース (2 つの Lambda 関数と 2 つの IAM ロール) が作成されます。
これで、ラベル付けジョブで使用する Lambda 関数をアカウントに正常にインストールしたことになります。これらの Lambda 関数を変更するには、それらを選択して、Python コードを微調整します。
カスタムラベル付けジョブの作成
公道を運転する車に搭載されたカメラから撮影された何百万もの画像があると仮定しましょう。これらの画像は、s3://mybucket/datasets/streetscenes/
と呼ばれる Amazon S3 バケットの場所に保存されています。 インスタンスセグメンテーションのためにラベル付けジョブを開始するには、まず、Ground Truth にフィードするマニフェストを作成します。
次のコード例は、画像のセットと共にマニフェストファイルのサンプルコンテンツを示します。 詳細については 、「入力データ」をご参照ください。
{"source-ref": "S3 location for image 1"}
{"source-ref": "S3 location for image 2"}
...
{"source-ref": "S3 location for image n"}
ステップ 1: サンプルデータセットのダウンロード
すでにインスタンスセグメンテーションのマニフェストファイルをお持ちの場合は、このセクションをスキップしてください。
この例では、CBCL StreetScenes データセットを使用します。このデータセットには 3,000 個を超える画像がありますが、10 個の画像のみを選択します。完全なデータセットは約 2 GB です。ラベル付けのためにすべての画像を S3 にアップロードすることもできますし、選択した画像だけをアップロードすることもできます。
- zip ファイルをダウンロードし、フォルダーに抽出します。デフォルトで、フォルダーは Output です。
- 使用する小さなサンプルデータセットを作成します。
mkdir streetscenes
cp Original/SSDB00010.JPG ./streetscenes/
cp Original/SSDB00017.JPG ./streetscenes/
cp Original/SSDB00019.JPG ./streetscenes/
cp Original/SSDB00025.JPG ./streetscenes/
cp Original/SSDB00038.JPG ./streetscenes/
cp Original/SSDB00016.JPG ./streetscenes/
cp Original/SSDB00018.JPG ./streetscenes/
cp Original/SSDB00021.JPG ./streetscenes/
cp Original/SSDB00029.JPG ./streetscenes/
cp Original/SSDB00039.JPG ./streetscenes/
S3 コンソール内で、バケット内に /streetscenes フォルダを作成します。 S3 はキーバリューストアなので、フォルダーという概念はありません。ただし、S3 コンソールでは、キーにスラッシュを使用することでフォルダ構造の感覚を与えています。そのため、コンソールを使ってフォルダを作成します。
以下のファイルを S3 バケット s3://mybucket/datasets/streetscenes/
にアップロードします。S3 コンソールまたは以下の AWS CLI コマンドを使用できます。
aws s3 sync streetscenes/ s3://cnidus-ml-iad/datasets/streetscenes/
upload: streetscenes/SSDB00010.JPG to s3://gt-recipe-demo/datasets/streetscenes/SSDB00010.JPG
upload: streetscenes/SSDB00017.JPG to s3://gt-recipe-demo/datasets/streetscenes/SSDB00017.JPG
upload: streetscenes/SSDB00018.JPG to s3://gt-recipe-demo/datasets/streetscenes/SSDB00018.JPG
upload: streetscenes/SSDB00021.JPG to s3://gt-recipe-demo/datasets/streetscenes/SSDB00021.JPG
upload: streetscenes/SSDB00025.JPG to s3://gt-recipe-demo/datasets/streetscenes/SSDB00025.JPG
upload: streetscenes/SSDB00038.JPG to s3://gt-recipe-demo/datasets/streetscenes/SSDB00038.JPG
upload: streetscenes/SSDB00029.JPG to s3://gt-recipe-demo/datasets/streetscenes/SSDB00029.JPG
upload: streetscenes/SSDB00016.JPG to s3://gt-recipe-demo/datasets/streetscenes/SSDB00016.JPG
upload: streetscenes/SSDB00039.JPG to s3://gt-recipe-demo/datasets/streetscenes/SSDB00039.JPG
upload: streetscenes/SSDB00019.JPG to s3://gt-recipe-demo/datasets/streetscenes/SSDB00019.JPG
ステップ 2: 入力マニフェストの作成
すでにインスタンスセグメンテーションのマニフェストファイルをお持ちの場合は、このセクションをスキップしてください。
Amazon SageMaker コンソールで、ラベル付けジョブを作成してプロセスを開始します。
[input dataset location] の下で、[Create manifest file] を選択します。このツールを使用すると、未加工データ (画像またはテキスト) を含む S3 の場所をクロールすることでマニフェストを作成できます。
画像については、クローラーは入力 s3Prefix を取得し、プレフィックスで .jpg、jpeg、.png の拡張しをもつすべての画像ファイルをクロールさせます。その後、各行を次のように設定してマニフェストを作成します。
{"source-ref":"<s3-location-of-crawled-image>"}
[Create manifest file] リンクが開き、モーダルウィンドウが開きます。画像ファイルをアップロードした場所の S3 パスを入力し、末尾のスラッシュを忘れずに含めます。次に、[Create] を選択します。 作成プロセスが完了したら、[Use this manifest] を選択します。マニフェストを作成するのに数秒かかります。
この例では、オブジェクトは S3 の画像なので、クロールグールを使用して、最初のマニフェストを作成できます。JSON の各行は、画像の s3Uri 値をポイントする source-ref と呼ばれるフィールドを含みます。 作成されたマニフェストファイルのコンテンツは、次のようになります。
{"source-ref":"s3://gt-recipe-demo/datasets/streetscenes/SSDB00010.JPG"}
{"source-ref":"s3://gt-recipe-demo/datasets/streetscenes/SSDB00016.JPG"}
{"source-ref":"s3://gt-recipe-demo/datasets/streetscenes/SSDB00017.JPG"}
{"source-ref":"s3://gt-recipe-demo/datasets/streetscenes/SSDB00018.JPG"}
{"source-ref":"s3://gt-recipe-demo/datasets/streetscenes/SSDB00019.JPG"}
{"source-ref":"s3://gt-recipe-demo/datasets/streetscenes/SSDB00021.JPG"}
{"source-ref":"s3://gt-recipe-demo/datasets/streetscenes/SSDB00025.JPG"}
{"source-ref":"s3://gt-recipe-demo/datasets/streetscenes/SSDB00029.JPG"}
{"source-ref":"s3://gt-recipe-demo/datasets/streetscenes/SSDB00038.JPG"}
{"source-ref":"s3://gt-recipe-demo/datasets/streetscenes/SSDB00039.JPG"}
ステップ 3: カスタムラベル付けジョブの作成
以下のジョブ設定を行います。
- ラベル付け ジョブ名—この名前は、AWS リージョン内のアカウントに固有でなければなりません。
- 入力データセット S3 ロケーション—ステップ 2 で作成した入力マニフェストファイルのロケーション。
- 出力データセット S3 ロケーション—出力データが書き込まれるロケーション。
- IAM ロール —IAM ポリシーを使用して権限を設定します。ステップ 4 で必要になるため、このロールを書き留めます。
カスタムタスクのタイプを選択し、[Next] を選択します。
ワーカーには [Private] を選択します。別のワークフォースオプションに関する詳細は、ワークフォースの管理 を参照してください。
独自のカスタムワークフローをセットアップするために使用できるラベル付け UI テンプレートは数多くあります。この場合、インスタンスセグメンテーション UI を使用します。テンプレートについては、インスタンスセグメンテーションを選択します。
HTML コードを変更すると、次のようになります。元のテンプレートの場合、src、header、および labels の 3 つのプレースホルダーがありました。私は header と labels のフィールドを変更しました。 このテンプレートを使用して、タスクがワーカーに対して作成されると、Ground Truth は src プレースホルダーフィールドに入力するデータを指定します。
<script src="https://assets.crowd.aws/crowd-html-elements.js"></script>
<crowd-form>
<crowd-instance-segmentation
name="annotatedResult"
src="{{ task.input.taskObject | grant_read_access }}"
header="画像のすべての人の周りに多角形を描画します。"
labels="['Person']"
>
<full-instructions header="Segmentation Instructions">
<ol>
<li>タスクを注意深く<strong>読み</strong>、画像を検査する</li>
<li>オプションを<strong>読み</strong>、指定されたサンプルを見直して、ラベルについて理解する。</li>
<li>画像に最適の適切なラベルを<strong>選択jする</strong>。</li>
</ol>
</full-instructions>
<short-instructions>
<p>画像で要求されたアイテムのすべてのインスタンスにラベル付けするためにツールを使用します</p>
</short-instructions>
</crowd-instance-segmentation>
</crowd-form>
次に前と後処理タスクの Lambda 関数フィールドの場合、以前、インポートした Lambda 関数を選択します。
カスタムラベル付けタスクの設定で、[Preview] を選択します。UI をプレビューする前に、忘れずにポップアップを許可してください。このページがエラーなしで正常に読み込まれる場合、前処理タスクの Lambda 関数とカスタム HTML テンプレートが共に正常に機能していることがわかります。
ステップ 4: Amazon SageMaker ロールへの実行権限の付与
前のステップで、Ground Truth ラベル付けジョブを作成し、IAM ロールを作成します。Ground Truth はこの IAM ロールを使用して、ラベル付けジョブを実行します。このロールは、後処理の Lambda 関数の実行ロールを信頼する必要があります。
Lambda コンソールでは、以前インポートした Lambda 関数を選択します。ページの先頭または [Tags] セクションの下の Amazon Resource Name (ARN) を書き留めます。 結果は、以下のようになるはずです。
arn:aws:lambda:us-east-1:919226420625:function:serverlessrepo-aws-sagema-GtRecipeAnnotationConsol-xxxxxxx
実行ロールを選択し、既存のロールを使用、ロールを表示します。

IAM ロール ARN をコピーします。
IAM コンソールで、作成した Amazon SageMaker 実行ロールを見つけます。[信頼関係]、[信頼関係の編集] を選択します。 信頼関係にコピーした Lambda 実行ロールを追加します。次のコード例は、信頼関係のコンテンツを示します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::<your-aws-account>:role/serverlessrepo-aws-sagema-GtRecipeAnnotationConsol-xxxxx"
],
"Service": [
"lambda.amazonaws.com",
"sagemaker.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
[Permissions]、[Attach policies] を選択します。AWSLambdaFullAccess を選択し、[Attach Policy] を選びます。ポリシーをアタッチした後で、[Permissions] は次のスクリーンショットのように表示されるはずです。

現在のタブを閉じます。
ステップ 5: ラベル付けジョブの送信
ラベル付けジョブが開いているメインブラウザーのタブで、[Submit] を選択します。ラベル付けジョブが進行中です。ジョブが完了するのを待ちます。
プライベートワークチームにワーカーが割り当てられている場合は、彼らに自分のタスクを行うように指示します。ワーカーとして自分自身を追加している場合、プライベートワークチームのポータルでタスクを完了します。詳細については、プライベートワークフォースの管理を参照してください。
ラベル付け結果
ワーカーがラベル付け作業を終了した後で、出力マニフェストは以下のようになります。
{"source-ref":"s3://gt-recipe-demo/dataset/streetscenes/SSDB00010.JPG","gt-label":{"annotationsFromAllWorkers":[{"workerId":"public.us-east-1.M52TVGWFFYHS34QM3EHF3NMTKY","annotationData":{"content":"{\"annotatedResult\":{\"inputImageProperties\":{\"height\":960,\"width\":1280},\"instances\":[],\"labeledImage\":{\"pngImageData\":\"iVBORw0KGgoAAAANSUhEUgAABQAAAAPAAQMAAABQEkY6AAAAAXNSR0IB2cksfwAAAANQTFRFAAAAp3o92gAAAAF0Uk5TAEDm2GYAAACsSURBVHic7cExAQAAAMKg9U/tbwagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAN1veAAH/xLK9AAAAAElFTkSuQmCC\"}}}"}},{"workerId":"public.us-east-1.JZUQXKHROY2DBQ2V2ZLEWEYCAE","annotationData":{"content":"{\"annotatedResult\":{\"inputImageProperties\":{\"height\":960,\"width\":1280},\"instances\":[{\"color\":\"#2ca02c\",\"label\":\"Person\"}],\"labeledImage\":{\"pngImageData\":\"iVBORw0KGgoAAAANSUhEUgAABQAAAAPAAQMAAABQEkY6AAAAAXNSR0IB2cksfwAAAAZQTFRFAAAALKAsCO/WQQAAAAJ0Uk5TAP9bkSK1AAABeklEQVR4nO3awWnEQAxAURsffHQJLsWlOaVtKVNCjjmEzGYbGMNqQTK8V8FHJyE0TQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8ac8OuLL/ZBdcOPojO2FMYNQpMKh8YBcYJDBo7r1lNwyVD1xuEPid3TD0H1h731pvEPib3TC09f6X3TBUPnDvvWc3DAmMOqoHlp/gK/ArO2JEYJTAqO0OgY/siBGBUQKj1jsEtuyIEYFRAqNegaWPMwKjbhHYsiNGBEYJjBIYJTBqqR44Vw+cBEad1QOP6oF79cBNYNBaPbD800L5t49JYNRZPfCoHrhVD5yrB05nyy64sLXsggtLyy640rIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPicJ/PI71EA2TUjAAAAAElFTkSuQmCC\"}}}"}},{"workerId":"public.us-east-1.H7WTTAHGRYWYXEA7V7E7KOMOCE","annotationData":{"content":"{\"annotatedResult\":{\"inputImageProperties\":{\"height\":960,\"width\":1280},\"instances\":[],\"labeledImage\":{\"pngImageData\":\"iVBORw0KGgoAAAANSUhEUgAABQAAAAPAAQMAAABQEkY6AAAAAXNSR0IB2cksfwAAAANQTFRFAAAAp3o92gAAAAF0Uk5TAEDm2GYAAACsSURBVHic7cExAQAAAMKg9U/tbwagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAN1veAAH/xLK9AAAAAElFTkSuQmCC\"}}}"}}]},"gt-label-17-metadata":{"type":"groundtruth/custom","job-name":"gt-label-17","human-annotated":"yes","creation-date":"2019-04-01T05:21:34+0000"}}
{"source-ref":"s3://gt-recipe-demo/dataset/streetscenes/SSDB00016.JPG","gt-label":{"annotationsFromAllWorkers":[{"workerId":"public.us-east-1.H7WTTAHGRYWYXEA7V7E7KOMOCE","annotationData":{"content":"{\"annotatedResult\":{\"inputImageProperties\":{\"height\":960,\"width\":1280},\"instances\":[{\"color\":\"#2ca02c\",\"label\":\"Person\"},{\"color\":\"#1f77b4\",\"label\":\"Person\"}],\"labeledImage\":{\"pngImageData\":\"iVBORw0KGgoAAAANSUhEUgAABQAAAAPAAgMAAAAXsjzqAAAAAXNSR0IB2cksfwAAAAlQTFRFAAAALKAsH3e00sbfdAAAAAN0Uk5TAP//RFDWIQAABI1JREFUeJzt3E2O4kgUhVGwhNTyqCdswqtgCTUo74elMGx5lV1JklWGWXP10u2IcxYQL/QJ/2CEDwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaMhpnufL1pvYMwFDHwF/bL2JPRMw9BHw59ab2DMBQx8B5603sWcChu4BL1vvYscEDN0Duo95n4Che8CG72PG6gGtB5yuxQPuAdu9jxmWW/GExgOOyz/FEz4DXoqnbGZaluIJjQdcluVaO+EzYKv3McOvgLfaEZ8BWz0J/jqCq0+Cj4CX2ilbWT7UjngEbPNOcLgHvJbOeARs8yM43gPeSmd8BWzyMjLdA9aeBL8CtngZ+TyCi0+C57ndj+D4CHgtnHH86tfiZWR6BLwVzvh9BLd4GfmOgLOAkWPTAZf6gCcBM7OAkWPTAYf6gOc+AtZ9FZkFjBzbDjiWBzwLmJkFjJwaDzhVBzwLmOkmYNUDwdYDLgJmBAwJmBkEzNQHnAXMNB5wFDCzCnitmSBgqPGAk4AZAUMChpbqgEcBMx0FvJUMaDzgIGBGwJCAoVHATH3Ak4AZAUMdBaz5YbjxgIOAIQFDAoYmATPlAc+NBxwFzKzvY0oGtB5w8AkMVX8T6SjgtWT95gNOtUdwRwFvNes3H3CsPYJffxZuL+Dvy3DR+t0ErPqXQ/MBD7WnwH4CXouWbz/gVHoK7CbgN/1Xs8WAY+kR/PqzcIMBh9IjuJeA3/R//yYDHipvYroJeK1avIeAU+EpsIuAY+U7YzoJeCtbvIeAQ+XbK19/Fm4zYOELaHsIePiuVwe2G/Bat3YXAafCtbsI+Ffh2l0ErCRgSMDQWcCMgCEBQwKGBAwJGBIw9NpPwP/q9SN42XpDu9P6a5DrNf4q+HoChgQMCRgSMCRgSMCQgCEBQwKGBAwJGBIwJGBIwJCAIQFDAoYEDAkYEjAkYOg54Na72SEBQwKGBAwJGBIw9BTw59a72SEBQwKGBAydBMw8Bfyx9W52SMCQgCEBQwKGngJett7NDgkYEjAkYEjAkIChp4Bbb2aPBAwJGBIwJGBoHdDz1DcIGBIwJGBIwNA6oOepbxAwJGBIwJCAIQFD64CXrTezRwKGBAwJGBIwtA649V526SxgRsCQgCEBQ6uAnqe+Q8CQgCEBQwKGBAytAnqe+g4BQwKGBAwJGBIwtAp42XovuyRgSMCQgCEBQ6uAW29lnwQMCRgSMCRgSMDQn4AeSL9FwJCAIQFDAob+BPQ89S0ChmYBMwKGBIyd9Usd9Yv9vfUGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAID/t38Buw1HOPtmWvcAAAAASUVORK5CYII\u003d\"}}}"}},{"workerId":"public.us-east-1.M52TVGWFFYHS34QM3EHF3NMTKY","annotationData":{"content":"{\"annotatedResult\":{\"inputImageProperties\":{\"height\":960,\"width\":1280},\"instances\":[],\"labeledImage\":{\"pngImageData\":\"iVBORw0KGgoAAAANSUhEUgAABQAAAAPAAQMAAABQEkY6AAAAAXNSR0IB2cksfwAAAANQTFRFAAAAp3o92gAAAAF0Uk5TAEDm2GYAAACsSURBVHic7cExAQAAAMKg9U/tbwagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAN1veAAH/xLK9AAAAAElFTkSuQmCC\"}}}"}},{"workerId":"public.us-east-1.QUERNWRJ6HNNO5D6XDUVPMWTMA","annotationData":{"content":"{\"annotatedResult\":{\"inputImageProperties\":{\"height\":960,\"width\":1280},\"instances\":[{\"color\":\"#2ca02c\",\"label\":\"Person\"},{\"color\":\"#1f77b4\",\"label\":\"Person\"}],\"labeledImage\":{\"pngImageData\":\"iVBORw0KGgoAAAANSUhEUgAABQAAAAPAAgMAAAAXsjzqAAAAAXNSR0IB2cksfwAAAAlQTFRFAAAALKAsH3e00sbfdAAAAAN0Uk5TAP//RFDWIQAABJZJREFUeJzt3EFuIjsUhtFUJKQW89oEq2AJb/BqPyyFYYtVdpMOCcms+9etUl2fswDb+oRlMAUvLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEB3y3nrFezbImBiWgRM3PsJmBAwJGDoHvC/rRexZwKGBAwJGBIwJGBIwNA94P9bL2LPBAwJGBIwNAuYETAkYOgecNl6EXvWPuDrtXb89gGP19rx2we8/awdv3vA4+1WO0H3gDcBI6+/A15KZ5h7fy13+h3wWjpD64D31191wKVxwONbv+JjWMDMJGDmIGCmdcDTCgHfDuGuX8utEXAZIGDpR5E/AZt+FFkh4PQe8Fw4x3ZWCHh4D9jzUv+2XsCee3iFgPMjYMtjZIWAj3499/Aj4KVuio+AHY+R1/qA02fAhnt4hYCHz4ANj5GVA57LZtnKCgHnp4D9jpEVAi5L55fg8RHwWjbFl4DtjpFTecCp9yuwPuChd8CbgJHX+oCzgJmldcCPQ7juTr93wFN5wEnAzKF3wJuAkdf6gLOAmaV1wM9DuOxOv3fAU/krcBIw8+0M6XYlfRMwUx9w7h2wfgsLGGoe8Chgpv6NdPOA9Z+Fxwl4rZmge8CTgJmjgBkBQ+VfKnUPWP5oR/uAL+sG7Pd01scmvtYM3z/gYxNfakYfIOCLgKE/m7ho8BECvm3ilb7VFPBvDRPwWjT2MkrAS9HYAoaGCVg19igBV3q8UsC/NkrAa9XY3wK2+53Nm2PhD70EDI0SsGzsQQLW/W+RgKFBAl7Lxh4k4KVsbAFDgwSsG1vA0BgBC/99UcDQGAGvdWN/C3ium2lDhQGb/1Dp3fFSNrSAoUEC1g0tYGiMgD/qhhYwNEbAQgKGBAwJGBIwJGDoe8Ct17M7AoYEDAkYEjAkYEjAkICh5n+dVU/AkC0cEjAlYGj+0q/nz0RKCRg6CJiZBMwImBIwNAuYETD05Rju+YRvrUnAjIAhAUMChgQMCRgSMCRg6EvA89ar2SEBUwKGBAwJGBIwJGBIwJCAoeeAW69llwQMCRgSMCRgSMCQgCEBQ0/9PNnxLwQMCRgSMCRgSMCQgCEBQ08BPZjwLwQMCRgSMCRg6Cngeeu17JKAIQFDAoaeAm69lH0SMCRgSMCQy5iQgCEBQwKGBAy5jAkJGBIwJGDIZUxIwJCAIQFDLmNCAoYEDAkYEjDkMiYkYEjAkIAhlzEhAUMChgQMCRhymxUSMCRgSMCQgCEBQwKGBAwJGBIwJGBIwNBHwK0XslcChgQMCRg6CBiaBcxMAoYOAoYEDB0EDM0CAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjOIXhsjo6mjj6oAAAAAASUVORK5CYII\u003d\"}}}"}}]},"gt-label-17-metadata":{"type":"groundtruth/custom","job-name":"gt-label-17","human-annotated":"yes","creation-date":"2019-04-01T05:21:34+0000"}}
JSON 行を 1 行展開して、注釈を表示します。画像と作成された注釈で 3 人のワーカーが作業したことを確認できます。
- source-ref: 画像のロケーション。
- workerId: その後の annotationData のワーカーの ID。この場合、3 個の workerIds が表示されますが、この画像に対して 3 人のワーカーが注釈したことを意味します。
- annotationData: 注釈結果。
- gt-label-17-metadata: この画像が一部となるラベル付けジョブに関連付けられたメタデータ。
{
"source-ref":"s3://gt-recipe-demo/dataset/streetscenes/SSDB00010.JPG",
"gt-label-17":{
"annotationsFromAllWorkers":[
{
"workerId":"public.us-east-1.M52TVGWFFYHS34QM3EHF3NMTKY",
"annotationData":{
"content":"{\"annotatedResult\":{\"inputImageProperties\":{\"height\":960,\"width\":1280},\"instances\":[],\"labeledImage\":{\"pngImageData\":\"iVBORw0KGgoAAAANSUhEUgAABQAAAAPAAQMAAABQEkY6AAAAAXNSR0IB2cksfwAAAANQTFRFAAAAp3o92gAAAAF0Uk5TAEDm2GYAAACsSURBVHic7cExAQAAAMKg9U/tbwagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAN1veAAH/xLK9AAAAAElFTkSuQmCC\"}}}"
}
},
{
"workerId":"public.us-east-1.JZUQXKHROY2DBQ2V2ZLEWEYCAE",
"annotationData":{
"content":"{\"annotatedResult\":{\"inputImageProperties\":{\"height\":960,\"width\":1280},\"instances\":[{\"color\":\"#2ca02c\",\"label\":\"Person\"}],\"labeledImage\":{\"pngImageData\":\"iVBORw0KGgoAAAANSUhEUgAABQAAAAPAAQMAAABQEkY6AAAAAXNSR0IB2cksfwAAAAZQTFRFAAAALKAsCO/WQQAAAAJ0Uk5TAP9bkSK1AAABeklEQVR4nO3awWnEQAxAURsffHQJLsWlOaVtKVNCjjmEzGYbGMNqQTK8V8FHJyE0TQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8ac8OuLL/ZBdcOPojO2FMYNQpMKh8YBcYJDBo7r1lNwyVD1xuEPid3TD0H1h731pvEPib3TC09f6X3TBUPnDvvWc3DAmMOqoHlp/gK/ArO2JEYJTAqO0OgY/siBGBUQKj1jsEtuyIEYFRAqNegaWPMwKjbhHYsiNGBEYJjBIYJTBqqR44Vw+cBEad1QOP6oF79cBNYNBaPbD800L5t49JYNRZPfCoHrhVD5yrB05nyy64sLXsggtLyy640rIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPicJ/PI71EA2TUjAAAAAElFTkSuQmCC\"}}}"
}
},
{
"workerId":"public.us-east-1.H7WTTAHGRYWYXEA7V7E7KOMOCE",
"annotationData":{
"content":"{\"annotatedResult\":{\"inputImageProperties\":{\"height\":960,\"width\":1280},\"instances\":[],\"labeledImage\":{\"pngImageData\":\"iVBORw0KGgoAAAANSUhEUgAABQAAAAPAAQMAAABQEkY6AAAAAXNSR0IB2cksfwAAAANQTFRFAAAAp3o92gAAAAF0Uk5TAEDm2GYAAACsSURBVHic7cExAQAAAMKg9U/tbwagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAN1veAAH/xLK9AAAAAElFTkSuQmCC\"}}}"
}
}
]
},
"gt-label-17-metadata":{
"type":"groundtruth/custom",
"job-name":"gt-label",
"human-annotated":"yes",
"creation-date":"2019-04-01T05:21:34+0000"
}
}
クリーンアップ
今後の課金の発生を避けるため:
- 自分のラベル付けジョブが Amazon SageMaker コンソールで「Complete」、「Stopped」、または「Failed」としてマークされます。
- Amazon S3 で対応する S3 バケット「mybucket」を削除します。
- Amazon CloudFormation console から「serverlessrepo-aws-sagemaker-ground-truth-recipe」スタックを削除します。
結論
この記事では、AWS Serverless Application Repository を使用して、Ground Truth アプリから前処理と後処理の Lambda 関数をデプロイすることから開始しました。次に、カスタムのラベル付けジョブを作成し、それをインポートされた Lambda 関数を使用して設定しました。
これらのサンプルの Lambda 関数は、素早く実行中のカスタムラベル付けジョブを取得することを助けます。AWS Lambda コンソールを使用して、固有のロジックでそれらを追加または変更できます。
まず最初に AWS マネジメントコンソールにアクセスしてください!
著者について
Anjan Dash は AWS AI のソフトウェア開発エンジニアであり、複雑な機械学習の問題を解決するために大規模な分散システムを構築しています。彼は主に、ビッグデータの問題を「分割して征服する」革新的な技術に焦点を当てています。余暇には、アウトドア活動で家族との時間を楽しんでいます。
Revekka Kostoeva は Amazon AI のソフトウェア開発エンジニアのインターンで、顧客対応と社内ソリューションを担当して、Sagemaker Ground Truth サービスの幅をひろげるように仕事をしています。研究者として、彼女は技術革新を推進するために取引のためのツールを改良することに取り組んでいます。