Amazon Rekognition Custom Labels で動きを認識できるか~猫パンチで試してみた

# はじめに

AWS の AI サービスの中に Amazon Rekognition という画像認識サービスがありますが、さらにその中に Amazon Rekognition Custom Labels という機能があります。これを使うと、画像を用意するだけで、自分独自のシーン認識や物体検知モデルを作ることができます。以前 [こちらの記事](https://qiita.com/mariohcat/items/fe1f7ce6a130e9abe1c6) で猫を見分けるモデルを作りましたが、今回はちょっとした動作なら Rekognition Custom Labels で認識できることをご紹介するために、猫パンチ動画のなかの猫パンチを認識するモデルを作ってみようと思います。また、Amazon SageMaker Ground Truth の動画ラベリング機能が非常に便利なので、そちらもご紹介します。

ゴールはこの動画を作ることです。元となる動画は [こちらのサイト (mixkit)](https://mixkit.co/free-stock-video/pet-owner-playing-with-a-cute-cat-1779/) からお借りしました。

https://youtu.be/h02X4ZH1wQI

大まかな流れはこんな感じです。以降の手順において、すべて同じリージョンでサービスを使用してください。
![スクリーンショット 2021-07-26 17.37.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/041f2289-36e2-c170-531a-c4b558a44e1c.png)

# Amazon SageMaker Ground Truth で動画ラベリング

事前にラベリングワークフォースでプライベートチームの登録が完了していることを前提としています。登録方法は[こちらの記事 (builders.flash)](https://aws.amazon.com/jp/builders-flash/202003/sagemaker-groundtruth-cat/?awsf.filter-name=*all) をご参照ください。また、ラベリングしたい動画ファイルをあらかじめ Amazon S3 にアップロードしておいてください。

## ラベリングジョブの作成
Amazon SageMaker のコンソールを表示し、左側のメニューで「Ground Truth」→「ラベリングジョブ」と選択し、「ラベリングジョブの作成」ボタンをクリックします。

「ジョブの詳細の指定」画面でラベリングジョブをセットアップしていきます。「入力データセットの S3 の場所」のところには S3 に保存されているラベリング対象の動画ファイルを指定します。
![スクリーンショット 2021-07-26 17.47.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/826fa2c4-78f7-f6a9-a808-f6defdc2dab1.png)

「データタイプ」のところは「動画ファイル」を設定します。
![スクリーンショット 2021-07-26 17.47.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/fcd2f1b0-ebca-a7f6-bbae-87ac58631827.png)

その後 IAM ロールを設定したら、「完全なデータセットアップ」ボタンをクリックして数分待ちます。このとき、裏側では動画ファイルがフレーム単位で静止画として切り出されているので、動画の尺が長いほどこの処理に時間がかかります。

データセットアップが完了したら、その下にある「タスクのタイプ」を設定します。「タスクのカテゴリ」は「動画 - オブジェクトの検出」を選択します。
![スクリーンショット 2021-07-26 17.59.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/687a2a1e-be6c-621e-c66e-58fd6bf2511d.png)

すると「タスクの選択」部分にタスクが表示されるので、その中の「境界ボックス」を選択します。その後「次へ」をクリックします。
![スクリーンショット 2021-07-26 18.00.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/b9dcb398-8a09-dde4-8442-57c66e3c1b6e.png)

「ワーカー」の設定では、あらかじめ作成してあるはずのプライベートチームを選択します。「動画オブジェクトの検出」のエリアでは、猫パンチ状態じゃないことを示す「normal」と猫パンチ状態であることを示す「punch」の2つのラベルを設定します。最後に、「作成」ボタンをクリックします。
![スクリーンショット 2021-07-26 18.07.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/a62ba001-253f-d97d-12ce-9e0196cec2c3.png)

数分経つと、作成したラベリングジョブがラベリングポータルに表示されるので、ジョブを選択して「Start working」をクリックしてラベリングを開始します。
![スクリーンショット 2021-07-26 18.27.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/bf8222ff-602c-f8bd-66b5-2afc34b5031d.png)


## 動画の物体検知ラベリング

それでは、動画にラベリングしていきましょう。ここがこの記事のハイライトです。

ラベリングを開始すると、このような画面が表示されます。右上にある「Label category」からラベルを選択します。
![スクリーンショット 2021-07-26 18.40.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/c7bdd726-d4b8-41c3-4bd3-0182ade44b99.png)

この画像は猫パンチしているところなので、「punch」を選択して猫の領域を枠で囲みます。
![スクリーンショット 2021-07-26 18.39.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/e01e5dce-29e8-10d9-8354-6c50fecf36c4.png)

ここで、右下の「Submit」ボタンを押すと次のフレームのラベリングができるようになるのですが、今回はここで「P」キーを押すか、下のツールボックスの左から2番目の「Predict next (P)」をクリックします。
![スクリーンショット 2021-07-26 18.32.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/cfef1e31-7781-1059-98d5-ccdc8f3e377a.png)

すると、次のフレームの画像に自動的に枠が表示されます。これは SageMaker Ground Truth が、今ラベリングした枠の情報をもとに、次のフレームに自動的に枠をつけてくれたためです。自動なので、多少のズレが発生することもあります。この図でも、枠が猫の耳にかぶっています。そういう場合は、枠をクリックして選択し、枠をドラッグして正しく枠を設定します。枠をクリックしてから、右上の「Label category」で異なるラベルを選択すれば、枠はそのままで異なるラベルに変更することができます。
![スクリーンショット 2021-07-26 18.41.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/f0f9a526-0d00-16ac-6c3a-cd17d13e9a6a.png)

あとは画像が表示されなくなるまで同じ手順を繰り返してラベリングしていきます。SageMaker Ground Truth の動画ラベリングの便利なところは、前後のフレームを見比べながらラベリングができることと、先ほどご紹介した予測機能です。

## manifest ファイルのフォーマット変換

Amazon SageMaker Ground Truth でラベリングを行うと、ラベリング結果が manifest ファイルとして出力されます。この manifest ファイルを使って Amazon Rekognition Custom Labels でモデルを作成したいところなのですが、動画ラベリングによって出力された manifest ファイルのフォーマットのままでは Rekognition Custom Labels に入力することができません。そのため manifest ファイルのフォーマットを変換する必要があります。[こちら (GitHub)](https://github.com/ohbuchim/sample-codes-for-aiml/blob/main/amazon-sagemaker-ground-truth/scripts/transform_video_manifest_to_image_manifest.py) に変換スクリプトを公開しました。使用方法はスクリプトのヘッダ部に記載されている説明をご参照ください。このスクリプトを実行して出力されたファイルを Amazon S3 にアップロードしてください。このファイルを Rekognition Custom Labels のデータセット登録時に使用します。

# Amazon Rekognition Custom Labels で猫パンチ認識モデルを作成

Amazon SageMaker Ground Truth の動画ラベリング機能を使ってラベリングした結果を使って猫パンチ認識モデルを作成します。Amazon Rekognition のコンソールにアクセスし、左側のメニューの一番上にある「カスラムラベルを使用」をクリックして Rekognition Custom Labels のコンソールに移動します。

ここからの手順は [こちらの記事](https://qiita.com/mariohcat/items/fe1f7ce6a130e9abe1c6) を参照してください。こちらの記事からの変更点は以下の通りです。

- 「データセットの準備」の手順をスキップ
- 「データセットの登録」の手順で「Amazon SageMaker Ground Truth でラベル付けされた画像をインポートする」を選択し（下図参照）、「.manicest ファイルの場所」の部分に前の手順で S3 にアップロードしたファイル（SageMaker Ground Truth の manifest ファイルを変換したファイル）のパスを設定

![スクリーンショット 2021-07-26 19.03.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/16df11c5-f157-b717-92bf-0479ba02dfa9.png)

# AWS Cloud9 で推論と動画の作成

AWS Cloud9 のコンソールで「Create environment」をクリックし、すべてデフォルト設定のままで環境を立ち上げます。

画面の下部にターミナルがあるので、そこで以下のコマンドを実行して OpenCV をインストールします。

```bash
python3 -m pip install opencv-python boto3
sudo yum install -y mesa-libGL.x86_64
```
以下の手順で認証情報のセットアップをします。短い動画が対象であればこの手順を飛ばしても良いのですが、このサンプルで使用した 15秒の動画を使用すると推論スクリプトの実行中に認証情報の期限が切れてしまうため、こちらの手順を実施しておくと安心です。

1. AWS マネジメントコンソールの左上にあるサービスの検索欄に`IAM`と入力し、IAM サービスを選択
- IAM ダッシュボード画面にて、左のペインにある「ユーザー」をクリック
- 使用している IAM ユーザー名をクリック (IAM アカウントが無い場合は [こちら](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_create.html) を参考に作成してください)
- ユーザー管理画面から「認証情報」タブを開く
- 「アクセスキーの作成」をクリック（既に作成してある場合はその情報を使っても OK）
- 「アクセスキー ID」と「シークレットアクセスキー」をコピーし、ローカルに保存
- 以下のコマンドを実行（**AWS_DEFAULT_REGION は使用するリージョンの情報を入れてください**）

```bash
export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_ACCESS_KEY_ID={アクセスキー ID}
export AWS_SECRET_ACCESS_KEY={シークレットアクセスキー}
```

以下のコマンドを実行してスクリプトをダウンロードします。

```bash
wget https://raw.githubusercontent.com/ohbuchim/sample-codes-for-aiml/main/amazon-rekognition-image-analysis/predict.py
```

推論で使用したい動画ファイル（mp4）をスクリプトと同じパスに保存しておいてください。Cloud9 へのファイルのアップロードはドラッグ＆ドロップで可能です。
ダウンロードしたスクリプトの以下の部分を自分の環境に合わせて書き換えます。

```python
# set Amazon Rekognition Custom Labels's project ARN
projectVersionArn = "<ARN>"

# set movie's information
videoFile = "cat.mp4" # 推論に使用したい動画ファイル名
frame_rate = 25 # 上記動画のフレームレート
width = 1920 # 上記動画の幅（画素数）
height = 1080 # 上記動画の高さ（画素数）
```

projectVersionArn には、Rekognition Custom Labels コンソールでモデルの詳細画面を表示し、「モデルを使用」タブを選択して「モデルを使用する」と書かれた部分に表示されている ARN を設定してください。
![スクリーンショット 2021-07-27 18.37.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/534fb6a9-24dc-e7fe-8401-5a7840d9226b.png)

上記設定が終わったら以下のコマンドを実行します。mp4 ファイルが連番静止画に変換され、各画像に対して推論を実行し、その結果を画像に重畳して最後に mp4 に変換します。result_xxx.mp4 という名前のファイルが出力されているはずなので、そのファイルを右クリックして「Download」を選択し、ファイルをダウンロードします。

```bash
python3 predict.py
```

猫パンチ中は赤い枠、通常時は緑の枠で猫が囲われた動画が再生できましたでしょうか？

# さいごに

Amazon SageMaker Ground Truth の動画物体検知ラベリングと Amazon Rekognition Custom Labels を組み合わせて、猫パンチ認識モデルを作ることができました。動画物体検知ラベリングの機能を使うと、単純に連番静止画に分割した画像を静止画としてラベリングするのと比べて、前後のフレームを見比べながら、次フレームのラベル予測機能を活用して効率的にラベリングができます。