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

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

מהו מפל האר?

Haar Cascade הוא אלגוריתם זיהוי אובייקטים שהוצג על ידי פול ויולה ומייקל ג'ונס כדי לזהות פרצופים בתמונות או בסרטונים. פונקציית אשד מאומנת באמצעות תמונות חיוביות ושליליות רבות אשר ניתן להשתמש בהן מאוחר יותר כדי לזהות כל אובייקט או פנים במדיה אחרת. קבצים מאומנים אלה זמינים ב- מאגר OpenCV GitHub.

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

OpenCV, כלי ראייה ממוחשבת, עובד עם מודל Haar Cascade מיומן מראש כדי לסווג את התכונות. כל שלב בודק חמש תכונות: שתי תכונות קצה, שתי תכונות קו ותכונה אחת של ארבעה מלבנים.

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

instagram viewer

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

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

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

זרימת עבודה של זיהוי פנים

עקוב אחר האלגוריתם הזה כדי לבנות את תוכנית זיהוי הפנים שלך:

  1. טען את אלגוריתם הפנים הפרונטלי של Haar Cascade.
  2. אתחול המצלמה.
  3. קרא פריימים מהמצלמה.
  4. המרת תמונות צבע לגווני אפור.
  5. קבל את קואורדינטות הפנים.
  6. צייר מלבן ושם את ההודעה המתאימה.
  7. הצג את הפלט.

מה זה OpenCV?

OpenCV היא ספריית ראייה ממוחשבת ולמידת מכונה בקוד פתוח. יש לו למעלה מ-2,500 אלגוריתמים מותאמים ליישומים שונים. אלה כוללים זיהוי פנים/אובייקטים, זיהוי, סיווג ורבים נוספים.

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

כדי להתקין את OpenCV ב-Python, השתמש בפקודה:

צִפצוּף להתקין opencv-python

כיצד לבנות תוכנית זיהוי פנים באמצעות Python

בצע את השלבים הבאים כדי לבנות את גלאי הפנים:

קוד דוגמה זה, יחד עם קובץ האלגוריתם Haar Cascade, זמין ב-a מאגר GitHub והוא בחינם עבורך לשימוש תחת רישיון MIT.

  1. הורד את Haar Cascade Frontal Face ברירת מחדל XML קובץ והצב אותו באותו מיקום כמו תוכנית Python שלך.
  2. ייבא את ספריית OpenCV.
    # ייבוא ​​הספריות הנדרשות
    יְבוּא cv2
  3. אחסן את קובץ האלגוריתם של Haar Cascade Frontal Face להפניה קלה.
    # טעינת קובץ אלגוריתם ה-haar למשתנה alg
    אלג = "haarcascade_frontalface_default.xml"
  4. השתמש במחלקה CascadeClassifier כדי לטעון קובץ XML לתוך OpenCV.
    # העברת האלגוריתם ל-OpenCV
    haar_cascade = cv2.CascadeClassifier (alg)
  5. צלם את הווידאו מהמצלמה. העבר 0 ל- VideoCapture() פונקציה כדי להשתמש במצלמה הראשית שלך. אם צירפת מצלמה חיצונית תוכל להשתמש במספרים עוקבים 1, 2 וכן הלאה כדי להשתמש בה במקום.
    # צילום עדכון הווידאו מהמצלמה
    cam = cv2.VideoCapture (0)
  6. הגדר לולאה אינסופית כדי לקרוא את קלט המצלמה פריים אחר פריים. ה לקרוא() הפונקציה מחזירה שני פרמטרים. הערך הראשון הוא מסוג בוליאני המציין אם הפעולה הצליחה או לא. הפרמטר השני מכיל את המסגרת האמיתית שאיתה אתה הולך לעבוד. אחסן את המסגרת הזו ב- img מִשְׁתַנֶה.
    בזמןנָכוֹן:
    _, img = cam.read()
  7. הגדר את טקסט ברירת המחדל להופיע בתור פנים לא זוהו. לאחר זיהוי, עדכן את הערך של משתנה זה.
     טקסט = "פנים לא זוהו"
  8. הקלט המתקבל מהעולם האמיתי הוא צבעוני, בפורמט BGR. BGR מייצג כחול, ירוק ואדום. זה יוצר הרבה עיבוד עבור יישומי ראייה ממוחשבת. כדי לצמצם זאת, השתמש בפורמט בגווני אפור.
    # המרת כל מסגרת מ-BGR לגווני אפור
    grayImg = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY)
    העבר את פורמט המסגרת וקוד ההמרה, COLOR_BGR2GRAY, ל cvtColor() כדי לשנות כל פריים בסרטון מצבע לגווני אפור.
  9. להשתמש detectMultiScale() כדי לזהות פרצופים. שיטה זו לוקחת שלושה פרמטרים כקלט. ראשית היא תמונת המקור, greyImg. הפרמטר השני הוא scaleFactor. זה מציין כמה אתה צריך להקטין את גודל התמונה בכל קנה מידה של תמונה. השתמש בערך ברירת המחדל 1.3 כגורם קנה המידה. ככל שגורם קנה המידה גבוה יותר, כך פחות שלבים, והביצוע מהיר יותר. עם זאת, יש גם סבירות גדולה יותר להיעדר פנים. הפרמטר השלישי הוא minNeighbors. זה מציין כמה שכנים צריכים להיות לכל מלבן מועמד כדי לשמור עליו. ככל שהערך גבוה יותר, הסיכוי לחיוב שגוי קטן יותר, אך משמעות הדבר היא גם החמצה של עקבות פנים לא ברורות.
    # זיהוי פנים באמצעות Haar Cascade 
    face = haar_cascade.detectMultiScale (grayImg, 1.3, 4)
  10. כאשר אתה מזהה פנים, אתה מקבל ארבע קואורדינטות. x מייצגת את קואורדינטת x, y מייצגת את קואורדינטת y, w מייצגת את הרוחב, ו-h מייצגת את הגובה. עדכן את הטקסט ל זוהו פנים וצייר מלבן באמצעות הקואורדינטות הללו. צבע המלבן הוא בפורמט ירוק (BGR) בעובי של שני פיקסלים.
    # צייר מלבן סביב הפנים ועדכן את הטקסט לזיהוי פנים
    עבור (x, y, w, h) בפנים:
    טקסט = "זוהו פנים"
    cv2.מַלבֵּן(img, (איקס, y), (איקס + w, y + ח), (0, 255, 0), 2)
  11. אופציונלי להדפיס את הטקסט על מסוף הפלט. הצג את הטקסט על המסך באמצעות המסגרת שנלכדה כמקור, טקסט כפי שהתקבל בטקסט לעיל, גופן סגנון של FONT_HERSHEY_SIMPLEX, גורם קנה מידה של גופן של 1, צבע כחול, עובי שני פיקסלים וסוג קו של AA.
    # הצג את הטקסט בתמונה
    הדפס(טֶקסט)
    image = cv2.putText (img, text, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2, cv2.LINE_AA)
  12. הצג את החלון עם הכותרת זיהוי פנים ואת התמונה. להשתמש ב waitkey() שיטה להציג את החלון למשך 10 אלפיות השנייה ולבדוק אם יש לחיצה על מקש. אם משתמש לוחץ על יציאה מקש (ערך ASCII 27), צא מהלולאה.
    # הצג את חלון הפלט ולחץ על מקש Escape כדי לצאת
    cv2.imshow("זיהוי פנים", תמונה)
    key = cv2.waitKey (10)

    אם מפתח == 27:
    לשבור

  13. לבסוף, שחרר את אובייקט המצלמה מתוכנית python וסגור את כל החלונות.
    פִּקָה.לְשַׁחְרֵר()
    cv2.destroyAllWindows()

זיהוי פנים באמצעות Python בפעולה

כאשר פרצוף נראה, אתה אמור לראות פלט כך:

כשאין פנים, תראה הודעה כזו:

מגבלות של זיהוי פנים באמצעות אלגוריתם Haar Cascade

למרות שהאלגוריתם הזה קל משקל, עם גודל דגם קטן ועובד מהר, יש כמה מגבלות:

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

היישומים הרבים של זיהוי פנים

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

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