このページでは、TensorFlow Lite を使用して Android アプリを構築し、ライブ カメラ フィードを分析してオブジェクトを識別する方法を説明します。この機械学習のユース ケースは、オブジェクト検出と呼ばれます。サンプル アプリでは、 Google Play サービスを介してビジョン用の TensorFlow Lite タスク ライブラリを使用して、物体検出機械学習モデルを実行できるようにします。これは、TensorFlow Lite で ML アプリケーションを構築するための推奨されるアプローチです。
サンプルをセットアップして実行する
この演習の最初の部分では、サンプル コードを GitHub からダウンロードし、 Android Studioを使用して実行します。このドキュメントの次のセクションでは、コード例の関連セクションを調べて、独自の Android アプリに適用できるようにします。これらのツールの次のバージョンがインストールされている必要があります。
- Android Studio 4.2 以降
- Android SDK バージョン 21 以降
サンプルコードを入手する
サンプル コードのローカル コピーを作成して、ビルドして実行できるようにします。
サンプルコードを複製してセットアップするには:
- git リポジトリ
git clone https://github.com/tensorflow/examples.git
のクローンを作成します - スパース チェックアウトを使用するように git インスタンスを構成して、オブジェクト検出サンプル アプリのファイルのみを用意します:
cd examples git sparse-checkout init --cone git sparse-checkout set lite/examples/object_detection/android_play_services
プロジェクトをインポートして実行する
Android Studio を使用して、ダウンロードしたサンプル コードからプロジェクトを作成し、プロジェクトをビルドして実行します。
サンプル コード プロジェクトをインポートしてビルドするには:
- Android Studioを起動します。
- Android Studio の [ようこそ]ページで、[プロジェクトのインポート]を選択するか、[ファイル] > [新規] > [プロジェクトのインポート] を選択します。
- build.gradle ファイル (
...examples/lite/examples/object_detection/android_play_services/build.gradle
) を含むサンプル コード ディレクトリに移動し、そのディレクトリを選択します。
このディレクトリを選択すると、Android Studio によって新しいプロジェクトが作成され、ビルドされます。ビルドが完了すると、Android Studio はBuild Output status パネルにBUILD SUCCESSFUL
メッセージを表示します。
プロジェクトを実行するには:
- Android Studio から、 Run > Run…とMainActivityを選択してプロジェクトを実行します。
- カメラが接続された Android デバイスを選択して、アプリをテストします。
サンプルアプリの仕組み
サンプル アプリでは、TensorFlow Lite 形式のmobilenetv1.tfliteなどの事前トレーニング済みのオブジェクト検出モデルを使用して、Android デバイスのカメラからのライブ ビデオ ストリーム内のオブジェクトを探します。この機能のコードは、主に次のファイルにあります。
- ObjectDetectorHelper.kt - ランタイム環境を初期化し、ハードウェア アクセラレーションを有効にして、オブジェクト検出 ML モデルを実行します。
- CameraFragment.kt - カメラ画像データ ストリームを構築し、モデルのデータを準備し、オブジェクト検出結果を表示します。
次のセクションでは、これらのコード ファイルの主要なコンポーネントを示します。これにより、Android アプリを変更してこの機能を追加できます。
アプリをビルドする
以下のセクションでは、独自の Android アプリを構築し、サンプル アプリに示されているモデルを実行するための主要な手順について説明します。これらの手順では、参照ポイントとして前に示したサンプル アプリを使用します。
プロジェクトの依存関係を追加する
基本的な Android アプリで、TensorFlow Lite 機械学習モデルを実行し、ML データ ユーティリティ関数にアクセスするためのプロジェクトの依存関係を追加します。これらのユーティリティ関数は、画像などのデータをモデルで処理できるテンソル データ形式に変換します。
このサンプル アプリでは、 Google Play サービスの視覚用 TensorFlow Lite Task ライブラリを使用して、物体検出機械学習モデルを実行できるようにします。次の手順では、必要なライブラリの依存関係を独自の Android アプリ プロジェクトに追加する方法について説明します。
モジュールの依存関係を追加するには:
TensorFlow Lite を使用する Android アプリ モジュールで、モジュールの
build.gradle
ファイルを更新して、次の依存関係を含めます。サンプル コードでは、このファイルは次の場所にあります:...examples/lite/examples/object_detection/android_play_services/app/build.gradle
... dependencies { ... // Tensorflow Lite dependencies implementation 'org.tensorflow:tensorflow-lite-task-vision-play-services:0.4.2' implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0' ... }
Android Studio で、 File > Sync Project with Gradle Files を選択して、プロジェクトの依存関係を同期します。
Google Play サービスの初期化
Google Play サービスを使用して TensorFlow Lite モデルを実行する場合、サービスを使用する前にサービスを初期化する必要があります。 GPU アクセラレーションなどのハードウェア アクセラレーション サポートをサービスで使用する場合は、この初期化の一部としてそのサポートも有効にします。
TensorFlow Lite を Google Play サービスで初期化するには:
TfLiteInitializationOptions
オブジェクトを作成し、それを変更して GPU サポートを有効にします。val options = TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build()
TfLiteVision.initialize()
メソッドを使用して Play サービス ランタイムの使用を有効にし、リスナーを設定して正常にロードされたことを確認します。TfLiteVision.initialize(context, options).addOnSuccessListener { objectDetectorListener.onInitialized() }.addOnFailureListener { // Called if the GPU Delegate is not supported on the device TfLiteVision.initialize(context).addOnSuccessListener { objectDetectorListener.onInitialized() }.addOnFailureListener{ objectDetectorListener.onError("TfLiteVision failed to initialize: " + it.message) } }
ML モデル インタープリターを初期化する
モデル ファイルを読み込んでモデル パラメーターを設定することにより、TensorFlow Lite 機械学習モデル インタープリターを初期化します。 TensorFlow Lite モデルには、モデル コードを含む.tflite
ファイルが含まれています。モデルは、開発プロジェクトのsrc/main/assets
ディレクトリに保存する必要があります。次に例を示します。
.../src/main/assets/mobilenetv1.tflite`
モデルを初期化するには:
- ssd_mobilenet_v1などの開発プロジェクトの
src/main/assets
ディレクトリに.tflite
モデル ファイルを追加します。 modelName
変数を設定して、ML モデルのファイル名を指定します。val modelName = "mobilenetv1.tflite"
予測しきい値や結果セットのサイズなど、モデルのオプションを設定します。
val optionsBuilder = ObjectDetector.ObjectDetectorOptions.builder() .setScoreThreshold(threshold) .setMaxResults(maxResults)
オプションを使用して GPU アクセラレーションを有効にし、アクセラレーションがデバイスでサポートされていない場合はコードが適切に失敗するようにします。
try { optionsBuilder.useGpu() } catch(e: Exception) { objectDetectorListener.onError("GPU is not supported on this device") }
このオブジェクトの設定を使用して、モデルを含む TensorFlow Lite
ObjectDetector
オブジェクトを構築します。objectDetector = ObjectDetector.createFromFileAndOptions( context, modelName, optionsBuilder.build())
TensorFlow Lite でハードウェア アクセラレーション デリゲートを使用する方法の詳細については、 TensorFlow Lite Delegatesを参照してください。
モデルのデータを準備する
モデルで処理できるように、画像などの既存のデータをTensorデータ形式に変換して、モデルによる解釈用のデータを準備します。 Tensor 内のデータには、モデルのトレーニングに使用されるデータの形式と一致する特定の次元または形状が必要です。使用するモデルによっては、モデルが期待するものに適合するようにデータを変換する必要がある場合があります。サンプル アプリはImageAnalysis
オブジェクトを使用して、カメラ サブシステムから画像フレームを抽出します。
モデルで処理するデータを準備するには:
ImageAnalysis
オブジェクトを作成して、必要な形式で画像を抽出します。imageAnalyzer = ImageAnalysis.Builder() .setTargetAspectRatio(AspectRatio.RATIO_4_3) .setTargetRotation(fragmentCameraBinding.viewFinder.display.rotation) .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .setOutputImageFormat(OUTPUT_IMAGE_FORMAT_RGBA_8888) .build() ...
アナライザーをカメラ サブシステムに接続し、カメラから受信したデータを格納するビットマップ バッファーを作成します。
.also { it.setAnalyzer(cameraExecutor) { image -> if (!::bitmapBuffer.isInitialized) { bitmapBuffer = Bitmap.createBitmap( image.width, image.height, Bitmap.Config.ARGB_8888 ) } detectObjects(image) } }
モデルに必要な特定の画像データを抽出し、画像の回転情報を渡します。
private fun detectObjects(image: ImageProxy) { // Copy out RGB bits to the shared bitmap buffer image.use { bitmapBuffer.copyPixelsFromBuffer(image.planes[0].buffer) } val imageRotation = image.imageInfo.rotationDegrees objectDetectorHelper.detect(bitmapBuffer, imageRotation) }
サンプル アプリの
ObjectDetectorHelper.detect()
メソッドに示すように、最終的なデータ変換を完了し、画像データをTensorImage
オブジェクトに追加します。val imageProcessor = ImageProcessor.Builder().add(Rot90Op(-imageRotation / 90)).build() // Preprocess the image and convert it into a TensorImage for detection. val tensorImage = imageProcessor.process(TensorImage.fromBitmap(image))
予測を実行する
正しい形式の画像データを使用してTensorImageオブジェクトを作成したら、そのデータに対してモデルを実行して、予測または推論を生成できます。サンプルアプリでは、このコードはObjectDetectorHelper.detect()
メソッドに含まれています。
モデルを実行し、画像データから予測を生成するには:
画像データを予測関数に渡して予測を実行します。
val results = objectDetector?.detect(tensorImage)
モデル出力の処理
オブジェクト検出モデルに対して画像データを実行すると、追加のビジネス ロジックを実行したり、結果をユーザーに表示したり、その他のアクションを実行したりして、アプリ コードで処理する必要がある予測結果のリストが生成されます。サンプル アプリのオブジェクト検出モデルは、検出されたオブジェクトの予測と境界ボックスのリストを生成します。サンプル アプリでは、予測結果がリスナー オブジェクトに渡されてさらに処理され、ユーザーに表示されます。
モデル予測結果を処理するには:
リスナー パターンを使用して、結果をアプリ コードまたはユーザー インターフェイス オブジェクトに渡します。サンプル アプリは、このパターンを使用して、検出結果を
ObjectDetectorHelper
オブジェクトからCameraFragment
オブジェクトに渡します。objectDetectorListener.onResults( // instance of CameraFragment results, inferenceTime, tensorImage.height, tensorImage.width)
ユーザーに予測を表示するなど、結果に基づいて行動します。サンプル アプリは
CameraPreview
オブジェクトにオーバーレイを描画して結果を表示します。override fun onResults( results: MutableList<Detection>?, inferenceTime: Long, imageHeight: Int, imageWidth: Int ) { activity?.runOnUiThread { fragmentCameraBinding.bottomSheetLayout.inferenceTimeVal.text = String.format("%d ms", inferenceTime) // Pass necessary information to OverlayView for drawing on the canvas fragmentCameraBinding.overlay.setResults( results ?: LinkedList<Detection>(), imageHeight, imageWidth ) // Force a redraw fragmentCameraBinding.overlay.invalidate() } }
次のステップ
- タスク ライブラリ APIの詳細
- Interpreter APIの詳細をご覧ください。
- 例で TensorFlow Lite の使用法を調べます。
- モデルセクションで、TensorFlow Lite を使用した機械学習モデルの使用と構築の詳細をご覧ください。
- モバイル アプリケーションに機械学習を実装する方法については、 TensorFlow Lite デベロッパー ガイドをご覧ください。