ערכתי לאחרונה בתאריך 03.09.10 בשעה 14:35 בברכה, ronen333
קודם כל סוג הזיהוי לפנים נקרא Harr cascade (שזה מעין מלבנים עם אינטרול גבוה ונמוך ) והם בעצם מקטלגים אם יש חלקים בתמונה שהם פנים או לא.
כאשר סורקים את התמונה מספר פעמים על גודל תמונה קטן יחסית (נניח 50X50).
נוכחות של Haar features נקבעת ע"י כך שבעצם מחסרים את ממוצע הפיקסלים הכהים ממוצע הפיקסלים הבהירים. אם קיים הבדל גדול בין התוצאה הזאת לבין הסט שנקבע בלמידה- אזי יש נוכחות.
כדי לבדוק את הנוכחות/חוסר נוכחות הזאת בפוסציות שונות, ובגדלים שונים בין מאות Haar features משתמשים בטכניקה (של Viola & Jones) שנקראת
"Integral image".
באופן כללי ההכללה הזאת היא לסכם את הפיקסלים ששמאל למעלה עד ימין למטה של אותו מלבן.
http://www.cognotics.com/opencv/servo_2007_series/part_2/fig_s2.png
כמו שמופיע בתמונה הX,Y יכיל בעצם את סכום כל ערכי הפיסלים שבתוך המלבן.
כדי למצוא את הפיקסל הממוצע צריך רק לחלק את הפיקסל X,Y בשטח של המלבן.
אם נגיד אנחנו צריכים לבדוק נוכחות במלבן D, שהוא לא משמאל למעלה.. פשוט
נעשה חיבור וחיסור ^^ ( D=A+B+C-(A+B)-(A+C) +A ).
שבאופן נוח מאוד, A+B זה המיקום 2, A+C זה המיקום 3, וA זה המיקום 1.
עכשיו אפשר לגיע לכל מקום בתמונה..
כדי לבחור בHaar features הספציפי , לקבוע ולשפר את רמות סט הלמידה משתמשים באלגוריתם AdaBoost.. שמשפר בצורה משמעותית את מהירות ע"י כך שהוא בעצם משלב הרבה קיטלוגים "חלשים" ונותן להם משקל-
כדי ליצור קיטלוג חזק בסופו של דבר.
וכשאני אומר "חלשים" אני מתכוון למשהו כמו קצת יותר טוב מבחירה רנדומלית (לא נשמע כזה טוב אה?).. אבל ברגע שיש הרבה חלשים כל אחד "דוחף" מעט לקראת דיוק גבוה יותר.. ואז יש לנו זיהוי טוב.
http://www.cognotics.com/opencv/servo_2007_series/part_2/fig_s3.png
אם במהלך הקיטלוג זה נכשל באחד מה"פילטרים" אז הוא ישר מגיע לכך שזה לא פנים, אחרת זה ממשיך בשרשרת ה"פילטרים" עד שזה מגיע לכך שזה פנים.
לשרשרת הנתונים הזאת קוראים cascade, וזה בעצם הנתונים שנאספים בDB או בקבצי XML.
המיון של הפילטרים הוא בעצם ע"י חשיבות המשקל שניתן ע"י AdaBoost...
מהכבד לקל כדי לחסל כמה שיותר מהר זיהוי שגוי.
לסיכום, מזהים חלקים בפרצוף בהסתמכות על בהירות מחלק אחד לאחר..
זה לפחות מה שאני הבנתי ממאמר אחד שקראתי באתר SERVO...

