MediaPipe Face Landmarker タスクを使用すると、画像や動画内の顔のランドマークと表情を検出できます。このタスクを使用して、人間の顔の表情を特定したり、顔のフィルタやエフェクトを適用したり、仮想アバターを作成したりできます。このタスクでは、単一の画像または連続した画像ストリームを処理できる ML モデルを使用します。このタスクは、3 次元の顔のランドマーク、ブレンドシェイプ スコア(表情を表す係数)を出力して、詳細な顔の表面をリアルタイムで推測し、エフェクトのレンダリングに必要な変換を行うための変換行列を出力します。
この手順で説明するコードサンプルは GitHub で入手できます。このタスクの機能、モデル、構成オプションの詳細については、概要をご覧ください。
サンプルコード
MediaPipe Tasks のサンプルコードは、Android 向けの顔ランドマーク検出アプリの簡単な実装です。この例では、物理的な Android デバイスのカメラを使用して、連続する動画ストリーム内の顔を検出します。また、デバイスのギャラリーにある画像や動画内の顔を検出することもできます。
このアプリは、独自の Android アプリの出発点として使用することも、既存のアプリを変更する際に参照することもできます。顔ランドマークのサンプルコードは GitHub でホストされています。
コードをダウンロードする
次の手順では、git コマンドライン ツールを使用して、サンプルコードのローカルコピーを作成する方法について説明します。
サンプルコードをダウンロードするには:
- 次のコマンドを使用して、git リポジトリのクローンを作成します。
git clone https://github.com/google-ai-edge/mediapipe-samples
- 必要に応じて、スパース チェックアウトを使用するように git インスタンスを構成して、Face Landmarker サンプルアプリのファイルのみを取得します。
cd mediapipe-samples git sparse-checkout init --cone git sparse-checkout set examples/face_landmarker/android
サンプルコードのローカル バージョンを作成したら、プロジェクトを Android Studio にインポートしてアプリを実行できます。手順については、Android のセットアップ ガイドをご覧ください。
主要コンポーネント
次のファイルには、この顔のランドマーク検出のサンプル アプリケーションの重要なコードが含まれています。
- FaceLandmarkerHelper.kt - 顔ランドマーカーを初期化し、モデルとデリゲートの選択を処理します。
- CameraFragment.kt - デバイスのカメラを処理し、画像と動画の入力データを処理します。
- GalleryFragment.kt -
OverlayViewとやり取りして、出力画像または動画を表示します。 - OverlayView.kt - 検出された顔のフェイス メッシュを表示する実装。
セットアップ
このセクションでは、Face Landmarker を使用するために開発環境とコード プロジェクトをセットアップする主な手順について説明します。プラットフォーム バージョンの要件など、MediaPipe Tasks を使用するための開発環境のセットアップに関する一般的な情報については、Android のセットアップ ガイドをご覧ください。
依存関係
Face Landmarker タスクは com.google.mediapipe:tasks-vision ライブラリを使用します。Android アプリの build.gradle ファイルに次の依存関係を追加します。
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
モデル
MediaPipe Face Landmarker タスクには、このタスクと互換性のあるトレーニング済みモデル バンドルが必要です。顔ランドマーカーで使用可能なトレーニング済みモデルの詳細については、タスクの概要のモデル セクションをご覧ください。
モデルを選択してダウンロードし、プロジェクト ディレクトリに保存します。
<dev-project-root>/src/main/assets
ModelAssetPath パラメータでモデルのパスを指定します。次のコード例では、モデルは FaceLandmarkerHelper.kt ファイルで定義されています。
baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)
タスクを作成する
MediaPipe Face Landmarker タスクは、createFromOptions() 関数を使用してタスクを設定します。createFromOptions() 関数は、構成オプションの値を受け入れます。構成オプションの詳細については、構成オプションをご覧ください。
Face Landmarker は、静止画像、動画ファイル、ライブ動画ストリームの入力データ型をサポートしています。タスクを作成するときに、入力データ型に対応する実行モードを指定する必要があります。入力データ型のタブを選択して、タスクの作成方法と推論の実行方法を確認します。
画像
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)
顔のランドマーク検出のサンプルコードの実装では、ユーザーが処理モードを切り替えることができます。このアプローチでは、タスク作成コードが複雑になり、ユースケースに適していない可能性があります。このコードは、FaceLandmarkerHelper.kt ファイルの setupFaceLandmarker() 関数で確認できます。
構成オプション
このタスクには、Android アプリの次の構成オプションがあります。
| オプション名 | 説明 | 値の範囲 | デフォルト値 |
|---|---|---|---|
runningMode |
タスクの実行モードを設定します。モードは 3 つあります。 IMAGE: 単一の画像入力用のモード。 動画: 動画のデコードされたフレームのモード。 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 |
Face Landmarker が顔のブレンドシェイプを出力するかどうか。顔のブレンドシェイプは、3D 顔モデルのレンダリングに使用されます。 | Boolean |
False |
outputFacialTransformationMatrixes |
FaceLandmarker が顔の変換行列を出力するかどうか。FaceLandmarker は、この行列を使用して、標準の顔モデルから検出された顔に顔のランドマークを変換します。これにより、ユーザーは検出されたランドマークにエフェクトを適用できます。 | Boolean |
False |
resultListener |
FaceLandmarker がライブ ストリーム モードの場合に、ランドマーク検出の結果を非同期で受け取る結果リスナーを設定します。実行モードが 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()
Face Landmarker のサンプルコードでは、データ準備は FaceLandmarkerHelper.kt ファイルで処理されます。
タスクを実行する
扱うデータの種類に応じて、そのデータ型に固有の FaceLandmarker.detect...() メソッドを使用します。個々の画像には detect()、動画ファイルのフレームには detectForVideo()、動画ストリームには detectAsync() を使用します。動画ストリームで検出を実行する場合は、ユーザー インターフェース スレッドがブロックされないように、別のスレッドで検出を実行してください。
次のコードサンプルは、これらのさまざまなデータモードで Face Landmarker を実行する簡単な例を示しています。
画像
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)
次の点にご留意ください。
- 動画モードまたはライブ ストリーム モードで実行する場合は、入力フレームのタイムスタンプを Face Landmarker タスクに提供する必要があります。
- 画像モードまたは動画モードで実行する場合、Face Landmarker タスクは、入力画像またはフレームの処理が完了するまで現在のスレッドをブロックします。ユーザー インターフェースのブロックを回避するには、バックグラウンド スレッドで処理を実行します。
- ライブ ストリーム モードで実行する場合、Face Landmarker タスクはすぐに戻り、現在のスレッドをブロックしません。入力フレームの処理が完了するたびに、検出結果とともに結果リスナーを呼び出します。
Face Landmarker のサンプルコードでは、detect、detectForVideo、detectAsync の各関数は FaceLandmarkerHelper.kt ファイルで定義されています。
結果を処理して表示する
Face Landmarker は、検出実行ごとに 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]
...
次の画像は、タスク出力の可視化を示しています。
Face Landmarker のサンプルコードは、タスクから返された結果を表示する方法を示しています。詳細については、OverlayView クラスをご覧ください。