הביצועים של רשתות עצביות עמוקות עשו צעד גדול קדימה בשני העשורים האחרונים. מדי שנה, מתגבשים ארכיטקטורות חדשות שמנצחות את התוצאות המתקדמות ביותר. עם זאת, רק שיפור ארכיטקטורות לא יעבוד ללא מערך נתונים איכותי. למערך הנתונים יש השפעה גדולה על הביצועים הסופיים. איסוף ותיוג מערכי נתונים מגוונים ומדויקים עשויים להיות מייגעים ויקרים, ומערכי נתונים קיימים בדרך כלל אינם מכסים את כל מגוון הפצת הנתונים האמיתיים, ולכן נעשה שימוש בטכניקות להגדלת נתונים.
במאמר זה, אני אראה כיצד ניתן להעשיר את מערך הנתונים של פנים אנושיות על ידי שינוי גיאומטריה תלת-ממדית כדי לשפר את הביצועים של המודל שלך. יישום קוד מקור פתוח מסופק להלן[1].
הגדלת נתונים היא טכניקה שמגדילה את כמות הנתונים על ידי החלת שינויים שונים על דגימות. ניתן לחלק הגדלת תמונה גנרית לשתי קטגוריות: טרנספורמציות גיאומטריות ושינויי צבע. טרנספורמציות גיאומטריות מורכבות משינוי קנה מידה, חיתוך, היפוך, סיבוב, תרגום וכו'. בעוד שהטרנספורמציות צבע מורכבות מריצוד צבע, הוספת רעש, קנה מידה אפור, התאמת בהירות/ניגודיות וכו'.
בואו נחשוב איך אנחנו יכולים להגדיל תמונה אם אנחנו יודעים שיש פנים אנושיות. איך נבדיל בין אדם למשנהו? ישנן תווי פנים המהווים זהות, כמו צבע עור, צורת פנים, תספורת, קמטים, צבע עיניים וכו'. אחד המאפיינים הבולטים ביותר הוא צורת הפנים.
לכן, אם נשנה את הצורה של תמונת הפנים הקלט, זה יהיה אדם קצת שונה עבור דוגמנית שניתן לאמן. אז בואו נשתמש בנכס הזה כדי להגדיל את מערך הנתונים שלנו.
נשנה את הגיאומטריה של פנים על ידי שימוש במודל 3D Morphable (3DMM), במיוחד במודל FLAME[2]. 3DMM היא רשת תלת מימדית בעלת פרמטרים לתמרן את הצורה, התנוחה והביטוי שלה. 3DMM בנוי מרשתות תלת מימדיות שנרשמו על ידי אנשים אמיתיים.
לפיכך, זה יכול לייצג את ההפצה של צורות פנים אמיתיות. מתחת למכסה המנוע, הוא מורכב מהצורה הממוצעת וממערכת של רכיבים עיקריים המציינים את כיווני השינוי לצורה ולהבעה. אלפא ובטא הם פרמטרים של המודל.
לפני שינוי צורת הפנים, עלינו למצוא פרמטרים של 3DMM התואמים לתמונת הקלט שלנו. ישנן מספר שיטות לעשות זאת, כמו אופטימיזציה לציוני דרך, אופטימיזציה פוטומטרית או מודלים של רגרסיה כדי לחזות פרמטרים בשלב אחד. השתמשתי באופטימיזציה של ציוני דרך דו-ממדית מכיוון שיש לה יישום פשוט ונותן תוצאות מדויקות בזמן סביר.
נקודות ציון פנים זוהו בתמונת הקלט עם מודל זיהוי הפנים של Dlib. נעשה שימוש באלגוריתם אופטימיזציה של Adam עם אובדן MSE עבור ציוני דרך כדי להתאים 3DMM לתמונת הפנים. נדרשו בערך 150 איטרציות כדי להתכנס.
כעת, אנו מוכנים לשנות את הגיאומטריה של הפנים. קודם כל, כבר יש לנו רשת תלת מימדית מיושרת עם תמונת הפנים שלנו. שינוי פרמטרי הצורה של 3DMM מוביל לשינוי של קודקודי רשת במרחב התמונה. בידיעה שמשתנה, נוכל להשתמש בו כדי להזיז את הפיקסלים של התמונה.
כדי לקבל מפה צפופה של משמרות, השתמשתי בספריית OpenGL, שבה הצגתי רשת 3DMM עם שינויים בכיווני x ו-y במקום צבע קודקוד. נותר דבר אחד לשקול, כיצד לטפל בפיקסלים שהיו מחוץ לאזור רשת הפנים.
לצורך כך השתמשתי באקסטרפולציה המחברת בצורה חלקה את הפנים שהשתנו עם רקע סטטי. כל עוד יש לנו מפות תזוזה צפופות לכיווני x ו-y, נוכל להחיל אותן על כל סוג של תווית כמו ציוני דרך פנים, מסכות פילוח או תמונות זוגיות. ניתן לראות דוגמאות של הגדלת פנים עם טרנספורמציה גיאומטרית באיור למטה. אם אתה רוצה לדעת פרטים נוספים, אני מזמין אותך לקוד מקור[1].
כעת, אתה יכול לנסות את זה על מערכי הנתונים שלך. טכניקת הגדלה זו תעזור לך לשפר מודל ולהפוך אותו ליציב לווריאציות קלט. במאמר זה, למדנו על טרנספורמציה גיאומטרית תלת מימדית, אך מלבדה, ישנם שינויים בטקסטורה שהם שיפורים נוספים של מערכי נתונים של פנים, אשר במאמר הבא.
הפניות
[1] קוד GitHub.
[2] דגם FLAME.