Google AutoML Vision の画像認識をクルマSNSアプリに組み込んだ

[Google Cloud Platform](https://cloud.google.com/?hc=ja) が提供する、画像認識の機械学習サービス  **[AutoML Vision](https://cloud.google.com/automl/?hl=en)** のβ版が、
2018/07/25 にリリースされました。

このたび、この AutoML Vision を活用した機能を、
**「[CARTUNE](https://cartune.me/)」** という、クルマ好きが集うSNSアプリ ( [Android](https://play.google.com/store/apps/details?id=me.cartune.android) / [iOS](https://itunes.apple.com/jp/app/id1221199655?mt=8) ) に実戦投入しました。

この記事では、その事例をご紹介します。

# 完成した機能
クルマSNSアプリ 「CARTUNE」 にユーザーが投稿したクルマの画像を、**AutoML Vision が自動で分類** し、あらゆるクルマの投稿をカタログ的に見られようにしました。

下記はその一例です。
眺めているだけでも、非常に楽しいものになっております。

<img width="240" alt="フロント.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/29149/7f1f1e49-f415-7c19-92ae-5720af0e672c.jpeg">　<img width="240" alt="リア.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/29149/195963d7-ec3e-9823-4037-ed5b2e253b47.jpeg">

<img width="240" alt="痛車.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/29149/69d51c49-7384-0764-1c67-47069b39e611.jpeg">　<img width="240" alt="メーター.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/29149/c94180d5-dc43-8336-6792-63a9b2e413ed.jpeg">

<img width="240" alt="海.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/29149/ce86916c-3846-a8b2-71b1-9cb747fa4b2a.jpeg">　<img width="240" alt="大黒.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/29149/99509d66-9258-9a37-5d74-8386e37badb2.jpeg">


これらの画像は全て、**ユーザーがタグ付けしたものではなく、AutoML Vision が画像認識を行い**、分類しています。

分類としては、

* フロント、サイド、リアといった、写真内のクルマのアングル
* メーター、ステアリングなど、インテリアとして写っているもの
* 痛車、ガルウィングといった、クルマの外観
* 大黒PA（クルマ好きが集う聖地パーキングエリア）の写真や、海が一緒に写っている写真、といったロケーション

などなどが可能となっています。

これ以外にも、合わせて計約30のラベルをオリジナルで用意しており、
いずれも非常に高い精度で（単一の画像分類モデルで）分類することができました。



# AutoML Vision の概要とその能力
## 概要
[**AutoML Vision**](https://cloud.google.com/automl/?hl=en) とは、 [Google Cloud Platform ](https://cloud.google.com/) が提供する、画像認識の機械学習サービスです。
2018年初めに、[ラーメン二郎の画像から店舗を特定する事例](https://cloudplatform-jp.googleblog.com/2018/03/automl-vision-in-action-from-ramen-to-branded-goods.html)で話題になりました。
2018/07/25 にβ版がリリースされております。

AutoML Vision は、
　**オリジナルの画像分類モデルを**、 
　**高度なプログラミング手法を必要とせず**、
　**非常に高い精度で**
トレーニングさせられることが特徴です。

対比として例えば、2016年に、同じく Google Cloud Platform からリリースされた [Vison API](https://cloud.google.com/vision/) は、非常に強力な画像認識サービスであるものの、
「ヨット」や「ライオン」、「エッフェル塔」などといった、あくまで Vison API 側が用意したカテゴリを検出することに限られました。（とはいえ膨大な量のカテゴリですが）

対して **AutoML Vision** は、自前の画像分類モデルを作成することができるため、
本記事の CARTUNE の事例のような、「痛車」「大黒PA」を検出したい、など、オリジナルの学習モデルを作成したい用途に適しています。

## 精度
下記画像は、本事例でトレーニングした画像分類モデルの、精度テスト結果（AutoML Vision コンソールのキャプチャ）です。

<img width="750" alt="スクリーンショット 2018-08-08 16.01.48.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/29149/c67a17e8-c392-45fa-344d-d61bc9fadc32.jpeg">

約4000枚の画像に約30のラベルづけをしてトレーニングを行い、
　[Precision（適合率）](https://en.wikipedia.org/wiki/Precision_and_recall) **89.8%**
　[Recall（再現率）](https://en.wikipedia.org/wiki/Precision_and_recall) **83.0%**
を出すことができました。

今回準備した学習データセットは、1ラベル平均で100枚強となります。
一般的な画像認識トレーニングに用いる学習量としては若干物足りない（推奨は1ラベル1,000枚以上）ながらも、
今回の使用目的には十分耐えうる精度を出すことができています。
（実プロダクトでは、score のしきい値を厳しめにすることで、さらに Precision を高くしています）



# AutoML Vision の使い方
詳細な利用方法は、 [**公式のドキュメント**](https://cloud.google.com/vision/automl/docs/) をご参照ください。
ここではざっくり学習の流れと、一通り AutoML Vision を利用してみて気づいた注意点を記載します。

## トレーニング画像の準備
トレーニング画像を [Google Cloud Storage](https://cloud.google.com/storage/) にアップロードし、
アップロードしたそれぞれの画像URIがどの分類ラベルに属するかを示す、CSVを作成します。
トレーニング画像が大量になる場合は、スプレッドシートなどで対応表を作成し、マクロでCSVを作成することになるでしょう。

<img width="300" alt="dataset_spread.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/29149/abbd9e82-f8c1-7650-0709-bbe445447133.jpeg">

あとは、このCSVをインポート画面からインポートするだけです。
4,000枚のトレーニング画像であれば、約1時間ほどでインポートが完了します。

<img width="300" alt="import.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/29149/1410b1c6-4d1e-fd9c-ccbb-8062b2cae07b.jpeg">

また、試しに少量画像で AutoML Vision を試したいだけであれば、
コンソールのUI上で画像をインポートし、ラベル付けしていくこともできます。

## トレーニング実行
トレーニング画像のインポートが終わると、下記画像のように、コンソール上で各画像とラベル付けを確認することができます。

<img width="300" alt="images.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/29149/b1c3249e-619f-e729-a8f4-b8ea3eca29dd.jpeg">

あとはトレーニング実行ボタンを押すだけです。
AutoML Vision のトレーニングにはパラメータは殆ど必要なく、学習時間の設定のみです。
学習時間が長いほど精度は良くなりますが、[料金が発生します](https://cloud.google.com/vision/automl/pricing#training_costs)。

しかし、1時間（※正確には 1 compute hour と呼ばれる内部時間）のトレーニングであれば、無料で月に10回まで可能です。
<img width="300" alt="train.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/29149/7b535eef-588a-5a43-836b-02e73187414e.jpeg">
試しにトレーニングする場合は、この無料枠を積極的に使っていきましょう。

与えたデータセットは、トレーニングの際に自動で

- 80％が[トレーニングデータ](https://en.wikipedia.org/wiki/Training,_test,_and_validation_sets)
- 10％が[バリデーションデータ](https://en.wikipedia.org/wiki/Training,_test,_and_validation_sets)
- 10％が[テストデータ](https://en.wikipedia.org/wiki/Training,_test,_and_validation_sets)

に分類されます。
この割合はカスタムで変更することも可能ですし、画像ごとに個別に割り当てることも可能です。

## 評価
トレーニングが完了すると、コンソール上で評価を確認することができます。

<img width="300" alt="スクリーンショット 2018-08-08 16.01.48.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/29149/c67a17e8-c392-45fa-344d-d61bc9fadc32.jpeg">

[数々の評価軸](https://cloud.google.com/vision/automl/docs/evaluate) で結果を確認することができるので、[ガイドラインに沿って](https://cloud.google.com/vision/automl/docs/beginners-guide#evaluate) データセットを改善し、再トレーニングを行って精度を高めていきましょう。

また、この時点で実データをモデルに適用することができるので、手元に別途テストデータを用意して、評価してみるのも良いと思います。

<img width="300" alt="eval.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/29149/8b29e256-32ed-35a6-bfd7-fea49caac168.jpeg">



## 注意点

### 学習画像の量は目的に応じて設定する
AutoML Vision で、1ラベルあたりの[推奨される学習画像枚数](https://cloud.google.com/vision/automl/docs/beginners-guide#include_enough_labeled_examples_in_each_category)は、1,000枚です。
さらに、全ラベルで同等の量の学習データを準備することが[推奨されている](https://cloud.google.com/vision/automl/docs/beginners-guide#distribute_examples_equally_across_categories)ため、例えば30ラベルを分類したい場合、推奨に従えば30,000枚の学習データを準備する必要があります。

しかしながら、推奨枚数ほどの大量データを準備できない事例も多々あるかと思います。
しかも、量を確保しやすいラベル・確保しにくいラベル、といった偏りが出ることは、実例で多々あることかと思います。

本事例では、先述の通り、1ラベル平均で100枚強 × 30ラベル で計4,000枚 を準備し、
Precision, Recall ともに80〜90%の精度を実現することが出来ました。
勿論、本アプリでは今後、さらに精度を上げていきますが、
本事例を参考にして、画像認識の目的とコストに合わせて、学習画像の量を設定いただければと思います。

### 学習画像のラベルはもれなく設定する
[ドキュメントに記載](https://cloud.google.com/vision/automl/docs/datasets#label-items)の通り、AutoML Vision では、全学習画像にラベルを設定する必要があります。
「ラベルなし」の学習データはトレーニングに影響を与えない（負例として学習されることはない）ので、もれなくラベルを設定するようにしましょう。
（※ `None_of_the_above` という特別なラベルを付与することで [負例として学習できるようです] (https://cloud.google.com/vision/automl/docs/prepare#preparing_your_images)が、未検証です）

また、AutoML Vision では、multi-label 分類（1データに複数ラベルづけされる分類）も可能です。
multi-label 分類する場合は、ラベルづけ漏れのないように、全ラベル×全画像 を横断的にチェックするようにしてください。
例えば本事例で、「痛車」の学習画像のひとつとして、下記画像を準備しました。

<img width="300" alt="痛車_学習.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/29149/a44b26d9-0c79-3e43-3a8d-f5f9f2cc2678.jpeg">

これに「痛車」のラベルは付与したものの、「フロント」（正面向きのクルマ）のラベルの付与が漏れてしまっていたため、「フロント」の学習精度が悪くなる、という事例がありました。

全ラベルを横断的にチェックするよう、注意してください。

### トレーニング時間による変化
先述の通り、AutoML Vision では、トレーニング時に学習時間を設定することができます。
先述の本事例の学習モデルは、24時間の学習を行ったものです。

<img width="300" alt="スクリーンショット 2018-08-08 16.01.48.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/29149/c67a17e8-c392-45fa-344d-d61bc9fadc32.jpeg">

同じデータセットで、無料枠の、1時間 (1 compute hour) の学習 （無料は月10回まで） を行うと、下記の精度となりましたので、ご参考にしてください。
この1時間の学習の精度でも、十分実用に耐えられる事例もあるかと思います。

<img width="300" alt="1hour.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/29149/460576de-4058-302e-91fe-5ef153050453.jpeg">


# まとめ
このたび、AutoML Vision を活用した機能を、クルマ好きが集うSNSアプリ「CARTUNE」に組み込みました。

AutoML Vision は、「高度なプログラミング手法を必要とせず画像認識を可能とする」ことをうたっています。
まさにその通りで、データセットとそのラベリングを適切に行うだけで、高精度の画像認識モデルを作成することができました。
この「適切に行う」というところもある程度の職人技が必要になるかと思いますが、それも [公式のガイドライン](https://cloud.google.com/vision/automl/docs/beginners-guide) にて tips が公開されていますので、これから利用される場合は、まずドキュメントをしっかり読むことをおすすめします。

この AutoML Vision の登場により、機械学習（画像認識）の用途がさらに広まっていくのではと感じます。
今まで機械学習（画像認識）を敬遠していた方も、ぜひ AutoML Vision を触ってみて、独自のモデルを作ってみていただきたいと思います。