【初心者】「Nyantec ハンズオン」をやってみる (Amazon SageMaker Ground Truth, Amazon Rekognition Custom Labels を使ってみる)

# 目的
- AWS開発者向けサイト(builders.flash)の記事「 [【Nyantech ハンズオンシリーズ】機械学習を使って写真に写っている猫を見分けてみよう！ ~ 前編 : Amazon SageMaker Ground Truth を使った画像のラベリング ~](https://aws.amazon.com/jp/builders-flash/202003/sagemaker-groundtruth-cat/)」 が楽しそう、かつ勉強になりそうだったのでやってみることにする。
- このハンズオンでは、2匹のねこの画像を見分けることをゴールにしているが、今回はみかんとデコポンを見分ける課題に置き換えて実施する。

# Amazon SageMaker Ground Truth とは（自分の理解）
- 画像に対してラベリングを行い、データセット（分析の元データ）を作成できるサービス。

# Amazon Rekognition Custom Labels とは（自分の理解）
- データセット（ラベリングを行った画像のセット）を用いて学習を行い、モデルを作成できるサービス。

# やったこと
- 元記事では、ねこ2匹(タマ、ミケ)の画像を10枚ずつ用意し、ラベリング、学習を行った後、別の画像についてどちらのねこなのかを判定する検証を行っている。
- 今回は、ねこ(タマ、ミケ)の画像をみかんとデコポンの画像に置き換えた以外は、完全にハンズオンの手順通りに実施する（そのため、操作画面等は保存しておらず、元記事を参照のこと）。
- まず Amazon SageMaker Ground Truth を用いて、画像へのラベリング（この画像はみかん、この画像はデコポン、の感じで）によるデータセット作成を行い、その後 Amazon Rekognition Custom Labels にてそのデータセットを用いてモデルを作成し、画像がみかんかデコポンかの判定ができるようにする。

# 構成図

![deko構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/ec6e4a55-bbf9-38e1-a535-95ee7bbdcadb.png)


# 手順
## ステップ 1 : 画像を準備する
- S3にみかんの画像10個、デコポンの画像10個を保存する。※2020/6現在、ラベリング(SageMaker Ground Truth)の対象とするにはバケットがN.Virginia(us-east-1)である必要がある様子。
    
##ステップ 2 : 画像にラベルをつける

### ワーカーの登録
- Amazon SageMaker - Ground Truth - ラベリングワークフォース から、プライベートチームを作成する。※プライベートチームはラベリング処理をする人のチームを作れる機能。プライベートチームではワーカー(作業者)を最大100名招待できるが、今回は作業者は自分だけのため、自分だけを招待する。

### ラベリングジョブの作成
- ステップ1で用意したS3バケットを指定してラベリングジョブを作成する。※チーム内のワーカー（作業者）にやってほしいラベリング作業（今回は画像を見て、「みかん」か「デコポン」かどちらかのラベルを選んで付与してほしい！）を定義する。

### ワーカーによるラベリング
- 招待しておいたメールアドレスに対して、ラベリング処理用のWEBサイトのURL、ログインID、初期パスワードが送付されているので、それを用いてWEBサイトにワーカー（ラベリング作業者）としてログインする。画像(20枚)に対し、それぞれ「みかん」か「デコポン」かを選択し登録していく。一度選択して提出してしまうと修正できなさそうなので注意が必要と感じた。

![deko05a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/6e26b14f-2fb9-6a1e-5667-3c8db47ca96a.png)


### ラベリング結果の確認
- ラベリング結果「output.manifest」がS3の「出力データセット」のところに出力されており、その中身を確認する。それぞれの画像に対して、「みかん」か「デコポン」かの値が設定されている。

```
{"source-ref":"s3://xxxx-dekopon/dekopon01.jpg","mksamba-dekopon":1,"mksamba-dekopon-metadata":{"confidence":0.75,"job-name":"labeling-job/mksamba-dekopon","class-name":"デコポン","human-annotated":"yes","creation-date":"2020-06-02T14:20:42.278689","type":"groundtruth/image-classification"}}
{"source-ref":"s3://xxxx-dekopon/dekopon02.jpg","mksamba-dekopon":1,"mksamba-dekopon-metadata":{"confidence":0.57,"job-name":"labeling-job/mksamba-dekopon","class-name":"デコポン","human-annotated":"yes","creation-date":"2020-06-02T14:21:50.649560","type":"groundtruth/image-classification"}}
{"source-ref":"s3://xxxx-dekopon/dekopon03.jpg","mksamba-dekopon":1,"mksamba-dekopon-metadata":{"confidence":0.75,"job-name":"labeling-job/mksamba-dekopon","class-name":"デコポン","human-annotated":"yes","creation-date":"2020-06-02T14:20:42.278712","type":"groundtruth/image-classification"}}
```

## 元記事の切替
ここまでで元記事の前編が終了。ここからは中編「 [【Nyantech ハンズオンシリーズ】機械学習を使って写真に写っている猫を見分けてみよう！〜中編：Amazon Rekognition Custom Labels を使った機械学習モデルの作成](https://aws.amazon.com/jp/builders-flash/202004/sagemaker-groundtruth-cat/)」に沿って作業を継続する。

## Amazon Rekognition でみかんとデコポンを見分けるモデルを作る

### プロジェクトの作成
- プロジェクト名を指定して Rekognition Custom Labelsのプロジェクトを作成する。
 
### データセットの登録
- データセットとして、output.manifestファイルを指定し、対象とするデータ(ラベリング済の画像20個)を登録する。

### S3 バケットにバケットポリシーを設定
- データセットの登録時、S3に対しRekognitionからのアクセスを許可するバケットポリシーを設定する必要がある。

### データセットの確認
- 対象となる画像が表示されることを確認する。

### モデルの学習
- 「Train Model」により学習を行う。「Split training dataset」を選択し、画像データを学習用と検証用に分割して使用する設定とする。

### モデルの確認
- 作成されたモデルを確認する。
    - 今回は学習に0.733時間(約44分)要した。
    - またF1 score が0.829となった。 
- F1 Score は「精度 (Precision) と検出率 (Recall) をバランス良く持ち合わせているかを示す指標」で、0～1の間の値になり、1が最もよい評価とのこと。算出ロジックは「[Python でデータサイエンス / scikit-learn でクラス分類結果を評価する](https://pythondatascience.plavox.info/scikit-learn/%E5%88%86%E9%A1%9E%E7%B5%90%E6%9E%9C%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E8%A9%95%E4%BE%A1)」を参照。元記事のモデル（ねこの判別）ではこの値が1になっているが、茶色のねこと黒いねこの画像なので、はっきりと判別し易い結果なのではと推測した。


![deko06b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/f2cea604-cfb4-4a5a-add2-b792fb9a5e2b.png)


## 作ったモデルを使ってデコポンの写真を見分ける (推論)

### API 実行環境について
- 元記事ではCloud9を使用しているが、今回は普通にAWS CLIが入ったEC2インスタンスを使用。AWS CLIのバージョンは 2.0.10。

### API を実行してデコポンを見分ける
#### APIの有効化
- Statusが"STARTING"になることを確認する。

```
$ aws rekognition start-project-version \
>   --project-version-arn "arn:aws:rekognition:us-east-1:xxxxxxxxxxxx:project/mksamba-dekopon/version/mksamba-dekopon.2020-06-03T01.01.36/xxxxxxxxxxxxx" \
>   --min-inference-units 1 \
>   --region us-east-1
{
    "Status": "STARTING"
}
```

#### 動画の判別
- S3に保存してある画像を指定して判別を行う。
- 上記のstartコマンド実行後、しばらく(5分くらい？)は実行エラーとなった。立ち上がりに少し時間かかるかも。
- 1個目のデコポン画像は確信度 87.4 でデコポンと判断された。
![dekopon21.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/668f15f0-15aa-e33b-edee-12d55f7f1065.jpeg)

```
$ aws rekognition detect-custom-labels \
>   --project-version-arn "arn:aws:rekognition:us-east-1:xxxxxxxxxxxx:project/mksamba-dekopon/version/mksamba-dekopon.2020-06-03T01.01.36/xxxxxxxxxxxxx" \
>   --image '{"S3Object": {"Bucket": "xxxxx","Name": "dekopon21.JPG"}}' \
>   --region us-east-1
{
    "CustomLabels": [
        {
            "Name": "デコポン",
            "Confidence": 87.44499969482422
        }
    ]
}
```
- 同様に2個目のデコポン画像も確信度 74.3 でデコポンと判定された。

![dekopon22.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/e0182098-060c-7973-d030-835405ae9f8f.jpeg)

```
$ aws rekognition detect-custom-labels   --project-version-arn "arn:aws:rekognition:us-east-1:xxxxxxxxxxxxx:project/mksamba-dekopon/version/mksamba-dekopon.2020-06-03T01.01.36/xxxxxxxxxxxxx"   --image '{"S3Object": {"Bucket": "xxxxx","Name": "dekopon22.JPG"}}'   --region us-east-1
{
    "CustomLabels": [
        {
            "Name": "デコポン",
            "Confidence": 74.343994140625
        }
    ]
}
```

#### APIを無効化
- Statusが "STOPPING" になることを確認する。課金を止めるために確実に実施する必要がある。
- 「AWS公式サイト: [Amazon Rekognitionの料金](https://aws.amazon.com/jp/rekognition/pricing/?nc=sn&loc=4)」によると、2020/6時点で、APIを有効化している間の料金はN.Virginia(us-east-1)で $4/時間 となっている。

```
$ aws rekognition stop-project-version \
>   --project-version-arn "arn:aws:rekognition:us-east-1:xxxxxxxxxxxx:project/mksamba-dekopon/version/mksamba-dekopon.2020-06-03T01.01.36/xxxxxxxxxxxxx" \
>   --region us-east-1
{
    "Status": "STOPPING"
}
```

# 所感

- みかんとデコポンはコンピュータ的にも容易に判別できることが分かった。
- 1) 画像のラベリングによるデータセット作成、2) モデルの作成、3) モデルを用いた画像判別、というプロセスが非常に分かりやすく実施できるハンズオンだったと思う。今回は前編、中編までを行ったが、別途後編にもチャレンジしたい。