SageMaker Ground Truthによる物体検出用データセットの作成

# Amazon SageMaker Ground Truth
先日、AWSの教師データ作成のサービス`Amazon SageMaker Ground Truth`の使い方や特徴を調べる機会がありました。ところどころ躓いたりもしたので、それらを含めて使うまでの流れをまとめたいと思います。

[Amazon SageMaker Ground Truth](https://aws.amazon.com/jp/sagemaker/groundtruth/)とは、Amazonの提供する教師データを作成するためのサービスです。このサービスを通して、自前あるいはクラウドソーシングによるデータのラベル付けを行うことができます。

以下のラベリングタスクが利用可能です。

* Image classification
* Bounding box (object detection)
* Text classification
* Semantic segmentation
* Custom (未調査)

`Image classification`と`Bounding box(object detection)`について見ていきたいと思います。
<font color="red">注) `Image classification`では、複数クラスのラベルを定義できますが、`Bounding box`では、単一のラベルしか定義できないです(2019.2.5現在)。複数クラスの物体検出用の教師データを作成したい場合は注意。</font>

## 主要な概念
SageMaker Ground Truthを始めるにあたって、以下の3つの概念を認識しておくと、全体像を把握しやすいと思います。

* <strong>Labeling Job</strong>: ラベリング作業の定義と状態を表します。status, task type, progressなどを含みます。<img src="https://qiita-image-store.s3.amazonaws.com/0/46493/339462d8-20a0-5117-2467-ae306921574e.png" width="804">
* <strong>Labeling Dataset</strong>: 教師データ作成ようのデータ(画像またはテキスト)の集合です。
* <strong>Labeling Workforce</strong>: ラベリング作業を行う人的リソースです。チームとそれを構成するワーカーから成り立ちます。`Public`, `Private`, `Vendor`の3種類のWorkforceがあります。
    * `Public`: Amazon Mechanical Turkの経由でのワーカーです。チームはグローバルチームになります。
    * `Private`: ラベリング作業に内部リソースを使う場合はこちらです。メールアドレスでワーカーのアカウントを作成します。
    * `Vendor`: ラベル作成業者をAWS Marketplaceから選びたい場合用です。

## Jobの作成
<font color="red">まず、us-east-2 (ohio) リージョンのS3バケットを作成し、そこにデータをアップロードします。</font>記事執筆時点で別のリージョンのバケットはサポートされていないです。ここでは、`s3://my-sagemaker-sample`というバケットを作成して、その中の`sample-data`というディレクトリに画像データを置きました。

データの準備ができたら、[Labeling jobsのページ](https://us-east-2.console.aws.amazon.com/sagemaker/groundtruth)でJobを作成していきます。流れに従ってフォームを埋めていきます。

### Job overview
Jobの名前や、データの入力、出力場所などを指定します。
<img width="804" alt="スクリーンショット 2019-02-05 15.01.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/46493/89cd0223-9d7d-d45d-8504-230d5c714a04.png">
`Input dataset location`では、manifestファイルというファイルを指定する必要があります。これは`Create manifest file`のリンクから作成できます。データを置いたディレクトリを指定して、manifestファイルを作成できます。
<img width="600" alt="スクリーンショット 2019-02-05 14.58.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/46493/3d6537d0-dbb7-00af-ea51-8c3a7d7426cb.png">

また、`IAM Role`を作成して指定する必要があります。

### Task type
教師データの種類を選択します。
<img width="600" alt="スクリーンショット 2019-02-05 15.02.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/46493/743ee7f1-fc00-a4b2-6d4d-5f3b909eb7d7.png">


### Workers
ラベリング作業者を定義します。ここでは`Private`を選択しますが、作業者を追加するにあたって、`Team`を作る必要があります。作業者はメールアドレスで追加します。オプションで`Automated data labeling`を有効にすることができます。active learningによる自動ラベリングを行ってくれるらしいです。
<img width="804" alt="スクリーンショット 2019-02-05 15.30.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/46493/7a79d132-981e-672e-0790-4169b824bb8d.png">

### Labeling tool
具体的なラベリングの仕方を記述できます。ラベルもここで設定します。良いラベリング例や悪いラベリング例などを説明に加えることができますが、そのための画像はあらかじめパブリックなS3に置いておく必要があるようです。

* `Image classification`の場合
複数のラベルを設定することができます(画像は[Visual Geometry Group: Oxford-IIIT Pet Dataset](http://www.robots.ox.ac.uk/~vgg/data/pets/)のものです)。<img width="804" alt="スクリーンショット 2019-02-05 15.45.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/46493/ede19e00-ac6f-6ddc-f89d-26064f26b571.png">

* `Bounding Box`の場合
<font color="red">1種類のラベルしか設定できないです。</font>
<img width="804" alt="スクリーンショット 2019-02-05 15.50.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/46493/61263509-54c6-94a2-14a9-373fde4fc9fd.png">

あとは`submit`を押して、Jobを作成できます。なお、<font color="red">一度作成したJobの詳細は変更できない</font>ようです。Jobの一覧画面から、選択したJobのcloneができるので、変更したい場合はJobをcloneして、それを修正するのが良さそうです。

## Workerによるラベリング作業
Jobを作成すると、Workersで指定したメールアドレスに、パスワードと作業画面へのログインURLの含まれたメールが届きます。もしログインページのURLが含まれていない場合は(なぜか1度ありました)、[Labeling workforcesのページ](https://us-east-2.console.aws.amazon.com/sagemaker/groundtruth?region=us-east-2#/labeling-workforces)の`Private`タブから、ログインURLを参照できます。なおこのページでは、TeamやWorkerの追加や編集ができます。

ログイン後の画面。
<img width="804" alt="スクリーンショット 2019-02-05 16.35.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/46493/e5f2528f-8c15-5167-72de-7cf14252e2d6.png">
ラベリング作業の様子(プライベートのバケットにある画像を、ラベリング例の画像に使ってしまったため、左側の画像が正しく表示されてないです)。
![output.gif](https://qiita-image-store.s3.amazonaws.com/0/46493/8dc0ab4d-235f-3d56-9a9f-a017fdfe1b83.gif)
ラベリング作業の結果がJobに反映されるのに、少し時間がかかります。

## まとめ
以上、SageMaker Ground Truthの使い方を見てきました。よく説明を読まないと引っかかる部分が多少ありました。また、Bounding boxタスクで、ラベルが1種類しか設定できないというのは、複数クラスの物体検出用のデータを作成するには辛い制限です。やがてアップデートされることを期待します。

今回はPrivateなWorkforceで試しましたが、データが大規模で、PublicなWorkforceが使用可能な案件であれば、かなり強力なツールになるのではないかと思います。

## 参考
* [Amazon SageMaker Ground Truth | AWS](https://aws.amazon.com/jp/sagemaker/groundtruth/)
* [Amazon SageMaker Ground Truth — 高い精度のデータセットを構築し、ラベル付けのコストを最大70%削減](https://aws.amazon.com/jp/blogs/news/amazon-sagemaker-ground-truth-build-highly-accurate-datasets-and-reduce-labeling-costs-by-up-to-70/)
* [Amazon SageMaker Ground Truth を試してみる - Qiita](https://qiita.com/SatoshiGachiFujimoto/items/e4ab624d3527237ca9e9)