GoogleのAutoML Visionで「快盗戦隊ルパンレンジャーVS警察戦隊パトレンジャー」の登場人物を検出してみた

非常に簡易的な操作で機械学習のモデルを生成できるGoogleの「AutoML Vision」を試してみました。

AutoML Vision
https://cloud.google.com/vision/automl/docs/?hl=ja

コンソールからポチポチと画像をアップロードして、ラベルを付けるだけで、あとは勝手に学習してくれるという素敵なシステムです。

猫を分類したり、魚を分類したり、二郎を分類したりするのが流行りだそうですが、娘が毎週見ている「快盗戦隊ルパンレンジャーVS警察戦隊パトレンジャー」の登場人物をAIで分類できたら「パパかっこいい！」となるのではないかということで、こちらにチャレンジしてみました。

かざすAI図鑑アプリ「LINNÉ LENS」リリース(特許出願中) 第一弾は約4,000種、日本の水族館にいる生き物の9割に対応
https://www.value-press.com/pressrelease/206311

ラーメン二郎とブランド品で AutoML Vision の認識性能を試す
https://cloudplatform-jp.googleblog.com/2018/03/automl-vision-in-action-from-ramen-to-branded-goods.html

# 画像収集

機械学習で一番大変なのは画像収集なのではないか? とやってみて分かりました。「AutoML Vision」では1ラベルにつき100枚以上、数百枚の画像を推奨しているようでしたが、100枚以下でも機能している事例を読みましたので、今回は1キャラクター50枚を目処にしました。

画像検索から拾ってくるのが定番のようですので、ヤフーとグーグルの画像検索からポチポチ拾っていきました。スクリプトを書いて自動化せよと怒られそうでしたが、「50枚くらいならいけるか・・・」という誘惑に負けました。

拾ってきた画像はサイズも形式もバラバラです。後処理で、複数の人物が同じ画像に収まっているものは、機械学習の妨げになるのではないかということで、トリミングを施しました。

ちなみに今回分類したのは以下の7名です。

登場人物
・夜野 魁利（やの かいり） / ルパンレッド
・宵町 透真（よいまち とおま） / ルパンブルー
・早見 初美花（はやみ うみか） / ルパンイエロー
・朝加 圭一郎（あさか けいいちろう） / パトレン1号
・陽川 咲也（ひかわ さくや） / パトレン2号
・明神 つかさ（みょうじん つかさ） / パトレン3号
・高尾ノエル（たかお のえる） / ルパンエックス / パトレンエックス

執事のおっさんも入れておけば良かった・・・。

それぞれ50枚ずつなので合わせて350枚の画像を用意しました。

# AutoML Visionのセットアップ

Google Cloudのアカウントは持っている前提で、以下からプロジェクトを作成(既存のプロジェクトでも問題ないです)。

https://console.cloud.google.com/cloud-resource-manager?hl=ja&_ga=2.53674408.-1047417256.1533167814

次に課金を有効に。

https://support.google.com/cloud/answer/6293499?hl=ja#enable-billing

「AutoML Vision」のAPIを有効化します。

https://console.cloud.google.com/flows/enableapi?apiid=storage-component.googleapis.com%2Cautoml.googleapis.com%2Cstorage-api.googleapis.com&hl=ja&_ga=2.267521166.-1047417256.1533167814

以上だったような、もう少し手続きがあったような・・・。

# 機械学習していくぞ

以下のURLから「AutoML Vision」のコンソールが開きます。

https://beta-dot-custom-vision.appspot.com/vision/

中に「Dataset」というものと「Model」というものが見れます。

・Dataset　画像ファイルにラベルを付けたものの集合体
・Model　Datasetを機械学習にかけて学習させたもの

まずDatasetを作成し、それを機械学習させてModelを作ります。そのModelにプログラムなどから分類したい画像を渡して、その結果を取得します。

## データセットを作る

以下のURLからデータセットを新規作成できます。

https://beta-dot-custom-vision.appspot.com/vision/datasets/create

![1.png](https://qiita-image-store.s3.amazonaws.com/0/153244/b58719e6-15ed-2c21-d617-ee416eed073b.png)

Dataset nameは好きな名前を付けてください。

画像のアップ方法はPCからJPG,PNG,ZIPでアップロードする、CSVを使ってアップロードするなどの方法があります。

Classification typeでは画像に複数のラベルを付けるか否か、という選択がありますが、現状では1画像には1枚のラベルというのが効果的だと書かれています。

画像のアップが終わったら、ラベルを付けていきます。

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/153244/d3b9e03c-b020-59d0-0e89-325b9c368479.jpeg)

UIはGoogle Photoに似てますね。

左側に「Add Label」というリンクがあるので、ここから使いたいラベルを追加していきます。それから、画像をクリックして、それぞれの画像にラベルを付けます。ラベルはRESTなどで叩いた際の戻り値になってきますので、分かりやすいものを付けておいた方が良いです。

## モデルを作る

データセットを用意したら、「TRAIN」というタブを開き「Train New Model」をクリックします。ウインドウが開くので、モデルに名前を付けて、「START TRAINING」をクリックすると学習が始まります。

今回は画像360枚、7つのラベルを設定して学習を行いました。所要時間は1時間程度だったと思います。完了したらEVALUATEのタブから結果を確認できます。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/153244/8774504b-8558-8d93-49e0-b88bf333bcb9.png)

幾つかの指標があります。

・Precision(適合率)　正と判断したデータが、実際に正である割合
・Recall(再現率)　正であるデータが、正と判断された割合
・Score threshold(閾値)

PrecisionとRecallはいずれも高い割合の方がモデルの精度が高いことを示します。ただし、トレードオフの関係にあり、PrecisionとRecallがいずれも高い数値を出す、Score thresholdの数字を探る必要があります(スライダーを動かすだけで簡単にチェックできます)。コンソールやAPIからアクセスする際にも、閾値を設定することになりますので、ここでちゃんとチェックしておきましょう。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/153244/0e6297d1-ce20-fde4-9cf9-2818729b976b.png)

ちなみにこちらはラベル毎の結果。上手くいけば、左上から右下に、斜めに適合率の高い青い数字が出てくるはずです。この結果からはルパンブルーとルパンレッドはなかなか難しかったということが分かります。

# コンソールで結果を楽しんでみる

モデルが完成したら「PREDICT」のタブから、簡単に機械学習の結果をチェックできます。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/153244/3a238a9f-f78b-bb2c-f633-60cfe33f80fd.png)

こちらの「UPLOAD IMAGES」のボタンを押すと画像選択画面になり、アップロードした画像を、先程作成したモデルで分類して結果を教えてくれます。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/153244/2097d3c5-e897-5900-2022-ccc994c1722c.png)

検知したラベルと、その精度を返してくれます。

Pythonのコードも例示されていて、もちろんAPIから叩くこともできます。こちらの方法は追って紹介したいと思います。

# やってみて分かったこと

## 簡単すぎてびっくり

ほぼ機械学習デビューで、AutoMLデビューだったのですが、簡単すぎてびっくりしました。コンソールを使って画像をぽちぽちアップして、コンソールから結果を確認する、これだけであればノンプログラマーでも支障なく出来そうです。(その後、Pythonから結果を取得するのはなかなか苦労がありましたが・・・)

## データセット大事

みんなが言うことですがデータ作りがとても大事で、これで精度が大いに変わります。

今回一番の反省点は、ヒーローの変身前と変身後のデータをごっちゃにしてしまったこと。今回はデータ量が少なかったですし、「快盗戦隊ルパンレンジャーVS警察戦隊パトレンジャー」は色が似通ってたりするので、見分けるのは難しいようでした。出来上がったモデルでも、変身前は大方判別できましたが、変身後はかなり間違える・・・という状態です。次回やるなら、変身前、変身後で計14ラベルでやるべきかなと思いました。

この辺のデータ作り、ラベル作りのノウハウはそれなりにありそうですね。

## とにかくトライ

「百聞は一見に如かず」という言葉がありますが、実地で試してみると分かることが多いよね、と思いました。言葉や用語からして機械学習は難しそうというイメージを持っていた自分ですが、試して、体験しながら、言葉の意味も多少は理解できたように思います。具体的なユースケースがあまり思い付けてないのですが、触ったところで、多少なりともアイデアも出てきました。

あと楽しんでやれるテーマが必要だなあと。二郎を分類した人はきっと楽しかっただろうし、自分も「子供に凄い！」と言われたいというのが多少モチベーションになってデータ作りもできたので、ここって大事だよなあと改めて思いました。

では。

快盗戦隊ルパンレンジャーVS警察戦隊パトレンジャー
http://www.tv-asahi.co.jp/lvsp/