MediaPipe 顔検出タスクを使用すると、画像や動画内の顔を検出できます。次を使用: このタスクでは、フレーム内の顔と顔の特徴を検出します。このタスクでは、 単一の画像または連続的な画像で機能する 必要があります。このタスクでは、顔の位置と、以下が出力されます。 顔の要点: 左目、右目、鼻先、口、左目のトラジション、 あります
ここで説明するコードサンプルは、 オン GitHub。 機能、モデル、サービスについて詳しくは、 構成オプションの詳細については、概要をご覧ください。
サンプルコード
MediaPipe Tasks のサンプルコードは顔検出器の単純な実装です アプリこの例では、物理的な Android デバイスのカメラを使用して、 連続する動画ストリームで顔を検出できます。また、デバイスのギャラリーから取得した画像や動画内の顔を検出することもできます。
独自の Android アプリの出発点としてアプリを使用することも、アプリ自体に言及することもできます。 変更する際の注意点があります。顔検出器のサンプルコードは次の場所でホストされています: GitHub。
コードをダウンロードする
次の手順では、サンプルのローカルコピーを作成する方法を示します。 git コマンドライン ツールを使用してコードを実行します。
<ph type="x-smartling-placeholder">サンプルコードをダウンロードするには:
- 次のコマンドを使用して Git リポジトリのクローンを作成します。
git clone https://github.com/google-ai-edge/mediapipe-samples
- 必要に応じて、スパース チェックアウトを使用するように Git インスタンスを構成します。
これで、Face Detector サンプルアプリのファイルのみが作成されます。
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/face_detector/android
サンプルコードのローカル バージョンを作成したら、プロジェクトをインポートできます。 アプリを実行します。手順については、次をご覧ください: Android 向けセットアップ ガイド
主要コンポーネント
次のファイルには、この顔検出の例に不可欠なコードが含まれています。 アプリケーション:
- FaceDetectorHelper.kt - 顔検出器を初期化し、モデルを処理してデリゲートする 選択します。
- CameraFragment.kt - デバイスのカメラを処理し、画像と動画の入力データを処理します。
- GalleryFragment.kt -
OverlayView
を操作して出力画像または動画を表示します。 - OverlayView.kt - 検出された顔の境界ボックスを表示する表示を実装します。
セットアップ
このセクションでは、開発環境をセットアップする主な手順と Face Detector を使用するコード プロジェクトを作成することにしました。一般的な情報については、 MediaPipe タスクを使用するための開発環境の設定 プラットフォーム バージョンの要件については、 Android の設定ガイド
<ph type="x-smartling-placeholder">依存関係
顔検出タスクは com.google.mediapipe:tasks-vision
を使用します。
ライブラリです。Android アプリの build.gradle
ファイルに次の依存関係を追加します。
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
モデル
MediaPipe Face Detector タスクには、以下と互換性のあるトレーニング済みモデルバンドルが必要です できます。顔検出機能で利用可能なトレーニング済みモデルについて詳しくは、 タスクの概要のモデル セクションをご覧ください。
モデルを選択してダウンロードし、プロジェクト ディレクトリに保存します。
<dev-project-root>/src/main/assets
ModelAssetPath
パラメータ内でモデルのパスを指定します。
サンプルコード、
モデルは FaceDetectorHelper.kt
で定義されています。
ファイル:
val modelName = "face_detection_short_range.tflite"
baseOptionsBuilder.setModelAssetPath(modelName)
タスクを作成する
MediaPipe Face Detector タスクは、createFromOptions()
関数を使用して
タスクを実行します。createFromOptions()
関数は構成の値を受け入れます。
。構成オプションの詳細については、このモジュールの
構成オプション。
顔検出機能は、静止画像、動画ファイル、 ライブ動画ストリーム。モデルに対応する実行モードを 入力データ型を使用します。レポートタイプに対応するタブを 入力データ型を見て、タスクの作成方法と推論の実行方法を確認します。
画像
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = FaceDetector.FaceDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinDetectionConfidence(threshold) .setRunningMode(RunningMode.IMAGE) val options = optionsBuilder.build() FaceDetector = FaceDetector.createFromOptions(context, options)
動画
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = FaceDetector.FaceDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinDetectionConfidence(threshold) .setRunningMode(RunningMode.VIDEO) val options = optionsBuilder.build() FaceDetector = FaceDetector.createFromOptions(context, options)
ライブ配信
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = FaceDetector.FaceDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinDetectionConfidence(threshold) .setResultListener(this::returnLivestreamResult) .setErrorListener(this::returnLivestreamError) .setRunningMode(RunningMode.LIVE_STREAM) val options = optionsBuilder.build() FaceDetector = FaceDetector.createFromOptions(context, options)
顔検出器のコード実装例では、ユーザーが顔検出機能を
処理モードを選択できますこのアプローチでは、タスク作成コードが複雑になり、
ユースケースに適さない場合がありますこのコードは
setupFaceDetector()
関数を次の
FaceDetectorHelper.kt
表示されます。
構成オプション
このタスクには、Android アプリ用に次の構成オプションがあります。
オプション名 | 説明 | 値の範囲 | デフォルト値 |
---|---|---|---|
runningMode |
タスクの実行モードを設定します。3 つの
モード: IMAGE: 単一画像入力のモード。 VIDEO: 動画のデコードされたフレームのモード。 LIVE_STREAM: 入力のライブ配信のモード カメラからのデータなどです。このモードでは、resultListener は 結果を受け取るリスナーを設定するために呼び出されます。 使用できます。 |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
minDetectionConfidence |
顔検出が成功とみなされるための最小信頼スコア。 | Float [0,1] |
0.5 |
minSuppressionThreshold |
重複とみなされる顔検出の非最大抑制しきい値の最小値。 | Float [0,1] |
0.3 |
resultListener |
検出結果を受信する結果リスナーを設定する
顔検出がライブ配信中に非同期で送信されます。
モードです。実行モードが LIVE_STREAM に設定されている場合にのみ使用できます。 |
N/A |
Not set |
errorListener |
オプションのエラーリスナーを設定します。 | N/A |
Not set |
データの準備
顔検出機能は、画像、動画ファイル、ライブ動画ストリームに対応しています。タスク サイズ変更、回転、値を含むデータ入力の前処理を処理 説明します。
次のコードは、処理のためにデータを引き渡す方法を示しています。これらの サンプルには、画像、動画ファイル、ライブ ストリーミング データ、 動画ストリーム。
画像
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(image).build()
動画
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage val argb8888Frame = if (frame.config == Bitmap.Config.ARGB_8888) frame else frame.copy(Bitmap.Config.ARGB_8888, false) // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(argb8888Frame).build()
ライブ配信
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(rotatedBitmap).build()
顔検出ツールのサンプルコードをご覧ください。データの準備は、
FaceDetectorHelper.kt
表示されます。
タスクを実行する
扱うデータのタイプに応じて、
そのデータ型に固有の faceDetector.detect...()
メソッドを使用します。使用
個々の画像の場合は detect()
、
動画ファイル内のフレームの場合は detectForVideo()
動画ストリームの場合は detectAsync()
。Cloud Storage バケットに
検出を別のスレッドで実行して、この問題を回避してください。
ユーザー インターフェース スレッドをブロックします。
次のコードサンプルは、顔検出ツールを実行する方法の簡単な例を示しています。 さまざまなデータモードで
画像
val result = faceDetector.detect(mpImage)
動画
val timestampMs = i * inferenceIntervalMs faceDetector.detectForVideo(mpImage, timestampMs) .let { detectionResult -> resultList.add(detectionResult) }
ライブ配信
val mpImage = BitmapImageBuilder(rotatedBitmap).build() val frameTime = SystemClock.uptimeMillis() faceDetector.detectAsync(mpImage, frameTime)
次の点にご留意ください。
- 動画モードまたはライブ配信モードで実行している場合は、 入力フレームのタイムスタンプを顔検出タスクに渡します。
- 画像モードまたは動画モードで実行している場合、顔検出タスクは 入力画像の処理が完了するまで、現在のスレッドをブロックします。 クリックします。ユーザー インターフェースがブロックされないように、 使用します。
- ライブ ストリーム モードで実行している場合、顔検出タスクが 現在のスレッドをブロックしません。このメソッドは、 完了するたびに、その検出結果が 表示されます。顔検出タスクの実行時に検出関数が呼び出された場合 別のフレームの処理でビジー状態の場合、タスクは新しい入力フレームを無視します。
顔検出機能のサンプルコード、detect
、detectForVideo
、
detectAsync
関数は、
FaceDetectorHelper.kt
表示されます。
結果の処理と表示
顔検出は、検出ごとに FaceDetectorResult
オブジェクトを返します。
あります。result オブジェクトには、検出された顔の境界ボックスと、
信頼スコアが表示されます。
このタスクからの出力データの例を次に示します。
FaceDetectionResult:
Detections:
Detection #0:
BoundingBox:
origin_x: 126
origin_y: 100
width: 463
height: 463
Categories:
Category #0:
index: 0
score: 0.9729152917861938
NormalizedKeypoints:
NormalizedKeypoint #0:
x: 0.18298381567001343
y: 0.2961040139198303
NormalizedKeypoint #1:
x: 0.3302789330482483
y: 0.29289937019348145
... (6 keypoints for each face)
Detection #1:
BoundingBox:
origin_x: 616
origin_y: 193
width: 430
height: 430
Categories:
Category #0:
index: 0
score: 0.9251380562782288
NormalizedKeypoints:
NormalizedKeypoint #0:
x: 0.6151331663131714
y: 0.3713381886482239
NormalizedKeypoint #1:
x: 0.7460576295852661
y: 0.38825345039367676
... (6 keypoints for each face)
次の図は、タスク出力を可視化したものです。
境界ボックスのない画像については、元の画像をご覧ください。
顔検出器のコード例は、顔検出機能
結果については、
OverlayView
クラスをご覧ください。