Detyra MediaPipe Face Landmarker ju lejon të zbuloni pikat referuese të fytyrës dhe shprehjet e fytyrës në imazhe dhe video. Ju mund ta përdorni këtë detyrë për të identifikuar shprehjet e fytyrës njerëzore, për të aplikuar filtra dhe efekte të fytyrës dhe për të krijuar avatarë virtualë. Kjo detyrë përdor modele të mësimit të makinerive (ML) që mund të funksionojnë me imazhe të vetme ose një rrymë të vazhdueshme imazhesh. Detyra nxjerr pika referimi 3-dimensionale të fytyrës, rezultatet e formës së përzierjes (koeficientët që përfaqësojnë shprehjen e fytyrës) për të nxjerrë përfundime të sipërfaqeve të detajuara të fytyrës në kohë reale dhe matricat e transformimit për të kryer transformimet e kërkuara për paraqitjen e efekteve.
Shembulli i kodit i përshkruar në këto udhëzime është i disponueshëm në GitHub . Për më shumë informacion rreth aftësive, modeleve dhe opsioneve të konfigurimit të kësaj detyre, shihni Përmbledhjen .
Shembull kodi
Kodi i shembullit të MediaPipe Tasks është një zbatim i thjeshtë i një aplikacioni Face Landmarker për Android. Shembulli përdor kamerën në një pajisje fizike Android për të zbuluar fytyrat në një transmetim të vazhdueshëm video. Aplikacioni gjithashtu mund të zbulojë fytyrat në imazhe dhe video nga galeria e pajisjes.
Mund ta përdorni aplikacionin si pikënisje për aplikacionin tuaj Android ose t'i referoheni kur modifikoni një aplikacion ekzistues. Kodi i shembullit të Face Landmarker gjendet në GitHub .
Shkarkoni kodin
Udhëzimet e mëposhtme ju tregojnë se si të krijoni një kopje lokale të kodit shembull duke përdorur mjetin e linjës së komandës git .
Për të shkarkuar kodin shembull:
- Klononi depon e git duke përdorur komandën e mëposhtme:
git clone https://github.com/google-ai-edge/mediapipe-samples
- Opsionale, konfiguroni shembullin tuaj të git për të përdorur arkëtimin e rrallë, në mënyrë që të keni vetëm skedarët për shembullin e aplikacionit Face Landmarker:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/face_landmarker/android
Pas krijimit të një versioni lokal të kodit shembull, mund ta importoni projektin në Android Studio dhe të ekzekutoni aplikacionin. Për udhëzime, shihni Udhëzuesin e konfigurimit për Android .
Komponentët kryesorë
Skedarët e mëposhtëm përmbajnë kodin vendimtar për këtë aplikacion shembulli për shënimin e fytyrës:
- FaceLandmarkerHelper.kt - Inicializon shënuesin e fytyrës dhe trajton përzgjedhjen e modelit dhe delegatit.
- CameraFragment.kt - Trajton kamerën e pajisjes dhe përpunon të dhënat e hyrjes së imazhit dhe videos.
- GalleryFragment.kt - Ndërvepron me
OverlayView
për të shfaqur imazhin ose videon dalëse. - OverlayView.kt - Zbaton ekranin me një rrjetë fytyre për fytyrat e zbuluara.
Konfigurimi
Ky seksion përshkruan hapat kryesorë për konfigurimin e mjedisit tuaj të zhvillimit dhe projekteve të kodit në mënyrë specifike për të përdorur Face Landmarker. Për informacion të përgjithshëm mbi konfigurimin e mjedisit tuaj të zhvillimit për përdorimin e detyrave të MediaPipe, duke përfshirë kërkesat e versionit të platformës, shihni udhëzuesin e konfigurimit për Android .
varësitë
Detyra Face Landmarker përdor bibliotekën com.google.mediapipe:tasks-vision
. Shtoni këtë varësi në skedarin build.gradle
të aplikacionit tuaj Android:
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
Model
Detyra MediaPipe Face Landmarker kërkon një paketë modeli të trajnuar që është në përputhje me këtë detyrë. Për më shumë informacion mbi modelet e trajnuara të disponueshme për Face Landmarker, shihni seksionin Modelet e përmbledhjes së detyrave.
Zgjidhni dhe shkarkoni modelin dhe ruajeni në direktorinë e projektit tuaj:
<dev-project-root>/src/main/assets
Specifikoni shtegun e modelit brenda parametrit ModelAssetPath
. Në kodin e shembullit, modeli përcaktohet në skedarin FaceLandmarkerHelper.kt
:
baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)
Krijo detyrën
Detyra MediaPipe Face Landmarker përdor funksionin createFromOptions()
për të konfiguruar detyrën. Funksioni createFromOptions()
pranon vlerat për opsionet e konfigurimit. Për më shumë informacion mbi opsionet e konfigurimit, shihni Opsionet e konfigurimit .
Face Landmarker mbështet llojet e mëposhtme të të dhënave hyrëse: imazhe statike, skedarë video dhe transmetime video të drejtpërdrejta. Ju duhet të specifikoni mënyrën e ekzekutimit që korrespondon me llojin tuaj të të dhënave hyrëse kur krijoni detyrën. Zgjidhni skedën për llojin tuaj të të dhënave hyrëse për të parë se si të krijoni detyrën dhe të ekzekutoni konkluzionet.
Imazhi
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)
Video
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)
Transmetim i drejtpërdrejtë
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)
Zbatimi i kodit të shembullit të Face Landmarker lejon përdoruesin të kalojë midis mënyrave të përpunimit. Qasja e bën kodin e krijimit të detyrës më të komplikuar dhe mund të mos jetë i përshtatshëm për rastin tuaj të përdorimit. Ju mund ta shihni këtë kod në funksionin setupFaceLandmarker()
në skedarin FaceLandmarkerHelper.kt
.
Opsionet e konfigurimit
Kjo detyrë ka opsionet e mëposhtme të konfigurimit për aplikacionet Android:
Emri i opsionit | Përshkrimi | Gama e vlerave | Vlera e paracaktuar |
---|---|---|---|
runningMode | Vendos modalitetin e ekzekutimit për detyrën. Ekzistojnë tre mënyra: IMAGE: Modaliteti për hyrjet e një imazhi të vetëm. VIDEO: Modaliteti për kornizat e dekoduara të një videoje. LIVE_STREAM: Modaliteti për një transmetim të drejtpërdrejtë të të dhënave hyrëse, si p.sh. nga një aparat fotografik. Në këtë modalitet, resultListener duhet të thirret për të vendosur një dëgjues për të marrë rezultatet në mënyrë asinkrone. | { IMAGE, VIDEO, LIVE_STREAM } | IMAGE |
numFaces | Numri maksimal i fytyrave që mund të zbulohen nga FaceLandmarker . Zbutja zbatohet vetëm kur num_faces është vendosur në 1. | Integer > 0 | 1 |
minFaceDetectionConfidence | Rezultati minimal i besimit për zbulimin e fytyrës për t'u konsideruar i suksesshëm. | Float [0.0,1.0] | 0.5 |
minFacePresenceConfidence | Rezultati minimal i besimit të rezultatit të pranisë së fytyrës në zbulimin e pikës referimi të fytyrës. | Float [0.0,1.0] | 0.5 |
minTrackingConfidence | Rezultati minimal i besimit për gjurmimin e fytyrës për t'u konsideruar i suksesshëm. | Float [0.0,1.0] | 0.5 |
outputFaceBlendshapes | Nëse Face Landmarker nxjerr format e përzierjes së fytyrës. Format e përzierjes së fytyrës përdoren për paraqitjen e modelit të fytyrës 3D. | Boolean | False |
outputFacialTransformationMatrixes | Nëse FaceLandmarker nxjerr matricën e transformimit të fytyrës. FaceLandmarker përdor matricën për të transformuar pikat referuese të fytyrës nga një model kanonik i fytyrës në fytyrën e zbuluar, në mënyrë që përdoruesit të mund të aplikojnë efekte në pikat referuese të zbuluara. | Boolean | False |
resultListener | Vendos dëgjuesin e rezultateve që të marrë rezultatet e pikë referimit në mënyrë asinkrone kur FaceLandmarker është në modalitetin e transmetimit të drejtpërdrejtë. Mund të përdoret vetëm kur modaliteti i ekzekutimit është caktuar në LIVE_STREAM | ResultListener | N/A |
errorListener | Vendos një dëgjues opsional gabimi. | ErrorListener | N/A |
Përgatitni të dhënat
Face Landmarker punon me imazhe, skedarë video dhe transmetime video të drejtpërdrejta. Detyra trajton parapërpunimin e hyrjes së të dhënave, duke përfshirë ndryshimin e madhësisë, rrotullimin dhe normalizimin e vlerës.
Kodi i mëposhtëm tregon se si të dorëzohen të dhënat për përpunim. Këto mostra përfshijnë detaje se si të trajtohen të dhënat nga imazhet, skedarët video dhe transmetimet video të drejtpërdrejta.
Imazhi
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()
Video
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()
Transmetim i drejtpërdrejtë
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()
Në kodin e shembullit të Face Landmarker, përgatitja e të dhënave trajtohet në skedarin FaceLandmarkerHelper.kt
.
Drejtoni detyrën
Në varësi të llojit të të dhënave me të cilat po punoni, përdorni metodën FaceLandmarker.detect...()
që është specifike për atë lloj të dhënash. Përdorni detect()
për imazhe individuale, detectForVideo()
për kornizat në skedarët video dhe detectAsync()
për transmetimet video. Kur jeni duke kryer zbulime në një transmetim video, sigurohuni që zbulimet t'i ekzekutoni në një bashkëbisedim të veçantë për të shmangur bllokimin e lidhjes së ndërfaqes së përdoruesit.
Shembujt e mëposhtëm të kodit tregojnë shembuj të thjeshtë se si të ekzekutohet Face Landmarker në këto mënyra të ndryshme të të dhënave:
Imazhi
val result = FaceLandmarker.detect(mpImage)
Video
val timestampMs = i * inferenceIntervalMs FaceLandmarker.detectForVideo(mpImage, timestampMs) .let { detectionResult -> resultList.add(detectionResult) }
Transmetim i drejtpërdrejtë
val mpImage = BitmapImageBuilder(rotatedBitmap).build() val frameTime = SystemClock.uptimeMillis() FaceLandmarker.detectAsync(mpImage, frameTime)
Vini re sa vijon:
- Kur ekzekutoni në modalitetin e videos ose në modalitetin e transmetimit të drejtpërdrejtë, duhet të jepni vulën kohore të kornizës së hyrjes në detyrën Face Landmarker.
- Kur ekzekutohet në modalitetin e imazhit ose të videos, detyra Face Landmarker bllokon fillin aktual derisa të përfundojë përpunimin e imazhit ose kornizës hyrëse. Për të shmangur bllokimin e ndërfaqes së përdoruesit, ekzekutoni përpunimin në një fill në sfond.
- Kur ekzekutohet në modalitetin e transmetimit të drejtpërdrejtë, detyra e Face Landmarker kthehet menjëherë dhe nuk e bllokon lidhjen aktuale. Ai do të thërrasë dëgjuesin e rezultatit me rezultatin e zbulimit sa herë që përfundon përpunimin e një kornize hyrëse.
Në kodin e shembullit Face Landmarker, funksionet detect
, detectForVideo
dhe detectAsync
përcaktohen në skedarin FaceLandmarkerHelper.kt
.
Trajtoni dhe shfaqni rezultatet
Face Landmarker kthen një objekt FaceLandmarkerResult
për çdo ekzekutim zbulimi. Objekti i rezultatit përmban një rrjetë fytyre për çdo fytyrë të zbuluar, me koordinata për çdo pikë referimi të fytyrës. Opsionale, objekti i rezultatit mund të përmbajë gjithashtu forma të përziera, të cilat tregojnë shprehjet e fytyrës dhe një matricë transformimi të fytyrës për të aplikuar efektet e fytyrës në pikat referuese të zbuluara.
Më poshtë tregon një shembull të të dhënave dalëse nga kjo detyrë:
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]
...
Imazhi i mëposhtëm tregon një vizualizim të daljes së detyrës:
Kodi i shembullit të Face Landmarker demonstron se si të shfaqen rezultatet e kthyera nga detyra, shihni klasën OverlayView
për më shumë detaje.