מדריך לזיהוי של זיהוי פנים ל-Android

המשימה MediaPipe Face Placeer מאפשרת לך לזהות ציוני דרך של פנים והבעות פנים תמונות וסרטונים. אפשר להשתמש במשימה הזו כדי לזהות הבעות פנים אנושיות, להשתמש בפילטרים ובאפקטים לפנים וליצור דמויות וירטואליות. המשימה הזו משתמשת מודלים של למידת מכונה (ML) שיכולים לעבוד עם תמונות בודדות או עם רצף זרם של תמונות. במשימה נוצר ציוני דרך תלת-ממדיים של פנים, צורת מיזוג (מקדמים שמייצגים הבעות פנים) כדי להסיק נתונים מפורטים של פנים ומטריצות טרנספורמציה בזמן אמת כדי לבצע שנדרשים לעיבוד האפקטים.

דוגמת הקוד שמתוארת בהוראות אלה זמינה במכשירים הבאים: GitHub. מידע נוסף על היכולות, המודלים ואפשרויות ההגדרה במשימה הזאת, ראו סקירה כללית.

קוד לדוגמה

הקוד לדוגמה של Tasks ב-MediaPipe הוא הטמעה פשוטה של סמל זיהוי פנים. לאפליקציה ל-Android. בדוגמה, המצלמה במכשיר Android פיזי משמשת את המצלמה כדי: זיהוי פרצופים בשידור וידאו רציף. האפליקציה יכולה לזהות פנים גם ב: תמונות וסרטונים מגלריית המכשיר.

אפשר להשתמש באפליקציה כנקודת התחלה של אפליקציה משלכם ל-Android, או להתייחס אליה כשמשנים אפליקציה קיימת. הקוד לדוגמה של Face Valueer מתארח ב- GitHub.

להורדת הקוד

בהוראות הבאות מוסבר איך ליצור עותק מקומי של הדוגמה באמצעות כלי שורת הפקודה git.

כדי להוריד את הקוד לדוגמה:

  1. משכפלים את מאגר ה-Git באמצעות הפקודה הבאה:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. לחלופין, להגדיר את מכונת ה-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 לקבלת פרטים נוספים.