Amazon Web Services ブログ

Amazon SageMaker Ground Truth を使ったカスタムデータラベリングワークフローの構築

優れた機械学習モデルは大量の高品質トレーニングデータで構築されていますが、このようなトレーニングデータの作成は高額かつ複雑で、時間もかかります。モデルが正しい判断を行う方法を学べるように助けるには、通常、人に手動でトレーニングデータへのラベル付けを行ってもらう必要があります。

Amazon SageMaker Ground Truth は、人が画像とテキストの分類、物体検出、およびセマンティックセグメンテーションのラベリングジョブに取り組むためのラベリングワークフローを提供します。また、データラベリングジョブ用のユーザーインターフェイス (UI) を定義するためのカスタムワークフローを構築することもできます。これらを開始できるようユーザーを援助するために、Amazon SageMaker は画像、テキスト、および音声データのラベリングジョブのためのカスタムテンプレートを提供します。これらのテンプレートは、データラベリング UI の構築をシンプル化する Amazon SageMaker Ground Truth の crowd HTML 要素を使用します。UI には独自の HTML を指定することも可能です。

カスタムワークフローは、以下にある理由のために構築するとよいでしょう。

  • カスタムデータラベリング要件がある。
  • 入力データが複雑で、タスクごとに複数の要素 (例えば、画像、テキスト、またはカスタムメタデータ) がある。
  • タスクの作成時に特定のアイテムがラベラーに送信されないようにしたい。
  • ラベリング出力を統合し、精度を向上させるためのカスタムロジックが必要。

IEEE が後援する学会のような科学学会には何千編ものアブストラクトが届き、これらは手作業でレビューされます。科学論文の典型的なアブストラクトには、背景、目的、手法、結果、限界、および結論といった情報が含まれます。何千編ものアブストラクトについてこれらのセクション、つまりエンティティをレビューすることは、手間のかかる作業になり得ます。

必要なエンティティのすべてに自動でタグ付けすることによってレビューアーを助けることができる自然言語処理 (NLP) モデルがあったとしたらどうでしょう? テキストラベリングツールが投稿されたアブストラクトからエンティティを抽出できるととしたらどうでしょうか?

Amazon Comprehend は、テキスト内のインサイトと関係性を見つけるために機械学習を使用する自然言語処理 (NLP) サービスですが、この記事では、固有表現抽出 (NER) モデル用のトレーニングデータセットを構築するための、科学論文アブストラクトから名前付きエンティティを抽出するカスタムテキストラベリングワークフローの構築について段階的に説明していき、ユーザー独自の既存のウェブテンプレートを Amazon SageMaker Ground Truth に簡単に取り入れる方法を紹介します。

ソリューションの概要

カスタムワークフローの構築には、arxiv.org のご厚意により提供された科学論文 10 編の最初のページからの入力画像を使用しました。

論文からのテキストの抽出には、Amazon Textract SDK を使用しました。拡張マニフェストの生成には別のスクリプトを使用し、後でこれを Amazon SageMaker Ground Truth に投入しました。これらのスクリプトは、この GitHub リポジトリにあります。この拡張マニフェストを使用して、ラベリングジョブを作成することができます。

カスタム UI の構築には、React フレームワークと WebStorm 統合開発環境 (IDE) を使用します。フレームワークと IDE は、任意のものを使用できます。

必要なものはすべてテンプレート内にあります。

カスタムウェブテンプレートの仕組み

このソリューションは、プレラベリングとポストラベリングの処理にサーバー側の AWS Lambda 関数を使用します。以下の図はおおまかなワークフローを示すもので、その下に説明があります。

  1. カスタムウェブテンプレートを構築する。
  2. プレラベリングタスクの Lambda 関数を AWS アカウントにデプロイする。
  3. ポストラベリングタスクの Lambda 関数を AWS アカウントにデプロイする。
  4. 入力マニフェストを作成し、それを Amazon S3 バケットにアップロードする。
  5. ワークフォースチームを作成し、チームにメンバーを追加する。
  6. SageMaker Ground Truth コンソールから、カスタムテンプレートを使用した SageMaker Ground Truth ラベリングジョブを開始する。
  7. ラベリングジョブの終了後、統合されたラベルが Amazon S3 出力ロケーションに保持される。

カスタムテンプレート

.jpg 画像、アノテーション用のテキスト、追加のメモのための自由形式テキストフィールド、およびアブストラクトの品質を分類するための yes/no 要素を表示するラベリング UI を構築するために、React を使用して単一ページのウェブアプリを作成します。静的 JavaScript と CSS ファイルは、s3://smgtannotation/web/static にある Amazon S3 でホストされます。 ウェブアプリの構築方法に興味がある場合は、その手順について GitHub リポジトリを参照してください。

このアプリを使うと、ラベリングを実行するワーカーは、選択されたテキストにラベルを付けることによってアブストラクトにアノテーションを付けることができます。以下のスクリーンショットにあるように、ワーカーはドロップダウンリストからエンティティのタイプ (背景、目的、手法、結果、結論、および限界) を選択できます。また、ワーカーはメモを追加し、アブストラクトの品質のラベル付けを行うこともできます。

Ground Truth ジョブの開始時には、この GitHub ロケーションで提供されているテンプレートを使用できます。これから私が構築したカスタム HTML テンプレートについて詳しく説明していきますが、ソースから独自のテンプレートを構築することを選択する場合は、必要に応じて生成された JavaScript と CSS URL を置き換えてください。

まず、crowd HTML 要素を使用できるように、テンプレートの最上部に crowd-htm-element.js スクリプトを追加しました。

<script src="https://assets.crowd.aws/crowd-html-elements.js"></script>

次に、静的 CSS コンテンツを追加しました。

<link rel="stylesheet" href="https://s3.amazonaws.com/smgtannotation/web/static/css/1.3fc3007b.chunk.css">
<link rel="stylesheet" href="https://s3.amazonaws.com/smgtannotation/web/static/css/main.9504782e.chunk.css">

アノテーションを付けるテキスト、画像ドキュメントの URL、および関連メタデータのユーザーインターフェイスへの投入には Liquid テンプレート言語を使用しました。

以下のスニペットでは、二重カーリーブラケットの間にプレラベリングタスクの AWS Lambda 関数からの変数、「task.input.taskObject」が確認できます。Grant_read_access 変数は、S3 URI を署名済みの S3 HTTPs URL にエンコードする追加のフィルタです。詳細については、Amazon SageMaker 開発者ガイドGround Truth ドキュメントを参照してください。

<div id='document-text' style="display: none;">
  {{ task.input.text }}
</div>
<div id='document-image' style="display: none;">
  {{ task.input.taskObject | grant_read_access }}
</div>
<div id="metadata" style="display: none;">
  {{ task.input.metadata }}
</div>

今回は、Amazon SageMaker Ground Truth にアノテーションを送信する <crowd-form /> 要素を使用しました。また、フォーム内に非表示の <crowd-button /> 要素も使用し、<crowd-form /> がそれを独自のボタンに包含しないようにしました。これは、フォームの最後にボタンを追加する柔軟性を提供します。もちろん、アプリにアプリ独自の送信ボタンがない場合には、単純に <crowd-form /> が提供するデフォルトの <crowd-button /> を使用できます。

<crowd-form>
    <input name="annotations" id="annotations" type="hidden">

     <!-- Prevent crowd-form from creating its own button -->
    <crowd-button form-action="submit" style="display: none;"></crowd-button>
</crowd-form>

<!-- Custom annotation user interface is rendered here -->
<div id="root"></div>

UI の構築には、crowd HTML 要素を使用する代わりに JavaScript アプリを使用しました。アプリを <crowd-form /> と統合するための小さなスクリプトを含めたのはこのためです。要するに、今回は送信ボタンに <crowd-form /> を送信させ、フォームに対して送信したいデータを何でも投入します。

<crowd-button id="submitButton">Submit</crowd-button>

<script>
    document.querySelector('crowd-form').onsubmit = function() {
        document.getElementById('annotations').value = JSON.stringify(JSON.parse(document.querySelector('pre').innerText));
    };

    document.getElementById('submitButton').onclick = function() {
        document.querySelector('crowd-form').submit();
    };
</script>

テンプレートの最後には、React アプリ用の JavaScript スクリプトを追加しました。

<script src="https://s3.amazonaws.com/smgtannotation/web/static/js/1.3e5a6849.chunk.js"></script>
<script src="https://s3.amazonaws.com/smgtannotation/web/static/js/main.96e12312.chunk.js"></script>
<script src="https://s3.amazonaws.com/smgtannotation/web/static/js/runtime~main.229c360f.js"></script>

入力の拡張マニフェスト

ラベリングジョブのための入力データは、ラベリングのためにワークフォースに送信するデータオブジェクトの一式です。入力データ内の各オブジェクトは、マニフェストファイル内に記述されています。マニフェストファイル内の各行は、ラベル付けされる有効な JSON Lines オブジェクトと、その他のカスタムメタデータです。各行は、標準改行で区切られています。

入力データとマニフェストは S3 バケットに保存されます。マニフェスト内の各 JSON 行には以下が含まれています。

  • 画像の S3 オブジェクト URI が含まれる source-ref JSON オブジェクト。
  • テキストの S3 オブジェクト URI が含まれる text-file-s3-uri JSON オブジェクト。
  • 追加のメタデータが含まれる metadata JSON オブジェクト。

詳細については、Amazon SageMaker 開発者ガイドの「入力データ」を参照してください。

{'source-ref': 's3://smgtannotation/raw-abstracts-jpgs/1801_00006.jpg', 'text-file-s3-uri': 's3://smgtannotation/text/1801_00006.jpg.csv', 'metadata': {'Author': 'Alejandro Rosalez', 'ISBN': '1-358-98355-0'}}
{'source-ref': 's3://smgtannotation/raw-abstracts-jpgs/1801_00015.jpg', 'text-file-s3-uri': 's3://smgtannotation/text/1801_00015.jpg.csv', 'metadata': {'Author': Mary Major', 'ISBN': '1-242-55362-2'}}

プレラベリングタスクの Lambda 関数

カスタムラベリングワークフローは、プレラベリングタスクの Lambda 関数のためのフックを提供します。ラベリングタスクがワーカーに送信される前に、この Lambda 関数が dataObject オブジェクト内のマニフェストエントリが含まれる JSON 形式のリクエストで呼び出されます。

以下は、AWS Lambda に送信されたリクエストの例です。

{
 "version": "2018-10-06",
 "labelingJobArn": <labeling job ARN>,
 "dataObject": {
   "source-ref": "s3://smgtannotation/raw-abstracts-jpgs/1801_00015.jpg",
	"text-file-s3-uri": "s3://smgtannotation/text/1801_00015.jpg.csv",
	"metadata": {
	"Author": "Mary Major",
	"ISBN": "1-242-55362-2"
	}
  }
}

プレラベリング Lambda 関数はレスポンスとして JSON リクエストを解析して dataObject キーを取得し、text-file-s3-uri オブジェクトの S3 URI から未処理テキストを取得して、それを Amazon SageMaker Ground Truth が必要とする taskInput JSON フォーマットに変換します。

{
 'taskInput': {
   'taskObject': 's3://smgtannotation/raw-abstracts-jpgs/1801_00015.jpg',
   'metadata': {
	'Author': 'Mary Major',
	'ISBN': '1-242-55362-2',
	'text_file_s3_uri': 's3://smgtannotation/text/1801_00015.jpg.csv'
   },
   'text': <Raw Text>	},
   'isHumanAnnotationRequired': 'true'
} 

ポストラベリングタスクの Lambda 関数

すべてのワーカーがラベリングタスクを完了したら、Amazon SageMaker Ground Truth が データセットオブジェクトとワーカーのアノテーションへのポインターでポストラベリング Lambda 関数を呼び出します。この Lambda 関数は、一般にアノテーションの統合に使用されます。リクエストオブジェクトは以下に似たものになります。

{
"version": "2018-10-06",
"labelingJobArn": "<labeling job ARN>",
"payload": {
"s3Uri": "‘<s3uri of annotation consolidation request>"
},
"labelAttributeName": "<labeling job name>",
"roleArn": "<Amazon SageMaker Ground Truth Role ARN>",
"outputConfig": "<output s3 prefix uri>"
}

アノテーションは payload オブジェクト内の s3uri によって指定されたファイルに保存されます。Lambda 関数は、アノテーションを読み取るためにこの S3 オブジェクトファイルを取得します。各入力アノテーションは以下に似たものになります。

[{'datasetObjectId': '0',
  'dataObject': {'content': <input manifest task content>},
  'annotations': [{
	'workerId': <worker Id>,
	'annotationData': {'content': <named entity annotations>}
	}]
}]

カスタム UI フォームからのすべてのフィールドは、content オブジェクトに含まれています。

Lambda 関数は次に、ラベリングジョブの設定時に出力用に指定された S3 バケット内に統合されたアノテーションのマニフェストを作成するため、データ統合を開始します。以下の例には、content オブジェクトに統合レスポンスが含まれています。

{
  "source-ref": "s3://smgtannotation/raw-abstracts-jpgs/1801_00006.jpg",
  "text-file-s3-uri": "s3://smgtannotation/text/1801_00006.jpg.csv",
  "metadata": {
			"Author": "Alejandro Rosalez",
			"ISBN": "1-358-98355-0"
		  },
  "<labeling jobname": {
"annotationsFromAllWorkers": [{
	"workerId": "<internal worker id>",
	"annotationData": {
"content": "{\"annotations\":\"{\\\"value\\\":[{\\\"start\\\":296,\\\"end...\"}"
		}]
	},
  "custom-ner-job-23-metadata": {
	"type": "groundtruth/custom",
	"job-name": "<labeling jobname>",
	"human-annotated": "yes",
	"creation-date": "2019-04-18T20:24:18+0000"
		}
}
{… }

プレラベリングタスクおよびポストラベリングタスクの Lambda 関数のデプロイメント

AWS コンソールにサインインして、米国東部 (バージニア北部) us-east-1 リージョンで AWS CloudFormation スタックを起動します。これにより、プレラベリングタスクおよびポストラベリングタスクの Lambda 関数がデプロイされます。

Lambda 関数のデプロイメントと必要な AWS Identity and Access Management (IAM) ロールの作成は数分足らずで終了するはずです。

AWS CloudFormation コンソールを開き、[出力] セクションで IAM ロールの Amazon リソースネーム (ARN) をメモします。これは後で必要になります。

AWS Lambda コンソールを開き、[関数] ページに移動して Lambda 関数を確認します。

Amazon SageMaker Ground Truth ラベリングジョブの開始

ワークフォースは、データセットにラベルを付けるために選択されるワーカーのグループです。Amazon SageMaker Ground Truth では、パブリック Amazon Mechanical Turk ワークフォース、ベンダー管理のワークフォース、またはユーザー独自のプライベートワークフォースを選択できます。このラベリングジョブには、プライベートワークフォースを使用します。

前提条件

ラベリングジョブを作成する前に、以下のステップを完了してください。

  1. 拡張マニフェストファイルをバージニア北部リージョン内の S3 バケットにアップロードする。
  2. ラベリングジョブには、SageMakerFullAccess ポリシーがアタッチされた IAM ロールが必要です。このようなロールをまだ作成していない場合は、ラベリングジョブの開始にある手順に従って作成してください。
  3. IAM ロールに信頼ポリシーをアタッチする。このポリシーは、Amazon S3 に保存されているリソースへのアクセス権をポストラベリング Lambda 関数に付与します。
    1. 新しいブラウザタブで IAM コンソールを開きます。ナビゲーションペインで [ロール] を選択し、ステップ 2 で作成した IAM ロールを検索します (ロールの名前は、通常 AmazonSageMaker-ExecutionRole- で始まります)。[ロール名] で名前を選択します。
    2. [概要] ページで [信頼関係] を選択し、次に [信頼関係の編集] を選択して信頼ポリシーを編集します。
    3. 信頼ポリシーを以下のポリシーに置き換えます。<Lambda IAM Role ARN>AWS CloudFormation テンプレート出力からコピーしたロール ARN に置き換えます。
      {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Service": "sagemaker.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
          },
          {
            "Effect": "Allow",
            "Principal": {
              "AWS": "<Lambda IAM Role ARN>",
              "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
          }
        ]
      }
      
    4. [インラインポリシーの追加] リンクをクリックして、ロールに AWS Lambda 呼び出しポリシーを追加します。
    5. [ポリシーの作成] ページの [JSON] タブで、以下の json ポリシーを追加して [ポリシーの確認] をクリックします。

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Sid": "VisualEditor0",
                  "Effect": "Allow",
                  "Action": "lambda:InvokeFunction",
                  "Resource": "*"
              }
          ]
      }
    6. [ポリシーの確認] ページで、[名前] に「LambdaInvocationPolicy」を入力して [ポリシーの作成] をクリックします。

ラベリングジョブの開始

  1. Amazon SageMaker コンソールを開き、バージニア北部リージョンが選択されていることを確認します。[ラベリングジョブ] メニューで [ラベリングジョブの作成] をクリックして新しいラベリングジョブを開始します。
  2. [ジョブ名] に名前を入力し、入力マニフェストの S3 ロケーションを入力して (このマニフェストは、前提条件ステップ 1 ですでに S3 バケットにアップロードされています)、出力データセットの S3 プレフィックスロケーションを入力します。Amazon S3 内の入力マニフェストと出力データセットの場所が開始しているジョブと同じリージョン内にあることを確認してください。「SageMakerFullAccess」IAM ポリシーがアタッチされた既存の IAM ロールを選択、またはそれがない場合は新しいロールを作成します。
  3. Lambda 信頼ポリシーがこの記事の IAM ロールにすでに追加されている場合、このステップは省略してください。追加されていない場合は、新しいタブでブラウザを開き、前提条件のステップ 3 を実行して IAM ロールに信頼ポリシーをアタッチします。
  4. [タスクのタイプ] で [カスタム] を選択し、[次へ] を選択します。
  5. ワーカータイプには [プライベート] を選択します。ワークチームをすでに作成している場合は、それを選択して次のステップに進みます。今回初めてプライベートワークチームで Ground Truth ジョブを開始する場合は、チーム名を入力し、招待したいワーカーのコンマで区切った E メールアドレスを追加、そして組織を追加して、ワーカーが必要に応じて連絡するための連絡先 E メールを入力します。
  6. [テンプレート] には [カスタム] を選択し、カスタムテンプレートをコピーして貼り付けます。
  7. [Lambda 関数のプレラベリングタスク] と [Lambda 関数のポストラベリングタスク] には、それぞれのドロップダウンを使って [gt-prelabel-task-lambda] および [gt-postlabel-task-lambda] を選択してから、[送信] を選択します。
  8. 数分でプライベートワーカーがポータルにログインし、ラベル付けを開始できるようになります。

まとめ

このブログ記事では、Amazon SageMaker Ground Truth を使ってカスタムラベリングワークフローを構築する方法について説明しました。カスタムワークフローは、拡張マニフェストからの複数の入力属性を事前処理し、カスタムに作成されたラベリング UI を使用してから、個々のワーカーアノテーションを忠実性に優れたラベルセットに統合しました。カスタムワークフローは、パブリック、プライベート、またはベンダーの各ラベリングワークフォースを活用するときに、ユーザー独自のラベリングビジネスニーズを容易に満たすことを可能にします。

このブログ記事にご意見や質問がおありの場合は、以下のコメント欄をご利用ください。ラベリングがうまくいきますように!

関連ブログ記事


著者について

Nitin Wagh は Amazon AI のシニアビジネス開発マネージャーで、お客様が機械学習と AWS クラウドにおける Augmented AI の力について理解できるように援助できる機会が好きです。余暇には、アウトドア活動で家族との時間を楽しんでいます。

 

 

 

Hareesh Lakshmi Narayanan は Sagemaker GroundTruth に携わるソフトウェア開発エンジニアです。Hareesh は、現実世界の問題を解決するためのソフトウェアシステムの構築に情熱を傾けています。

 

 

 

Ted Lee は Amazon AI のソフトウェア開発エンジニアです。Ted は、機械学習と AI のお客様がヒューマンアノテーター向けのユーザーインターフェイスを作成できるよう援助することに焦点を当てています。