Amazon Web Services ブログ
Amazon SageMaker Ground Truth を使用して階層型ラベル分類法を作成する
re:Invent 2018 で、私たちは Amazon SageMaker Ground Truth を発表しました。これは、機械学習を使用して非常に正確なデータセットを構築し、ラベル付けのコストを最大 70% 削減することができます。Amazon SageMaker Ground Truth を使用すると、パブリックおよびプライベートでラベル付けを行う人間の作業者に簡単なアクセスと、一般的なラベル付けタスクのための組み込みのワークフローとインターフェースが提供されます。さらに、Amazon SageMaker Ground Truth は自動データラベル付けを使用してラベル付けのコストを削減します。自動データラベル付けは、人間がラベルを付けたデータから Ground Truth をトレーニングし、サービスが独自にデータにラベルを付けることを学習することによって機能します。
路上でカメラで撮影した画像の大規模なコーパスがあるとしましょう。それぞれの画像には、無人自動車用のアルゴリズムを開発するために重要な多くの異なる対象物 (たとえば、車または交通標識) が含まれている可能性があります。最初に、画像から取得したい情報の階層表現を定義する必要があります (そのようなラベル分類法がどのように見えるかの例については、下記を参照してください)。次に、これらのラベルが付いていない未処理の画像を取得し、高レベルのクラス (「車」、「交通標識」、「歩行者」など) でラベル付けすることによってラベル付けプロセスを開始します。
このブログ記事では、ジョブをチェーンさせて拡張マニフェスト機能を利用することで、Amazon SageMaker Ground Truth を使用してこのような階層的なラベル付けを実現する方法を紹介します。
通常の解決方法
教師あり機械学習では、通常、未加工データと各データオブジェクトの関連ラベルの両方を含むラベル付きデータセットを使用します。たとえば、道路画像のトレーニングデータセットを作成し、それらを「交通標識あり」または「交通標識なし」に分類することができます (ラベル 0 と 1 が 2 つのクラスに対応します)。これらのラベルは通常、CSV や JSON などの形式で保存され、最初の列は未加工データを表し、2 番目の列はラベルを表します。
ただし、同じセットの画像にさらにラベルを付けたい場合 (たとえば、「交通標識あり」セット内の交通標識の種類を識別するため)、通常、最初のデータセットに対してフィルタ処理を実行して交通標識が含まれている画像だけを選択して、新しいデータセットを作成します。これにより、データセットは「交通標識」 (ラベル 0) だけを含む別のサブセットに縮小されます。その後、新しいラベルを追加して、標識を「一時停止標識」、「制限速度」などに分類することができます。
こうした種類のフィルタリング操作は、大規模なデータセットではコストや時間がかかる可能性があります。また、物体検出 (バウンディングボックス) アルゴリズムによって、画像内のすべての停止標識と歩行者をマークしたいと考えるかもしれません。このため、通常、画像の中の停止標識と歩行者のそれぞれの周囲に、物体検出ラベルを追加して 3 番目のデータセットを作成する必要があります。深く分類し続けるにつれて、トレーニングデータセットの数と複雑さは分類法のファンアウト係数 (最も複雑な場合は指数関数) とほぼ同じ割合で増加します。
簡単に言うと、階層的分類法を使用するときは、以下のすべてを実行できる必要があります。
- 複数のラベル層を画像に関連付け、効率的かつ費用対効果の高い方法で保存および取得できる。
- 指定されたラベルを含むフィルタ処理されたデータセットを効率的かつ費用対効果の高い方法で作成できる。
- 複数のラベルを含むデータセットで特定のラベルのモデルをトレーニングできる。
Amazon SageMaker Ground Truth は、ジョブのチェーンと拡張マニフェスト機能を使用して、これらのタスクを簡単に完了できます。
ジョブのチェーン
データセットにラベルを付けるとき、異なる UI や劇的に異なるラベル付けコンテキストを必要とする異なる種類のラベル (画像分類、バウンディングボックス、セマンティックセグメンテーションなど) があることがよくあります。そのために、最適な品質を実現するためにラベラーに対して異なる指示が必要となります。こうした場合、ラベル付けのジョブを複数の実行に分割することが必要になる可能性があります。Amazon SageMaker Ground Truth は、ジョブのチェーンを通じてこのワークフローをサポートします。ジョブのチェーンとは、あるラベル付けジョブの出力が出力拡張マニフェストを介して次のジョブにフィードされるワークフローを指します。それぞれの手順で、前のジョブのラベルに基づいてフィルタを適用することもできます。
特定したい特徴が含まれているとすでに識別されている画像に対して、より高価なタスク (セマンティックセグメンテーションなど) だけを実行する場合、ジョブのチェーンはコスト削減策になり得ます。異なるタイプのワーカーを混在させる機会も提供することができます。パブリックなワーカーを使用して簡単なラベル付けおよびフィルタリング作業を実行し、プライベートおよび精選された労働力を使用して、より正確または専門的な専門知識が必要な作業を実行します。
ここでのストリートシーンの例では、まず画像を含むマニフェストから始め、次に各レベルのラベルを徐々に追加します。このプロセスで、フィルタでデータセットを細分化します。ワークフローは次のようになります。
- ラベルなしの初期データを収集します。
- ジョブ1: 道路オブジェクトのラベル付け (画像分類ジョブ)。出力は、車、交通標識、歩行者のラベル付きの拡張マニフェストになります。
- ジョブ2: 車があるすべての画像を選択し、これらの画像内のそれぞれの車の周りにバウンディングボックスを描画します。
拡張マニフェストとは?
拡張マニフェストとは、各行が完全で有効な JSON オブジェクトである、UTF-8 でエンコードされた JSON 行ファイルです。各行は標準の改行、「\n」または「\r\n」で区切られています。各行が有効な JSON オブジェクトである必要があるため、JSON 内にエスケープされていない改行文字を含めることはできません。データ形式の詳細については、JSON 行を参照してください。
拡張マニフェストには、データセットオブジェクトを定義するソースフィールドと、オプションで属性フィールドも含める必要があります。それぞれのラベル付けジョブは、2 つの追加属性フィールドを出力します。1 つはラベルを含み、もう 1 つはラベルに関連付けられたメタデータを含みます。拡張という用語は、データセットオブジェクトのグラウンドトゥルースラベルがインラインで拡張されているという事実から来ています。データセットオブジェクトの新しいラベルは、拡張マニフェストの対応する JSON 行に新しい属性フィールドとして拡張されます。
通常、Amazon SageMaker のトレーニングジョブには、実際の画像をトレーニングするための 1 つのチャネルとラベルのための追加チャネルがあります。拡張マニフェストを使用すると、1 つのチャネルで画像とラベルの両方をストリーミングすることができます。これにより、チャネル数が半分になり、ラベルファイルとそれに対応する画像ファイルを関連付ける際の複雑さが軽減されます。
この単一の一貫した形式を、追加の変換や再フォーマットなしで、ラベル付けジョブへの入力およびトレーニングジョブへの入力として使用できます。ラベル付けジョブの出力も同じ形式であるため、この形式は過渡的です。つまり、ラベル付けジョブの出力を別のラベル付けジョブへの入力としてフィードすることができるため、変換や再フォーマットを行わずにラベル付けジョブをチェーンすることが容易になります。
それでは、サンプルの拡張マニフェストを構築して、先ほど説明した分類法の問題を解決しましょう。
さあ、やってみましょう!
公道を運転する車に搭載されたカメラから撮影された何百万もの画像があると仮定しましょう。画像は、Amazon S3 バケットの s3://mybucket/datasets/streetscenes/ という場所に保存されています。画像を車、交通標識、歩行者に分類するラベル付けジョブを開始するには、まず Amazon SageMaker Ground Truth にフィードされるマニフェストを作成する必要があります。マニフェストの唯一の必須フィールドは、データセットオブジェクトを定義するフィールドです。データセットオブジェクトは、オブジェクトの s3Uri を指すフィールド「source-ref」で表される画像や、マニフェストで「source」として直接表すことができるテキストなど、Amazon S3 バケット内のオブジェクトにすることができます。この例では、「source-ref」を使ってストリートシーンの画像を指定します。詳細については、Amazon SageMaker Ground Truth の入力セクションを参照してください。
ステップ 1: サンプルデータセットのダウンロード
この例では、CBCL StreetScenes データセットを使用します。このデータセットには 3,000 を超える画像がありますが、10 の画像を選択します。完全なデータセットは約 2 GB です。ラベル付けのためにすべての画像を Amazon S3 にアップロードすることもできますし、選択した画像だけをアップロードすることもできます。
- 次の場所から、images.zip をダウンロードします: ダウンロード。
- zip アーカイブをフォルダに解凍します。(デフォルトでは、フォルダは「Output」になります。)
- 使用する小さなサンプルデータセットを作成します。
- Amazon S3 コンソールに移動して、バケット内に「streetscenes」フォルダを作成します。(注意: Amazon S3 はキーバリューストアなので、フォルダという概念はありません。ただし、AmazonS3 コンソールでは、キーにスラッシュを使用することでフォルダ構造の感覚を与えています。そのため、コンソールを使ってフォルダを作成します。)
- 以下のファイルを Amazon S3 バケット (s3://mybucket/datasets/streetscenes/) にアップロードします。Amazon S3 コンソール、または次の AWS CLI コマンドを使用することができます。
ステップ 2: 入力マニフェストの作成
Ground Truth 用の Amazon SageMaker コンソールには、Ground Truth に使用できるクロールツール (ラベル付けジョブへの入力の「マニフェストファイルの作成」リンクを参照) があります。このツールを使用すると、未加工データ (画像またはテキスト) を含む Amazon S3 の場所をクロールすることでマニフェストを作成できます。画像の場合、このクローラは入力 s3Prefix を受け取り、そのプレフィックスを持つすべての画像ファイル (拡張子 .jpg、.jpeg、.png) をクロールし、各行を {“source-ref”:”<s3-location-of-crawled-image>”} としてマニフェストを作成します。テキストの場合、このクローラーは入力 s3Prefix を取り、そのプレフィックスを持つすべてのテキストファイル (拡張子 .txt、.csv) をクロールし、そのプレフィックスを持つそれぞれのテキストファイルの各行を読み取り、各行を {“source”:”<one-line-of-text>”} としてマニフェストを作成します。
Amazon SageMaker コンソールで、ラベル付けジョブを作成してプロセスを開始します。最初に左側のナビゲーションペインで [Labeling jobs] を選択してから、[Create labeling job] ボタンを選択します。
次に、[Create manifest file] を選択します。
これにより、マニフェストファイルの作成ページが開きます。ファイルをアップロードした場所の s3 パスを入力します (末尾のスラッシュを忘れずに含めます)。次に、[Create] を選択し、[Use this manifest] を選択します。(マニフェストを作成するのに数秒かかります。)
この分類の例では、オブジェクトは Amazon S3 内の画像なので、クロールを使用して JSON の各行に画像の s3Uri を指すフィールド「source-ref」を含む初期マニフェストを作成することができます。
ジョブ 1: 道路オブジェクトのラベル付け
これで、コンソールから、画像分類タスクを使用してラベル付けジョブを開始し、車、交通標識、歩行者を含むものとして画像を分類できます。このファイルを入力として使用し、「streetscenes-road-objects1」 をジョブ名として使用します (または、LabelAttributeName を「road-objects」に設定して AWS API を使い始めることができます)。ラベル付けジョブを開始する方法については、こちらの前の記事を参照してください。
ラベル付けジョブの出力は、対応するラベルが前の各 JSON 行で拡張された拡張マニフェストです。さまざまな様式の形式についての詳細は、出力データのドキュメントを参照してください。自動データラベル付けを有効にすると、別の出力アーティファクトとしてモデルも取得されます (自動データラベル付けの詳細については、このブログ記事を参照してください)。
ジョブ 2: 「車」の周りにバウンディングボックスを追加する
これで各画像に存在する道路オブジェクトのラベルを含むデータセットができたので、分類法の次のレイヤを追加するためのジョブを定義できます。次のレイヤは、画像内の個々のオブジェクトの周囲にバウンディングボックスを追加することです。
注意: 車を自動車、自転車、トラックなどに分割するために中間的な 2 次分類を実行することができますが、この例では、 単に自動車のバウンディングボックスジョブを作成し、すべての画像を車でフィードします。実際には、より大きなデータセットを使用する場合、中間的分類を実行することを選択すると、各ジョブのオブジェクト数が減り、ジョブを並行して実行する機会も得られます。
以下のスクリーンショットで、2 番目のジョブでも、最初のジョブに似た命名規則に従っていることがわかります。また、ジョブ 1 から output.manifest も選択しています。
フィルタ: 車の選択
画像を 3 種類の道路オブジェクト (分類の最初のレベル) を含むものに分類した後、今度はデータセットをフィルタリングして車だけを含むようにします。これで、自動車を表すオブジェクト (バウンディングボックス) を識別する別のラベル付けジョブを開始できます。Amazon SageMaker コンソールには、データセットのフィルタリングを容易にしてデータのサブセットをクリーンアップまたは作成するための S3 Select を搭載したクエリエンジンが装備されています。
この場合、クエリボックスに次のクエリを適用して、拡張マニフェストをフィルタ処理し、「車」を含む画像だけを含むサブセットを作成することができます。
次に、[Create subset] を選択し、[Use this subset] を選択します。これにより、次のような新しいマニフェスト (この例では 7 行) が作成されます。
新しい拡張マニフェストは次のようになります。
ジョブ 2 の設定
フィルター処理された拡張マニフェストを取得した後、再度労働力を選択して、ジョブの指示を書く必要があります。この場合、私一人からなるプライベートな労働力を選びます。
ジョブ 1 と同様に、パブリックの労働力を選択することもできましたが、より小さいデータセットで領域の専門知識を持つ別の労働力を使用できることを実証するためです。車をバウンディングするような単純なタスクでは、おそらくどのような労働力を選択しても、適切な指示があればうまくいくでしょう。ただし、医療用画像処理のような別の例では、より安価な労働力によって単純なフィルタリング/分類を実行した後に、トレーニングを受けた放射線科医に癌性細胞を分類させることができます。
ジョブのパラメータを定義した後、いくつかの実践的な指示を書く必要があります。理想的には、オブジェクトの周囲にバウンディングボックスを描画して、それらがどのように出力に含まれると予想されるかを示します。ただし、この場合、私がアノテーターになるので、デフォルトのイメージを使用してタスクを説明します。
結果
ジョブが完了すると、コンソールジョブの出力でバウンディングボックスがどのように見えるかを確認できます。
完了したマニフェストは、上記のマニフェストの [streetscenes-road-objects2] および [streetscenes-road-objects2-metadata] フィールドで拡張されています。たとえば、このマニフェストの最初の JSON 行は次のようになります。
マルチラベル?
ジョブ 1: 「道路オブジェクトのラベル付け」では単一のラベルしか選択できないことが、結果またはラベラー UI に表示されることがあります。 これは、各画像が単一のラベル (車、交通標識、歩行者) だけを含むこととして明らかになります。このデータセットでは、特定の画像に複数のラベルを含めることが完全に有効です。たとえば、単一の画像に車、歩行者、および停止の標識が含まれている場合があります
現在、Ground Truth の画像分類では単一のラベルで画像をラベル付けすることだけをサポートしています。この例の目的のために、単純にして、デフォルトの画像分類を使うことを選びました。マルチラベルに拡張するには、いくつかの選択肢があります。
- ラベルごとの画像分類ジョブ: 車、歩行者、交通標識が別々のジョブになります。それぞれの画像はすべてのジョブを使用して実行されます (必要に応じて並行して)。
- カスタムラベル付けワークフローを作成する: Ground Truth には、顧客がワーカーの入力用に HTML を提供できるワークフローがあります。この方法を使用すると、単一のパスで複数のラベルを単一の画像に適用できるようにするワークフローを作成できます。
次のステップ: 複数のラベルを含む拡張マニフェストを使ったトレーニング
拡張マニフェストの主な特徴は、このブログ記事で説明したチェーン方法を使用して、同じマニフェストにさまざまなラベル付けジョブからのラベルを含めることができることです。そのため、拡張マニフェストを使用して、モデル内の必要なラベルについてモデルをトレーニングすることができます。たとえば、このブログ記事のマニフェストには、「streetscenes-road-objects1」と「streetscenes-road-objects2」の 2 つのジョブからのラベルが含まれています。
S3DataType
を AugmentedManifestFile
とし、AttributeNames
を [“source-ref”, “road-objects”] として Amazon SageMaker トレーニングジョブを開始するための変換なしでこの出力マニフェストを直接使用することにより、画像分類モデルをトレーニングして道路オブジェクトを分類することができます。
S3DataType
を AugmentedManifestFile
とし、AttributeNames
を [“source-ref”, “streetscenes-road-objects2”] として Amazon SageMaker トレーニングジョブを開始するための変換なしでこの出力マニフェストを直接使用することにより、物体検出モデルをトレーニングして車を識別することができます。
拡張マニフェストを使用して Amazon SageMaker のトレーニングジョブを開始するには、このサンプルノートブックを参照してください。
結論
このブログ記事では、階層型ラベル分類法で複数のラベルを関連付けるために、ジョブのチェーンと拡張マニフェストをどのように使用できるかを説明しました。拡張マニフェストには、すべてのラベルが単一のマニフェストにインラインで含まれているので、このマニフェストを Amazon SageMaker のトレーニングジョブで直接使用することができます。さらに、Ground Truth のフィルタリングおよびサンプリングの機能を使用して、ラベルまたはメタデータに基づいてデータセットのサブセットを作成する方法も学びました。
Amazon SageMaker Ground Truth に何ができるかを描き始めたところですが、この記事が参考になることを願っています。このサービスは、本日から米国東部 (バージニア)、米国東部 (オハイオ)、米国西部 (オレゴン)、欧州 (アイルランド)、アジアパシフィック (東京) の各 AWS リージョンでお使いいただけます。ぜひ、ご意見をお聞かせください。
著者について
Doug Youd は、AWS で戦略的アカウントを担当するソリューションアーキテクトです。彼のバックグラウンドはネットワーキングと仮想化ですが、最近は顧客のために ML プロジェクトに取り組んでいます。余暇には、クラシックカーやモータースポーツを楽しんでいます。
Zahid Rahman は AWS AI の SDE であり、複雑な機械学習の問題を解決するために大規模な分散システムを構築しています。彼は主に、ビッグデータの問題を「分割して征服する」革新的な技術に焦点を当てています。