オブジェクト検出タスクを使用すると、複数のオブジェクトの存在と場所を検出できます。 オブジェクトのクラスです。たとえばオブジェクト検出機能は、画像内の犬の位置を特定できます。 説明します。以下では、Google Cloud コンソールでオブジェクト検出タスクを使用する方法について説明します。 Android。この手順で説明するコードサンプルは、 GitHub。 このタスクの動作を確認するには、 ウェブデモ。 機能、モデル、構成オプションの詳細については、 概要をご覧ください。
サンプルコード
MediaPipe Tasks のサンプルコードは、オブジェクト検出の単純な実装です。 アプリこの例では、物理的な Android デバイスのカメラを使用して、 物体を継続的に検出します。また、画像と動画を使用して、 静的にオブジェクトを検出することもできます。
独自の Android アプリの出発点としてアプリを使用することも、アプリ自体に言及することもできます。 変更する際の注意点があります。オブジェクト検出のサンプルコードは次の場所でホストされています: GitHub。
コードをダウンロードする
次の手順では、サンプルのローカルコピーを作成する方法を示します。 git コマンドライン ツールを使用してコードを実行します。
<ph type="x-smartling-placeholder">サンプルコードをダウンロードするには:
- 次のコマンドを使用して Git リポジトリのクローンを作成します。
git clone https://github.com/google-ai-edge/mediapipe-samples
- 必要に応じて、スパース チェックアウトを使用するように Git インスタンスを構成します。
したがって、オブジェクト検出サンプルアプリのファイルのみになります。
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/object_detection/android
サンプルコードのローカル バージョンを作成したら、プロジェクトをインポートできます。 アプリを実行します。手順については、次をご覧ください: Android 向けセットアップ ガイド
主要コンポーネント
次のファイルには、オブジェクト検出に不可欠なコードが含まれています。 サンプル アプリケーション:
- ObjectDetectorHelper.kt - オブジェクト検出を初期化し、モデルとデリゲートを処理する 選択
- MainActivity.kt - アプリを実装し、ユーザー インターフェース コンポーネントを構築する
- OverlayView.kt - 結果を処理して表示する
セットアップ
このセクションでは、開発環境をセットアップする主な手順と Object Detector を使用する方法について説明します。一般的な情報については、 MediaPipe タスクを使用するための開発環境の設定 プラットフォーム バージョンの要件については、 Android の設定ガイド
<ph type="x-smartling-placeholder">依存関係
オブジェクト検出では com.google.mediapipe:tasks-vision
ライブラリを使用します。こちらの
build.gradle
ファイルに依存関係を追加して、
Android アプリ開発プロジェクト。必要な依存関係をインポートする
次のコードを使用します。
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
モデル
MediaPipe Object Detector タスクには、これと互換性のあるトレーニング済みモデルが必要です。 タスクを実行します。オブジェクト検出機能で利用可能なトレーニング済みモデルの詳細については、以下をご覧ください。 タスクの概要のモデル セクションをご覧ください。
モデルを選択してダウンロードし、プロジェクト ディレクトリに保存します。
<dev-project-root>/src/main/assets
BaseOptions.Builder.setModelAssetPath()
メソッドを使用してパスを指定する
使用されます。コード例については、次のセクションをご覧ください。
タスクを作成する
タスクを作成するには、createFromOptions
関数を使用します。「
createFromOptions
関数は、実行などの構成オプションを受け入れます。
モード、表示名のロケール、結果の最大数、信頼度のしきい値、
拒否リストがあります構成オプションを指定しない場合は
デフォルト値が使用されます。構成オプションについて詳しくは
構成の概要をご覧ください。
オブジェクト検出タスクは、静止画像と動画ファイルの 3 つの入力データタイプをサポートします。 ストリーミング動画にも対応しています対応する実行モードを指定する必要があります。 入力データ型を指定します。対応するタブを選択してください タスクの作成方法と推論の実行方法を確認できます。
画像
ObjectDetectorOptions options = ObjectDetectorOptions.builder() .setBaseOptions(BaseOptions.builder().setModelAssetPath(‘model.tflite’).build()) .setRunningMode(RunningMode.IMAGE) .setMaxResults(5) .build(); objectDetector = ObjectDetector.createFromOptions(context, options);
動画
ObjectDetectorOptions options = ObjectDetectorOptions.builder() .setBaseOptions(BaseOptions.builder().setModelAssetPath(‘model.tflite’).build()) .setRunningMode(RunningMode.VIDEO) .setMaxResults(5) .build(); objectDetector = ObjectDetector.createFromOptions(context, options);
ライブ配信
ObjectDetectorOptions options = ObjectDetectorOptions.builder() .setBaseOptions(BaseOptions.builder().setModelAssetPath(‘model.tflite’).build()) .setRunningMode(RunningMode.LIVE_STREAM) .setMaxResults(5) .setResultListener((result, inputImage) -> { // Process the detection result here. }) .setErrorListener((result, inputImage) -> { // Process the classification errors here. }) .build(); objectDetector = ObjectDetector.createFromOptions(context, options);
オブジェクト検出機能のコード実装例では、
処理モードを選択できますこのアプローチでは、タスク作成コードが複雑になり、
ユースケースに適さない場合がありますこのコードは
ObjectDetectorHelper
クラス setupObjectDetector()
関数を使用します。
構成オプション
このタスクには、Android アプリ用に次の構成オプションがあります。
オプション名 | 説明 | 値の範囲 | デフォルト値 |
---|---|---|---|
runningMode |
タスクの実行モードを設定します。3 つの
モード: IMAGE: 単一画像入力のモード。 VIDEO: 動画のデコードされたフレームのモード。 LIVE_STREAM: 入力のライブ配信のモード カメラからのデータなどです。このモードでは、resultListener は 結果を受け取るリスナーを設定するために呼び出されます。 使用できます。 |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
displayNamesLocales |
指定された表示名に使うラベルの言語を設定します。
タスクのモデルのメタデータ(利用可能な場合)。デフォルトは en です。
英語。カスタムモデルのメタデータにローカライズされたラベルを追加できます。
TensorFlow Lite Metadata Writer API を使用
|
言語 / 地域コード | en |
maxResults |
オプションの高スコアの検出結果の最大数を設定します。 戻ります。 | 正の数 | -1(すべての結果が返されます) |
scoreThreshold |
予測スコアのしきい値を設定します。このしきい値は、 モデル メタデータ(存在する場合)この値を下回る結果は拒否されます。 | 任意の浮動小数点数 | 未設定 |
categoryAllowlist |
許可するカテゴリ名のオプション リストを設定します。空でない場合、
カテゴリ名がこのセットに含まれていない検出結果は、
フィルタで除外されます重複または不明なカテゴリ名は無視されます。
このオプションは categoryDenylist とは相互に排他的であり、
どちらの結果もエラーになります |
任意の文字列 | 未設定 |
categoryDenylist |
許可されていないカテゴリ名のオプション リストを設定します。条件
空ではない場合、このセット内にカテゴリ名が含まれる検出結果がフィルタされます。
できます。重複または不明なカテゴリ名は無視されます。このオプションは
categoryAllowlist と排他的であり、両方を使用するとエラーになります。 |
任意の文字列 | 未設定 |
resultListener |
検出結果を受信する結果リスナーを設定する オブジェクト検出がライブ ストリームに存在する場合に非同期で行われます。 モードです。このオプションは、runningMode を LIVE_STREAM に設定している場合のみ使用できます。 | 該当なし | 未設定 |
データの準備
入力画像またはフレームを
com.google.mediapipe.framework.image.MPImage
オブジェクトを使用してから
オブジェクト検出。
次の例は、処理するデータを準備する方法について説明します。 各データタイプについて
画像
import com.google.mediapipe.framework.image.BitmapImageBuilder; import com.google.mediapipe.framework.image.MPImage; // Load an image on the user’s device as a Bitmap object using BitmapFactory. // Convert an Android’s Bitmap object to a MediaPipe’s Image object. Image mpImage = new BitmapImageBuilder(bitmap).build();
動画
import com.google.mediapipe.framework.image.BitmapImageBuilder; import com.google.mediapipe.framework.image.MPImage; // Load a video file on the user's device using MediaMetadataRetriever // From the video’s metadata, load the METADATA_KEY_DURATION and // METADATA_KEY_VIDEO_FRAME_COUNT values. Use these values // to calculate the timestamp of each frame later. // Loop through the video and load each frame as a Bitmap object. // Convert the Android’s Bitmap object to a MediaPipe’s Image object. Image mpImage = new BitmapImageBuilder(frame).build();
ライブ配信
import com.google.mediapipe.framework.image.MediaImageBuilder; import com.google.mediapipe.framework.image.MPImage; // Create a CameraX’s ImageAnalysis to continuously receive frames // from the device’s camera. Configure it to output frames in RGBA_8888 // format to match with what is required by the model. // For each Android’s ImageProxy object received from the ImageAnalysis, // extract the encapsulated Android’s Image object and convert it to // a MediaPipe’s Image object. android.media.Image mediaImage = imageProxy.getImage() MPImage mpImage = new MediaImageBuilder(mediaImage).build();
オブジェクト検出サンプルコードでは、データの準備を
ObjectDetectorHelper
detectImage()
、detectVideoFile()
、detectLivestreamFrame()
内のクラス
使用できます。
タスクを実行する
扱うデータのタイプに応じて、
そのデータ型に固有の ObjectDetector.detect...()
メソッドを使用します。使用
個々の画像の場合は detect()
、
動画ファイル内のフレームの場合は detectForVideo()
動画ストリームの場合は detectAsync()
。Cloud Storage バケットに
検出を別のスレッドで実行して、この問題を回避してください。
ユーザー インターフェース スレッドをブロックします。
次のコードサンプルは、オブジェクト検出を実行する簡単な例を示しています。 さまざまなデータモードで
画像
ObjectDetectorResult detectionResult = objectDetector.detect(image);
動画
// Calculate the timestamp in milliseconds of the current frame. long frame_timestamp_ms = 1000 * video_duration * frame_index / frame_count; // Run inference on the frame. ObjectDetectorResult detectionResult = objectDetector.detectForVideo(image, frameTimestampMs);
ライブ配信
// Run inference on the frame. The detection results will be available // via the `resultListener` provided in the `ObjectDetectorOptions` when // the object detector was created. objectDetector.detectAsync(image, frameTimestampMs);
オブジェクト検出コードの例は、これらの各実装を示しています。
詳しく見ていきます。
detect()
detectVideoFile()
,
および detectAsync()
。
このサンプルコードでは、ユーザーが処理モードを切り替えることができます。
実際のユースケースでは必要ない場合があります
次の点にご留意ください。
- 動画モードまたはライブ配信モードで実行する場合は、 入力フレームのタイムスタンプをオブジェクト検出タスクに渡します。
- 画像モードまたは動画モードで実行すると、オブジェクト検出タスクが 入力画像の処理が完了するまで、現在のスレッドをブロックします。 クリックします。現在のスレッドをブロックしないようにするには、 使用します。
- ライブ ストリーム モードで実行すると、オブジェクト検出タスクがブロックされない すぐに戻ります。このメソッドは、 完了するたびに、その検出結果が 表示されます。オブジェクト検出タスクの実行時に検出関数が呼び出された場合、 が別のフレームの処理でビジー状態の場合、新しい入力フレームは無視されます。
結果の処理と表示
推論を実行すると、オブジェクト検出タスクは
ObjectDetectorResult
オブジェクト。これは、見つかったオブジェクトを記述します。
生成します。
このタスクからの出力データの例を次に示します。
ObjectDetectorResult:
Detection #0:
Box: (x: 355, y: 133, w: 190, h: 206)
Categories:
index : 17
score : 0.73828
class name : dog
Detection #1:
Box: (x: 103, y: 15, w: 138, h: 369)
Categories:
index : 17
score : 0.73047
class name : dog
次の図は、タスク出力を可視化したものです。
オブジェクト検出サンプルコードは、検出機能を表示する方法を示しています。
結果については、
OverlayView
クラスをご覧ください。