Amazon SageMaker Ground Truthで画像分類用教師画像を作ってみる – Amazon SageMaker Advent Calendar 2018

こんにちは、大阪DI部の大澤です。 この記事は「クラスメソッド Amazon SageMaker Advent Calendar」の5日目の記事となります。

今回は「Amazon SageMaker Ground Truthでの画像分類用教師画像の作成」についてご紹介します。
先月末のre:Inventで発表された新サービス、Amazon SageMaker Ground Truthを使って画像分類用教師画像を作ってみたいと思います。

Amazon SageMaker Ground Truthとは

Amazon SageMaker Ground Truthは機械学習の教師あり学習の教師データを作成する際に必要となる、データのラベル付けを行えるサービスです。 ラベル付けは数十個のデータであればまだなんとかなりますが、数千・数万とかの規模になるともう自分だけではどうにもなりません。そういった際にAmazon Mechanical Turkやベンダー、もしくは自ら指定した人たちで構成するチームに対して、ラベル付けを依頼し、ラベル付けされたデータセットを管理できるサービスです。

AWSの公式ブログでは以下のように紹介されています。

Amazon SageMaker Ground Truth は以下のデータセットの構築をお手伝いします。

・テキスト分類 ・画像分類 (画像を特定のクラスに分類する) ・物体検出 (画像内の物体の位置をバウンディングボックスとともに取得) ・セマンティック・セグメンテーション (ピクセル精度で画像内の物体の位置を取得) ・ユーザ定義のカスタムタスク Amazon SageMaker Ground Truth は必要に応じてアクティブラーニングを使用し、インプットデータのラベル付けを自動化することもできます。アクティブラーニングは機械学習のテクニックで、人によりラベル付けされるべきデータと機械がラベル付けできるデータを特定する手法です。自動化されたデータのラベル付けには Amazon SageMaker の学習・推論のコストがかかりますが、人手で全データセットをラベル付けするのに比べて、コスト (最大70%) と時間を削減することができます。

手作業が必要な場合は、クラウドソーシングのマーケットプレイスである Amazon Mechanical Turk で50万人以上のワーカーの労働力、プライベートな労働力として独自のワーカー、あるいは AWS Marketplace に記載された精選されたサードパーティベンダーをお選び頂くことが可能です。

やってみる

ラベリングジョブの作成

まずはラベリングジョブを作成します。 マネジメントコンソールのSageMakerのページを開き、右側のメニューからGroundTruthのラベリングジョブを開きます。 Create labeling jobからラベリングジョブを作成します。

まずはJob overviewの設定からです。

  • Job name: ジョブ名
  • Input dataset location: データセットのマニフェストファイルを指定
    • 入力データセットの形式: Input Data - Amazon SageMaker
    • 自分でマニフェストファイルを作成しなくても、Create manifest fileを選択しデータセットが入っているディレクトリを入力することで、自動で作成してくれます。
  • Output dataset location: ラベリングジョブによってラベル付けされたデータの出力先
  • IAM Role: ラベリングジョブ実行に必要なIAMロールを指定

次にTask typeの設定です。ここではどういうタイプかだけを選択します。ワーカーが選択可能なラベルなどの設定については、次のステップで行います。

  • Image Classification: 各画像に対して適切なラベルを選ぶタスクです。各画像に関連づけられるラベルは1つのみです。
    • 今回試すのはこのタスクです。
  • Bounding box: 画像内の適切な範囲を覆う、ラベルに紐づいたバウンディングボックスと呼ばれる矩形を作成します。
  • Text classification:各テキストに対して適切なラベルを選ぶタスクです。各画像に関連づけられるラベルは1つのみです。
  • Semantic segmentation: 各ピクセル毎にラベルを割り当てるタスクです。
  • Custom: 自らでラベリング方法とUIを定義します。

ワーカーの選択を行います。

  • Public: Amazon Mechanical Turkに登録しているワーカーにラベル付けを依頼します。ヌードなどの不適切な内容や個人情報が含まれている場合には利用できません。
  • Private: 指定したPrivateチームに対してラベル付けを依頼します。
  • Vendor: サードパーティのベンダーにラベル付けを依頼します。ベンダーはマーケットプレイスを介して探すことができます。

今回はPrivateチームで試します。Private チームがまだ存在しない場合には作成が必要です。 チームの作成には以下の項目の設定が必要です。

  • Team name: チーム名
  • Invite private annotators: ラベル付けを行ってもらいたい人(アノテーター)のメールアドレスをカンマ区切りで入力します。
  • Organaization: 組織名。アノテーターに招待メールを送るときに表示される。
  • Contact email: 何かあったときに連絡が来るメールアドレス。

今回は自分でラベル付けを行うので、自分自身のみをチームに含めます。

次にラベリングツールの設定を行います。 今回は画像分類用のラベル付けを行うためそれ専用のツールに関する設定になります。前のTask typeで異なるものを選んでいた場合には、それぞれ異なる設定内容になります。

画像分類用の場合には説明用文章とoption(選択肢、ラベル)の設定が必要です。例えば以下のような感じです。

右上にあるPreviewを選択することで、アノテーターがラベル付けを行う際の画面で試すことができます。

設定画面に戻り、Submitで設定を送信すればラベリングジョブの作成は完了です。プライベートチームをワーカーとして選択していた場合には順次チーム内のメンバーへメールが自動的に送られます。

ラベリング

プロジェクトへの招待メールがamazonses.com経由で届きます。その中にログイン用のリンクが書かれているのでアクセスし、メールに記載のUser nameTemporary passwordを入力してログインします。ログイン後はパスワードの再設定が求められるので、指示に従い再設定します。 再設定後、ジョブ一覧ページが開きます。その中に先ほど作成したラベリングジョブも含まれているはずです。ジョブがない場合は現れるまで少し待つか、作成したジョブが正しく作成できているか確認するのが良さそうです。

対象のジョブを選択して、右上のStart workingをクリックすることでラベル付けを始めることができます。

ラベル付けは中央に表示された画像に対して適切なラベルを右側から選択してSubmitすることで次に進めることができます。

全ての画像のラベル付けが終了すると、ジョブ一覧画面に戻ります。 全てのジョブが終わると以下のような感じで表示されます。

※23枚の画像で試した際、最初のラベル付けジョブでは10枚の画像しかありませんでした。しばらくすると、新しいジョブが一覧に表示されてラベル付けができるようになってました。全画像分のラベル付けが終わって無いのにジョブがもう表示されないという場合はしばらく待ってみるといいかもしれません。

ラベリング結果の確認

全ての画像のラベル付けが終わって、マネジメントコンソールのラベリングジョブ一覧を見てみると、ジョブのLabeled objects / totalという箇所がラベル付けした枚数だけ更新されているかと思います。StatusもしばらくするとCompleteに変化します。

データセットのラベリング(Labeling datasets)というページではデータセットの一覧を見ることができます。データセットのマニフェストファイルの場所と作成日が記載されています。 データセットをクリックすることで詳細を開くことができ、そこではどういう画像が含まれているかを確認できます。

記載されているマニフェストファイルにラベル付けされたデータセットの情報が書かれています。マニフェストファイルの内容などの詳細についてはドキュメントをご確認ください。

画像分類モデルの学習

SageMaker Ground Truthのラベリングジョブによって作成したマニフェストファイルは、SageMakerでモデルの学習を行う際の入力データとして使うことが出来ます。

執筆時点ではマネジメントコンソール、SageMaker Python SDKでAttributeNamesを指定する方法が見つからなかったので、現時点においてはboto3から学習ジョブを作成する必要があります。
create_training_jobInputDataConfigで設定するデータチャネルデータを以下のようにした上で、AlgorithmSpecificationTrainingInputModeを"Pipe"とすることで、SageMaker Ground Truthのマニフェストファイルを画像分類の学習ジョブにおける教師データとして使用できます。

    {
        "ChannelName": "train",
        "DataSource": {
            "S3DataSource": {
                "S3DataType": "AugmentedManifestFile",
                "S3Uri": "s3://bucket-name/path/to/labeled-data.manifest", # マニフェストファイルのパス
                "S3DataDistributionType": "FullyReplicated",
                "AttributeNames": [ # AttributeNamesでマニフェストファイルの中で参照すべきデータのAttribute名
                    "source-ref", #(必須)画像のあるs3パスのAttribute名
                    "labeling-job-name", #(必須)画像のクラス(ラベル)IDのAttribute名としてラベリングジョブ名が使われてるので、ジョブ名を入力する必要がある
                    "labeling-job-name-metadata"   #(必須ではない)コンフィデンス値や作成日などのメタデータのAttribute名(ラベリングジョブ名+'-metadata')
                ]
            }
        },
        "ContentType": "application/x-recordio",
        "RecordWrapperType": "RecordIO",
        "CompressionType": "None"
    }

さいごに

今回は 「クラスメソッド Amazon SageMaker Advent Calendar」 の6日目として、「Amazon SageMaker Ground Truthでの画像分類用教師画像の作成」についてお送りしました。今回は自らでアノテーションを行いましたが、アノテーションは外部のチームやAmazon Mechanical Turk、ベンダーに発注することができます。教師画像の規模感や予算に応じて、そういった手段の利用を検討するのが良さそうです。 また、アノテーションの種類も画像分類だけではなく、テキスト分類、物体検出、セマンティックセグメンテーション、ユーザー定義のカスタムタスクも可能です。そういった用途における教師データの作成が必要な際に試してみてはいかがでしょうか。

お読みくださりありがとうございました〜!明日もお楽しみに〜!

参考