מדריך לזיהוי אובייקטים באינטרנט

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

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

קוד לדוגמה

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

הגדרה

בקטע הזה מתוארים השלבים העיקריים להגדרת סביבת הפיתוח, במיוחד לשימוש ב-Object Detector. מידע כללי על הגדרת סביבת הפיתוח לאינטרנט ול-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/

יצירת המשימה

משתמשים באחת מהפונקציות ObjectDetector.createFrom...() של Object Detector כדי להכין את המשימה להרצת מסקנות. משתמשים בפונקציה createFromModelPath() עם נתיב יחסי או מוחלט לקובץ המודל שעבר אימון. אם המודל כבר נטען בזיכרון, אפשר להשתמש ב-method‏ createFromModelBuffer(). בדוגמת הקוד שבהמשך מוצג שימוש בפונקציה createFromOptions(), שמאפשרת להגדיר אפשרויות תצורה נוספות. מידע נוסף על אפשרויות ההגדרה הזמינות זמין בקטע אפשרויות הגדרה.

הקוד הבא ממחיש איך ליצור את המשימה הזו ולהגדיר אותה:

const vision = await FilesetResolver.forVisionTasks(
  // path/to/wasm/root
  "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"
);
objectDetector = await ObjectDetector.createFromOptions(vision, {
  baseOptions: {
    modelAssetPath: `https://storage.googleapis.com/mediapipe-tasks/object_detector/efficientdet_lite0_uint8.tflite`
  },
  scoreThreshold: 0.5,
  runningMode: runningMode
});

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

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

למשימה הזו יש את אפשרויות התצורה הבאות לאפליקציות אינטרנט:

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

IMAGE: המצב להזנת תמונה אחת.

וידאו: המצב של פריימים מפוענחים של וידאו או של שידור חי של נתוני קלט, למשל ממצלמה.
{IMAGE, VIDEO} IMAGE
displayNamesLocale הגדרת השפה של התוויות לשימוש בשמות התצוגה שסופקו במטא-נתונים של מודל המשימה, אם הם זמינים. ברירת המחדל היא en לאנגלית. אפשר להוסיף תוויות מותאמות לשוק המקומי למטא-נתונים של מודל מותאם אישית באמצעות TensorFlow Lite Metadata Writer API קוד לוקאל en
maxResults מגדיר את המספר המקסימלי האופציונלי של תוצאות זיהוי עם הדירוג הגבוה ביותר שיוחזר. מספרים חיוביים -1 (כל התוצאות מוצגות)
scoreThreshold הגדרת הסף של ציון התחזית, שמבטל את הסף שצוין במטא-נתונים של המודל (אם קיים). תוצאות מתחת לערך הזה נדחות. כל ערך צף לא מוגדר
categoryAllowlist הגדרת רשימה אופציונלית של שמות קטגוריות מותרים. אם הערך לא ריק, תוצאות הזיהוי ששם הקטגוריה שלהן לא נמצא בקבוצה הזו יוסר. המערכת מתעלמת משמות קטגוריות כפולים או לא מוכרים. האפשרות הזו לא תואמת לאפשרות categoryDenylist, ושימוש בשתיהן גורם לשגיאה. מחרוזות כלשהן לא מוגדר
categoryDenylist הגדרת רשימה אופציונלית של שמות קטגוריות אסורים. אם הערך לא ריק, תוצאות הזיהוי ששם הקטגוריה שלהן נמצא בקבוצה הזו יסוננו. המערכת מתעלמת משמות קטגוריות כפולים או לא מוכרים. האפשרות הזו לא תואמת לאפשרות categoryAllowlist, ושימוש בשתיהן גורם לשגיאה. מחרוזות כלשהן לא מוגדר

הכנת הנתונים

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

הרצת המשימה

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

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

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

תמונה

const image = document.getElementById("image") as HTMLImageElement;
const detections = objectDetector.detect(image);

וידאו

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

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

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

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

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

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

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

בהמשך מוצגת דוגמה לנתוני הפלט של המשימה הזו:

ObjectDetectorResult:
 Detection #0:
  Box: (x: 355, y: 133, w: 190, h: 206)
  Categories:
   index       : 17
   score       : 0.73828
   class name  : dog
 Detection #1:
  Box: (x: 103, y: 15, w: 138, h: 369)
  Categories:
   index       : 17
   score       : 0.73047
   class name  : dog

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

שני כלבים שמודגשים באמצעות תיבות גבול

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