המשימה MediaPipe Face Placeer מאפשרת לך לזהות ציוני דרך של פנים והבעות פנים תמונות וסרטונים. אפשר להשתמש במשימה הזו כדי לזהות הבעות פנים אנושיות, להשתמש בפילטרים ובאפקטים לפנים וליצור דמויות וירטואליות. המשימה הזו משתמשת מודלים של למידת מכונה (ML) שיכולים לעבוד עם תמונות בודדות או עם רצף זרם של תמונות. במשימה נוצר ציוני דרך תלת-ממדיים של פנים, צורת מיזוג (מקדמים שמייצגים הבעות פנים) כדי להסיק נתונים מפורטים של פנים ומטריצות טרנספורמציה בזמן אמת כדי לבצע שנדרשים לעיבוד האפקטים.
דוגמת הקוד שמתוארת בהוראות אלה זמינה במכשירים הבאים: GitHub. מידע נוסף על היכולות, המודלים ואפשרויות ההגדרה במשימה הזאת, ראו סקירה כללית.
קוד לדוגמה
הקוד לדוגמה של Tasks ב-MediaPipe הוא הטמעה פשוטה של סמל זיהוי פנים. לאפליקציה ל-Android. בדוגמה, המצלמה במכשיר Android פיזי משמשת את המצלמה כדי: זיהוי פרצופים בשידור וידאו רציף. האפליקציה יכולה לזהות פנים גם ב: תמונות וסרטונים מגלריית המכשיר.
אפשר להשתמש באפליקציה כנקודת התחלה של אפליקציה משלכם ל-Android, או להתייחס אליה כשמשנים אפליקציה קיימת. הקוד לדוגמה של Face Valueer מתארח ב- GitHub.
להורדת הקוד
בהוראות הבאות מוסבר איך ליצור עותק מקומי של הדוגמה באמצעות כלי שורת הפקודה git.
כדי להוריד את הקוד לדוגמה:
- משכפלים את מאגר ה-Git באמצעות הפקודה הבאה:
git clone https://github.com/google-ai-edge/mediapipe-samples
- לחלופין, להגדיר את מכונת ה-Git שלך לשימוש בקופה עם היעדר תשלום, כדי
רק את הקבצים עבור האפליקציה לדוגמה של Face Placeer:
cd mediapipe 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 Markuper. למידע כללי על להגדיר את סביבת הפיתוח לשימוש במשימות של MediaPipe, כולל הדרישות לגרסאות הפלטפורמה זמינות במדריך ההגדרה עבור ב-Android.
יחסי תלות
במשימה של Face Placeer נעשה שימוש בספרייה com.google.mediapipe:tasks-vision
. הוסף
תלות זו בקובץ build.gradle
של האפליקציה ל-Android:
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
דגם
למשימה MediaPipe Face Placeer נדרשת חבילת מודלים מאומנת שתואמים ל- במשימה הזאת. לקבלת מידע נוסף על מודלים זמינים שעברו אימון של Face Scoreer: ראו את הקטע 'מודלים' בסקירה הכללית על המשימה.
בוחרים את המודל, מורידים אותו ושומרים אותו בספריית הפרויקט:
<dev-project-root>/src/main/assets
צריך לציין את הנתיב של המודל בתוך הפרמטר ModelAssetPath
. ב
המודל מוגדר
FaceLandmarkerHelper.kt
file:
baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)
יצירת המשימה
במשימה MediaPipe Face Placeer נעשה שימוש בפונקציה createFromOptions()
כדי להגדיר
למשימה הזו. הפונקציה createFromOptions()
מקבלת ערכים להגדרה
אפשרויות. למידע נוסף על אפשרויות ההגדרה, ראו הגדרות אישיות
הפרמטר הזה.
Face Placeer תומך בסוגים הבאים של נתוני קלט: תמונות סטילס, וידאו קבצים וסטרימינג בשידור חי. צריך לציין את מצב הריצה שתואם לסוג של נתוני הקלט בזמן יצירת המשימה. בחירת הכרטיסייה לגבי סוג נתוני הקלט, כדי לראות איך ליצור את המשימה ולהריץ אותה מסיקה.
תמונה
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 Placeer מאפשרת למשתמש לעבור בין
במצבי עיבוד שונים. הגישה הזו הופכת את הקוד ליצירת משימה למורכב יותר
לא מתאים לתרחיש לדוגמה שלכם. אפשר לראות את הקוד הזה
הפונקציה setupFaceLandmarker()
FaceLandmarkerHelper.kt
חדש.
אפשרויות תצורה
המשימה הזו כוללת את אפשרויות ההגדרה הבאות לאפליקציות ל-Android:
שם האפשרות | תיאור | טווח ערכים | ערך ברירת מחדל |
---|---|---|---|
runningMode |
מגדיר את מצב הריצה של המשימה. יש שלושה סוגים
מצבים: 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 Placeer יוצר פלט של שילובי פנים. כדי לעבד את המודל התלת-ממדי לזיהוי פנים, המערכת משתמשת במיזוגי פנים. | Boolean |
False |
outputFacialTransformationMatrixes |
האם FaceLandmark מפיק את הפלט של הפנים של הטרנספורמציה. FaceLandMark משתמש ב- להפוך את ציוני הדרך של הפנים מתבנית לזיהוי פנים קנוניות פנים שאותרו, כך שהמשתמשים יכולים להחיל אפקטים על ציוני הדרך שזוהו. | Boolean |
False |
resultListener |
מגדיר את אוזן התוצאות לקבל את תוצאות ה- במעקב
באופן אסינכרוני כש-FaceLandmarker במצב השידור החי.
אפשר להשתמש באפשרות הזו רק כשמצב הריצה מוגדר ל-LIVE_STREAM |
ResultListener |
N/A |
errorListener |
הגדרת האזנה לשגיאות אופציונלית. | ErrorListener |
N/A |
הכנת נתונים
התכונה Face Placeer פועלת עם תמונות, קובצי וידאו וסטרימינג של וידאו בשידור חי. המשימה מטפל בעיבוד מראש של קלט נתונים, כולל שינוי גודל, סיבוב וערך נירמול.
הקוד הבא מדגים איך להעביר נתונים לצורך עיבוד. האלה הדוגמאות כוללות פרטים על אופן הטיפול בנתונים מתמונות, מקובצי וידאו ומשידורים חיים וידאו בסטרימינג.
תמונה
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 Titleer, הכנת הנתונים מטופלת
FaceLandmarkerHelper.kt
חדש.
הרצת המשימה
בהתאם לסוג הנתונים שאתם עובדים איתם, משתמשים באופרטור
FaceLandmarker.detect...()
שספציפית לסוג הנתונים הזה. כדאי להשתמש
detect()
לתמונות נפרדות, detectForVideo()
לפריימים בקובצי וידאו,
ו-detectAsync()
לזרמי וידאו. כשאתם מבצעים זיהוי
וידאו בסטרימינג, חשוב לוודא שאתם מריצים את הזיהוי בשרשור נפרד,
וחוסם את ה-thread של ממשק המשתמש.
דוגמאות הקוד הבאות ממחישות איך להריץ את Face Scoreer במצבי הנתונים השונים האלה:
תמונה
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 Placeer תיחסם את ה-thread הנוכחי עד שהוא יסיים לעבד את קלט התמונה או המסגרת. שפת תרגום להימנע מחסימה של ממשק המשתמש, לבצע את העיבוד ברקע של שרשור.
- כשהמשימה של Face Placeer חוזרת, אפשר להפעיל אותה במצב שידור חי. מיד ולא תחסום את השרשור הנוכחי. הפעלת התוצאה המאזין עם תוצאת הזיהוי בכל פעם שהוא מסיים לעבד מסגרת הקלט.
בקוד לדוגמה של Face Valueer, הערכים detect
, detectForVideo
פונקציות detectAsync
מוגדרות
FaceLandmarkerHelper.kt
חדש.
טיפול בתוצאות והצגתן
התכונה Face Scoreer מחזירה אובייקט 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 Placeer מדגים איך להציג את התוצאות שהוחזרו
מהמשימה,
OverlayView
לקבלת פרטים נוספים.