Amazon SageMaker Ground Truthを概略を理解する

*※2021/6/6時点での情報になります。*

## Amazon SageMaker Ground Truthとは
公式の説明
> Amazon SageMaker Ground Truth はフルマネージド型のデータラベル付けサービスで、機械学習のための高精度なトレーニングデータセットを簡単に構築することができます。カスタム、または組み込み済みのデータラベル付けワークフローを使用して、SageMaker Ground Truth コンソールから数分でデータのラベル付けを開始することができます。

利点

- データラベルの精度向上
- 使いやすい
- コストを最大70%削減
- 人的リソースの選択

上記説明が公式ドキュメントにありますが、どう使えるのかがわからなかったので実際に使ってみました。

## 流れ
ざっくりで以下の流れでラベリングが行われます。

1. ラベリング対象の画像や動画をS3に用意
2. ラベリングジョブの作成
3. ラベリングジョブに対してワーカーの割り当て
4. ラベリングポータルでのラベリング

### ラベリング対象の画像や動画をS3に用意
任意のバケットにラベリング対象の画像を用意します。現状、サポートされている形式は以下のようです。

| 種類 | ファイル形式 |
| -- | -- |
| 画像 | .jpg, .jpeg, .png |
| テキスト | .txt, .csv |
| 動画（フレーム抽出） | .mp4 |
| 動画（動画分類） | .mp4, .ogg, .webm |

動画（フレーム抽出）はmp4形式の動画を元に指定したフレーム数毎に画像を抽出、ラベリングを行います。動画（動画分類）は動画自体のラベリングを行います。

ラベリングジョブを行うにあたり、manifestファイルが必要になります。対象ファイル群が入っているS3のフォルダを指定することで、ラベリングジョブ作成時に自動生成してもらえますが、用意しても良いです。
試しに自動生成したmanifestファイルは以下です。対象となるファイルの一覧と思って貰えば良いです。

```
{"source-ref":"s3://xxxxx/train/prefix/prefix_01.png"}
{"source-ref":"s3://xxxxx/train/prefix/prefix_02.png"}
{"source-ref":"s3://xxxxx/train/prefix/prefix_03.png"}
{"source-ref":"s3://xxxxx/train/prefix/prefix_04.png"}
{"source-ref":"s3://xxxxx/train/prefix/prefix_05.png"}
{"source-ref":"s3://xxxxx/train/prefix/prefix_06.png"}
```

## ラベリングジョブの作成
ラベリング自体をジョブとして作成します。ジョブには対象の画像や動画をS3においたmanifestファイルを指定し、対象の画像を特定します。または、S3のフォルダを指定し、対象のファイルを洗い出しmanifestファイルを自動生成します。

ラベリングジョブではさらに以下を指定します。

- ラベリング結果の出力先。インプットと同一の指定も可能
- ラベリングデータセットの設定
- ラベリングタスク

ラベリングデータセットの設定では、対象のファイルからランダムに30%のみ利用するということが可能です。ラベリングタスクでは画像でも、以下のタスクを指定することができます。

- 単一ラベル。画像に一つのラベルを設定
- マルチラベル。画像に複数のラベルを設定
- 境界ボックス。
- セグメンテーション
- ラベルの検証。設定したラベルが正しいか確認する

![ラベリングタスク例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123946/a1936324-7e01-6f02-d24c-f157be7cde7b.png)

作成したラベリングジョブはAmazon SageMaker > Ground Truth > ラベリングジョブで確認することができます。

## ラベリングジョブに対してワーカーの割り当て
ラベリングジョブを行うワーカーを選択します。このとき、以下の3つから選択します。

- パブリック。Amazon Mechanical Turkによる50万人以上の独立系請負業者に任せる
- プライベート。自身で用意した作業者に任せる
- ベンダー管理下。AWS Marketplaceから選択できるベンダーに任せる

今回はプライベートでラベリングを行いました。このとき、ラベリングジョブに対してプライベートチームを割り当てます。
プライベートチームに所属するユーザーは、予めメールアドレスで認証する必要がありますが、Amazon Cognitoを利用して管理します。初めてプライベートチームを作成する場合はGround Truthから自動的に作成されます。
Amazon Cognitoで管理されたユーザーを使用して、ラベリングポータルにログインすることになります。

ワーカーの状況はSageMaker > Ground Truth > ラベリングワークフォースの画面で確認することができます。以下のようにプライベートチームを適切に管理し、タスクに応じてジョブを割り当てることができるようになっています。

![ワーカー例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123946/d3aac32f-09ba-7f11-c281-99df5f44f879.png)

## ラベリングポータルでのラベリング
ラベリングポータルのURLからログインすることで、そのユーザーに割り当てられているジョブの一覧を確認することが可能です。実際にラベリングの動作については以下のリンクから確認することができます。
https://aws.amazon.com/jp/blogs/news/amazon-sagemaker-gt-video/

実際に画像と動画のラベリングの実施を行ってみましたが、動作が重いと感じることもありますが簡単に実行ができると思いました。特に、動画で領域のラベリングを行った際は、次のフレームに対して領域を保持することができる上に、標準で次のフレームの領域を予測して設定してくれます。

## 料金について
ラベルがつけられた対象物自体に対して料金が発生します。少なくとも1つあたり0.08USDかかるため、1000枚で80USDかかります。さらに、パブリックやベンダーを利用する場合は、ラベル毎や作業者毎対象物毎に課金されます。
個人で利用する場合は高い印象がありますが、単純な外注費用と比べると安い場合もあるかもしれません。

## 最後に
大量の画像データがある場合には全ての画像データに対して正しくラベリングするのは容易ではないと思います。ラベリングの品質を保つためにはGround Truthのような仕組みで実施できればいいのかなと思いました。



## 参考
- https://aws.amazon.com/jp/sagemaker/groundtruth/
- https://aws.amazon.com/jp/blogs/news/amazon-sagemaker-gt-video/
- https://aws.amazon.com/jp/sagemaker/groundtruth/pricing/