המודלים של סיווג תמונות שעסקנו בהם עד כה לקחו תמונה והפיקו תוצאה קטגורית, כמו הקטגוריה 'מספר' בבעיה של MNIST. עם זאת, במקרים רבים אנחנו לא רוצים רק לדעת שתמונה מציגה אובייקטים - אנחנו רוצים להיות מסוגלים לקבוע את המיקום המדויק שלהם. זה בדיוק הנקודה של זיהוי אובייקטים.
תמונה מתוך אתר YOLO v2
נניח שרצינו למצוא חתול בתמונה, גישה נאיבית מאוד לזיהוי אובייקטים תהיה כדלקמן:
- לחלק את התמונה למספר אריחים.
- להריץ סיווג תמונה על כל אריח.
- אריחים שמפיקים הפעלה גבוהה מספיק יכולים להיחשב ככאלה שמכילים את האובייקט המדובר.
תמונה מתוך מחברת התרגילים
עם זאת, גישה זו רחוקה מלהיות אידיאלית, מכיוון שהיא מאפשרת לאלגוריתם לאתר את תיבת הגבול של האובייקט בצורה מאוד לא מדויקת. כדי למקם בצורה מדויקת יותר, עלינו להריץ סוג של רגרסיה כדי לחזות את הקואורדינטות של תיבות הגבול - ולשם כך אנו זקוקים למערכי נתונים ספציפיים.
פוסט הבלוג הזה מציע מבוא עדין ומעולה לזיהוי צורות.
ייתכן שתיתקלו במערכי הנתונים הבאים למשימה זו:
- PASCAL VOC - 20 קטגוריות
- COCO - אובייקטים נפוצים בהקשר. 80 קטגוריות, תיבות גבול ומסכות סגמנטציה
בעוד שבסיווג תמונות קל למדוד עד כמה האלגוריתם מצליח, בזיהוי אובייקטים עלינו למדוד גם את נכונות הקטגוריה וגם את דיוק מיקום תיבת הגבול שחוזה האלגוריתם. עבור האחרון, אנו משתמשים במדד שנקרא חיתוך על איחוד (IoU), שמודד עד כמה שתי תיבות (או שני אזורים שרירותיים) חופפים.
איור 2 מתוך פוסט בלוג מצוין על IoU
הרעיון פשוט - אנו מחלקים את שטח החיתוך בין שתי הצורות בשטח האיחוד שלהן. עבור שני אזורים זהים, IoU יהיה 1, בעוד שעבור אזורים שאינם חופפים כלל הוא יהיה 0. אחרת הוא ינוע בין 0 ל-1. בדרך כלל אנו מתחשבים רק בתיבות גבול עבורן IoU מעל ערך מסוים.
נניח שאנחנו רוצים למדוד עד כמה קטגוריה מסוימת של אובייקטים
- עקומת דיוק-שליפה (Precision-Recall) מציגה את הדיוק בהתאם לערך סף זיהוי (מ-0 עד 1).
- בהתאם לסף, נקבל יותר או פחות אובייקטים מזוהים בתמונה, וערכים שונים של דיוק ושליפה.
- העקומה תיראה כך:
תמונה מתוך NeuroWorkshop
הדיוק הממוצע עבור קטגוריה נתונה
נשקול רק את הזיהויים עבורם IoU מעל ערך מסוים. לדוגמה, במערך הנתונים PASCAL VOC בדרך כלל
תמונה מתוך NeuroWorkshop
המדד המרכזי לזיהוי אובייקטים נקרא דיוק ממוצע כולל, או mAP. זהו ערך הדיוק הממוצע, מחושב כממוצע על פני כל קטגוריות האובייקטים, ולעיתים גם על פני
ישנן שתי קטגוריות עיקריות של אלגוריתמים לזיהוי אובייקטים:
- רשתות הצעת אזורים (R-CNN, Fast R-CNN, Faster R-CNN). הרעיון המרכזי הוא ליצור אזורים מעניינים (ROI) ולהריץ CNN עליהם, בחיפוש אחר הפעלה מקסימלית. זה קצת דומה לגישה הנאיבית, למעט העובדה שה-ROI נוצרים בצורה חכמה יותר. אחד החסרונות המרכזיים של שיטות אלו הוא שהן איטיות, מכיוון שצריך לבצע מספר רב של מעברים של מסווג CNN על התמונה.
- מעבר אחד (YOLO, SSD, RetinaNet). בארכיטקטורות אלו אנו מעצבים את הרשת כך שתנבא גם קטגוריות וגם ROI במעבר אחד.
R-CNN משתמשת ב-חיפוש סלקטיבי כדי ליצור מבנה היררכי של אזורי ROI, אשר מועברים לאחר מכן דרך מחלצי תכונות של CNN ומסווגי SVM כדי לקבוע את קטגוריית האובייקט, ורגרסיה ליניארית כדי לקבוע את קואורדינטות תיבת הגבול. מאמר רשמי
תמונה מתוך van de Sande et al. ICCV’11
תמונות מתוך הבלוג הזה
גישה זו דומה ל-R-CNN, אך האזורים מוגדרים לאחר יישום שכבות הקונבולוציה.
תמונה מתוך המאמר הרשמי, arXiv, 2015
הרעיון המרכזי בגישה זו הוא להשתמש ברשת עצבית כדי לנבא ROI - מה שנקרא רשת הצעת אזורים. מאמר, 2016
תמונה מתוך המאמר הרשמי
אלגוריתם זה מהיר יותר מ-Faster R-CNN. הרעיון המרכזי הוא כדלקמן:
- אנו מחלצים תכונות באמצעות ResNet-101.
- התכונות מעובדות על ידי מפת ניקוד רגישה למיקום. כל אובייקט מתוך
$C$ קטגוריות מחולק ל-$k\times k$ אזורים, ואנו מאמנים לחזות חלקים של אובייקטים. - עבור כל חלק מתוך
$k\times k$ אזורים כל הרשתות מצביעות על קטגוריות אובייקטים, וקטגוריית האובייקט עם ההצבעה המקסימלית נבחרת.
תמונה מתוך המאמר הרשמי
YOLO הוא אלגוריתם בזמן אמת במעבר אחד. הרעיון המרכזי הוא כדלקמן:
- התמונה מחולקת ל-$S\times S$ אזורים.
- עבור כל אזור, CNN מנבא
$n$ אובייקטים אפשריים, קואורדינטות תיבת הגבול ו-ביטחון=הסתברות * IoU.
תמונה מתוך המאמר הרשמי
- RetinaNet: מאמר רשמי
- מימוש ב-PyTorch ב-Torchvision
- מימוש ב-Keras
- זיהוי אובייקטים עם RetinaNet בדוגמאות של Keras
- SSD (Single Shot Detector): מאמר רשמי
המשיכו את הלמידה במחברת הבאה:
בשיעור זה עשיתם סיור מהיר בכל הדרכים השונות שבהן ניתן לבצע זיהוי אובייקטים!
קראו את המאמרים והמחברות על YOLO ונסו אותם בעצמכם:
- פוסט בלוג טוב שמתאר את YOLO
- אתר רשמי
- YOLO: מימוש ב-Keras, מחברת שלב-אחר-שלב
- YOLO v2: מימוש ב-Keras, [מחברת שלב-אחר-שלב](https://github.com/experiencor/keras-y











