ちょっと話題の記事

ML Kit For Firebaseを使ってスマホで色々検出してみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

当エントリでは、AndroidとiOSの端末上で機械学習を扱いやすくするML Kit for Firebaseについて紹介します。

ML Kit for Firebaseはクイックスタートが公開されているため、簡単に試す事ができます。その内容についても紹介していきます。

目次

ML Kit For Firebaseとは

ML Kitはモバイル端末上で機械学習を扱いやすくするためのパッケージです。
今はパブリックベータ公開ではありますが、Firebaseで使うことができます。

BaseAPI

次のような機能がBase APIとして用意されています。学習済みのモデルを使った機能なので、自分でモデルを用意する必要がなく、お手軽に使うことが出来ます。クラウドAPIと端末内APIがあり、端末内APIはオフライン状態でも使うことが出来ます。クラウドAPIは内部的にCLOUD Vision APIを使っているのでCLOUD Vision APIと同じ料金が掛かります。端末内APIは無料で利用できます。

画像分類
画像に表示されている物や場所、動き、動物などを分類するものです。端末内APIとクラウドAPIの両方に対応。
Image Labeling  |  Firebase
文字認識
画像に表示されている文字を検出し、認識します。端末内APIとクラウドAPIの両方に対応。
Text Recognition  |  Firebase
顔検出
画像内の顔を検出します。顔の各パーツの位置なども検出できます。端末内APIのみ対応。
Face Detection  |  Firebase
バーコードスキャン
画像内のバーコードを検出し、その内容を表示します。端末内APIのみ対応。
バーコード スキャン  |  Firebase
ランドマーク認識
画像内のランドマーク(有名な建築物など)を検出します。クラウドAPIのみ対応。
Landmark Recognition  |  Firebase

※ リンクのタイトルが日本語のものは日本語の詳細ページで、英語のものは英語の詳細ページです。(2018年8月23日現在)

カスタムモデル

BaseAPIの機能以外にも自らで用意したモデルもTensorFlow Liteで読み込める形式であれば使うことが出来ます。
特徴としては次のようなものがあります。

  • Firebase上にモデルを置いておくことができます。アプリ内にバンドルすることもできます。
  • Firebase上のモデルを更新すると、アプリ側で自動でダウンロードさせて端末内のモデルを更新させることができます。
  • Firebase上のモデルと端末内のモデルを使用することができ、Firebase上のモデルが使用できなければ端末内のものを使うということも出来ます。

今回はあまりカスタムモデルの実装の仕方については触れません。Codelabsに例があるので、そちらを確認して頂ければと思います。

TensorFlow Liteとは

TensorFlow LiteはTensorFlowのモバイル向けのライブラリ群です。専用のモデルのフォーマットを使うなどして、TensorFlowをモバイル用に最適化したものです。

今の所はTensorFlow Liteはデベロッパープレビューとして公開されています。なので、事前に検証された機械学習もまだまだ少なく、機能としても少ない状態です。しかし、同様のモバイル向けのTensorFlowとして公開されているTensorFlow Mobileに比べてより軽量でパフォーマンスの良いアプリケーションを開発できると謳われています。なので今の所は、サービスに使うのであればTensorFlow Mobileを使用し、今後の正式リリースに備えてTensorFlow Liteを検証して追いかけておく、というのが良さそうです。

クイックスタートをやってみた

ML Kitのクイックスタートを使って、試してみました。 内容としてはAndroidでカメラに表示しているものに対してリアルタイムでBaseAPIの端末内APIを利用した検出を行うLivePreviewActivityと、静止画に対してクラウドAPIを利用した検出を行うStillImageActivityがあります。

前提

Android Studioを事前にインストールしておく必要があります。

準備

まずはクイックスタートのリポジトリをクローンしてきます。

git clone https://github.com/firebase/quickstart-android.git

クローンで落としてきたディレクトリの中のmlkitをAndroid Studioで開きます。

google-services.jsonが無いと動かないので、Firebase consoleでプロジェクトを作成します。

プロジェクトの作成が出来たら、Androidアプリの追加を行います。
app/build.gradleに記載されているapplicationIdをAndroidパッケージ名として入力して登録します。

そうするとgoogle-services.jsonが作られるので、ダウンロードします。

ダウンロードしたgoogle-services.jsonはアプリプロジェクト内のディレクトリapp内に移動させましょう。

Android Studioのプロジェクトビューにファイルが表示されない場合は、左上のプルダウンでProjectを選択すると表示されるようになります。

アプリ内でクラウドAPIの機能を使う場合は事前に作成したFirebaseプロジェクトのプランを無料のスパークから従量課金のBlazeに設定する必要があるのと、GoogleAPIsからCloudVisionAPIを有効化する必要があります。

実際に動かしてみる

では、スマホをPCに接続した上でAndroid Studioの左上の▶︎マークをクリックして、アプリをビルドして動かしましょう。 デプロイ先を選択する際にもし接続したスマホが表示されていない場合は、スマホのUSB debuggingが無効になっている可能性があります。ドキュメントを参考にUSB debuggingを有効化した上で試してみてください。

ビルドが完了してapkファイルの転送が完了すると、スマホでアプリが起動します。

アプリにはリアルタイム検出のLivePreviewActivityと静止画検出のStillImageActivityの2つのコンテンツがあります。

LivePreviewActivity

まずはリアルタイムに検出が行われるLivePreviewActivityから試してみましょう。
カメラで映っているものをリアルタイムに端末内の機械学習のモデルに投げてモードに応じたものを検出することができます。
検出モードは顔検出、文字検出、バーコード認識、物の認識、カスタムモデルを使った画像分類の5種類があります。順に見ていきましょう。

まずは顔検出からです。 めそ子オフィシャルサイトから借りてきた画像で試してみます。

良い感じにめそ子の顔も検出できています。 カメラを写している間はリアルタイムで顔を検出し続けます。すごい。

次は文字検出です。

Hello WorldのつもりがHell Worldになってしまいました。機械学習の闇は深いと言う事でしょうか。
スマホでリアルタイムで検出していることを考えれば、私の汚い手書き文字にも関わらず、それなりに検出できていると言えます。

ちなみにソースコードを映すとこんな感じになります。

ごちゃごちゃして訳がわからないですが、かなり検出できていそうです。
手書き文字でなければ、それなりの精度が出るっぽいですね。

次はバーコード認識です。

自動でバーコードを検出し、その内容を表示してくれました。

次は映っている物を検出し、ラベル(分類)を表示します。

しっかりと紙と指が検出できているようです。

次はカスタムモデルを使った画像分類です。
モデルは量子化したMobileNetでいくつかのものを学習させているようです。

紙を封筒と分類しているようです。近いといえば近い判定です。
とりあえずカスタムモデルを使った推論も一応出来てはいます。

StillImageActivity

こちらは静止画をCloudVisionAPIに投げて検出を行うことが出来ます。静止画内の物の検出とランドマークの検出、テキスト検出、ドキュメントテキスト検出の計4種類の検出モードがあります。

GoogleAPIsからCloudVisionAPIを有効にすることで使用できます。もし写真を読み込んでも変化が無いようでしたら、GoogleAPIsから有効になっているかどうかを確認をしてみて下さい。それでも駄目であれば、Logcatでログを見てみましょう。Logcatについてはドキュメントをご確認ください。

まずは、左下のボタンから写真を撮るか、持っている写真を選択しましょう。

最初は物の検出です。

画像を選択してしばらくするといくつかのラベルが表示されます。
glassesが表示されているので、ちゃんと検出できています。

次はランドマーク検出です。
wikipediaから拝借した写真で試します。

無事自由の女神を検出できました。

次はテキスト検出です。

Worldは検出できましたが、それ以外が駄目でした。映し方がまずかったのかもしれません。

次はドキュメントテキスト検出です。こちらはテキスト検出よりも高密度のテキストを検出できるようです。

テキスト検出と違い、良い感じに検出できています。すごい。

さいごに

ML Kit For Firebaseのクイックスタートを試してみて、その内容を紹介しました。コードを書くことなく、スマホで顔や文字など色々な物の検出を行うことができました。すごい。

まだ、ML Kitはパブリックベータということですが、現時点でこれだけの事ができるので、今後の正式リリースが楽しみです。 合わせて、TensorFlow Liteについても今後どうなるか追いかけていきたいところです。

最後までお読み頂きありがとうございました。

参考