Detyra MediaPipe Face Detector ju lejon të zbuloni fytyrat në një imazh ose video. Ju mund ta përdorni këtë detyrë për të lokalizuar fytyrat dhe tiparet e fytyrës brenda një kornize. Kjo detyrë përdor një model të mësimit të makinës (ML) që funksionon me imazhe të vetme ose një rrjedhë të vazhdueshme imazhesh. Detyra nxjerr vendndodhjet e fytyrës, së bashku me pikat kryesore të mëposhtme të fytyrës: syri i majtë, syri i djathtë, maja e hundës, goja, tragjia e syrit të majtë dhe tragjia e syrit të djathtë.
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 Detector 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ë Detektorit të Fytyrës 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 arka të rralla, në mënyrë që të keni vetëm skedarët për shembullin e aplikacionit Face Detector:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/face_detector/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 të zbulimit të fytyrës:
- FaceDetectorHelper.kt - Inicializon detektorin 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 kuti kufizuese 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 Detektorin e Fytyrës. 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 Detector 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 Detector 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 Detektorin e Fytyrës, 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 FaceDetectorHelper.kt
:
val modelName = "face_detection_short_range.tflite"
baseOptionsBuilder.setModelAssetPath(modelName)
Krijo detyrën
Detyra MediaPipe Face Detector 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 .
Detektori i fytyrës 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 që korrespondon me 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(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = FaceDetector.FaceDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinDetectionConfidence(threshold) .setRunningMode(RunningMode.IMAGE) val options = optionsBuilder.build() FaceDetector = FaceDetector.createFromOptions(context, options)
Video
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = FaceDetector.FaceDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinDetectionConfidence(threshold) .setRunningMode(RunningMode.VIDEO) val options = optionsBuilder.build() FaceDetector = FaceDetector.createFromOptions(context, options)
Transmetim i drejtpërdrejtë
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = FaceDetector.FaceDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinDetectionConfidence(threshold) .setResultListener(this::returnLivestreamResult) .setErrorListener(this::returnLivestreamError) .setRunningMode(RunningMode.LIVE_STREAM) val options = optionsBuilder.build() FaceDetector = FaceDetector.createFromOptions(context, options)
Zbatimi i kodit të shembullit të Detektorit të Fytyrës lejon përdoruesin të kalojë ndërmjet 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 setupFaceDetector()
në skedarin FaceDetectorHelper.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 |
minDetectionConfidence | Rezultati minimal i besimit për zbulimin e fytyrës për t'u konsideruar i suksesshëm. | Float [0,1] | 0.5 |
minSuppressionThreshold | Pragu minimal jo-maksimal i shtypjes për zbulimin e fytyrës duhet të konsiderohet i mbivendosur. | Float [0,1] | 0.3 |
resultListener | Vendos dëgjuesin e rezultateve që të marrë rezultatet e zbulimit në mënyrë asinkrone kur Detektori i fytyrës është në modalitetin e transmetimit të drejtpërdrejtë. Mund të përdoret vetëm kur modaliteti i ekzekutimit është caktuar në LIVE_STREAM . | N/A | Not set |
errorListener | Vendos një dëgjues opsional gabimi. | N/A | Not set |
Përgatitni të dhënat
Detektori i fytyrës funksionon 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ë Detektorit të Fytyrës, përgatitja e të dhënave trajtohet në skedarin FaceDetectorHelper.kt
.
Drejtoni detyrën
Në varësi të llojit të të dhënave me të cilat po punoni, përdorni metodën faceDetector.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ë përdorni Detektorin e Fytyrës në këto mënyra të ndryshme të të dhënave:
Imazhi
val result = faceDetector.detect(mpImage)
Video
val timestampMs = i * inferenceIntervalMs faceDetector.detectForVideo(mpImage, timestampMs) .let { detectionResult -> resultList.add(detectionResult) }
Transmetim i drejtpërdrejtë
val mpImage = BitmapImageBuilder(rotatedBitmap).build() val frameTime = SystemClock.uptimeMillis() faceDetector.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 e Detektorit të Fytyrës.
- Kur funksionon në modalitetin e imazhit ose të videos, detyra e Detektorit të Fytyrës 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 Detektorit të Fytyrës 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ëse funksioni i zbulimit thirret kur detyra e Detektorit të Fytyrës është e zënë me përpunimin e një kuadri tjetër, detyra do të injorojë kornizën e re hyrëse.
Në kodin e shembullit të Detektorit të Fytyrës, funksionet detect
, detectForVideo
dhe detectAsync
përcaktohen në skedarin FaceDetectorHelper.kt
.
Trajtoni dhe shfaqni rezultatet
Face Detector kthen një objekt FaceDetectorResult
për çdo ekzekutim zbulimi. Objekti i rezultatit përmban kuti kufizuese për fytyrat e zbuluara dhe një pikë besimi për secilën fytyrë të zbuluar.
Më poshtë tregon një shembull të të dhënave dalëse nga kjo detyrë:
FaceDetectionResult:
Detections:
Detection #0:
BoundingBox:
origin_x: 126
origin_y: 100
width: 463
height: 463
Categories:
Category #0:
index: 0
score: 0.9729152917861938
NormalizedKeypoints:
NormalizedKeypoint #0:
x: 0.18298381567001343
y: 0.2961040139198303
NormalizedKeypoint #1:
x: 0.3302789330482483
y: 0.29289937019348145
... (6 keypoints for each face)
Detection #1:
BoundingBox:
origin_x: 616
origin_y: 193
width: 430
height: 430
Categories:
Category #0:
index: 0
score: 0.9251380562782288
NormalizedKeypoints:
NormalizedKeypoint #0:
x: 0.6151331663131714
y: 0.3713381886482239
NormalizedKeypoint #1:
x: 0.7460576295852661
y: 0.38825345039367676
... (6 keypoints for each face)
Imazhi i mëposhtëm tregon një vizualizim të daljes së detyrës:
Për imazhin pa kuti kufizuese, shihni imazhin origjinal .
Shembulli i kodit të Detektorit të Fytyrës tregon se si të shfaqen rezultatet e kthyera nga detyra, shikoni klasën OverlayView
për më shumë detaje.