カスタムモデルをアプリに統合する

1. 始める前に

このシリーズの最初の Codelab では、画像ラベリングを使用して画像の内容を解析する非常にシンプルなアプリを作成しました。ヒナギクの写真を渡したら、花びらや空などが見えていることがわかりました。その後、2 つ目の Codelab では Python に切り替えて、5 種類の花を認識する新しいカスタムモデルをトレーニングしました。

この Codelab では、最初のラボで作成したアプリを 2 番目のラボのモデルで更新します。

この Codelab の完全なソースコードを入手するには、こちらのリポジトリのクローンを作成します。Android 用と iOS 用のサブディレクトリがあります。前の Codelab のコードは、ImageClassifierStep1 として使用できます。この Codelab の最終的なコードは、ImageClassifierStep2 として利用できます。

前提条件

  • この学習プログラムの最初の 2 つの Codelab を完了している必要があります

作成する内容と学習内容

  • 前のラボでトレーニングしたカスタムモデルを Android アプリまたは iOS アプリに統合する

必要なもの

  • Android Studio(developer.android.com/studio からラボの Android 部分を参照可能)
  • Xcode(Apple App Store から入手可能)(ラボの iOS の部分用)

2. Starter アプリを入手する

まず、「Android または iOS で初めてのコンピュータ ビジョン アプリを作成する」Codelab で作成したアプリが必要です。ラボをすでに完了している場合は、「ImageClassifierStep1」という名前が付けられます。ラボを中断する場合は、リポジトリから完了バージョンのクローンを作成できます。

Android Studio で Android Studio を開き、必要な更新を行います。準備ができたらアプリを実行して、動作することを確認します。次のように表示されます。

f3703d45d1332d1d.png

かなりプリミティブなアプリですが、わずかなコードで非常に強力な機能を利用できます。ただし、この花を花だけでなくデイジーとして認識したい場合は、Codelab「画像分類器用のカスタムモデルを作成する」のカスタムモデルを使用するようにアプリを更新する必要があります。

3. カスタム ML Kit モデルを使用するように build.gradle を更新する

  1. Android Studio を使用して、アプリレベルの build.gradle ファイルを見つけます。これを行う最も簡単な方法は、プロジェクト エクスプローラを使用することです。上部で [Android] が選択されていることを確認し、下部に [Gradle Scripts] フォルダが表示されます。
  2. アプリ名の後に「.app」を付けた [モジュール] のモジュールを開きます。(モジュール: ImageClassifierStep1.app)

8fe1d04b40610047.png

  1. ファイルの下部で、dependent 設定を見つけます。次の行が表示されます。
implementation 'com.google.mlkit:image-labeling:17.0.1'

バージョン番号は異なる場合があります。最新のバージョン番号は、次の ML Kit のサイトでいつでも確認できます。https://developers.google.com/ml-kit/vision/image-labeling/android

  1. これをカスタム画像ラベル付けライブラリ リファレンスに置き換えます。バージョン番号については、https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android をご覧ください。
implementation 'com.google.mlkit:image-labeling-custom:16.3.1'
  1. さらに、前のラボで作成した .tflite モデルを追加します。Android Studio によるアプリのコンパイル時にこのモデルを圧縮したくないので、この設定は同じ build.gradle ファイルの Android セクションで使用してください。
aaptOptions{
    noCompress "tflite"
}

他の設定に含まれていないことを確認してください。android タグの直下でネストする必要があります。次の例をご覧ください。

62d546bff11d2a50.png

4. TFLite モデルを追加する

前の Codelab では、カスタムモデルを作成し、model.tflite としてダウンロードしました。

プロジェクトで、現在 flower1.jpg が含まれている assets フォルダを見つけます。次のように、モデルをそのフォルダにコピーします。

  1. Android Studio で Assets フォルダを右クリックします。表示されたメニューで [Finder で表示] を選択します。(Windows では [エクスプローラで表示]、Linux ではファイルで表示)。

db30b47e419a326b.png

  1. ファイル システム上のディレクトリが表示されます。model.tflite ファイルを flower1.jpg. とともにそのディレクトリにコピーします。

36de0c51bec1c19e.png

Android Studio が更新され、アセット フォルダに両方のファイルが表示されるようになります。

e9f4e9f394d9b357.png

これでコードを更新する準備が整いました。

5. カスタムモデルのコードを更新する

最初のステップは、カスタムモデルを読み込むためのコードを追加することです。

  1. MainActivity ファイルで、onCreatesetContentView(R.layout.activity_main) 行のすぐ下に次のコードを追加します。

LocalModel を使用して model.tflite アセットからビルドします。Android Studio で「LocalModel」をAlt+Enter キーを押してライブラリをインポートします。com.google.mlkit.common.model.LocalModel へのインポートが追加されます。

val localModel = LocalModel.Builder()
        .setAssetFilePath("model.tflite")
        .build()

以前、btn.setOnClickListener ハンドラではデフォルト モデルを使用していました。セットアップのコードは次のようになります。

val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)

これを置き換えて、カスタムモデルを使用します。

  1. カスタム オプション オブジェクトを設定します。
val options = CustomImageLabelerOptions.Builder(localModel)
        .setConfidenceThreshold(0.7f)
        .setMaxResultCount(5)
        .build()

これにより、デフォルトのオプションがカスタマイズされたセットに置き換えられます。信頼度のしきい値は、返される予測の品質に関する基準を設定します。この Codelab の冒頭にあるサンプルでは、画像がデイジーであったため、予測が 4 つあり、それぞれの横に「Sky」などの値があります。0.7632 です。

高い信頼度のしきい値を使用することで、品質の低い結果を効果的に除外できます。たとえば、この値を 0.9 に設定すると、それより優先度の低いラベルは返されません。setMaxResultCount() はクラス数が多いモデルで有用ですが、このモデルは 5 つしかないため、5 のままにしておきます。

ラベラー用のオプションが用意できたので、ラベラーのインスタンス化を次のように変更できます。

val labeler = ImageLabeling.getClient(options)

残りのコードは変更なしで実行されます。ぜひお試しください。

dd40c36c4edbb33.png

ご覧のとおり、この花は 0 .959 の確率でヒナギクとして識別されました。

2 つ目の花の画像を追加して再度実行するとします。

8556a5fbea487842.png

バラと識別されます。

なぜ単に「ローズ」ではなく「バラ」と書いてあるのか不思議に思われるかもしれません。これは、データセットではラベルがフォルダ名で指定されていますが、フォルダ名に少し一貫性がなく、単数形(「daisy」など)や複数形(「バラ」など)を使うこともあるからです。これを画像内のアイテムをカウントしようとするモデルと混同しないでください。モデルはそれよりもはるかにプリミティブであり、花の種類しか識別できません。

6. iOS の Start アプリを入手する

  1. まず、最初の Codelab で作成したアプリが必要です。ラボをすでに完了している場合は、「ImageClassifierStep1」という名前が付けられます。ラボを中断する場合は、リポジトリから完了バージョンのクローンを作成できます。Pod と .xcworkspace はリポジトリに存在しないため、次のステップに進む前に必ず「pod install」を実行してください。.xcproject と同じディレクトリからコピーできます。
  2. Xcode で ImageClassifierStep1.xcworkspace を開きます。.xcproject ではなく .xcworkspace を使用する必要があります。Pod を使って ML Kit がバンドルされており、ワークスペースにこれらが読み込まれるからです。

このラボの残りの部分では、Codelab のビルド ターゲットをサポートする iPhone シミュレータでアプリを実行します。ご自身のデバイスを使用する場合は、iOS バージョンに合わせてプロジェクト設定でビルド ターゲットの変更が必要になることがあります。

実行すると、次のように表示されます。

9e151ed18f99fb98.png

花びら、花、空という非常に一般的な分類に注目してください。前の Codelab で作成したモデルは、このヒナギクを含む 5 種類の花を検出するようにトレーニングされました。

この Codelab の残りの部分では、アプリをカスタムモデルでアップグレードするために必要な作業について説明します。

7. カスタム ML Kit 画像ラベラー Pod を使用する

最初のアプリでは、Pod ファイルを使用して ML Kit の画像ラベラーのベースライブラリとモデルを取得しました。カスタムの画像ラベル付けライブラリを使用するには、これを更新する必要があります。

  1. プロジェクト ディレクトリで podfile という名前のファイルを見つけます。開くと、次のように表示されます。
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabeling'
end
  1. 次のように、Pod の宣言を ImageLabeling から ImageLabelingCustom に変更します。
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabelingCustom'
end
  1. 完了したら、ターミナルを使用して podfile を含むディレクトリ(.xcworkspace も含む)に移動し、pod install を実行します。

bb5d78eb7c7ab975.png

しばらくすると、MLKitImageLabeling ライブラリが削除され、カスタム ライブラリが追加されます。これで、.xcworkspace を開いてコードを編集できるようになりました。

8. TFLite モデルを Xcode に追加する

前の Codelab では、カスタムモデルを作成し、model.tflite としてダウンロードしました。まだ用意していない場合は、Codelab に戻って実行するか、こちらの Colab コードに進んでください。Google Colab にアクセスできない場合は、ノートブックをこちらから入手できます。

  1. Xcode でワークスペースを開いて、model.tflite をプロジェクトにドラッグします。このファイルは、ViewController.swiftMain.storyboard など、他のファイルと同じフォルダに保存する必要があります。
  2. ダイアログが開き、ファイルを追加するオプションが表示されます。[Add to Targets] が選択されていることを確認します。そうしないと、モデルがデバイスにデプロイされたときにアプリにバンドルされません。

「Add to Targets」というラベルのエントリには ImageClassifierStep1 が入ります。これは、このラボで順を追って開始して続行した場合は ImageClassifierStep1 を、完成したコードに進んだ場合は ImageClassifierStep2 です(画像を参照)。

5b6a7f40c73f0f1f.png

これにより、モデルを確実に読み込めるようになります。その方法は次のステップで説明します。

9. カスタムモデル用のコードの更新

  1. ViewController.swift ファイルを開きます。 「import MLKitImageLabeling」でエラーが表示される場合がある追加します。これは、Pod ファイルの更新時に汎用イメージラベル付けライブラリを削除したためです。この行は必要に応じて削除し、次のように更新します。
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom

一気に読めば、同じコードを繰り返していると思われがちです。でも「コモン」[カスタム]を選択します説明します。

  1. 次に、前のステップで追加したカスタムモデルを読み込みます。getLabels() 関数を見つけます。visionImage.orientation = image.imageOrientation という行の下に、次の行を追加します。
// Add this code to use a custom model
let localModelFilePath = Bundle.main.path(forResource: "model", ofType: "tflite")
let localModel = LocalModel(path: localModelFilePath!)
  1. 汎用 ImageLabeler のオプションを指定するコードを探します。ライブラリが削除されたため、エラーが発生している可能性があります。
let options = ImageLabelerOptions()

これを次のコードに置き換えて、CustomImageLabelerOptions を使用します。これにより、ローカルモデルを指定します。

let options = CustomImageLabelerOptions(localModel: localModel)

...これで完了です。今すぐアプリを実行してみましょう。画像を分類しようとすると、より正確になります。高い確率でヒナギクを見ていることがわかります。

238cd21748a97cf4.png

2 つ目の花の画像を追加して再度実行するとします。

75f3970a6b509bfe.png

この画像が「バラ」というラベルと一致していることをアプリが検出しました。

10. 完了

汎用モデルを使用して画像の内容を認識するアプリの構築から、花などの特定のものを認識する独自の ML モデルの作成、カスタムモデルを使用するようにアプリを更新する作業に進みました。

生成されるアプリは、バンドルされた画像アセットに依存しているため、当然ながら非常に限定的なものになります。しかし、ML の部分はうまく機能しています。たとえば、AndroidX カメラを使用してライブフィードからフレームを取得して分類し、スマートフォンで認識される花を確認できます。

ここから無限の可能性が広がります。花以外の独自のデータがあれば、コンピュータ ビジョンを使用して花を認識するアプリを構築するために必要な基礎知識が身につきます。今回ご紹介した内容は、世界を広げていくための第一歩に過ぎません。ここまでお楽しみいただけたのであれば幸いです。