Amazon Rekognition Custom Labels でアーモンドとピーナッツの判別モデルを作ってみた。

# はじめに
今回は AWSの 画像、動画分析サービスである Amazon Rekognition の Custom Labels 利用が開始となったため、アーモンドとピーナッツが判別できるか、検証いたします。

# Amazon Rekognition Custom Labels とは
Amazon Rekognition とは　AWS の提供する 画像、動画分析サービスです。シーン検出や顔認識、テキスト認識や動線検出など多くのAPI が存在します。
今回この Rekognition が Custom Labels に対応しました。
今までは AWS の用意した学習済みモデルを利用した物体検出しか利用できませんでしたが、自前で用意した画像で画像検出モデルを作成し、利用できるようになりました。

# 今回の目的
Amazon Rekognition Custom Labels で、ちょうど家にあったピーナッツとアーモンドの判別モデルを作ってみます。
今回はデータ準備、ラベリング、モデル作成、推論API利用までやってみます。

# データ準備

今回は画像をピーナッツとアーモンドでそれぞれ21枚ずつ用意しました。

画像はこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/606b1687-238d-781e-bb2a-90bb050cb734.png)


データの準備は完了です。
早速 AWS コンソールから、ラベリングに進みましょう。

# ラベリング
作成したデータのラベリングは、AWSのコンソール上で行います。

現在(2019年12月10日時点)は、Amazon Rekognition Custom Labels は以下のリージョンでのみ利用可能です。

- バージニア北部
- オハイオ
- オレゴン
- アイルランド

AWS　コンソール上でリージョンを変更してから以降の手順を行ってください。


まず、AWS コンソールから Amazon Rekognition を開きます。
<img width="941" alt="001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/f9764841-c6cf-82b3-ce18-8f46545eaff7.png">

次に、サイドバー上部から Use Custom Labels を開きます。 
<img width="935" alt="002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/d5d5e784-3344-6c93-0571-ca9f866413d9.png">

**※2019年12月10日時点では、表示言語を日本語にしていると、Custom Labels の項目が表示されません。**
左下の言語欄から英語を選択し、次に進んでください。
<img width="948" alt="003.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/ce148272-79d6-a913-1236-dfd913b295fd.png">

Get Started をクリックします。
<img width="924" alt="004.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/759f9774-c8ec-9bbb-e6a2-4fe147f58fe0.png">

作成するデータセットや、モデルの保存先 S3 を作成します。
Create S3 bucket をクリックします。
<img width="489" alt="005.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/92536fd2-1067-0cde-b9ea-72005d532f49.png">

次にプロジェクトを作成します。
任意のプロジェクト名を入力し、Create project をクリックします。
<img width="932" alt="007.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/425e8b0a-2f8e-9e06-ab55-5746c2c37d3a.png">

プロジェクトを作成したら、データセットを作成します。
Create datasetをクリックします。
<img width="930" alt="008.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/b6a32668-4a1d-9c7f-8f3f-3fb4b02480f8.png">

任意のデータセット名を入力します。
<img width="908" alt="009.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/29684cfe-1eeb-1620-8cae-3a16af59f21c.png">

データのアップロード方法を選択します。
今回はローカルからアップロードを選択します。
<img width="915" alt="010.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/6ade67f5-b59d-4fb5-c375-9400da98b050.png">


画像をアップロードします。
下にスクロールし、Add images をクリックします。
<img width="914" alt="012.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/b1a9d49e-3bd9-3496-c97e-29837792e768.png">

以下のように表示されるので画像を、Drag＆Drops します。
※この時画像は一度に30枚までしかアップロードできません。分けて、アップロードしましょう。
<img width="298" alt="013-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/08e552e8-0ba9-e215-3fd8-32fd3de13a41.png">

画像を Drag＆Drops したら、Add images をクリックします。
<img width="296" alt="013-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/958ec070-9464-4633-ab49-a8b726b5c7a5.png">

画像をアップロードしたら、画像に割り当てるラベルを登録します。
Filter by labels の Add をクリックします。
<img width="920" alt="014-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/26e23979-0153-2e8e-c152-80a73d8a21f7.png">


ラベルを追加し、Save をクリックします。
私の場合は、almond と peanuts を追加しました。
<img width="297" alt="015-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/ea39b235-e08b-1ed7-4ca8-825274d09650.png">

ラベリングしたい画像を選択して、Draw Bounding Box をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/e1fe5a57-5295-e890-4305-fdf73d30ff3c.png)


ラベリングを行います。

- まず、右側の Labels から対象のラベルを選択します。
- 次に、画像の対象物を Box で囲みます。
- 囲んだら、右上のNextをクリックします。
- 全ての画像に対してラベリングができたら右上の Done をクリックします。

<img width="959" alt="017-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/93d97c02-d097-957f-6b0e-988c7fdef92c.png">

ラベリングが終わったら、右上の Save changes をクリックしてください。
<img width="908" alt="018-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/20f018d2-0bd1-bdca-3527-0bb8d3fcbec0.png">


# モデル作成

データセットのラベリングが完了したら、ついにモデルトレーニングです。
Train model をクリックします。
<img width="918" alt="020-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/aafacad0-4b1f-fe2e-6ae2-0f90631f4821.png">

各項目を設定します。

- Choose project : 最初に作成したプロジェクトを選択します。
- Choose training set : 作成したデータセットを選択します。
- Create test set : テストデータの作成方法を選択します。今回は、学習データの中から20%を自動でテストデータとして抽出する Split training dataset を選択します。

全て設定したら、右下の Train をクリックします。
<img width="922" alt="021-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/d768f7a7-aea4-f2fb-059f-1fa1247b5be2.png">

これでモデルトレーニングが始まります。
Status が　TRAINING_COMPLETED になるまで待ちます。
学習画像32枚、テスト画像10枚で1時間弱ぐらいかかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/dc729978-e7ad-4498-4550-0bd26b2c2dfc.png)

モデルトレーニングが完了しました。
ジョブ名をクリックして、トレーニングの詳細を見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/bf1fd9f7-aa46-44c7-467e-533b5246f3ef.png)


モデルのスコアが載っています、精度90％、再現率80％となかなかいい感じですね。
<img width="774" alt="034.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/0c40142c-822a-5751-45c0-29d85d02723d.png">

# 推論 API の利用

実際に作成したモデルをデプロイして、推論してみましょう。
下にスクロールすると、モデルデプロイ、推論、デプロイ終了の API 利用コマンドがあるので順に実行してみましょう。
**※古いバージョンの AWS CLI にはコマンドが存在しないため、以下から、AWS CLI のアップデート方法を確認し、実行してから次に進んでください。**
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv1.html#post-install-upgrade
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/05320dc9-77df-89f6-cc4b-18c5ea4d8429.png)

まず、Start APIを実行すると、以下の様にレスポンスがあります。

```
{
    "Status": "STARTING"
}
```

実行後コンソールを確認してみると、対象のモデルステータスが STARTING となります。

<img width="768" alt="035.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/985ea68d-afd7-f722-1055-0da45149987d.png">

Status が RUNNING になったのを確認したら、Detect API を実行しましょう。
推論に利用する画像は、あらかじめ S3 にアップロードしておきましょう。

<img width="767" alt="036.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/e9790c13-cba9-d9f2-2ff0-0618eb2895ff.png">

今回は以下の画像を推論してみます。
![almond.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/b0bc6a6d-84bc-a3db-7cda-7a09fb229517.jpeg)

Detect API を実行すると、以下のように推論結果が返されます。

```
{
    "CustomLabels": [
        {
            "Name": " almond",
            "Confidence": 96.87999725341797,
            "Geometry": {
                "BoundingBox": {
                    "Width": 0.3379000127315521,
                    "Height": 0.14917999505996704,
                    "Left": 0.31453999876976013,
                    "Top": 0.385919988155365
                }
            }
        }
    ]
}
```

実際に可視化するとこんな感じです。
うまく推論できているようです。
![037.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/4efa2945-c38f-1a6d-aec9-8b73627c54ec.png)

推論を終えたら、Stop API でデプロイしているモデルを停止します。
以下のようにレスポンスがあります。

```
{
    "Status": "STOPPING"
}
```

コンソールを確認してみると既に Status が STOPPED になっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/fc68a9dc-8cb1-634d-e6bf-0628fb6226f6.png)

# おわりに
今回は Amazon Rekognition Custom Labels を検証しました。
画像を用意するだけで簡単に画像検出ができてしまい、感動しております。
今回はピーナッツとアーモンドの2種類でしたが、もう少し似通ったカシューナッツとか入れてもやってみたいと思います。

※料金は2019年12月10日現在、確認中です。わかり次第追記いたしますので、お待ちください。