今日からAmazon Rekognition Custom Labelsで転移学習できるうようになった！

これは、[機械学習ツールを掘り下げる by 日経 xTECH ビジネスAI③ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/machine-learning-02)の記事です。12月後半に記事を書こうかなと思ったのですが、12月前半に記事を書いている方が少なそうでしたので、前倒しで書いてみました。本記事では、私のオススメ機械学習ツールとして、先週くらいにアマゾン ウェブ サービス (AWS) から発表があったAmazon Rekognition Custom Labelsを取り上げたいと思います。

参考：[日経xTech『画像認識AIの独自開発が容易に、AWSが新サービス「Rekognition Custom Labels」提供へ』](https://tech.nikkeibp.co.jp/atcl/nxt/news/18/06557/)

発表があったのは11月25日、使えるようになったのは12月3日（日本時間では12月4日）でしたので、できたてほやほやサービスです。と、いいつつ、本記事は「今日から～」というタイトルにしたのですが、試しているうちに翌日（日本時間12月5日）になってしまいました。まだ日本リージョンでは使えないためバージニア北部リージョンで動かしてみました。そもそもこの機能は日本語設定だと出てこないので、AWSを英語設定にする必要もあります。

### サーバレスで画像認識機能を使えるRekogniton！
サーバレスで画像認識を作るのがとても楽なので、従来からRekognitionは気に入っていました。

例えば、LINEで画像メッセージを送ったら、その画像に映っているものが何であるかを判定するようなアプリを作ってみました。次の画像のように、ピザの絵を送ったら、Food:94%やPizza85%といった結果をLINEメッセージで返します。
<img width="200" alt="qiita-square" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271244/167b1698-47bd-4540-d43d-2a4c907c3da8.jpeg">

このようなアプリは、Rekognition含むAWSサーバレスを駆使したら、意外と簡単に作ることができます。無料版のLINE@ Messaging APIを用意してWebhookURLをAWS API Gatewayに設定し、そこで受け取ったRESTリクエストをLambdaで処理するだけです。画像データを一旦S3において、Rekognitionで解析したら、その結果をLambdaからLINE Messaging APIに送るという仕組みです。

<img width="597" alt="system.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271244/2558c17f-b4ad-dfba-127d-30e7f6411524.png">

### でも、従来のRekognitionに不満もあった
従来のRekognitionは、AWSが自前で用意した画像をもとに作られた機械学習モデルです。ですから、AWSが使った学習データの教師ラベルに含まれていないものは、認識できません。海外のベンダーが作っている画像認識モデルですから、日本人感覚からすると、意外だなと思うものが認識できなかったりします。例えば・・・

<img width="917" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271244/5adb1b04-420b-5917-c9e9-020ce0fc3c3d.png">

日本人感覚では、絶対に間違えないであろうクワガタの画像をAWS Rekognitionで解析しても、まずクワガタ（Stag Beetle）とは認識してくれません。たいてい、フンコロガシ（Dung Beetle）と認識されます。USでは、クワガタよりもフンコロガシの方が一般的なのかな・・・（そういえば、ファーブル昆虫記でもフンコロガシが取り上げられていたなぁ）・・・これが、Rekognitionに対する長年の不満でした。こんなに特徴的なカタチをしている分かりやすい昆虫なんですけどね。

### Rekognitionでクワガタを認識させたい！
#### まずは、トレーニング（学習）！
Amazon Rekognition Custom Labelsは、ユーザーが自前の教師データを少量用意すれば、独自の画像認識AIを開発できるというAWSの新しいサービスです。つまり、転移学習ができるようになったわけですね。これを使って、クワガタの画像データを何枚か投入すれば、Amazon Rekognitionでクワガタを判別できるようになるのでは・・・と考えました。
ついに昨日からサービスが使えるようになったので、すぐに試してみました。

まず、学習用の画像データはgoogle検索でクワガタ10枚とカブトムシ10枚くらいを探して準備します。AWS Rekognitionをバージニア北部リージョンで、かつ英語版で開くと、Custome Labelsという今までなかった新機能があるのがわかります。

<img width="380" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271244/78d93c48-977b-c4ca-66b3-80fdc9a600f0.png">

Rekognition Custome Labelsの新しいプロジェクトを作ります。

<img width="300" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271244/4c0d60a2-9082-70ed-5e22-eb0a4f27b0b5.png">


画像をどんどん追加していきます。
<img width="300" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271244/bf70ffd7-a015-ba49-3f5c-5350892f3b20.png">

そして、1匹1匹にラベルと境界線を設定してきます。（意外と面倒・・・もう心が折れてきた・・・）

<img width="600" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271244/35f7b941-6723-613e-34d8-441a125bcd94.png">

さぁ、学習データが揃ったので、トレーニング（機械学習）してみます！全データ（画像20枚）のうち、20%を検証用データとすることにしました。
<img width="400" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271244/1e42e144-05de-6d6b-7088-69ce7ae8a16b.png">

ここでしばらく待っていると・・・トレーニング完了です。F値は、0.345・・・かなり低いですね。画像データが少なすぎるのか？クワガタとカブトムシが似すぎていて判別がつかないのか？など、色々と思うところはありましたが、今回はお試しなので、そのまま進めます。


#### 性能検証
<img width="600" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271244/d4274faa-8457-1e51-cb53-460e8f0d9939.png">

もう少しブレイクダウンして性能を見てみると、カブトムシの精度（Precision）は1.00でクワガタの精度（Presicion）は0.01でした。この数値だけ見ると、カブトムシと認識したものは正確にカブトムシであることを判別できている素晴らしい数値（精度1.0）ともいえなくもないですが、再現率が0.50であるところを見ると、ほとんど全ての検証データをカブトムシと判定してしまっている・・・つまり、あまり意味のない判定機になってしまっているということだと思います。

<img width="660" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271244/de4e0150-3cc8-077f-0882-5c22117a2ffe.png">

実際にクワガタの画像を解析してみると、次のような感じです。まず、AWS Rekognitionの元からあるモデルで物体認識して領域を抽出してくれます。それぞれの領域に対して、画像分類を実施してくれるみたいです。この画像の中だと、最もクワガタらしいハサミの部分を緑色の領域で「クワガタ」と認識してくれているようです。まぁ、これだけでも今日は満足です。

<img width="757" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271244/bc8b843c-fc0a-b18c-2aae-345393ec2493.png">


### おわりに
性能（精度と再現率）を上げていくためには、当然のことながら、学習データを工夫していく必要がありそうです。今回、Amazon Rekognition Custom Labelsを触ってみて、自分用の画像判定AIを、物凄く楽に作れることが分かりました。Rekognitionですから、もちろんAWS Lambdaから簡単に呼び出せますので、サーバレスでの活用も簡単です。つまり、画像判定AIを作る際に、『学習データの準備だけ』に集中できるようになったということだと思います。凄いな。これから、性能を上げていくための学習データの在り方などを、工夫していきたいなと考えています。