クラッシュロワイヤルに出てくるゴブリンをトラッキングしたった ③Amazon Rekognition(学習編)


[クラッシュロワイヤルに出てくるゴブリンをトラッキングしたった ①データ取得](https://qiita.com/satsukiya/items/3c19310f06475e15cd0f)
[クラッシュロワイヤルに出てくるゴブリンをトラッキングしたった ②アノテーション追加](https://qiita.com/satsukiya/items/eb7cb2b26ce689c066b2)
の続きです。

# What is Amazon ReKognition?
[Amazon ReKognition](https://aws.amazon.com/jp/rekognition/) とはクラウド上でDeepLearningにもとづいた画像・動画分析ができるサービスです。何もしなくても顔やテキストを抽出することができるみたいですが、今回のテーマであるゲームキャラクタなどの任意のオブジェクトもアノテーション(ラベリング)をつけて学習・推論をかけることができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/461881c6-822d-99a8-19ea-400742c85701.png" width=240>


# Preparetion
必要なものとして、S3とmanifestファイルの2つが必要です。S3は学習や推論をかけたい画像を格納するのに使います。manifestファイルは画像内にあるオブジェクトの情報であるアノテーションが集約されたReKognition用のファイルです。 [クラッシュロワイヤルに出てくるゴブリンをトラッキングしたった ②アノテーション追加](https://qiita.com/satsukiya/items/eb7cb2b26ce689c066b2)ではPASCAL VOC 1.1形式に変換してエクスポートしていますが、ここからmanifestファイルを作成します。


### s3 upload
学習に使った画像をs3にアップロードします。

```
ml-clashroyal/ (←バケット)
 ├ annotation/ (マニフェストファイル保存先)
 ├ learn/ (学習用画像)
 └ evaluate/ (評価用画像)
```


### create manifest file
PASCALからmanifestファイルを出力するのに`pascalgt`というライブラリを追加します。
このライブラリは[DaikiTanak](https://github.com/DaikiTanak)が個人で作成されたものです。

```sh
pip install pascalgt
```

`pascalgt`をもとにスクリプトを作成しました。
コマンド実行時に追加する引数は
- プロジェクト名 
  - ReKognitionでプロジェクトを作るときに使います
- S3パス
  - s3://xxxxx
- マニフェストファイルの出力先
- PASCAL内のxmlファイル場所
  - `Annotations` の中にあります。
 
の4つです。

```python
import argparse
from pascalgt.transformer import Pascal2GT

def main():
	parser = argparse.ArgumentParser()
	parser.add_argument("--pj_name", default="pj_name", help="プロジェクト名")
	parser.add_argument("--s3_path", default="s3://", help="s3パス")
	parser.add_argument("--output", default="./output.manifest", help="マニフェストファイルの出力先")
	parser.add_argument("--xml_path", default="./Annotations", help="PASCAL内のxmlファイル場所")
	args = parser.parse_args()

	pascal2gt = Pascal2GT(project_name=args.pj_name, s3_path=args.s3_path)
	pascal2gt.run(path_target_manifest=args.output, path_source_xml_dir=args.xml_path)

if __name__ == "__main__":
	main()
```

```sh
python main.py --pj_name="track_goblins" --s3_path="s3://ml-clashroyal/learn" --xml_path="./track_goblin/Annotations/"
```

実行後はマニフェストファイルができるので、このファイルをs3に格納します。
ここでは`ml-clashroyal/annotation`に入れてます。

# Method

材料がそろったのでAmazon Rekognitionを使ってモデルを作成しようと思います。

「カスタムラベルを使用」をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/0a745c84-4c96-bb6c-7ab7-dc6b2280cb5e.png" width=720>

「Projects」をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/c213ec51-3792-2d6a-9f22-d86ae0ebd9e2.png" width=720>

「Create project」をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/f049e112-9492-6f58-7d20-c5434e2b86e4.png" width=720>

プロジェクト名を追加する。
ここでは、 [create manifest file]()でスクリプトを実行したときに使ったプロジェクト名を入力します。
「Create project」をクリック。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/a2434907-56e8-fcd1-b17d-caf31b32dc5c.png" width=720>

「Create dataset」をクリック。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/5eabc5a5-7d71-4cff-1bb7-d1ade1813e8c.png" width=480>

Starting configurationは「Start with a single dataset」を選ぶ
Training dataset detailsは右下の「Import Images labeled by SageMaker Ground Truth」を選び、S3に保存してあるマニフェストファイルのS3パスを入力する。
「Create Dataset」をクリック。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/61162905-6483-4aec-25f7-3d2c7bfa0dbe.png" width=720>

LabelsでLabeledを選んでアノテーションが付いているか確認する。
問題なければ「Train model」をクリックする。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/03c2bc88-35bc-c7b6-c3b0-de2678e6dd60.png" width=720>

何も考えずに「Train model」をクリックする。
これで学習がスタートします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/5da1dcb4-b351-6a09-fdf6-beaaba99c62e.png" width=720>

学習はすぐ終わりません。
学習中は「TRAINING_IN_PROGRESS」と表示されます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/8333e0e9-6798-fe6c-d06b-cbec89eae902.png" width=720>

# Consequence

数時間後を見るとモデルが完成しました。
できたのはいいのですが、F1(適合率と再現率を考慮した値)が結構低いです:weary:


なので、精度を高めるにはもう一度アノテーションを作り直すかデータ数を増やすか、、、などのことが必要です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/5f128c70-95e4-6f76-5140-2f308e417f62.png" width=720>


# To Be Continued
今回出たモデルの精度が低いですが、推論の方法までを通しでやってみたい！!!があります。
次回は作成したモデルを使って推論し、物体検出をしてみます。

# Reference

- [AWS - Amazon Rekognition](https://aws.amazon.com/jp/rekognition/)
- [Pascal VOC形式のxmlファイルとAWS SageMaker Ground Truthのmanifestファイルの相互変換](https://moneyforward.com/engineers_blog/2021/10/04/pascal-voc_aws-sagemaker-ground-truth/)
- [AI(Amazon Rekognition カスタムラベル)であのラーメンを検出してみた](https://sendai.tenda.co.jp/blog/amazon-rekognition/)
- [AWS - Amazon SageMaker Ground Truthを利用した動画ラベリングとAmazon Rekognition Custom Labelsへのインポート](https://aws.amazon.com/jp/blogs/news/amazon-sagemaker-gt-video/)
- [AWS - モデルを評価するための指標](https://docs.aws.amazon.com/ja_jp/rekognition/latest/customlabels-dg/im-metrics-use.html#im-f1-metric)