顔ランドマーク検出ガイド(Android)

MediaPipe フェイス ランドマーカー タスクを使用すると、顔のランドマークと顔の表情を検出できます。 使用できます。このタスクを使用して、人間の顔の表情を識別し、 顔のフィルタやエフェクトを適用したり、仮想アバターを作成したりできます。このタスクで使用するもの 単一の画像または連続的な画像でも処理できる 必要があります。このタスクでは、顔の 3 次元のランドマーク、ブレンドシェイプが出力されます。 スコア(顔の表情を表す係数)を使って、顔の微妙な リアルタイムでの表面処理、変換行列を使用して、 エフェクトのレンダリングに必要な変換の数を表します。

この手順で説明するコードサンプルは、 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 インスタンスを構成し、 顔認識マーカー サンプルアプリのファイルのみ:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/face_landmarker/android
    

サンプルコードのローカル バージョンを作成したら、プロジェクトをインポートできます。 アプリを実行します。手順については、セットアップ ガイド: Android

主要コンポーネント

次のファイルには、この顔のランドマークのサンプルに不可欠なコードが含まれています。 アプリケーション:

  • FaceLandmarkerHelper.kt - 顔ランドマークを初期化し、モデルとデリゲートを処理します 選択します。
  • CameraFragment.kt - デバイスのカメラを処理し、画像と動画の入力データを処理します。
  • GalleryFragment.kt - OverlayView を操作して、出力画像または動画を表示します。
  • OverlayView.kt - 検出された顔の顔メッシュを使用したディスプレイを実装します。

セットアップ

このセクションでは、開発環境をセットアップする主な手順と 顔認識地マーカーを使用するコード プロジェクトです。一般的な情報については、 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 フェイス ランドマーカー タスクには、以下と互換性のあるトレーニング済みモデルバンドルが必要です できます。顔認識マーカーに使用できるトレーニング済みモデルについて詳しくは、 タスクの概要のモデル セクションをご覧ください。

モデルを選択してダウンロードし、プロジェクト ディレクトリに保存します。

<dev-project-root>/src/main/assets

ModelAssetPath パラメータ内でモデルのパスを指定します。 サンプルコードの場合、モデルは FaceLandmarkerHelper.kt ファイル:

baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)

タスクを作成する

MediaPipe フェイス ランドマーカー タスクでは、createFromOptions() 関数を使用して タスクを実行します。createFromOptions() 関数は構成の値を受け入れます。 。構成オプションの詳細については、構成 オプションをご覧ください。

顔認識地マーカーは、静止画像、動画といった入力データタイプをサポートしています。 ファイル、ライブ動画ストリームなどです。実行モードを指定する必要があります タスクの作成時に、入力データ型に対応する値を宣言します。タブを選択 タスクの作成方法とコード実行方法を 説明します。

画像

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setRunningMode(RunningMode.IMAGE)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

動画

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

ライブ配信

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setResultListener(this::returnLivestreamResult)
        .setErrorListener(this::returnLivestreamError)
        .setRunningMode(RunningMode.LIVE_STREAM)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

顔認識用マーカーのサンプル コードを実装すると、 処理モードを選択できますこのアプローチでは、タスク作成コードが複雑になり、 ユースケースに適さない場合がありますこのコードは setupFaceLandmarker() 関数を次の FaceLandmarkerHelper.kt 表示されます。

構成オプション

このタスクには、Android アプリ用に次の構成オプションがあります。

オプション名 説明 値の範囲 デフォルト値
runningMode タスクの実行モードを設定します。3 つの モード:

IMAGE: 単一画像入力のモード。

VIDEO: 動画のデコードされたフレームのモード。

LIVE_STREAM: 入力のライブ配信のモード カメラからのデータなどです。このモードでは、resultListener は 結果を受け取るリスナーを設定するために呼び出されます。 使用できます。
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
numFaces FaceLandmarker。平滑化は次の場合にのみ適用されます。 num_faces は 1 に設定されています。 Integer > 0 1
minFaceDetectionConfidence 顔検出に必要な最小信頼スコア 成功したとみなされます。 Float [0.0,1.0] 0.5
minFacePresenceConfidence 顔存在の最小信頼スコア 顔のランドマーク検出のスコアが出力されます。 Float [0.0,1.0] 0.5
minTrackingConfidence 顔トラッキングの最小信頼スコア 成功とみなされます。 Float [0.0,1.0] 0.5
outputFaceBlendshapes 顔認識地マーカーが顔ブレンドシェイプを出力するかどうか。 顔ブレンドシェイプは、3D 顔モデルのレンダリングに使用されます。 Boolean False
outputFacialTransformationMatrixes FaceLandmarker が顔を出力するかどうか 変換行列が作成されますFaceLandMarker で 行列を使用して、顔のランドマークを正規の顔モデルから 検出されたランドマークに効果を適用できます。 Boolean False
resultListener ランドマークの結果を受け取るように結果リスナーを設定します。 自動的に同期されます。 実行モードが LIVE_STREAM に設定されている場合にのみ使用できます ResultListener N/A
errorListener オプションのエラーリスナーを設定します。 ErrorListener N/A

データの準備

Face Landmarker は、画像、動画ファイル、ライブ動画ストリームで動作します。タスク サイズ変更、回転、値を含むデータ入力の前処理を処理 説明します。

次のコードは、処理のためにデータを引き渡す方法を示しています。これらの サンプルには、画像、動画ファイル、ライブ ストリーミング データ、 動画ストリーム。

画像

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()
    

顔認識マーカーのサンプルコードでは、 FaceLandmarkerHelper.kt 表示されます。

タスクを実行する

扱うデータのタイプに応じて、 そのデータ型に固有の FaceLandmarker.detect...() メソッドを使用します。使用 個々の画像の場合は detect()、動画ファイル内のフレームの場合は detectForVideo()、 動画ストリームの場合は detectAsync() です。Cloud Storage バケットに 検出を別のスレッドで実行して、この問題を回避してください。 ユーザー インターフェース スレッドをブロックします。

次のコードサンプルは、顔認識機能の実行方法の簡単な例を示しています。 さまざまなデータモードで

画像

val result = FaceLandmarker.detect(mpImage)
    

動画

val timestampMs = i * inferenceIntervalMs

FaceLandmarker.detectForVideo(mpImage, timestampMs)
    .let { detectionResult ->
        resultList.add(detectionResult)
    }
    

ライブ配信

val mpImage = BitmapImageBuilder(rotatedBitmap).build()
val frameTime = SystemClock.uptimeMillis()

FaceLandmarker.detectAsync(mpImage, frameTime)
    

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

  • 動画モードまたはライブ配信モードで実行する場合は、 顔認識地マーカー タスクへの入力フレームのタイムスタンプ。
  • 画像モードまたは動画モードで実行すると、顔認識地マーカー タスクがブロックされます。 入力画像やフレームの処理が完了するまで、現在のスレッドを待機状態にします。宛先 ユーザー インターフェースをブロックせずに、バックグラウンドで処理を実行 使用します。
  • ライブ ストリーム モードで実行している場合、顔認識ツールタスクは 現在のスレッドをブロックしません。このメソッドは、 完了するたびに、その検出結果が 表示されます。

顔認識マーカーのサンプルコードでは、detectdetectForVideodetectAsync 関数は、 FaceLandmarkerHelper.kt 表示されます。

結果の処理と表示

顔認識地マーカーは、検出のたびに FaceLandmarkerResult オブジェクトを返します。 あります。結果のオブジェクトには、検出された顔ごとに顔メッシュが含まれ、 各顔ランドマークの座標です。必要に応じて、結果オブジェクトには 顔の表情を表すブレンドシェイプと、 変換行列を使用して、検出されたランドマークに顔効果を適用します。

このタスクからの出力データの例を次に示します。

FaceLandmarkerResult:
  face_landmarks:
    NormalizedLandmark #0:
      x: 0.5971359014511108
      y: 0.485361784696579
      z: -0.038440968841314316
    NormalizedLandmark #1:
      x: 0.3302789330482483
      y: 0.29289937019348145
      z: -0.09489090740680695
    ... (478 landmarks for each face)
  face_blendshapes:
    browDownLeft: 0.8296722769737244
    browDownRight: 0.8096957206726074
    browInnerUp: 0.00035583582939580083
    browOuterUpLeft: 0.00035752105759456754
    ... (52 blendshapes for each face)
  facial_transformation_matrixes:
    [9.99158978e-01, -1.23036895e-02, 3.91213447e-02, -3.70770246e-01]
    [1.66496094e-02,  9.93480563e-01, -1.12779640e-01, 2.27719707e+01]
    ...

次の図は、タスク出力を可視化したものです。

顔認識マーカーのサンプルコードは、返された結果を表示する方法を示しています。 タスクの詳細については、 OverlayView クラスをご覧ください。