התקדמות מהירה בלמידה ממוחשבת וטכנולוגיות בינה מלאכותית הביאה להישגים משמעותיים בחזון ממוחשב לגילוי והכרת אובייקטים. עם זאת, יצירת מערכת שיכולה להבחין בהומור ובהנאה באנשים נותרה עדיין בעיה מאתגרת עבור מתכנתים, שכן קומדיה ובידור הם עניינים רגישים ומבוססים על טעמים אישיים והקשרים תרבותיים. לכן, זה מסובך ליצור מערכת שיכולה לקבוע במדויק מה אנשים מוצאים משעשע או מהנה.
עם זאת, חזון ממוחשב בזיהוי פנים וזיהוי היה בוצעה התקדמות משמעותית, ומשמש באופן נרחב ביישומים שונים כמו אבטחה, מעקב, וביומטריקה. טכנולוגיית זיהוי פנים מאתרת אנשים על ידי ניתוח והשוואה של תכונות הפנים שלהם לבסיס נתונים של פרצופים ידועים. זיהוי פנים כולל התאמת הפרצופים לזהותם. היא משתמשת באלגוריתמים להפקת תכונות פנים ייחודיות כמו המרחק בין העיניים, עקומות האף וזווית קו הסנטר.
טכניקות לזיהוי וזיהוי פנים
ישנן מספר שיטות לזיהוי וזיהוי פנים, אך הדרכה זו תתמקד בשלוש טכניקות ותציין את היתרונות והחסרונות שלהן.
1. גישת התבנית
ראשית, הגישה הבסיסית על שיטת התבנית משווה את תכונות הפנים של פני מטרה עם אלה בתמונת תבנית או תמונת התייחסות. תמונת התבנית כוללת מספר תכונות פנים, כגון מיקום העיניים, האף, הפה והמרחקים ביניהם. השיטה משווה אז את פני המטרה עם תמונת התבנית כדי לקבוע אם יש התאמה. Eigenfaces היא אחת השיטות הבסיסיות בהן משתמשים ב-PCA כדי להפחית את ממדיות התמונות של הפנים ולהוציא את התכונות הרלוונטיות ביותר.
יתרונות
- הם מאוד מדויקים עם תבניות באיכות גבוהה
- מספקים התמודדות עם שינויים בתאורה ובבעלות פנים
חסרונות
- דורש תבניות באיכות גבוהה לתוצאות מדויקות
- עשוי להיות יקר מבחינה חישובית
2. גישה מבוססת תכונות
שנית, השיטה המבוססת תכונות מוציאה תכונות מהפנים, כגון צורת העיניים, המרחק בין הגבות ועקמומיות השפתיים. הגישה משווה אז את התכונות הללו עם אלה במאגר של פנים ידועות כדי לזהות את פני המטרה. דוגמאות של שיטות מבוססות תכונות רגילות כוללות את Local Binary Pattern (LBP) ו-Scale-Invariant Feature Transform (SIFT).
יתרונות
- יחסית מהירה ויעילה
- עובדת עם תמונות ברוחב פס נמוך
חסרונות
- עשויה לא לעבוד טוב עם תנאי תאורה משתנים
- עשויה לא להיות חזקה כנגד שינויים בבעלות פנים או תפיסות
3. גישה מבוססת למידה עמוקה
לבסוף, גישה מבוססת למידה עמוקה משתמשת ברשתות עצביות עמוקות כדי ללמוד תכונות ישירות מתמונות פנים. רשתות מאומצות על מאגרים גדולים של תמונות פנים כדי לזהות דפוסים ותכונות רלוונטיות לזיהוי פנים. דוגמאות של שיטות מבוססות למידה עמוקה טיפוסיות כוללות רשתות עיבודיות מסובכות (CNN) ורשתות סיאמיים.
יתרונות
- משיגה דיוק גבוה עם מאגרים גדולים של נתונים
- מספקת עיכובים בבעלי פנים ותנועות
חסרונות
- דורשת כמות גדולה של נתונים לאימון
- מסובך מבחינה חישובית
הערה: ישנן מספר טכניקות לזיהוי וזיהוי פנים.
זיהוי פנים וזיהוי באמצעות פייתון ו-OpenCV
עם הזמינות של ספריות חזקות כמו OpenCV והתקדמות באלגוריתמים למידת מכונה, נעשה זה קל יותר מאי פעם לפתח מערכות זיהוי פנים וזיהוי באמצעות פייתון. OpenCV מספק סט עשיר של פונקציות וכלים לעיבוד תמונות, במיוחד שימושי במשימות זיהוי פנים כגון גילוי פנים, חילוץ תכונות והתאמה. יש לה גם מודלים מוכנים כמו ה-Haar Cascades classifier לגילוי פנים ו-VGG או ResNet לתיוג הפנים המזוהים.
OpenCV מספק מודלים שונים לתיוג פנים, כגון Eigenfaces, Fisherfaces ו-Local Binary Patterns Histograms (LBPH). אנו מאמןים את המודלים הללו לזיהוי יחידים ספציפיים על ידי הצגתם תמונות של האנשים שאנו רוצים להכיר. Eigenfaces משתמש ב-Principal Component Analysis (PCA) כדי לבנות תמונת פנים מחלקים קטנים יותר, ו-Fisherfaces משתמש ב-Linear Discriminant Analysis (LDA) כדי להבדיל בין פנים. LBPH משווה את מרקם הפנים לפנים ידועים.
זיהוי פנים
ייבוא תלות
ייבא את הספריות ה הכרחיות.
import numpy as np
import cv2
import matplotlib.pyplot as plt
from IPython.display import Image
from google.colab import drive
drive.mount('/content/drive')
טעינת מודלים מוטבעים ותמונה
OpenCV מספק קבוצה של מודלים מוכוונים `Haar Cascade classifiers` לזיהוי מספר חפצים, כולל פנים. `cv2.CascadeClassifier` היא מחלקה המייצגת את מבחן ה-Haar Cascade. הנתיב cv2.data.haarcascades הוא ספרייה המכילה את המודלים המוכוונים. `haarcascade_frontalface_default.xml` הוא הקובץ המכיל את מודל הזיהוי פנים המוכוון. המודל זמין להורדה חינם ב-GitHub.
# טען את מודל הזיהוי פנים המוכוון
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
טען את התמונה המבוקשת `image1.jpg` שניתן לבחור בעזרת פונקציית OpenCV `imread()`. לאחר מכן המרת התמונה לגוון אפור באמצעות פונקציית OpenCV `cvtColor()`. התמונה בגוון אפור היא הכרחית לאלגוריתם זיהוי הפנים.
# הוצאת התמונה והמרתה לגרסת גרייסקייל
img = cv2.imread('/content/drive/MyDrive/Face Detection/image1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# הצגת התמונה
plt.imshow(gray)
השורה שלמטה מזהה פנים בתמונה הבהרה גרייסקייל באמצעות השיטה detectMultiScale() של המחלקה CascadeClassifier. השיטה detectMultiScale() מקבלת את הארגומנטים הבאים:
`gray`: התמונה הבהרה גרייסקייל
`scaleFactor`: פרמטר המציין כמה הגודל של התמונה מופחת בכל קנה מידה של התמונה. ערך של 1.3 משמעו שהתמונה מופחתת ב-30% בכל קנה מידה.
`minNeighbors`: פרמטר המציין כמה שכנים צריכים להיות לכל מלבן מועמד כדי לשמר אותו, ערך גבוה יותר משמעותו מצאות פחות אך ברמת בטחון גבוהה יותר.
`The detectMultiScale()` שיטה מחזירה רשימה של מלבנים בהם מזוהה פנים. כל מלבן מייצג טופס של ארבעה מספרים שלמים `(x,y,w,h)` המייצג את קואורדינטות קדמי השמאלי `(x,y)` של המלבן והרוחב שלו `w` והגובה שלו `h`.
# זיהוי פנים בתמונה הבהרה גרייסקייל
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
ציור מלבן באזור הפנים
בואו ניצור לולאה המעבירה מלבנים סביב הפנים המזוהים בתמונה המקורית. פונקציית cv2.rectangle() מקבלת את הארגומנטים הבאים:
`img`: התמונה המקורית.
`(x,y)`: קואורדינטות קדמי השמאלי של המלבן.
`(x+w,y+h)`: קואורדינטות היכס ימני תחתון של המלבן.
`(255,0,0)`: מייצג את הצבע הבינארי של המלבן המוצג בפורמט RGB. (255,0,0) מייצג כחול.
`5`: עובי שוקיים המלבן בפיקסלים.
# ציור מלבנים סביב הפנים המזוהות
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),5)
#הצגת התמונה לאחר בניית המלבן.
# הצגת התמונה עם הפנים המזוהות
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
# שמירת התמונה המזוהה על שם
cv2.imwrite('detected_image.jpg', img)
#אימות האם התמונה המורשת קיימת.
detected_image=cv2.imread("detected_image.jpg", 1)
gray_channels_reversed = detected_image[:, :, ::-1]
plt.imshow(gray_channels_reversed)
זיהוי פנים
לא ניכנס להסבר כמו הנ"ל אלא נשתמש בתמונה המורשת הנ"ל כדי לאשר האם המודל עובד לזיהוי על ידי סילוק תמונות שונות לזיהוי.
ייבוא תלויות
import numpy as np
import cv2
import matplotlib.pyplot as plt
import dlib
from imutils import face_utils
from scipy.spatial.distance import cosine
from sklearn.metrics.pairwise import cosine_similarity
טעינת מודל זיהוי פנים ומפקח על האופיין הפנים
פונקציית `dlib.get_frontal_face_detector()` מחזירה מודל זיהוי פנים מואצל לזיהוי פנים אנושיות בתמונות. למידע נוסף, בדוק dlib.net פונקציות. גם, הורד את מפקח האופיין.
# טעינת מודל הזיהוי פנים ומפקח האופיין הפנים
face_detector = dlib.get_frontal_face_detector()
landmark_detector = dlib.shape_predictor('/content/drive/MyDrive/Face Detection/shape_predictor_68_face_landmarks_GTX.dat')
# טעינת התמונה המזוהה של
img1 = cv2.imread('/content/drive/MyDrive/Face Detection/detected_image.jpg')
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
# זיהוי הפנים והאופיין הפנים של התמונה
rects1 = face_detector(gray1, 1)
landmarks1 = landmark_detector(gray1, rects1[0])
landmarks1 = face_utils.shape_to_np(landmarks1)
# טעינת תמונה נוספת להשוואה עם התמונה שטוענים קודם
img2 = cv2.imread('/content/drive/MyDrive/Face Detection/001_d3323f3c.jpg')
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
### קביעת פרמטרי המודל
# זיהוי הפנים ונקודות המפתח של התמונה השנייה
rects2 = face_detector(gray2, 1)
landmarks2 = landmark_detector(gray2, rects2[0])
landmarks2 = face_utils.shape_to_np(landmarks2)
# חילוץ התכונות של שתי התמונות על ידי חישוב המרחקים האוקלידיים בין נקודות המפתח של הפנים
features1 = np.zeros(68)
features2 = np.zeros(68)
for i in range(68):
features1[i] = np.linalg.norm(landmarks1[i] - landmarks1[0])
features2[i] = np.linalg.norm(landmarks2[i] - landmarks2[0])
#### אימון על סמיכויות
# חישוב הדמיון הקוסינוסי בין שני וקטורי התכונות
score = cosine(features1, features2)
# בדיקה האם הציון נמוך מסף מסוים (למשל 0.5) כדי לקבוע האם שתי הפנים תואמות
if score < 0.5:
print("The model did not recognize Joseph in one or both of the images..")
else:
print("The model recognized Joseph in both images.")
מסקנה
בדרכה זו, למדתם על זיהוי פנים וז別 פנים באמצעות Python OpenCV, איך זה עובד, השימושים שלו ואיך ניתן ליישם אותו. הקוד לפרויקט זה ניתן לגשת אליו מהריפו של GitHub.
Source:
https://dzone.com/articles/facial-recognition-and-identification-in-computer