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

1. 始める前に

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

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

この Codelab の完全なソースコードは、こちらのリポジトリのクローンを作成して取得できます。Android と iOS のサブディレクトリが表示されます。前の Codelab のコードは、ImageClassifierStep1 として利用できます。この Codelab の完了コードは ImageClassifierStep2 として提供されています。

前提条件

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

演習内容と学習内容

  • 前のラボで学習したカスタムモデルを Android アプリまたは iOS アプリに統合する

必要なもの

  • Android Studio(このラボの Android 部分については、developer.android.com/studio から入手可能)
  • ラボの iOS 向けに Xcode で Apple App Store から入手可能

2. スターター アプリを入手する

最初に、Android または iOS で「初めてのコンピュータ ビジョン アプリを作成する」の Codelab のアプリを確認してください。このラボでは、ImageClassifierStep1 という名前が付けられます。ラボを行わない場合は、リポジトリから完成したバージョンのクローンを作成します。

Android Studio で必要なアップデートを行い、準備が整ったらアプリを実行して正常に動作していることを確認します。次のように表示されます。

f3703d45d1332d1d.png

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

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

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

2021

  1. ファイルの下部で [dependencies] 設定を見つけます。次の行が表示されます。
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. と同じディレクトリにコピーします。

27C75BEC1C19E.png

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

e9f4e9f394d9b357.png

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

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

まず、カスタムモデルを読み込むためのコードを追加します。

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

これは LocalModel を使用して model.tflite アセットからビルドします。「LocalModel」を赤に変えて Android Studio からエラーが表示された場合は、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」が .7632 などの値が入っています。

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

ラベル付け担当者向けのオプションを作成したので、ラベル付け担当者のインスタンス化を次のように変更できます。

val labeler = ImageLabeling.getClient(options)

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

dd40c36c4edbb33.png

この花は 0 .959 の確率でデイジーとして識別されたことがわかります。

2 つ目の花の画像を追加し、それを再度実行したとします。

28556a5fbea487842.png

バラであることがわかります。

「バラ」だけでなく「バラ」と表記されるのはなぜでしょうか。 このデータセットでは、ラベルはフォルダ名で識別されます。そして、残念ながらこれらのフォルダ名は少々一貫性がなく、単数形(「デイジー」など)と複数形(「バラ」など)が使用されることがあります。これを、画像内のアイテムをカウントしようとしているモデルと混同しないでください。これはもっとプリミティブであり、花の種類しか識別できません。

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

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

このラボの残りの部分では、Codelab のビルド ターゲットをサポートする iPhone シミュレータでアプリを実行します。独自のデバイスを使用する場合は、プロジェクトの設定のビルド ターゲットを iOS のバージョンと一致するように変更しなければならない場合があります。

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

17f99fb98.png

花、花、空といった一般的な分類にも注意してください。前の Codelab で作成したモデルは、この 5 種類の花(デイジー)を検出するようにトレーニングされています。

この Codelab の残りの部分では、カスタムモデルでアプリをアップグレードする際に必要なものを確認します。

7. カスタム ML Kit イメージ ラベラー Pod を使用する

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

  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. ダイアログが開き、ファイルを追加するためのオプションが表示されます。[ターゲットに追加] が選択されていないか、モデルをデバイスにデプロイする際にモデルがアプリにバンドルされません。

[ターゲットに追加] エントリは、最初から開始している場合は 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 カメラを使用してライブフィードからフレームを取得し、分類して、スマートフォンが認識する花を認識することができます。

可能性は無限大です。花以外のものに関する独自のデータがあれば、コンピュータ ビジョンを使用してそのデータを認識するアプリの構築に必要な基盤が構築されています。上記は、Google にとってさらに広くなった最初の一歩にすぎません。ぜひ、これらの取り組みを楽しんでいただければ幸いです。