Firebase MLKit AutoML Vision Edgeを触ってみた

# はじめに
この記事では、GoogleI/O 2019にて発表されたFirebaseの新機能`Firebase MLKit AutoML Vision Edge`についての概要と、実際に使用する際の流れを実例を用いて解説します。
「使ってみたいと思っているけど、大変そう。。。」とお考えの方々の後押しができればいいなと思っています。

# Firebase MLKit AutoML Vision Edgeとは
Firebaseコンソールに画像をアップロードするだけで、カスタムモデルを作成できる機能です。


- [What's new from Firebase at Google I/O 2019（Firebase公式ブログ）](https://firebase.googleblog.com/2019/05/whats-new-Google-IO-2019.html)
- [ML Kit: Machine Learning for Mobile with Firebase (Google I/O'19)（YouTube）](https://youtu.be/QwHD36bhXZA?t=1380)

Firebase Console > ML Kit > AutoMLからスタートできます。

# データセットの準備
## 新規データセットの作成
コンソールから`データセットを追加`を選択。

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/6b238a29-0c52-ca89-1032-aa083fe024c2.png)

学習データの各画像に付与するラベルの数を選ぶことができます。
今回は1つを選択します。

![2342342.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/d0fb209f-74dc-d5a4-6d88-aa3a3bc1424f.png)

## トレーニングデータ画像の準備
今回はバスの判別をするために、3社のバス会社の画像を使います。
バス会社A（busA）, バス会社B（busB）, バス会社C（busC）と名付けました。
（推論精度を上げるためには、それぞれのラベルに対して最低100枚の画像が必要になりますが、今回はお試しでそれぞれ20枚ずつで挑戦してみました。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/b7c69c43-b009-e573-025c-5a7c08eb820b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/5820c9a1-26a9-bd46-df97-d72d299a067a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/c2e99334-6170-92d6-88fd-4ffb85cfa050.png)

画像はそれぞれbusA, busB, busCというフォルダの中に保存しています。
コンソールにアップロードすると、それぞれのフォルダ名がラベルとして認識され、フォルダ内の画像全てにフォルダ名と同じ名前のラベルが付与されます。

<img width="156" alt="スクリーンショット 2019-06-11 18.59.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/bd928bd6-f263-4cac-91e4-a8b532618846.png">

これらの画像をzip圧縮してコンソールにアップロードします。

![スクリーンショット 2019-05-27 19.10.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/14f6611d-b35f-b253-286f-bd84e59d9207.png)

アップロードが完了すると、ラベル付けされた画像群が確認できます。
それぞれのラベルの横に表示されている警告マークは、データ数が100枚を満たしていないことを警告してくれています。

![スクリーンショット 2019-06-11 19.04.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/19a2ee67-83de-5fb1-278a-a8655bf35567.png)

# モデルのトレーニング
`モデルをトレーニング`を選択すると次の画面に遷移します。

![スクリーンショット 2019-05-27 19.19.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/4e02d6be-e88e-1d35-0947-ae24213942a0.png)

レイテンシとパッケージサイズのオプションを選択します。
制度よりも速度やサイズを求める場合は`下限レイテンシ`、速度やサイズよりも精度を求める場合は`高精度`を選択します。
今回は中間の`汎用`を選択しました。

トレーニング時間を長くすることでモデルの精度を上げることが可能ですが、無料のSparkプランだと最大で1時間しか選択できません。
したがって、今回は`1コンピューティング時間`を選択します。

これで準備は整いました。
`トレーニング開始`を選択します。

トレーニングが開始され次の画面に遷移します。
トレーニングが完了するとメールが送られてくるので待ちます。

![スクリーンショット 2019-06-11 19.08.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/0d2f3109-bdf4-3e50-43b9-0adca020301e.png)

完了するとモデルのステータスがトレーニング完了になるので、クリックしてモデルの評価を確認します。

![スクリーンショット 2019-06-11 19.33.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/a467594c-1177-0d61-626b-ccda9b31d12a.png)

# モデルの評価
この画面ではモデルの精度の確認、調整ができます。

![スクリーンショット 2019-06-11 19.35.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/174d29ad-b3b2-9589-2994-f8b4d744aba7.png)

## スコアのしきい値
スコアのしきい値を調整することで、モデルの精度のカスタマイズが可能です。
適合率と再現率という2つの指標を元に調整することになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/fa10fd87-b5fa-172a-e81e-b4f12b31ce72.png)

- 適合率
  - 正確性のこと。適合率が高いほど偽陽性が低くなる。
  - 偽陽性の具体例：バス会社Aが写っている画像に対してバス会社A以外のラベルを付与してしまうこと。
  - つまり適合率を高くすると、、、判定精度が上がる代わりに、取りこぼしが多くなる。（狭く深く）

![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/3475d49a-be88-fd9f-8c64-4025e73e2f70.png)

- 再現率
  - 網羅生のこと。再現率が高いほど偽陰性が低くなる。
  - 偽陰性の具体例：バス会社Aではない画像に対してバス会社Aのラベルを付与してしまうこと。
  - つまり再現率を高くすると、、、取りこぼしが少なくなる代わりに、正確性が失われる。（広く浅く）

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/270cbd02-ddcc-0396-7ead-d95c10d49fd6.png)

この2つはトレードオフになっているので、どちらを重要視するかは実現したいことによって変わってくると思います。
ちなみにGoogleはこれらの値とユースケースの関係を分かりやすく説明してくれています。
https://cloud.google.com/inclusive-ml/#jump-to-2

## ラベル毎の予測精度
この表では、各ラベルがどれくらいの確率で正しいラベル付けを行うか、またどれくらいの確率で他のラベルと間違えるかを表しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/7931ef7f-c9be-2895-6668-1caa4d929394.png)

# モデルのテスト
コンソール上から、トレーニングしたモデルを実際に試すことができます。

![スクリーンショット 2019-05-28 19.43.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/a8ba0bc9-158f-7275-3cf8-08d04d531f4d.png)

バス会社Aの画像を入れてみると、busAは60.5％と予測されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/085eabde-7d9d-c121-f207-d310ff3fbb49.png)

バス会社Bでは、busBが69.6%でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/627f89bc-ce97-3f94-d028-75171bd4b25c.png)

学習に用いた画像数が少なく学習時間も少ないながら、ML初心者からすると高い精度が出ているように感じました。

# まとめ

- Firebase MLKit AutoML Vision Edgeを使うと、Googleがモデル作成を肩代わりしてくれます。
- MLの専門知識がなくても、コンソールの手順通りに進めるだけで簡単にモデルを作成できます。

アプリへの組み込み部分も完了次第、追記したいと思います。
是非みなさんもご自分で試してみてください！