AWS Amazon Rekognitionを触ってみた

# Amazon Rekognitionで画像分類を実施してみた

## 背景
- 撮影した動物の画像が気に入らなかった場合、自動的に取捨選択してくれたら楽だな
- AWSの勉強も行いたい

ということで、画像分類に特化したAmazon Rekognitionのサービスをえらびました

Amazon Rekognitionについて

> - 機械学習 (ML) モデルとインフラストラクチャを最初から構築することなく、事前にトレーニングされた、またはカスタマイズ可能なコンピュータビジョン API をアプリケーションにすばやく追加
> - 何百万もの画像、ストリーミング、保存された動画を数秒で分析して、AI を使用して人間のレビュータスクを強化
> - フルマネージド AI 機能を使用して、ビジネス上のニーズに基づいてスケールアップおよびスケールダウンを行い、分析した画像と動画に対してのみ料金を支払います。

参照：https://aws.amazon.com/jp/rekognition/

# 流れ
- データの準備（前処理）

- プロジェクトの作成
- データセットの作成
- モデルの作成・評価

## データ準備（前処理）
ブラウザからS3に画像をアップロード
参考：Ahttps://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v3/developer-guide/s3-example-photo-album.html
  
  1.  アルバム・写真を保存できるS3バケットを作成する
  2. 画像をアップロード

## Amazon Rekognition導入
AWSコンソール画面（https://us-east-1.console.aws.amazon.com/console ) から **Amazon Rekognition**を選択

Amazon Rekognition　>  カスタムラベルを使用  >   ご利用開始にあたって  > プロジェクト > 作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605166/6feb8b4f-2315-02b0-37f0-7c057644b625.png)


先に流れを確認したい場合はチュートリアル・サンプルプロジェクトなどで大まかな流れを確認できます。
https://us-west-2.console.aws.amazon.com/rekognition/custom-labels?region=us-west-2#/get-started/example-projects

## データセット作成

今回はトレーニングデータとテストデータを分けていないので、

自動的に8:2で分けられるよう 1つのデータセットを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605166/5f9105dd-6797-d092-d16d-3e1b650513be.png)

事前に作成したS3を使用します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605166/c493f077-d272-dfa3-42ee-9f2127565a56.png)
![コメント 2022-05-25 17171.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605166/bd4407da-301e-641a-3ba6-5bcb44db212b.png)

S3のURLについては、使用画像が入っているディレクトリで　**S3　URLをコピー**　を選択すればOK

#### パケット側の設定
**ポリシーをコピーし、Paste the policy into the "Bucket Policy" section of xxx…**　を選択　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605166/332a7802-71c1-707a-a0f6-65c283fa6cda.png)
↓

対象バケットの　**バケットポリシー**　を編集、**データセット作成**を選択


#### 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605166/8162560a-c454-974c-4924-7daa78fe6d09.png)

データセットが作成済み　という表示になりました。


## 新しくラベルを追加する
ローカルコンピュータから使用する画像にはラベルがつかないので、自身でラベルをつくります。
ディレクトリを分けている場合、あらかじめラベルを設定することもできます。

  1. 新しいラベルの追加
ラベル付けを開始　＞　　ラベルを追加　＞　新しいラベル名 ＞　ラベルを追加　＞　保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605166/720720d9-9d4c-2279-f14e-2990587e6c2f.png)
参考：https://docs.aws.amazon.com/rekognition/latest/customlabels-dg/md-labels.html


　2. 細かく設定したい場合は、画像ごとに境界を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605166/a661b6c2-5ecf-5fa0-6488-1c31f874d115.png)
　　犬と判定してほしい箇所に犬のラベルを付けました
　3. トレーニングデータ・テストデータともにラベル付けを行い、完了
　**※ともにラベル付けを行わないと、モデルのトレーニングができないので注意**


## モデルのトレーニング

  1. プロジェクト > 対象のプロジェクト > モードのトレーニングを選ぶ
![コメント 2022-05-25 171710.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605166/1e7f4f49-b89c-d2d8-bbd3-a97606848ecf.png)
入力項目は変更せず、モデルをトレーニング　を選択

　 モデルのステータスが　TRAINING_IN_PROGRESS　→　TRAINING_COMPLETED　になっていれば成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605166/9419b57c-bcc0-fba5-32f7-3e1355753d24.png)
                     ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605166/06d06e7e-a7a6-4e14-6f23-4168b4eec3ab.png)
参考：https://docs.aws.amazon.com/rekognition/latest/customlabels-dg/training-model.html


#### エラーが発生した場合
今回は
使用されているテストラベルとトレーニングラベルの重複が50％未満の場合に起きるエラーが発生しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605166/cd69de4e-9ff9-db55-88e0-35dcb16bf981.png)

- 解決策
  ラベルが重複するよう、テストデータ用のラベルを細かく追加
参考:https://docs.aws.amazon.com/rekognition/latest/customlabels-dg/tm-debugging-aggregate-errors.html

- 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605166/3bf54582-c439-63ad-3a69-fe5d13df721e.png)


## モデルの評価
テストデータセットのパフォーマンスを確認する
犬の顔に想定通りのラベルがついていましたが、全身・手足はFalse Negativeの結果となりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605166/64e1dc92-6f71-6af4-676f-92b11103d3c0.png)


細かい結果・評価については、**モデルの詳細**から取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605166/033869a8-551f-b5d3-2f63-5d4595f6aaf9.png)



## まとめ

精度の高いモデル作成はできなかったが、画像分類を学ぶよい切り口

- 問題点
  ラベルの精度
データセットをあらかじめ作成
　

スマホなどで撮った写真　→　AWSで画像選択　→　自身が良いと思った写真のみ残す
といったことも可能だと思います。

## 参考
Sagemakerをつかった画像分類について
Amazon Rekognitionとはまた違う手法ですので、気になった方はぜひご覧ください。

◆モデルについて学ぶ　TensorFlow
https://www.tensorflow.org/tutorials/keras/classification

◆画像処理について（Dog vs Cat）
https://www.tensorflow.org/tutorials/images/classification

◆AWSを用いた機械学習
https://dev.classmethod.jp/articles/learn-machine-learning-within-an-hour-with-sagemaker/

◆現場で使える！TensorFlow開発入門 Kerasによる深層学習モデル構築手法
https://books.google.co.jp/books?hl=ja&lr=lang_ja|lang_en&id=-dtVDwAAQBAJ&oi=fnd&