מדריך לזיהוי פנים למחשב

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

בהוראות האלה מוסבר איך להשתמש ב'זיהוי פנים' באפליקציות אינטרנט וב-JavaScript. למידע נוסף על היכולות, המודלים ואפשרויות ההגדרה של המשימה הזו, קראו את הסקירה הכללית.

קוד לדוגמה

הקוד לדוגמה של גלאי הפנים מספק הטמעה מלאה של המשימה הזו ב-JavaScript, לעיונך. הקוד הזה עוזר לכם לבדוק את המשימה הזו ולהתחיל ליצור אפליקציה משלכם לזיהוי פנים. תוכלו להציג, להריץ ולערוך את הקוד לדוגמה של מזהה הפנים באמצעות דפדפן האינטרנט בלבד.

הגדרה

בקטע הזה מתוארים השלבים העיקריים להגדרה של סביבת הפיתוח באופן ספציפי לשימוש ב'זיהוי פנים'. למידע כללי על הגדרת סביבת הפיתוח של האתר ושל JavaScript, כולל הדרישות לגרסת הפלטפורמה, קראו את מדריך ההגדרה לאתרים.

חבילות JavaScript

הקוד לזיהוי הפנים זמין דרך חבילת @mediapipe/tasks-vision NPM של MediaPipe. אפשר למצוא ולהוריד את הספריות האלה לפי ההוראות במדריך ההגדרה של הפלטפורמה.

אתם יכולים להתקין את החבילות הנדרשות דרך NPM, באמצעות הפקודה הבאה:

npm install @mediapipe/tasks-vision

אם רוצים לייבא את קוד המשימה דרך שירות של רשת להעברת תוכן (CDN), מוסיפים את הקוד הבא בתג <head> בקובץ ה-HTML:

<!-- You can replace JSDeliver with another CDN if you prefer to -->
<head>
  <script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/vision_bundle.js"
    crossorigin="anonymous"></script>
</head>

מודל

למשימה של גלאי הפנים של MediaPipe נדרשת מודל מאומן שתואם למשימה הזו. למידע נוסף על המודלים הזמינים לשימוש בגלאי פנים, עיינו בסקירה הכללית על המשימות בקטע 'מודלים'.

בחרו והורידו מודל, ולאחר מכן שמרו אותו בספריית הפרויקט שלכם:

<dev-project-root>/app/shared/models/

יצירת המשימה

השתמשו באחת מהפונקציות createFrom...() של גלאי הפנים כדי להכין את המשימה להרצת הסקות. השתמשו בפונקציה createFromModelPath() עם נתיב יחסי או מוחלט לקובץ המודל שעבר אימון. אם המודל שלכם כבר נטען בזיכרון, אתם יכולים להשתמש בשיטה createFromModelBuffer().

הקוד לדוגמה הבא מדגים את השימוש בפונקציה createFromOptions() כדי להגדיר את המשימה. הפונקציה createFromOptions מאפשרת לכם להתאים אישית את 'זיהוי פנים' באמצעות אפשרויות תצורה. מידע נוסף על אפשרויות ההגדרה זמין במאמר אפשרויות תצורה.

הקוד הבא מדגים איך ליצור ולהגדיר את המשימה עם אפשרויות בהתאמה אישית:

const vision = await FilesetResolver.forVisionTasks(
  // path/to/wasm/root
  "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"
);
const facedetector = await FaceDetector.createFromOptions(
    vision,
    {
      baseOptions: {
        modelAssetPath: "path/to/model"
      },
      runningMode: runningMode
    });

אפשרויות הגדרה

המשימה הזו כוללת את אפשרויות ההגדרה הבאות לאפליקציות אינטרנט ו-JavaScript:

שם האפשרות תיאור טווח ערכים ערך ברירת מחדל
option_var_1_web_js מגדיר את מצב הריצה של המשימה. יש שני מצבים:

IMAGE: המצב שבו ניתן להזין תמונה יחידה.

וידאו: המצב של פריימים מפוענחים של סרטון או בשידור חי של נתוני קלט, למשל ממצלמה.
{IMAGE, VIDEO} IMAGE
minDetectionConfidence ציון המהימנות המינימלי שזיהוי הפנים ייחשב בהצלחה. Float [0,1] 0.5
minSuppressionThreshold הסף המינימלי שאינו ביטול מקסימלי כדי שזיהוי הפנים ייחשב לחפיפה. Float [0,1] 0.3

הכנת הנתונים

התכונה 'זיהוי פנים' יכולה לזהות פנים בתמונות בכל פורמט שנתמך בדפדפן המארח. המשימה מטפלת גם בעיבוד מראש של קלט נתונים, כולל שינוי הגודל, סיבוב והנירמול של הערכים. כדי לזהות פנים בסרטונים, תוכלו להשתמש ב-API כדי לעבד במהירות פריים אחד בכל פעם ולהשתמש בחותמת הזמן של הפריים כדי לקבוע מתי הפנים מופיעות בסרטון.

מריצים את המשימה.

גלאי הפנים משתמש בשיטות detect() (עם מצב ריצה image) ו-detectForVideo() (עם מצב ריצה video) כדי להפעיל מסקנות. המשימה מעבדת את הנתונים, מנסה לזהות פנים ואז מדווחת על התוצאות.

הקריאות לשיטות של גלאי הפנים detect() ו-detectForVideo() פועלות באופן סינכרוני וחוסמות את ה-thread של ממשק המשתמש. אם מזהים פנים בפריימים של וידאו ממצלמת המכשיר, כל זיהוי יחסום את התהליכון הראשי. כדי למנוע זאת, אפשר להטמיע עובדי אינטרנט כדי להריץ את השיטות detect() ו-detectForVideo() ב-thread אחר.

הקוד הבא מדגים איך מבצעים את העיבוד באמצעות מודל המשימה:

תמונה

const image = document.getElementById("image") as HTMLImageElement;
const faceDetectorResult = faceDetector.detect(image);

וידאו

await faceDetector.setOptions({ runningMode: "video" });

let lastVideoTime = -1;
function renderLoop(): void {
  const video = document.getElementById("video");

  if (video.currentTime !== lastVideoTime) {
    const detections = faceDetector.detectForVideo(video);
    processResults(detections);
    lastVideoTime = video.currentTime;
  }

  requestAnimationFrame(() => {
    renderLoop();
  });
}

להטמעה מלאה יותר של משימת 'זיהוי פנים', ראו קוד לדוגמה.

טיפול בתוצאות והצגתן

בכל הרצת זיהוי נוצר אובייקט תוצאה של מזהה פנים. אובייקט התוצאה מכיל פנים בקואורדינטות של תמונה ופנים בקואורדינטות בעולם.

דוגמה לנתוני הפלט מהמשימה הזאת:

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)

התמונה הבאה מציגה המחשה של פלט המשימה:

לגבי התמונה ללא תיבות תוחמות, יש לעיין בתמונה המקורית.

הקוד לדוגמה של מזהה הפנים מדגים איך להציג את התוצאות שהוחזרו מהמשימה. ראו דוגמה לקוד.