cnn

ניקוי רקע מתמונות (מודל ה- Tiramisu) – חלק ב’

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי shgidi

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

מודל ה Tiramisu והאימון

השם המלא של המודל נקרא: 100 layers Tiramisu , והוא מכיל 9 מיליון פרמטרים (לשם השוואה VGG מכיל 130 מיליון פרמטרים).

המודל מבוסס על ארכיטקטורת DenseNet שבה כל השכבות מחוברות זו לזו. מודל ה Tiramisu מוסיף גם חיבורי מעקפים לשכבות ה Up-sampling כמו רשת ה Unet.

https://arxiv.org/pdf/1611.09326.pdf

אימנו את המודל הזה על המאגר (המקוצץ) שלנו עם תמונות שהקטנו לגודל של 224×224 עם המאפיינים הבאים (כמו שמתואר במאמר המקורי):

פונקציית מחיר הינה  Cross Entropy Lossסטנדרטית, האופטימייזר הינו RMSProp עם Learning Rate=1e-3, גודל ה-Batch הינו 500 תמונות כאשר חילקנו את המאגר של ה-11 אלף תמונות ל 70% אימון (Training) , 10% בדיקה (Testing) ו 20% אימות (Validation).

סוגיות שעלו

חיות – המודל שלנו לעיתים שגה כשסיווג חיות כבני אדם. אילו היינו מוסיפים מחלקה שלישית לאימון (ז”א רקע, בני אדם וחיות) זה כנראה היה נפתר.

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

http://cocodataset.org/#home

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

http://cocodataset.org/#home

Ground Truth גס מידי – התמונות במאגר COCO לא תויגו פיקסל, פיקסל אלא עם מצולעים (polygons), מה שפגע באימון.

http://cocodataset.org/#home

תוצאות

אחרי בערך 300 epochs (יותר מזה כבר הגענו ל Overfit) התוצאות שלנו היו משביעות רצון אך לא מושלמות, הגענו ל 84.6 IOU על קבוצת התמונות לבדיקה (Testing Set). כאשר נכון לכתיבת שורות אלו (2017) התוצאה הטובה ביותר (State of the art) לסגמנטציה של בני אדם הינה 85 IOU. לאובייקטים אחרים התוצאות כמובן טובות יותר או פחות, למשל לבתים וכבישים ניתן להגיע ל 90 IOU, לעומת זאת לעצים מגיעים ל 60 IOU.

להלן דוגמאות מוצלחות:

שמאל: תמונה מקורית, אמצע: ground truth, ימין: התוצאה שלנו http://cocodataset.org/#home

ניפוי ורישום (Debugging & Logging)

בנינו כלי ניפוי (מאוד חשוב!) כדי לבחון את התוצאות שלנו בכל שלב. להלן האתגרים ואיך התגברנו עליהם:

  1. בעיות מוקדמות – המודל לא מצליח להתכנס. יכול להיות מכל מיני סיבות כמו למשל באג בעיבוד מקדים (Pre-processing). הצגת התוצאות באופן ויזואלי עוזרת לפתור זאת. ראו פוסט זה בנושא.
  2. לדבג (לנפות) את הרשת עצמה – המדד העיקרי שלנו להצלחה היה IOU (ולא ה Loss), מה שעוזר זה להציג פרדיקציות (תוצאת סגמנטציה של הרשת) כל כמה איטרציות אימון (Epochs). בפוסט הזה תוכלו לקרוא עוד על איך לדבג מודלים.
  3. ניהול גירסאות – כשמאמנים מודל יש המון פרמטרים. חייב להודות שעוד לא מצאנו את השיטה האידיאלית מלבד פשוט לרשום את הקונפיגורציה ולשמור את המודלים\אימונים המוצלחים (*).
  4. כלי דיבוג (ניפוי) – כדי לשלב את הכול יצרנו Jupyter Notebook שאיפשרה לנו בצורה חלקה לטעון כל מודל וכל תמונה במהרה וכך לבחון כל תוצאה, כך יכולנו להשוות ולזהות בעיות.

אז הנה דוגמא לשיפור תוצאות לאחר משחקים עם הפרמטרים:

http://cocodataset.org/#home

(*) שמירה אוטומטית של המודל הכי טוב עד עתה (לפי מדד IOU) עם פונקציית Keras  נוחה:

callbacks = [keras.callbacks.ModelCheckpoint(hist_model, verbose=1,save_best_only =True, monitor= ’val_IOU_calc_loss’), plot_losses]

שמנו לב שישנם שגיאות שניתן לצפות כמו תמונות עם חלקי גוף “חתוכים”, בגדים מאוד כהים או מאוד בהירים (לעיתים מתפרשים כרקע), תמונות בתנאי תאורה או איכות ירודה ועוד…

כדי לשפר את הגירסה הבאה נעשה אוגמנטציה (Augmentation) לאותם מקרים קשים. להלן דוגמאות של מקרים קשים:

אל תנסו את האפליקציה שלנו בלילה J http://cocodataset.org/#home

Matting

כאמור התוצאות אינן מושלמות בעיקר במקרים של שיער, קווי מתאר עדינים של בגדים, וכו’. ההפרדה בין רקע לאוביקט (הסגמנטציה) במקרים עדינים כאלו נקראת Image Matting ונחשבת לבעייה נפרדת בעולם הראייה הממוחשבת. להלן דוגמא לכך שפורסמה בכנס של אניבידיה.

http://cocodataset.org/#home

בעיית ה Matting הינה בעיה קשה והקלט שלה כולל גם את התמונה וגם תמונת  Trimapשהינה קווי מתאר של ה Egdes שלה (ראה בתרשים למעלה), מה שהופך אותה לבעיית מונחית למחצה (Semi-supervised).

ניסינו קצת לעשות Matting כאשר מודל הסגמנטציה שלנו שימש כ Trimap אך לא הגענו לתוצאות משמעותיות (אחת הבעיות היא שאין הרבה מאגרים רלוונטיים לאימון).

לסיכום

כמו שציינתי בהתחלה, המטרה שלנו הייתה ליצור מוצר deep learning משמעותי. ואכן הצלחנו ולמדנו מכך המון.

בעיקר למדנו ש deployment של מודל הוא הרבה יותר פשוט ממה שחשבנו בהתחלה, אך אימון מודל הוא עדיין תהליך מאתגר – שדורש תכנון, הבנה, תיעוד ותחקור משמעותי.

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

לסיכום, נהנינו מאוד מהפרויקט, שמספר חודשים קודם לכן נראה לנו כמו מדע בדיוני.

נשמח לדיונים ולענות לשאלות!

Posted by shgidi in deep

ניקוי רקע מתמונות (מודל ה- Tiramisu) – חלק א’

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי shgidi

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

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

במהלך 2017, עשיתי את קורס fast.ai יחד עם אלון בורג, וקיבלנו הזדמנות לעשות מוצר AI: ההתקדמות המשמעותית של ה Deep Learning איפשרו לבצע דברים שלא היו אפשריים קודם, וכלים חדשים אפשרו לפתח מודלים ואפשר גישה אליהם בקלות הרבה יותר גדולה מבעבר.

המטרות שהגדרנו עבור המוצר הן:

  • מוצר מגניב ושימושי
  • מוצר שלא נעשה עדיין (או שלא נעשה כמו שצריך)
  • מוצר שלא יהיה קשה מדי לתכנן ולממש – תכננו להקדיש לעבודה יום בשבוע במהלך מספר חודשים
  • ממשק משתמש פשוט מושך וכיפי
  • דאטה לאימון זמין ונגיש
  • מוצר שישתמש בטכנולוגיות המתקדמות ביותר של deep learning
  • יוכל להפוך למוצר B2C אמיתי

להלן הרשמים שלי מהפרויקט.

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

תודה ל http://www.worldbuzzhub.com/cute-animals-selfies/

בכתבה זו נעסוק בחלק האלגוריתמי בלבד, למי שמתעניין ב deployment (הפיכת האלגוריתם לשימוש מבצעי) מוזמן ללמוד מהפוסט על צד השרת (server side) ו- הפוסט על צד המשתמש קצה (client side)

פילוח סמנטי (Semantic Segmentation)

פילוח סמנטי (Semantic Segmentation) היא אחת משלושת הבעיות הידועות ביותר בראייה ממוחשבת  יחד עם סיווג תמונות (Image Classification), וזיהוי אוביקטים (Object Detection). בעיית הפילוח הסמנטי היא למעשה גם בעיית קלאסיפיקציה למחלקות אבל של כל פיקסל בתמונה (ולא של התמונה כולה).

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

הרעיונות המוקדמים לפתור בעיה זו (עם למידה עמוקה) היא להשתמש ברשתות סיווג כגון Alexnet, VGG. כשבוחנים רשתות אלו רואים שיש שם אקטיבציות חזקות סביב האוביקט אותו הם מזהים, אך הם גסים מידי בגלל פעולת ה pooling שחוזרת על עצמה. תובנות אלו הביא להנחה שניתן ע”י שינויים ברשתות אלו להופכן לרשתות שמוצלחות גם בסגמנטציה של האוביקט. (ז”א במציאת קווי המיתאר שלו ולא רק זיהוי מי הוא)

בפוסט הזה ניתן לראות רשת סגמנטציה מבוססת VGG:

http://warmspringwinds.github.io/tensorflow/tf-slim/2016/11/22/upsampling-and-image-segmentation-with-tensorflow-and-tf-slim/

http://warmspringwinds.github.io/tensorflow/tf-slim/2016/11/22/upsampling-and-image-segmentation-with-tensorflow-and-tf-slim/

ואחרי Bilinear Upsampling:

http://warmspringwinds.github.io/tensorflow/tf-slim/2016/11/22/upsampling-and-image-segmentation-with-tensorflow-and-tf-slim/

סגמנטציה מבוססת FCN

במאמר FCN= Fully Convolutional Networks for Semantic Segmentation החוקרים שיפרו את השיטה ע”י הוספת חיבורים נוספים בין השכבות. החיבורים בין שכבות מההתחלה, האמצע והסוף מגבירות את הדיוק של הפרטים הקטנים בתמונה.

האיור הבא מתאר את הארכיטקטורה אך מציג רק שכבות Pooling, Prediction, שאר השכבות מושמטות:

תודה ל-“Fully Convolutional Networks for Semantic Segmentation”

והתוצאות של שיטה זו אכן לא רעות בכלל:

תודה ל-“Fully Convolutional Networks for Semantic Segmentation”

הצלחה זו פתחה פתח לחוקרים נוספים לפתח מודלים נוספים ומשופרים לבעיית הסגמנטציה שמבוססים גם הם על Up-sampling ומעקפים Skip-connections. להלן קישורים רלוונטיים: 1, 2, 3.

ניסיון ראשון עם UNET  ו Tiramisu

לצורך הפרויקט הסרת רקע שלנו החלטנו להתמקד בשלושה מודלים: FCNUnet , ו  Tiramisu.

(על רשת ה UNET תוכלו לקרוא גם בעברית פה)

מודל ה FCN לא נתן לנו תוצאות מספיק טובות אפילו בתור התחלה, מודל ה Tiramisu שאומן על מאגר התמונות  CamVid היה נראה מבטיח מבחינת תוצאות, ולמודל ה UNET יש את יתרון הקומפקטיות והמהירות. אז התבססנו על המימוש הזה של מודל ה Tiramisu

Semantic Object Classes in Video: A High-Definition Ground Truth Database (pdf) Pattern Recognition Letters (to appear) Brostow, Fauqueur, Cipolla (bibtex)

לאחר כמה אימונים ראשוניים ראינו שה Tiramisu יותר עדין מ Unet ויותר מסוגל לתפוס גבולות חדים.

בחירה והכנה של ה DB לאימון

לבעיית הסגמנטציה יותר קשה לתייג ולכן למצוא מאגרי תמונות (מתוייגות). הפופולארי ביותר הינו מאגר  COCO המכיל 80K תמונות מ-90 קטגוריות שונות, מאגר VOC Pascal המכיל 11K תמונות מ-20 מחלקות שונות, ומאגר חדש יותר בשם  ADE20K. בחרנו לעבוד על COCO כי הוא מכיל יותר תמונות עם קטגוריית “אדם” (Person) מה שרלוונטי לבעיה שלנו.

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

הייתה לנו דילמה אם להשתמש בכל התמונות שבמאגר לצורך האימון או רק באלו שרלוונטיות אלינו. מצד אחד שימוש בכל התמונות יגרום למודל שלנו להיות טוב יותר ולהכיר מגוון רחב יותר של סצנות אך מצד שני בהרצה של לילה ניתן לעבוד על בערך 150 אלף תמונות ואז אימון עם כל המאגר כולו יגרום למודל “לראות” כל תמונה רק פעמיים. ולכן החלטנו לקצץ את המאגר רק לתמונות הרלוונטיות לבעיה שלנו.

אז השתמשנו ב API של מאגר COCO וקיצצנו את המאגר ל 11 אלף תמונות בהם השתמשנו לאימון, באופן הבא:

סינון רק תמונות שיש בהם אנשים (נשארנו עם 40K  תמונות) ואז סינון רק לתמונות המכילות 1-2 אנשים לכל היותר (כמו בתמונות סלפי),

ולבסוף סינון לתמונות בהן בין 20% ל 70% מהפיקסלים מתוייגים כדמות אדם. (ז”א להפטר מתמונות בהם האנשים קטנים מידי או גדולים מידי שכנראה אינן סלפי קלאסי)

דוגמאות לסינון שלנו:

שמאל: תמונה טובה לנו, אמצע: יותר מידי אנשים, ימין: דמות אדם קטנה מידי http://cocodataset.org/#home

עיברו לכתבת ההמשך כדי ללמוד על המודל שבחרנו ועל כל ההרפתקאות שבדרך לאימון המודל…

Posted by shgidi in deep

רשתות קונבולוציה על יריעות

מיועד ל- מטיבי לכת (כתבה מאוד טכנית)

נכתב על ידי Uri.itai

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

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

אבל מה קורה בבעיות בהן מרחב הנתונים אינו אוקלידי ?

מה לא אוקלידי ?

למשל בעולם המסחר אלקטרוני  (e-commerce) ישנם נתוני רכישות, כל רכישה מכילה שדות שונים, כגון סכום הרכישה, מועד הרכישה, זהות הרוכש וכו’

מתמטיקאים אוהבים לחשוב על הנתונים הללו כעל גרף. קודקוד מציין רכישה, וקשת המחברת בין 2 קודקודים מציינת את הקרבה בין 2 רכישות אלו על בסיס הנתונים הללו.

מקרה נוסף הינו דגימות שנדגמו ממקור ידוע, למשל מכדור או ממשטח גיאומטרי עקום אחר:

תודה ל AugPi

ישנן עוד מגוון דוגמאות מעולמות תוכן נוספים כגון רשתות חברתיות, דגימות מסנסורי IOT וכו’

קצת מתמטיקה

כדי להתקדם נצטרך לדבר על שני מונחים מתמטיים:

המונח הראשון הוא יריעה גאומטרית.

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

לדוגמא: כדור (sphere) הינו יריעה גיאומטרית שאינה אוקלידית אך באופן מקומי היא אוקלידית. (לא סתם חשבו אבותינו שכדור הארץ שטוח…)

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

 

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

אז איך עושים קונבולוציה על יריעה ?

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

דרך אגב, אופרטור לפלס בלטרמי קשור לשאלה מעניינת: האם אתה יכול לשמוע את צורת התוף ?

ז”א האם מתוך שמיעת התיפוף ניתן לשערך את צורתו הגיאומטרית ?

 

או אותו דבר לגבי פילים:

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

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

לסיכום

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

הערה: הפוסט כתוב כדי לתת לקרוא אינטואיציה על הנושא לא להשיג דיוק מתמטי. לכן למי שמוצא את הנושא מעניין הוספתי חומר לקריאה נוספת:

1) לרשתות על יריעה לא אוקלידית:

Geometric deep learning: going beyond euclidean data

MM Bronstein, J Bruna, Y LeCun… – IEEE Signal …, 2017 – ieeexplore.ieee.org

2) לפלסיאן של גרף:

 Godsil, C.; Royle, G. (2001). Algebraic Graph Theory, Graduate Texts in Mathematics. Springer-Verlag.

3) לפלס בלטרמי

Flanders, Harley (1989), Differential forms with applications to the physical sciences, Dover, ISBN 978-0-486-66169-8

Posted by Uri.itai in deep

רשת ה U-Net: סגמנטציה של תמונות מיקרוסקופיות

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי Hen Grinberg

סגמנטציה בעולם העיבוד תמונה היא חלוקת התמונה לאזורים. למעשה זו קלאסיפיקציה בה אנחנו מעוניינים לשייך כל פיקסל בתמונה המקורית לאחת ממספר מחלקות (classes) שהגדרנו מראש. התוצאה שמתקבלת הינה תמונה שבה כל פיקסל צבוע בצבע של המחלקה שאליה הוא שוייך.

תודה ל MathWorks https://www.mathworks.com/help/vision/ug/semantic-segmentation-basics.html

שני בסיסי הנתונים (datasets) הנפוצים עבור משימה זו הם VOC2012 ו MSCOCO .

אחת הגישות הראשונות והמוכרות של שימוש בלמידה עמוקה (deep learning – או בקיצור DL) עבור בעיה זו הייתה סיווג קטעי תמונה (patch classification) כאשר כל פיקסל בתמונה המקורית סווג בנפרד למחלקה הרלוונטית על ידי הפיקסלים שנמצאים סביבו באותו קטע תמונה והפיקסל שאותו אנחנו רוצים לסווג נמצא במרכז. הבעיה המרכזית בשיטה זו שהיא מאוד בזבזנית מבחינה חישובית ולא יעילה מכיוון שישנם המון קטעי תמונה שהם כמעט זהים (פיקסלים צמודים בתמונת המקור ימצאו בקטעי תמונות כמעט זהים).

רשתות קונבולוציה מלאות (fully convolutional networks)

בשנת 2014 הופיעה פרדיגמה / ארכיטקטורה חדשה שפותחה על ידי מספר חוקרים באוניברסיטת ברקלי שנקראת “רשתות קונבולוציוניות מלאות” (FCN=fully convolutional networks). פרדיגמה זו שונה מכל מה שהיה לפניה בכך שהיא מחליפה  שכבות מחוברות באופן מלא (fully connected layers) בשכבות קונבולוציה וע”י כך מאפשרת לקבל בכניסה לרשת תמונות בגדלים שונים. כמו כן היא גם הרבה יותר מהירה משיטת סיווג קטעי תמונה. מאז, כמעט כל השיטות שהביאו לביצועים הטובים ביותר עבור בעיה זו השתמשו בארכיטקטורה זו.

מלבד שימוש ברשתות מחוברות באופן מלא, אחת הבעיות המרכזיות בשימוש ברשתות עצביות קונבולוציוניות (CNN’s) עבור משימת הסגמנטציה הינה שימוש בשכבות אגרגציה (pooling layers). שכבת האגרגציה מסתכלת על איזור מסוים בתמונה ולוקחת את הערך הגדול ביותר ומעבירה אותו הלאה לשכבה הבאה. הבעיה בפעולה זו היא שאנחנו מאבדים מידע אודות המיקום המקורי המדויק שבו נמצא אותו פיקסל. סגמנטציה דורשת את היישור המדויק של מפות המחלקות, ולכן, צריך גם את המידע אודות המיקום.

אחת השיטות להתמודד עם בעיה זו הינה ארכיטקטורת מקודד-מפענח (encoder-decoder). המקודד מפחית בהדרגה המימד המרחבי (spatial dimension) באמצעות שכבות אגרגציה ואילו המפענח מגדיל בהדרגה את המימד המרחבי. ישנם בדרך כלל קשרי דילוג (skip connections) בין המקודד למפענח עבור שכבות מקבילות, על מנת לעזור למפענח לשחזר את התמונה לגודלה המקורי ולספק מידע אודות המיקום המדויק של כל פיקסל בתמונה המקורית. רשת פופולרית שפועלת על פי ארכיטקטורה זו היא U-Net.

תודה ל U-Net: Convolutional Networks for Biomedical
Image Segmentation

כיצד עובדת רשת U-Net?

הרשת מורכבת משני חלקים  – החלק המצמצם (החלק השמאלי בתרשים) והחלק המרחיב (החלק הימני בתרשים). החלק המצמצם בנוי לפי ארכיטקטורה קונבולוציונית טיפוסית, פרוצדורות  של 2 קונבולוציות בגודל 3×3  ללא שכבת אפסים מסביב לתמונה (padding) שאחריהן באה פונקציית אקטיבציה מסוג RELU, כאשר לאחר הקונבולוציה השניה מפעילים שכבת max pooling בגודל 2×2 עם קפיצות של 2 פיקסלים בכל פעם (stride=2) שמחזירה את הערך הגבוה ביותר בכל ריבוע בגודל 2×2 בתמונה. המטרה של שכבת הmax pooling  הינה להקטין את גודל התמונה. אחרי כל פרוצדורה מספר מפות הפיצ’רים (feature maps) גדל פי 2 וגודל התמונה קטן פי 2.

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

בשלב הבא משרשרים בין מפות פיצ’רים מקבילות של המפענח והמקודד (skip connections) כאשר מקטינים את גודלן של כל מפות הפיצ’רים של המקודד (encoder) על מנת שיהיו בעלות גודל זהה לאילו של המפענח (decoder). מטרת פעולת השרשור הינה לשפר את משימת המיקום של הפיקסלים בתמונה המורחבת (localization). בשלב הבא ישנן 2 קונבולוציות בגודל 3×3  ולאחר כל אחת מהן ישנה פונקציית אקטיבציה מסוג RELU. 

בפרוצדורה האחרונה בחלק המרחיב משתמשים בקונבולוציה בגודל 1×1 שמטרתה למפות כל וקטור מאפיינים בעל 64 ערכים (הגודל של השכבה הלפני אחרונה) למספר המחלקות שאנחנו רוצים.

האימון והתוצאות

את הרשת הם מאמנים עם מאגר תמונות מתויגות (ז”א לאיזו מחלקה שייך כל פיקסל) עם פונקציית מחיר softmax cross entropy כאשר נותנים משקל גבוה יותר לפיקסלים בגבולות של המחלקות ומשקל המאזן תדירויות פיקסלים ממחלקות שונות:

w_{c}(x) נועד לאזן פיקסלים ממחלקות בתדירויות שונות, ו d_{1}(x), d_{2}(x) הינם המרחק מפיקסל x לגבול של המחלקה הקרובה ביותר או השניה הקרובה ביותר בהתאמה.

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

קישורים

הסברים, קוד ומודל להורדה של U-Net:

https://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/

מימוש של רשתU-Net  ב Tensorflow:

https://www.kaggle.com/vijaybj/basic-u-net-using-tensorflow

Posted by Hen Grinberg in deep

AI בענן, האומנם ?

מיועד ל- כל אחד (כתבה לא טכנית)

נכתב על ידי Ronen

רובכם כבר בטח יודעים למה הרבה חברות אימצו פתרונות מבוססות AI. הסיבה הפשוטה, זה פשוט עובד!

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

 אבל איפה? איפה חברות בוחרות לשים את ה”מוח” שלהם?

למרבית חברות הטכנולוגיה הגדולות בעולם יש מוצרים משתמשים באלגוריתמים מעולם ה AI. כל פתרונות אלו יושבים בענן או לחילופין בשרת מרוחק שנגיש דרך האינטרנט. רוב הפעולות היומיומיות שלנו נעזרות בשירותי ענן. מבדיקת אי מיילים ועד קריאת החדשות (ועוד רבות הן הדוגמאות).

במקביל לזה שהאינטרנט יוצר גישה לכל מי שיש חיבור לכלים וידע, פתרונות הענן הינן מרוכזות מטבען. האלגוריתמים (AI) נמצאים בענן ומשוקפים למשתמש הקצה (נייד/desktop). משתמש הקצה מריץ את זה דרך הדפדפן. בדר”כ רוב מאמצי המיחשוב בצד משתמש הקצה הולך לרנדר את מה שהוא רואה במסך.

השיפור המתמיד ביכולות מחשוב של מכשירי הנייד כתוצאה מחומרה מתקדמת ביותר מעלה את השאלה – האם AI יכול להתבצע על המכשיר ולא בשרת מרוחק?

היום, המגבלה הטכנית של הרצת רשתות AI על הנייד בירידה מתמדת. כלים כמו CoreML ו ARCore מאפל וגוגל בהתאמה הופכים את הבעיה לקלה הרבה יותר.

  

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

 

פרופ’ הררי עושה השווה דומה למה שאני ניסיתי לעשות פה אבל מנסח את זה בצורה אחרת: דמוקרטיה (משתמש קצה) לעומת דיקטטורה דיגיטלית (ענן).

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

האומנם ענן ?

לאחרונה התרחשו דברים שמערערים על העליונות של הענן:

  • הקטנה משמעותית של גודל הרשתות ללא פגיעה גדולה מדי בדיוק
  • עליית רגישות פרטיות מידע
  • החומרה + התוכנה של הניידים (משתמשי הקצה) השתפרה משמעותית ובעלת יכולות מחשוב אדירות. הרבה בעזרת אפל וגוגל.

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

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

 

https://www.slideshare.net/anirudhkoul/squeezing-deep-learning-into-mobile-phones

 

מנגד, הדור הבא של תקשורת סלולארית 5G עלול להטות את המצב, אז איפה באמת בעתיד תשכון הבינה המלאכותית – עדיין לא ברור,

מה אתם חושבים?

Posted by Ronen in deep

לחולל DATA חדש כדי לשפר סיווג (הרחבת Data בעזרת GAN)

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי תמיר נווה

מה עושים כשאין מספיק Data ?

כשרוצים לאמן רשת Deep Learning ואין מספיק Data ישנם מספר שיטות מה לעשות, העיקריות הינן:

  • – Data Augmentation (למשל בתמונות: סיבובים, הזזות, הרעשות, מחיקות, שינויי הארה)
  • – הקטנת המודל
  • – יצירת DB סינטטי
  • – עזרה לאימון ע”י Data Preprocessing (למשל בתמונות Cropping מתוך הבנה מה חשוב ומה מיותר בתמונה על מנת לסווג)

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

רציתי להתעמק ולהבין למה שזה יעבוד ועד כמה זה בכלל משפר תוצאות ?

גיגול קצר הביא אותי לשני המאמרים האלו: (ששניהם אגב יצאו במרץ 2018 ואף אחד מהם לא מצטט את השני)

DATA AUGMENTATION GENERATIVE ADVERSARIAL NETWORKS

GAN-based Synthetic Medical Image Augmentation for increased CNN Performance in Liver Lesion Classification

בחרתי להתעמק במאמר הראשון מבין השניים (שנקרא בקיצור DAGAN), כי הם מצרפים לו קוד שאפילו רץ לי במכה ראשונה 🙂

בתמונות פנים הבאות ניתן לראות שהתמונות האמיתיות (לקוחות מ VGG-Face) הם רק בעמודה השמאלית הן של הגברים והן של הנשים, ובכל השאר העמודות התמונות מג’נרטות\מזויפות. (ז”א תוצר של DAGAN)

תודה ל DATA AUGMENTATION GENERATIVE ADVERSARIAL NETWORKS

איך בדיוק קורה הקסם ?

הרעיון לקבל תמונה ממחלקה מסוימת ולחולל על בסיסה תמונות נוספות מאותה מחלקה באמצעות Wasserstein GAN (שהינו שיכלול של אלגוריתם GAN).

מדובר על Database המחולק לכמה מחלקות ומטרתנו להגדיל את ה DB כדי לשפר רשת סיווג (אחרת).

הרשת שמגדילה את ה DB מורכבת מGeneratror  ו Discriminator.

רשת ה Generator מנסה לשנות\לעוות את התמונה בכל אופן שמצליחה כל עוד התמונה נשארת באותה מחלקה. רשת ה Discriminator תפקידה לקבל זוג תמונות מאותה מחלקה ולהחליט אם הם באמת שייכות לאותה מחלקה או שאחת מהן מזויפת (ז”א תולדה של ה Generator).

התרשים הבא (לקוח מהמאמר) והוא מסביר הכל:

תודה ל  DATA AUGMENTATION GENERATIVE ADVERSARIAL NETWORKS

מאמנים רשת Generator (צד שמאל בתרשים) המקבלת רעש גאוסיאני (z) ותמונה אמיתית (xi) ממחלקה c ועל בסיסם לג’נרט תמונה מזויפת (xg). ובמקביל לאמן רשת Discriminator (צד ימין בתרשים) להבדיל בין זוג תמונות אמיתי (xi, xj) ממחלקה c לבין זוג תמונות שאחת מהן אמיתית ואחת מזויפת (xi,xg) כאשר השניה (xg) נוצרה על בסיס הראשונה (xi).

בצד שמאל (הג’ינרוט) משתמשים במקודד-מפענח כאשר המפענח מקבל שירשור של הטלה לינארית ל z (הרעש המוגרל) ושל xi (התמונה האמיתית).

המימוש המוצע

הכותבים מימשו את הרעיון באופן הבא:

ה Generator (המחולק לEncoder  ול- Decoder) ממומש ע”י שילוב של UNet ושל ResNet והכותבים קוראים לו UResNet:

תודה ל DATA AUGMENTATION GENERATIVE ADVERSARIAL NETWORKS

ה Discriminator ממומש ע”י DenseNet.

סדרי גודל ותוצאות

ראשית נציין עובדה חשובה שכשהשוו תוצאות של ה classifier, בתוצאות ללא ה Gan Augmentation הם כן השתמשו ב Augmentation קלאסי (שכלל: סיבובים של 90 מעלות, הזזות, הוספת רעש לבן), ובתוצאות ים ה Gan Augmentation הם עשו גם Augmentation  קלאסי, מה שאומר שהגישה של ה Gan Augmentation באמת תרמה ביחס להוספת תמונות באופן רגיל.

הבחינה נעשתה על שלושה אתגרי קלאסיפיקציה:

האחד במאגר Omniglot שהינו מאגר של עשרות אלפי תמונות של 1623 אותיות שונות מחמישים שפות שונות בכתב יד. השני ממאגר תמונות פנים VGG-Face והשלישי ממאגר תמונות כתב יד EMNIST שהינו הרחבה של MNIST  הפופולארי.

השיפור בביצועי הקלאסיפיקציה משמעותי:

הבעיה עם Augmentation רגיל   עם Gan Augmentation 
Omniglot 69% 82%
EMNIST 73.9% 76%
VGG-Face 4.5% 12%

 

הריצה מאוד ארוכה אגב: 500 epochs על עשרות אלפי תמונות, חייבים כמה GPUים כדי להריץ בזמן סביר.

קישורים

ניתן להשתמש ב-DAGAN להרחבת DB כלשהוא של תמונות, כקופסה שחורה באמצעות הקוד הבא:

https://github.com/AntreasAntoniou/DAGAN

Posted by תמיר נווה in deep

Random Erasing Data Augmentation – הרחבת מידע בעזרת מחיקה אקראית

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי Yanai Ankri

 הרחבת מאגר הנתונים – Data Augmentation

אחת השיטות האפקטיביות בלמידה עמוקה להגדיל את כמות הדוגמאות איתן מאמנים רשת, נקראת Data Augmentation. הגדלת ה DB תורמת לאימון מודל מוצלח יותר וכללי יותר ובפרט להימנע מתופעת ה-overfit (כשהמודל לומד טוב מידי את הדוגמאות שמביאים לו באימון אך לא לומד על המקרה הכללי).

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

data augmentation

https://zhuanlan.zhihu.com/p/44363288

המוטיבציה לשיטת המחיקה האקראית

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

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

image recognition 

הרחבה באמצעות מחיקה אקראית

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

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

תודה ל Random Erasing Data Augmentation

רצוי שהמלבן שנבחר למחיקה ישקף באופן הטוב ביותר את האינפורמציה שרוצים למחוק. אם למשל יודעים שראש אדם הוא בקירוב ריבועי, כלומר יחס גובה-רוחב קרוב ל-1, ושהגודל שלו נע בין 30 ל-100 פיקסלים, נבחר מלבן אקראי שעונה על התנאים האלו. אם ידוע לנו מראש היכן האובייקט הרלוונטי, בעיקר במשימות גילוי, נבחר מלבן בתוך האובייקט. הנקודה הנכונה רלוונטית בעיקר כאשר האובייקט מהווה חלק קטן מהתמונה, ובחירת מלבן אקראי מתוך כל התמונה תפספס בחלק גדול מהמקרים את המטרה, תרתי משמע.

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

תודה ל Random Erasing Data Augmentation

תוצאות

להלן תרשים המתאר את שיפור הביצועים באימון מודל ResNet על מאגר תמונות Cifar-10 עם ובלי שיטת המחיקות האקראיות (Random Erasing). ניתן לראות איך ללא השגת תמונות נוספות אמיתיות לאימון, הרשת מצליחה בזיהוי בשגיאה נמוכה באופן משמעותי:

תודה ל Random Erasing Data Augmentation

קישורים

לקוד –  https://github.com/zhunzhong07/Random-Erasing

למאמר – https://arxiv.org/abs/1708.04896

Posted by Yanai Ankri in deep

העמקה לרשת הקפסולות Dynamic Routing Between Capsules – תיאוריה

מיועד ל- מטיבי לכת (כתבה מאוד טכנית)

נכתב על ידי תמיר נווה

בכתבה זו מטרתי להסביר את התיאוריה שבמאמר “Dynamic Routing between Capsules”. למי שלא מכיר את ההקשר ממליץ לקרוא קודם את הרקע בכתבה הזו: “הרעיון מאחורי רשת הקפסולות” שמסבירה את המאמר המוקדם יותר של הינטון: “Transforming Auto-“encoders. (אם כי אפשר להבין גם הכול מכתבה זו בלבד)

נציין שעל אף שהרעיון מעניין ונשמע מבטיח, הוא בינתיים הוכח כמנצח רק על מאגר תמונות ספרות וגם על ספרות חופפות מ MNIST. (ז”א תמונה המכילה כמה ספרות זו על זו). יתרון משמעותי נוסף שיש לארכיטקטורה זו היא ההסתפקות ב database קטן, וחסרון הוא משך אימון ארוך.

תיאוריה

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

capsules demo

capsules demo


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

אז מהן בדיוק קפסולות ?

קפסולות הם יחידות אבסטרקטיות (בהמשך, בחלק הפרקטי נראה מימוש) שמקבלות וקטורים ומחזירות וקטורים.

כל קפסולה מחזירה:

1. וקטור מוצא שלה (*) – שגודלו מעיד על ההסתברות לקיומו של האלמנט וכיוונו מקודד את המאפיינים שלו.

2. וקטורי פרדיקציה בעבור כל אחת מהקפסולות בשכבה הבאה.

המשמעות של וקטורי הפרדיקציה הינם: מה לדעת קפסולה i יהיה המוצא של קפסולה j. אם נניח קפסולה i מומחית בזיהוי עיגולים ומזהה בהסתברות גבוהה עיגול בקורדינאטה (x3,y3) בתמונה, אז תנבא שקפסולה משכבה גבוהה ממנה שאחראית על זיהוי פנים תוציא כפלט פנים במיקום (x1,y1) .

כל קפסולה מקבלת:

1. וקטורי פרדיקציה מכל אחת מהקפסולות שבשכבה שלפניה. אם אין שכבה מלפניה (כי זו השכבה הראשונה) אז מקבלת קלט כלשהוא, למשל במימוש המוצע כפי שנראה בהמשך מקבלת תוצאה של שכבת קונבולוציה. (פיצ’רים של התמונה המקורית)

(*) – וקטור תוצאה של קפסולה הינו שיקלול חכם ומנורמל של וקטורי הפרדיקציה מכל הקפסולות בשכבה שלפניה. השיקלול הזה מתואר באלגוריתם Dynamic Routing.

מהו אלגוריתם Dynamic Routing

וקטור מוצא של קפסולה הינו סכום משוקלל של וקטורי הפרדיקציה שהגיעו מהקפסולות שבשכבה הקודמת.
השיקלול ממומש באמצעות אלגוריתם Dynamic Routing ומהותו עידכון המשקלים\מקדמי צימוד (של כל אחד מאותם וקטורי פרדיקציה) באופן איטרטיבי לפי מידת ה-“הסכמה” בין וקטור פרדיקציה כלשהוא לבין וקטור התוצאה (כפי שהוא באיטרציה הנוכחית). ככל שוקטור פרדיקציה כלשהוא תואם לכיוון של וקטור התוצאה כך יגדל המקדם\המשקל שלו. מידת התאימות מחושבת ע”י מכפלה סקלרית בינהם. (הרי מכפלה סקלרית בין וקטורים בעלי אותו כיוון הינה 1 ואחרת אם הם בכיוונים שונים פחות מ-1)

תיאור האלגוריתם בין שכבת קפסולות l לבין השכבה הבאה l+1 בעבור r איטרציות ניתוב (routing):

קלט:  וקטורי הפרדיקציה של כל אחת מקפסולות i מהשכבה l לכל אחת מהקפסולות j בשכבה l+1: \widehat{u}_{j|i}

פלט: וקטור המוצא של כל קפסולה j משכבה l+1 : v_{j}

האלגוריתם:

בהתחלה אפס את כל מקדמי הצימוד  b_{i,j} 

בצע r איטרציות את שתי הפעולות הבאות: (שיקלול וקטור מוצא + עידכון משקלים)

1. v_{j}=squash(\Sigma_{i}c_{ij}\widehat{u}_{j|i})

כאשר מקדמי הצימוד בין הקפסולות מנורמלים באופן הבא:

c_{i}=softmax(b_{i})=\frac{e^{b_{i}}}{\sum_{k}e^{^{b_{k}}}}

2. עדכן את מקדמי הצימוד לפי מידת ההסכמה (המכפלה הסקלרית) בין וקטורי הפרדיקציה לוקטור התוצאה:

b_{ij}=b_{ij}+\widehat{u}_{_j|i}\cdot v_{j}

סוף!

 

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

העמקה לרשת הקפסולות Dynamic Routing Between Capsules – פרקטיקה

Posted by תמיר נווה in deep

העמקה לרשת הקפסולות Dynamic Routing Between Capsules – פרקטיקה

מיועד ל- מטיבי לכת (כתבה מאוד טכנית)

נכתב על ידי תמיר נווה

בכתבה זו מטרתי להסביר באופן מפורש ומספיק מפורט עד כדי שהקורא החרוץ יידע לממש בעצמו את המאמר “Dynamic Routing between Capsules”. למי שלא מכיר את ההקשר ממליץ לקרוא קודם את הרקע בכתבה הזו: “הרעיון מאחורי רשת הקפסולות” שמסבירה את המאמר המוקדם יותר של הינטון: “Transforming Auto-encoders. ואז את הכתבה הזו: “העמקה לרשת הקפסולות Dynamic Routing Between Capsules – תיאוריה” שמסבירה על התיאוריה שבמאמר.

פרקטיקה

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

נשים לב כי באופן כללי אלגוריתם Routing פועל בין כל שתי שכבות קפסולות סמוכות אך במימוש המוצע הוא פועל רק פעם אחת כי יש סה”כ 2 שכבות של קפסולות.

להלן התרשים של מבנה הרשת במאמר: (חייב להגיד שלקח לי זמן רב להבין ממנו מה באמת קורה באלגוריתם, מקווה שאצליח לחסוך לכם זמן זה…)

capsulenet

תודה ל Dynamic Routing between Capsules

הסבר על כל בלוק:

  • בלוק הכי שמאלי: הרשת מקבלת תמונה (של ספרה) בגודל 28×28

  • בלוק ReLU Conv1: שכבת קונבולוציה שהינה 256 פילטרים בגודל 9×9 ב stride=1 עם אקטיבציית Relu. לכן הטנזור במוצא בגודל 20x20x256.
  • בלוק PrimaryCaps: שכבת קונבולוציה שהינה 256 פילטרים בגודל 9×9 ב stride=2 עם אקטיבציית Squash (*). לכן הטנזור במוצא בגודל 6x6x256. אותו טנזור בגודל 6*6*256 אלמנטים מסודר כ 32 טנזורים בגודל 6x6x8. כל אחד מבין ה 32x6x6  וקטורים בגודל 8 כל אחד יסומן u_{i}
  • בלוק DigitCaps: שכבת Fully Connected שממומשת ע”י מטריצה W שהופכת כל אחד מה 6x6x32=1152  וקטורי u_{i} לעשרה וקטורי (פרדיקציה) \widehat{u}_{j|i} בגודל 16.

(*) – אקטיבציית squash הינה פעולה לא לינארית שהופכת וקטור Sj להפוך לוקטור Vj בגודל שבין 0 ל 1:

squash function

squash function

אם כך זו רשת CNN רגילה… איפה פה הקפסולות ?

“חבויות” פה שתי שכבות קפסולות:

  • האחת נקראת Primary Caps ומכילה 6*6*32=1152 קפסולות שכל אחת מחזירה וקטור u_{i} ממימד 8 ובנוסף מחזירה 10 וקטורי פרדיקציה \widehat{u}_{j|i} שהינם המוצא של בלוק DigitCaps. j=1..10, i=1..1152)).

וקטורי המוצא של קפסולות אלו מסודרות כ-32 לוחות כל אחד בגודל 6×6, מיקום הקפסולות בלוח ה- 6×6 פורפורציונלי למיקום (x,y) בתמונה המקורית. (ז”א למשל קפסולה במיקום שמאלי עליון בלוח 6×6 מייצג את המידע בתמונה שנמצא בפינה שמאלית עליונה)

  • השניה נקראת DigitCaps מכילה 10 קפסולות שכל אחת מחזירה וקטור v_{j} ממימד 16 (מחושבים באמצעות אלגוריתם Routing). קפסולות אלו לא מחזירות וקטורי פרדיקציה כי אין שכבה שלישית במימוש זה. (התרשים לא מראה את ה dynamic routing על אף שהינו חלק מהרשת)

מה שקצת מבלבל פה זה שמשתתפים פה באימון משתנים נוספים שכדאי שנשים לב אליהם:

כל אחד מהוקטורים v_{j} יש לסמן כ v_{j}^{r} (עם מציין לאינדקס האיטרציה) כי למעשה וקטורי r+1 מחושבים על בסיס וקטורי r.

אז מה בדיוק מאמנים פה ? מהי פונקציית ה Loss ?

פונקציית ה Loss מורכבת ממרכיב ה Margin Loss ומרכיב ה Reconstruction Loss.

מרכיב ה Margin Loss מבוסס על עשרת וקטורי המוצא v_{j} של שכבת הקפסולות השניה (DigitCaps) .

ה- Margin Loss הינו סכום עבור k=0..9  של:

capsule loss function

capsule loss function

כאשר Tk=1 אם ורק אם התמונה שהוזנה מכילה ספרה k, והפרמטרים +-m הינם ספים 0.1\0.9 בהתאמה, ו λ=0.5. (ערכים מומלצים לפי המאמר).

משמעות Loss זה בפשטות הינו תתגמל אם Vk מצביעה על הספרה של התמונה שהוזנה ותעניש אם לא.

כמו כן ישנו את מרכיב ה Reconstrucion Loss לו נותנים משקל נמוך והוא למעשה הפרש הריבועים בין התמונה המקורית לבין תמונה משוחזרת.

התמונה המשוחזרת נבנית באמצעות Decoder המורכב משלושה שכבות Fully Connceted שמקבלות את מוצא ה DigitCaps.

מרכיב ה- Reconstruction Loss אינו חובה וכשהוסיפו אותו אכן שיפר תוצאות.

קצת על הקוד

בקישור זה למשל תוכלו למצוא מימוש מלא ב TensorFlow:

https://github.com/naturomics/CapsNet-Tensorflow

הדבר הייחודי ששווה להזכיר שב Dynamic Routing יש לולאה בה כל המשתנים הם חלק מהאימון (ז”א ה Back-Propogation מעדכן אותם) הוא די מבלבל ולא סטנדרטי.

כך למשל ניתן לממש לולאה של טנזורים: (בקישור המימוש קצת שונה)

def condition(input, counter):
     return tf.less(counter, 100)

def loop_body(input, counter):
    output = tf.add(input, tf.square(counter))
    return output, tf.add(counter, 1)

with tf.name_scope(“compute_sum_of_squares”):
    counter = tf.constant(1)
    sum_of_squares = tf.constant(0)
    result = tf.while_loop(condition, loop_body, [sum_of_squares, counter])

with tf.Session() as sess:
    print(sess.run(result))

זהו להפעם… אשמח לשאלות ודיונים בנושא!

Posted by תמיר נווה in deep

רשת הInception הקיצונית: Xception

מיועד ל- מטיבי לכת (כתבה מאוד טכנית)

נכתב על ידי תמיר נווה

רקע

רשתות Inception v4 ו  Xception הינן מהרשתות הטובות ביותר כיום בזיהוי מה רואים בתמונה.

ב 2014 גוגל ניצחה בתחרות ILSVRC עם רשת GoogLeNet שהראתה לקהילה ארכיטקטורה חדשנית בשם Inception לפיה שכבות לאו דווקא חייבות להיות בטור אלא במקביל ואת תוצאותיהן משרשרים. השיטה הזו חסכה בזיכרון והביאה לביצועים הטובים ביותר דאז. מאז יצאו גירסאות נוספות שנקראות inception v2, v3, v4 או Inception-Resnet שמשלבת את הרעיון הזה של גוגל עם רעיון המעקפים של מיקרוסופט של רשת Resnet.

כל רשתות CNN=Convolution Neural Network מכילות פעולות קונבולוציה. ב 2016 יצאה רשת Xception שחידשה את פעולת הקונבולוציה ע”י כך שהיקצינה את מודל ה Inception.

בקונבולוציה רגילה יש עיבוד (סכום מכפלות) של הקלט והגרעין (הפילטר) בכל המימדים ביחד (המרחביים והצבע\ערוצים channels). הרעיון מאחורי מודל ה Inception הוא לבצע את העיבוד הזה בנפרד הן על המימדים המרחביים (x,y) והן על מימד העומק (הצבע אם מדובר בתמונה הראשונית). יש הגיון בכך אם חושבים על כך שבתמונה המימד המרחבי שונה מהותית ממימד העומק שהינו הצבעים שבתמונה, ויש טעם בלבנות פילטרים בלתי תלויים שפועלים כל אחד בתורו.

הרשת Xception (extreme inception) מקצינה את הרעיון הזה באמצעות פעולה שנקראת depthwise separable convolution.

כותב המאמר Xception הינו François Chollet שגם ידוע כיוצר של Keras!

טכני

בקונבולוציה רגילה, בעבור טנזור בגודל 6x6x3 נצטרך kernel בגודל nxnx3. נניח n=2 אז קובית ה kernel בגודל 2x2x3 נעה בכיוון x,y בלבד על פני הקוביה הגדולה של ה 6x6x3 ובכל מעבר סוכמים את המכפלות. מימדי העומק של הטנזור ושל הגרעין שניהם שווים (לשלוש בדוגמא זו) ולכן הקוביה הקטנה לא נעה בכיוון z.

בקונבולוציה רגילה מימד העומק של הטנזור והגרעין זהים

בפעולת ה depthwise separable convolution לעומת זאת, יש שני שלבים, באחת הקוביה הקטנה נעה בכיוונים x,y ובשניה קוביה קטנה (אחרת) נעה בכיוון z.

ישנן גירסאות מימוש שונות, לפי המימוש המקובל (למשל ב Tensorflow) קודם מבצעים קונבולוציות מרחביות  לכל ערוץ בנפרד (ז”א ה-kernel בגודל nxnx1) ואז מבצעים קונבולוציה למימד הערוץ ז”א מימד עומק (ה-kernel בגודל 1x1xc)

למשל, שורות הקוד הבאות מדגימות טנזור בגודל 6x6x3 שעובר separable conv עם פילטר מרחבי בגודל 3×3 ומכפיל את הערוצים פי 2 ועם פילטר “עומקי” שמגדיל 6 ערוצים ל 12 ערוצים:

x = tf.placeholder(tf.float32, [None, 6, 6, 3])
depthwise_filter = tf.get_variable(
‘depthwise_filter’, shape=[3, 3, 3, 2])
pointwise_filter = tf.get_variable(
‘pointwise_filter’, shape=[1, 1, 6, 12])
y = tf.nn.separable_conv2d(x,depthwise_filter, pointwise_filter,
strides=[1, 1, 1, 1], padding=‘SAME’)

 

והתוצאה הינה טנזור בגודל:

?x6x6x12

(? מייצג את גודל ה batch)

ארכיטקטורת Xception כפי במוצגת במאמר כוללת שלושה מרכיבים: middle, entry, exit  הכוללים בעיקר פעולות Seperable Conv, ReLu, MaxPooling:

תודה ל Xception

תוצאות

באותו מאמר הם מציגים ביצועים על מאגר ImageNet (מאגר של עשרות מיליוני תמונות עם אלף מחלקות).

תודה ל xception

ותוצאות על FastEval14K (מאגר של 14,000 תמונות עם 6,000 מחלקות) כאשר הרשת אומנה על JFT (מאגר פנימי של גוגל של 350 מיליון תמונות עם 17,000 מחלקות):

תודה ל xception

 

כמו כן הרשת MobileNet (רשת קלה וקומפקטית שרצה על מובייל) מבוססת על Xception.

קישורים

מימוש Xception ב Tensorflow:

https://github.com/kwotsin/TensorFlow-Xception

מימוש Xception ב Keras:

https://github.com/keras-team/keras/blob/master/keras/applications/xception.py

Posted by תמיר נווה in deep

סיסמת הפנים – רשתות קומפקטיות שרצות ללא ענן

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי תמיר נווה

רקע

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

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

תוצאות נכון להיום (אימות תמונות פנים במובייל)

ישנן רשתות קומפקטיות (מתאימות למובייל) שמוצלחות בזיהוי (לאו דווקא של פנים) כמו ShuffleNet, SqueezeNet ו MobileNetV2. אך לאחרונה יצאה רשת MobileFaceNet  שנראה שמתמחה בזיהוי הפנים.

במאמר המציג את MobileFaceNet בחנו ביצועים על מאגר התמונות LFW=Labeled Faces in the Wild המכיל 13,000 תמונות פנים שנאספו מהרשת, (in the wild הכוונה שאלו תמונות שצולמו בתנאים בלתי נשלטים, ז”א במגוון תנאי תאורה, הבעות פנים, רעשים, הסתרות, תנוחות וכו’) ועל מאגר התמונות AgeDB שגם מכיל תיוג גיל לכל תמונה.

רשת MobileFaceNet  מגיעה לדיוקים של 99.55% על LFW ו 96.07% על AgeDB. הרשת צורכת 4MB  זכרון (פחות ממיליון פרמטרים) ונותנת תשובה תוך 24 מילישניות (על מעבד של mobile) על תמונה באורך\רוחב 112 או 96 פיקסלים. (תלוי בגירסה). הגדולה של רשת זו היא שהביצועים שלה גבוהים כמו של הרשתות הגדולות והכבדות הדורשות מאות MB זכרון (שאינן מתאימות למובייל).

את הרשת אימנו על מאגר בן 10 מיליון תמונות פנים של 100 אלף סלבריטאים MS-celeb-1M.

על הארכיטקטורה של הרשת ומה החידוש בה, במאמר הבא.

מה קורה ב MobileFaceNet 

ה tradeoff בין דיוק גבוה של רשת לבין כמות פרמטרים הינו נושא מחקר פורה. אחרי שנדהמנו מהדיוקים של Alexnet ואלו שבאו אחריה נעשו ונעשים מחקרים רבים המנסים לשחזר דיוקים עם רשתות קומפקטיות. ראו למשל SqueezeNet, MobileNetV1, MobileNetV2, ShuffleNet, NasNet, Light CNN-29, LMobileNetE. הגישות של הרשתות הקומפקטיות מתבססות על טכניקות כגון bottleneck, depthwise convolution layer או מציאת רשת באמצעות reinforcement learning או גישת ה  .knowledge distillation

אימות תמונת פנים מתבצע באופן כללי בשלושה שלבים: עיבוד מקדים (preprocessing), חישוב פיצ’רים מהתמונה בעזרת רשת CNN, השוואה בין פיצ’רים של שתי תמונות פנים.

במאמר הם מנתחים את אזורי ה reception field (האזור בשכבה שמשפיע על נקודה בשכבות הבאות) של הפיצ’רים במוצא ה CNN ועל בסיס הניתוח כמו גם על בסיס ניסויים מראים שהחולשה של רשתות שרצות על מובייל היא שכבת ה averaging pooling שמתייחסת באופן שווה לכל היחידות. כיוון שלהחליף אותה ב fully connected זו לא אופציה כיוון שיעלה משמעותית את כמות הפרמטרים של הרשת, הם מציעים להחליף אותה בשכבת global depthwise convolution=GDConv. להלן הארכיטקטורה המלאה של הרשת:

תודה ל MobileFaceNets: Efficient CNNs for Accurate Real-time Face Verification on Mobile Devices

Posted by תמיר נווה in deep

מה רואים בתמונה ? המסע שהחל ב-Alexnet והגיע עד רשתות הקפסולות

מיועד ל- כל אחד (כתבה לא טכנית)

נכתב על ידי תמיר נווה

סנונית מהפיכת הלמידה העמוקה הגיעה ב 2012 עם תוצאה טובה באופן משמעותי בתחרות זיהוי אוביקטים השנתית שנקראת ILSVRC. לראשונה אלגוריתם מבוסס רשת נוירונים עמוקה שנקרא Alexnet היצליח לזהות מה רואים במיליוני תמונות ברמת הצלחה של 85% בעוד המקום השני בתחרות דאז הגיע ל 74% הצלחה.

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

מאז 2012 התחום לא מפסיק להתפתח ולהפתיע, אם נישאר בעולם התמונה, ב 2013 זכתה רשת נוירונים עמוקה בשם ZF  Netעם 89% הצלחה, אחריה ב 2014 VGG עם 93% הצלחה,  אחריה ב 2015 GoogleNet של גוגל עם 94% הצלחה, אחריה ResNet של מיקרוסופט עם 97% הצלחה, ומשם הדברים עוד התפתחו והרעיונות השתלבו כמו Inception v4 או Inception-resnet.

אבל איך זה שאלגוריתם מקבל 3072 מספרים (למשל תמונה ממאגר התמונות CIFAR10  שהינה בגודל 32X32 פיקסלים וכל פיקסל צבעוני ולכן מתואר ע”י שלוש מספרים: 32323=3072) ומחזיר מספר בין 1 ל עשר שמציין מה רואים בתמונה (מטוס, רכב, ציפור, חתול, וכו…).

תודה ל CIFAR

הרי אותה רשת נוירונים עמוקה הינה אוסף (מיליונים) של פעולות אריתמטיות פשוטות ומוכרות לכולנו שמסודרות בסדר מסוים. משפט אחרון זה אולי נשמע הפשטה לא סבירה למי שלא מכיר, אבל זה באמת מה שיש ברשתות CNN= Convolutional Neural Network:

פעולות חיבור, פעולות כפל ופעולת תנאי (אם מספר גדול מסף מסויים אז תחזיר כך אחרת תחזיר כך)

האם זה כל מה שצריך כדי לתרגם תמונה למספר שמייצג מה רואים בתמונה ?

אין פה שום מתמטיקה כבדה ומסובכת ?

התשובה המאכזבת היא שלא, אין כאן!

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

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

אז בכל זאת מה עושות אותן מיליוני הפעולות האריתמטיות הללו בכדי לזהות מה רואים בתמונות ?

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

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

והנה עוד סרטון שסוקר כלי ויזואליזציה נוסף כללי יותר ועם הסברים:

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

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

https://hackernoon.com/capsule-networks-are-shaking-up-ai-heres-how-to-use-them-c233a0971952 מיקומים יחסיים של מאפיינים בתמונה

הדבר החם בעולם הזיהוי תמונות הגיע מג’פרי הינטון ונקרא Capsule Network (עוד לא ממש ברור איך לתרגם לעברית).

ג’פרי הינטון Geoffrey Hinton מאבות הלמידה העמוקה שהאמין ברשתות נוירונים עוד בשנות השמונים כשרב הקהילה ראתה בזה ענף חסר עתיד. (עיקר הביקורות היו: כשזה כבר כן עובד זה מקרי ואי אפשר להבין למה זה עובד כי זו קופסה שחורה).

דווקא הוא זה שלאחרונה יצא נגד CNN והביא לקהילה בשורה חדשה.

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

Posted by תמיר נווה in deep

נביאי הרכב האוטונומיים עומדים למבחן

מיועד ל- כל אחד (כתבה לא טכנית)

נכתב על ידי תמיר נווה

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

 

 

Year Company
2020 Nvidia
2020 Audi
2020 NuTonomy
2019 Delphi & MobilEye
2021 Ford
2019 Volkswagen
2020 GM
2021 BMW
2020 Toyota
2021 Tesla
2025 US Secretary of Transportation
2030 UBER
2024 Jaguar and Land-Rover
2025 Daimler
2020 Nissan

בכדי לאמן רשת נוירונים לנהוג ברכב יש לאמן אותה עם מגוון סוגי נהיגה, מצבי נהיגה, מזגי אוויר שונים. כמויות המידע איתם מאמנים לנהיגה הינם בסדרי גודל של petabytes (ז”א אלפי טרבייטים terabytes).

השחקניות הגדולות במרוץ לרכב האוטונומי (Ford, GM, Waymo, Tesla) מחזיקות צי של מאות רכבים שמוסיפים למאגר המידע שלהם בקצב שיכול להגיע למיליון מיילים ליום שנועד לאמן ולשפר את האלגוריתם שלהם. כמובן שמאגר נתונים של נסיעות אמיתיות לא מספיק ומשקיעים הרבה גם בלבנות סימולציה של נתוני נהיגה (למשל פלטפורמת הקוד הפתוח לסימולציה של רכבים אוטונומיים Carla).

נתוני נסיעה לא אומר רק תמונות (וידאו) ממצלמות היקפיות אלא גם מחיישנים נוספים שבניהם רדאר ולידר.

תודה ל Texas Instruments

ההיסטוריה המדעית מלאה ניסיונות לאוטומטיזציה של רכבים עוד מהמאה הקודמת, למשל ALVINN הינו פרויקט אמבולנס צבאי אוטונומי מבוסס רשת נוירונים בת שתי שכבות מאוניברסיטת Carnegie Mellon משנת 1989:

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

תודה לאנבידיה

ז”א הרשת מבינה מה חשוב בתמונה (שולי הכביש) ומה לא רלוונטי כרגע לצורך השליטה בהגה.

אגב, את טעויות הנהיגה: ה-“כמעט סטייה מהנתיב”, או ה-“כמעט תאונה” הוסיפו באופן סינטטי ע”י הסטת תמונת הנתיב, כי הרי על האלגוריתם גם ללמוד הרבה מאיך מתקנים הגה כשצריך, ולייצר נתונים כאלו אמיתיים זה טיפה מסוכן…

לאחר שאימנו את האלגוריתם עם רשת CNN=Convolutional Neural Network בת תשע שכבות, בחנו אותו על סימולציה שמציגה לאלגוריתם וידאו של אותה מצלמה קידמית שנבנה בצורה סינתטית על בסיס וידאו אמיתי (ז”א לקחו פריימים אמיתיים שצילמו והסיטו אותם כך שייראה שיש סטייה מהמסלול). בריצת הסימולציה אפשרו לנהג  (אנושי) לתקן את ההיגוי כשצריך. כדי לבחון עד כמה האלגוריתם בשל לחיים האמיתיים הגדירו מדד לרמת האוטונומיות שמבוסס על מספר הפעמים שבו הייתה התערבות אנושית לנהיגה, וכשהאלגוריתם נהיה מספיק אוטונומי (מינימום התערבויות בסימולטור) יצאו לנסיעת מבחן אמיתית, ראו את התוצאה:

Posted by תמיר נווה in deep

מהי למידה עמוקה

מיועד ל- כל אחד (כתבה לא טכנית)

נכתב על ידי תמיר נווה

“למידה עמוקה” (Deep Learning) הינו ענף ברשתות ניורונים שעשה מהפכה כמעט בכל תחומי האלגוריתמיקה.

המהפיכה התחילה בראייה ממוחשבת (computer vision) והמשיכה לנושאים שונים כמו עיבוד שפה טבעית (NLP), תרגום, עיבוד אות שמע (speech, voice), מכוניות אוטונומיות, רובוטיקה, התנהגות ברשת ועוד ועוד… רבים מכנים זאת (באופן שגוי) כבינה מלאכותית (AI=Artificial Intelligence) אך למעשה זה רק ענף של התחום.

המפורסמים שבהישגים בתחום הינם ניסוי החתול של גוגל, הנצחון הראשון של מחשב נגד אלוף העולם במשחק גו (וקודם לכן deepmind שנקנתה ע”י גוגל ביותר מחצי מיליארד דולר), ההתפתחות של המכוניות האוטונומיות.

כמו כן קיימים מגוון מוצרים ושירותים שכולנו משתמשים בהם, אשר מבוססים על למידה עמוקה כמו למשל siri, תירגום סימולטני בסקייפ, google photos, ועוד ועוד…

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

ידוע שבתחום למידת המכונה (machine learning) יש צורך בהרבה רקע מתמטי ויש הרבה משוואות מתמטיות “מפחידות”

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

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

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

Posted by תמיר נווה in deep