Android の顔検出ガイド

MediaPipe 顔検出タスクを使用すると、画像や動画内の顔を検出できます。次を使用: このタスクでは、フレーム内の顔と顔の特徴を検出します。このタスクでは、 単一の画像または連続的な画像で機能する 必要があります。このタスクでは、顔の位置と、以下が出力されます。 顔の要点: 左目、右目、鼻先、口、左目のトラジション、 あります

ここで説明するコードサンプルは、 オン GitHub。 機能、モデル、サービスについて詳しくは、 構成オプションの詳細については、概要をご覧ください。

サンプルコード

MediaPipe Tasks のサンプルコードは顔検出器の単純な実装です アプリこの例では、物理的な Android デバイスのカメラを使用して、 連続する動画ストリームで顔を検出できます。また、デバイスのギャラリーから取得した画像や動画内の顔を検出することもできます。

独自の Android アプリの出発点としてアプリを使用することも、アプリ自体に言及することもできます。 変更する際の注意点があります。顔検出器のサンプルコードは次の場所でホストされています: GitHub

コードをダウンロードする

次の手順では、サンプルのローカルコピーを作成する方法を示します。 git コマンドライン ツールを使用してコードを実行します。

<ph type="x-smartling-placeholder">

サンプルコードをダウンロードするには:

  1. 次のコマンドを使用して Git リポジトリのクローンを作成します。
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. 必要に応じて、スパース チェックアウトを使用するように 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)
    

次の点にご留意ください。

  • 動画モードまたはライブ配信モードで実行している場合は、 入力フレームのタイムスタンプを顔検出タスクに渡します。
  • 画像モードまたは動画モードで実行している場合、顔検出タスクは 入力画像の処理が完了するまで、現在のスレッドをブロックします。 クリックします。ユーザー インターフェースがブロックされないように、 使用します。
  • ライブ ストリーム モードで実行している場合、顔検出タスクが 現在のスレッドをブロックしません。このメソッドは、 完了するたびに、その検出結果が 表示されます。顔検出タスクの実行時に検出関数が呼び出された場合 別のフレームの処理でビジー状態の場合、タスクは新しい入力フレームを無視します。

顔検出機能のサンプルコード、detectdetectForVideodetectAsync 関数は、 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 クラスをご覧ください。