כתבה זו הינה תירגום ותימצות של הכתבה המלאה שמסקרת את הפרויקט שלי ושל אלון בורג על הסרת רקע מתמונה. הכתבה מסקרת את כל הפרטים הקטנים במימוש האפליקציה הוובית הזו.
במהלך השנים שאני עוסק ב Machine Learning השאיפה העיקרית שלי היא לייצר מוצרי דאטה. משימה זו תמיד נראתה קשה ומאתגרת, וכזו שדורשת זמן רב מאוד.
במהלך 2017, עשיתי את קורס fast.ai יחד עם אלון בורג, וקיבלנו הזדמנות לעשות מוצר AI: ההתקדמות המשמעותית של ה Deep Learning איפשרו לבצע דברים שלא היו אפשריים קודם, וכלים חדשים אפשרו לפתח מודלים ואפשר גישה אליהם בקלות הרבה יותר גדולה מבעבר.
המטרות שהגדרנו עבור המוצר הן:
- מוצר מגניב ושימושי
- מוצר שלא נעשה עדיין (או שלא נעשה כמו שצריך)
- מוצר שלא יהיה קשה מדי לתכנן ולממש – תכננו להקדיש לעבודה יום בשבוע במהלך מספר חודשים
- ממשק משתמש פשוט מושך וכיפי
- דאטה לאימון זמין ונגיש
- מוצר שישתמש בטכנולוגיות המתקדמות ביותר של deep learning
- יוכל להפוך למוצר B2C אמיתי
להלן הרשמים שלי מהפרויקט.
בהתחלה ניסינו לעשות מסיר רקע כללי, ז”א לכל סוג של תמונה. אבל לאחר אימון המודל הראשון הבנו שעלינו להתמקד בסוג מסויים של תמונות ובחרנו ניקוי רקע של תמונות פורטרייט וסלפי:
בכתבה זו נעסוק בחלק האלגוריתמי בלבד, למי שמתעניין ב deployment (הפיכת האלגוריתם לשימוש מבצעי) מוזמן ללמוד מהפוסט על צד השרת (server side) ו- הפוסט על צד המשתמש קצה (client side)
פילוח סמנטי (Semantic Segmentation)
פילוח סמנטי (Semantic Segmentation) היא אחת משלושת הבעיות הידועות ביותר בראייה ממוחשבת יחד עם סיווג תמונות (Image Classification), וזיהוי אוביקטים (Object Detection). בעיית הפילוח הסמנטי היא למעשה גם בעיית קלאסיפיקציה למחלקות אבל של כל פיקסל בתמונה (ולא של התמונה כולה).
במקרה שלנו, של הסרת רקע, הסיווג לכל פיקסל משמעותו האם הפיקסל שייך לרקע או לפנים.
הרעיונות המוקדמים לפתור בעיה זו (עם למידה עמוקה) היא להשתמש ברשתות סיווג כגון Alexnet, VGG. כשבוחנים רשתות אלו רואים שיש שם אקטיבציות חזקות סביב האוביקט אותו הם מזהים, אך הם גסים מידי בגלל פעולת ה pooling שחוזרת על עצמה. תובנות אלו הביא להנחה שניתן ע”י שינויים ברשתות אלו להופכן לרשתות שמוצלחות גם בסגמנטציה של האוביקט. (ז”א במציאת קווי המיתאר שלו ולא רק זיהוי מי הוא)
בפוסט הזה ניתן לראות רשת סגמנטציה מבוססת VGG:
ואחרי Bilinear Upsampling:
סגמנטציה מבוססת FCN
במאמר FCN= Fully Convolutional Networks for Semantic Segmentation החוקרים שיפרו את השיטה ע”י הוספת חיבורים נוספים בין השכבות. החיבורים בין שכבות מההתחלה, האמצע והסוף מגבירות את הדיוק של הפרטים הקטנים בתמונה.
האיור הבא מתאר את הארכיטקטורה אך מציג רק שכבות Pooling, Prediction, שאר השכבות מושמטות:
והתוצאות של שיטה זו אכן לא רעות בכלל:
הצלחה זו פתחה פתח לחוקרים נוספים לפתח מודלים נוספים ומשופרים לבעיית הסגמנטציה שמבוססים גם הם על Up-sampling ומעקפים Skip-connections. להלן קישורים רלוונטיים: 1, 2, 3.
ניסיון ראשון עם UNET ו Tiramisu
לצורך הפרויקט הסרת רקע שלנו החלטנו להתמקד בשלושה מודלים: FCN, Unet , ו Tiramisu.
(על רשת ה UNET תוכלו לקרוא גם בעברית פה)
מודל ה FCN לא נתן לנו תוצאות מספיק טובות אפילו בתור התחלה, מודל ה Tiramisu שאומן על מאגר התמונות CamVid היה נראה מבטיח מבחינת תוצאות, ולמודל ה UNET יש את יתרון הקומפקטיות והמהירות. אז התבססנו על המימוש הזה של מודל ה Tiramisu
לאחר כמה אימונים ראשוניים ראינו שה Tiramisu יותר עדין מ Unet ויותר מסוגל לתפוס גבולות חדים.
בחירה והכנה של ה DB לאימון
לבעיית הסגמנטציה יותר קשה לתייג ולכן למצוא מאגרי תמונות (מתוייגות). הפופולארי ביותר הינו מאגר COCO המכיל 80K תמונות מ-90 קטגוריות שונות, מאגר VOC Pascal המכיל 11K תמונות מ-20 מחלקות שונות, ומאגר חדש יותר בשם ADE20K. בחרנו לעבוד על COCO כי הוא מכיל יותר תמונות עם קטגוריית “אדם” (Person) מה שרלוונטי לבעיה שלנו.
נזכור שמודל ה Tiramisu אומן במקור על מאגר CamVid שאומנם מכיל תמונות של אנשים אבל שצולמו ממכוניות, ז”א תמיד על רקע כביש. זה כמובן לא מספיק טוב לבעיה שלנו.
הייתה לנו דילמה אם להשתמש בכל התמונות שבמאגר לצורך האימון או רק באלו שרלוונטיות אלינו. מצד אחד שימוש בכל התמונות יגרום למודל שלנו להיות טוב יותר ולהכיר מגוון רחב יותר של סצנות אך מצד שני בהרצה של לילה ניתן לעבוד על בערך 150 אלף תמונות ואז אימון עם כל המאגר כולו יגרום למודל “לראות” כל תמונה רק פעמיים. ולכן החלטנו לקצץ את המאגר רק לתמונות הרלוונטיות לבעיה שלנו.
אז השתמשנו ב API של מאגר COCO וקיצצנו את המאגר ל 11 אלף תמונות בהם השתמשנו לאימון, באופן הבא:
סינון רק תמונות שיש בהם אנשים (נשארנו עם 40K תמונות) ואז סינון רק לתמונות המכילות 1-2 אנשים לכל היותר (כמו בתמונות סלפי),
ולבסוף סינון לתמונות בהן בין 20% ל 70% מהפיקסלים מתוייגים כדמות אדם. (ז”א להפטר מתמונות בהם האנשים קטנים מידי או גדולים מידי שכנראה אינן סלפי קלאסי)
דוגמאות לסינון שלנו:
עיברו לכתבת ההמשך כדי ללמוד על המודל שבחרנו ועל כל ההרפתקאות שבדרך לאימון המודל…