Android 臉部地標偵測指南

MediaPipe Face Landmarker 工作可讓你在 圖片、圖片和影片你可以使用這項工作來辨識人類臉部表情 像是套用臉部濾鏡和特效,以及製作虛擬頭像。這項工作使用 可以使用單一圖片或連續性模型的機器學習 (ML) 模型 一流的圖片這項工作會輸出 3D 臉部地標、混合形狀 分數 (代表臉部表情的係數) 以推斷詳細的臉部 並透過轉換矩陣執行 效果轉譯所需的轉換

如需上述指示中所述的程式碼範例,請前往 GitHub。 進一步瞭解功能、模型和設定選項 請參閱總覽

程式碼範例

MediaPipe Tasks 程式碼範例是臉部地標的簡易實作方式 App Engine 應用程式這個範例會使用實體 Android 裝置上的相機執行以下動作: 在連續影片串流中偵測臉孔。應用程式也可以在以下位置偵測臉孔: 下載這些內容

您可以將應用程式做為起點,當做 Android 應用程式的起點,也可以參照應用程式 做出決定Face Marker 範例程式碼 GitHub

下載程式碼

以下說明如何建立範例的本機副本 git 指令列工具編寫程式碼。

如要下載範例程式碼,請按照下列步驟操作:

  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

重要元件

以下檔案包含這個臉部地標範例的重要程式碼 應用程式:

設定

本節說明設定開發環境的重要步驟,以及 程式碼專案如需 設定開發環境以使用 MediaPipe 工作,包括: 平台版本需求,請參閱這份指南 Android

依附元件

Face Faceer 工作會使用 com.google.mediapipe:tasks-vision 程式庫。新增 以下依附元件到 Android 應用程式的 build.gradle 檔案:

dependencies {
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

型號

MediaPipe Face 標誌 er 工作需要經過訓練且與 執行這項工作如要進一步瞭解適用於臉部地標的已訓練模型, 請參閱工作總覽的「模型」一節

選取並下載模型,然後儲存在專案目錄中:

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

ModelAssetPath 參數中指定模型的路徑。在 範例程式碼當中定義了模型 FaceLandmarkerHelper.kt敬上 檔案:

baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)

建立工作

MediaPipe Face 地標 er 工作會使用 createFromOptions() 函式來設定 工作。createFromOptions() 函式可接受設定值 只要設定成「自動重新啟動」 和「在主機維護期間」選項即可如要進一步瞭解設定選項,請參閱設定 選項

Face 地標支援下列輸入資料類型:靜態圖片、影片 檔案和直播影片您必須指定執行模式 對應至輸入資料類型的個別項目選擇分頁 查看如何建立任務並執行 推論

圖片

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)
    

實作 Face Ther 範例程式碼可讓使用者切換 處理模式這種方法使得工作建立程式碼變得更加複雜, 可能會不適合您的用途您可以在 setupFaceLandmarker() 函式,用於 FaceLandmarkerHelper.kt 檔案。

設定選項

這項工作有下列 Android 應用程式設定選項:

選項名稱 說明 值範圍 預設值
runningMode 設定任務的執行模式。在架構中 模式:

圖片:單一圖片輸入模式。

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 設定 Face Marker 是否輸出臉部混合。 臉部混合形狀是用來算繪 3D 臉部模型。 Boolean False
outputFacialTransformationMatrixes FaceLandmarker 是否會輸出臉部 轉換矩陣FaceLandmarker 會使用 將臉部地標從標準臉部模型轉換為 ,方便使用者在偵測到的地標上套用特效。 Boolean False
resultListener 設定結果事件監聽器以接收地標結果 FaceLandmarker 處於直播模式時以非同步方式顯示。 只有在執行模式設為「LIVE_STREAM」時才能使用 ResultListener N/A
errorListener 設定選用的錯誤事件監聽器。 ErrorListener N/A

準備資料

臉部地標可以使用圖片、影片檔案和即時影像串流,工作內容 處理資料輸入預先處理作業,包括調整大小、旋轉和值 以便處理正規化的情況

以下程式碼示範如何發送資料進行處理。這些 樣本包括如何處理圖片、影片檔案、 和串流影片。

圖片

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 Marker 程式碼範例中,系統會把 FaceLandmarkerHelper.kt敬上 檔案。

執行工作

請根據您處理的資料類型使用 該資料類型專屬的 FaceLandmarker.detect...() 方法。使用 detect() 適用於個別圖片,detectForVideo() 適用於影片檔案中的影格; 和 detectAsync() 用於影片串流。當您對某個網路類型執行偵測時 影片串流,請務必在另外的執行緒執行偵測,以免 並封鎖使用者介面執行緒

以下程式碼範例顯示如何執行 Face 地標 er 分別是

圖片

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 地標 er 工作會傳回 而且不會封鎖目前的執行緒。就會叫用結果 每次處理完 輸入影格

在臉部地標範例程式碼中,detectdetectForVideodetectAsync 函式定義於 FaceLandmarkerHelper.kt。 檔案。

處理及顯示結果

Face 地標會針對每個偵測傳回 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敬上 類別,取得更多詳細資訊。