Detyra MediaPipe Face Landmarker ju lejon të zbuloni pikat e referimit të fytyrës dhe shprehjet e fytyrës në imazhe dhe video. 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ë të mësuarit automatik (ML) që mund të funksionojnë me imazhe të vetme ose me një rrjedhë të vazhdueshme imazhesh. Detyra nxjerr pika referimi 3-dimensionale të fytyrës, rezultate të formës së përzierjes (koeficientë që përfaqësojnë shprehjet e fytyrës) për të nxjerrë sipërfaqe të detajuara të fytyrës në kohë reale dhe matrica transformimi për të kryer transformimet e kërkuara për renderimin 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 shembull i MediaPipe Tasks është një implementim 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 atij kur modifikoni një aplikacion ekzistues. Kodi shembullor i Face Landmarker është i vendosur në GitHub .
Shkarko 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 shembullor:
- Klononi repozitorin git duke përdorur komandën e mëposhtme:
git clone https://github.com/google-ai-edge/mediapipe-samples
- Opsionalisht, konfiguroni instancën tuaj git për të përdorur kontrollin e rrallë (sparte checkout), në mënyrë që të keni vetëm skedarët për aplikacionin shembullor Face Landmarker:
cd mediapipe-samples git sparse-checkout init --cone git sparse-checkout set examples/face_landmarker/android
Pasi të krijoni një version lokal të kodit shembull, mund ta importoni projektin në Android Studio dhe ta 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 thelbësor për këtë aplikacion shembullor për përcaktimin e fytyrave:
- 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 hyrëse të imazhit dhe videos.
- GalleryFragment.kt - Ndërvepron me
OverlayViewpër të shfaqur imazhin ose videon e dalë. - OverlayView.kt - Implementon shfaqjen me një rrjetë fytyrash për fytyrat e zbuluara.
Konfigurimi
Ky seksion përshkruan hapat kryesorë për konfigurimin e mjedisit tuaj të zhvillimit dhe projekteve të kodit posaçërisht 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ë modelesh të trajnuara që është e pajtueshme 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ë detyrës.
Zgjidhni dhe shkarkoni modelin dhe ruajeni atë brenda direktorisë së projektit tuaj:
<dev-project-root>/src/main/assets
Specifikoni shtegun e modelit brenda parametrit ModelAssetPath . Në kodin shembullor, modeli është përcaktuar 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 vlera 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. Duhet të specifikoni modalitetin e ekzekutimit që korrespondon me llojin e të dhënave hyrëse kur krijoni detyrën. Zgjidhni skedën për llojin e të dhënave hyrëse për të parë se si të krijoni detyrën dhe të ekzekutoni përfundimin.
Imazh
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)
Implementimi i kodit shembullor të Face Landmarker i lejon përdoruesit të kalojë midis mënyrave të përpunimit. Kjo qasje e bën kodin e krijimit të detyrës më të ndërlikuar dhe mund të mos jetë e përshtatshme për rastin tuaj të përdorimit. 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 | Diapazoni i Vlerave | Vlera e parazgjedhur |
|---|---|---|---|
runningMode | Cakton modalitetin e ekzekutimit për detyrën. Ekzistojnë tre mënyra: IMAZH: Modaliteti për futjen e një imazhi të vetëm. VIDEO: Modaliteti për kuadrot 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ë kamera. Në këtë modalitet, duhet të thirret resultListener për të konfiguruar 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 që zbulimi i fytyrës të konsiderohet 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 pikave të referimit të fytyrës. | Float [0.0,1.0] | 0.5 |
minTrackingConfidence | Rezultati minimal i besimit që gjurmimi i fytyrës të konsiderohet i suksesshëm. | Float [0.0,1.0] | 0.5 |
outputFaceBlendshapes | Nëse Face Landmarker nxjerr forma të përziera të fytyrës. Format e përziera të fytyrës përdoren për renderimin e modelit 3D të fytyrës. | Boolean | False |
outputFacialTransformationMatrixes | Nëse FaceLandmarker nxjerr matricën e transformimit të fytyrës. FaceLandmarker përdor matricën për të transformuar pikat e referimit 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 e referimit të zbuluara. | Boolean | False |
resultListener | Cakton dëgjuesin e rezultateve që të marrë rezultatet e landmarker 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ë vendosur në LIVE_STREAM | ResultListener | N/A |
errorListener | Cakton një dëgjues gabimi opsional. | ErrorListener | N/A |
Përgatitni të dhënat
Face Landmarker punon me imazhe, skedarë video dhe transmetime video të drejtpërdrejta. Detyra merret me përpunimin paraprak të të dhënave të futura, duke përfshirë ndryshimin e madhësisë, rrotullimin dhe normalizimin e vlerave.
Kodi i mëposhtëm tregon se si të kalohen të dhënat për përpunim. Këto shembuj përfshijnë detaje se si të trajtohen të dhënat nga imazhet, skedarët video dhe transmetimet e drejtpërdrejta të videos.
Imazh
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 shembullor të Face Landmarker, përgatitja e të dhënave trajtohet në skedarin FaceLandmarkerHelper.kt .
Ekzekuto 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 kuadro në skedarë video dhe detectAsync() për transmetimet video. Kur kryeni zbulime në një transmetim video, sigurohuni që t'i ekzekutoni zbulimet në një fije të veçantë për të shmangur bllokimin e fijes së ndërfaqes së përdoruesit.
Shembujt e mëposhtëm të kodit tregojnë shembuj të thjeshtë se si të ekzekutoni Face Landmarker në këto mënyra të ndryshme të të dhënave:
Imazh
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 jeni në modalitetin video ose në modalitetin e transmetimit të drejtpërdrejtë, duhet të jepni vulën kohore të kuadrit të hyrjes për detyrën e Shënuesit të Fytyrës.
- Kur ekzekutohet në modalitetin e imazhit ose videos, detyra Face Landmarker bllokon fijen aktuale derisa të përfundojë përpunimin e imazhit ose kuadrit të futur. Për të shmangur bllokimin e ndërfaqes së përdoruesit, ekzekutoni përpunimin në një fije në sfond.
- Kur ekzekutohet në modalitetin e transmetimit të drejtpërdrejtë, detyra Face Landmarker kthehet menjëherë dhe nuk e bllokon fijen aktuale. Do të thërrasë dëgjuesin e rezultateve me rezultatin e zbulimit sa herë që përfundon përpunimin e një kuadri hyrës.
Në kodin shembullor të Face Landmarker, funksionet detect , detectForVideo dhe detectAsync janë të përcaktuara 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 secilën fytyrë të zbuluar, me koordinata për secilën pikë referimi të fytyrës. Opsionale, objekti i rezultatit mund të përmbajë edhe forma përzierjeje, të cilat tregojnë shprehjet e fytyrës, dhe një matricë transformimi të fytyrës për të aplikuar efektet e fytyrës në pikat e referimit të zbuluara.
Më poshtë tregohet një shembull i të dhënave të daljes 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ë rezultatit të detyrës:

Kodi shembullor i Face Landmarker demonstron se si të shfaqen rezultatet e kthyera nga detyra, shihni klasën OverlayView për më shumë detaje.