الشبكات العصبية للتنبؤ بالعمر والجنس





الحصول على معلومات حول عمر الشخص وجنسه يحدث حصريًا من صورة وجهه. بناءً على ذلك ، يمكن تقسيم مهمتنا إلى مرحلتين رئيسيتين:



  1. كشف الوجوه في الصورة المدخلة.
  2. استخراج منطقة الاهتمام (ROI - منطقة الاهتمام) وتطبيق خوارزمية كاشف عمر الشخص والجنس.


بالنسبة للمرحلة الأولى ، هناك العديد من الحلول الجاهزة ، على سبيل المثال: Haar cascades ، HOG ((رسم بياني للتدرجات الموجهة) ، ونماذج التعلم العميق ، وما إلى ذلك ، دعونا ننظر في السمات المميزة الرئيسية لكل منها:



  1. ستكون سلاسل Haar سريعة جدًا وقادرة على العمل في الوقت الفعلي على الأجهزة المضمنة - المشكلة هي أنها أقل دقة وعرضة جدًا للإيجابيات الخاطئة
  2. تعد نماذج HOG أكثر دقة من شلالات Haar ، ولكنها أبطأ. كما أنهم ليسوا متسامحين مع الانسداد (أي عندما يتم إخفاء جزء من الوجه)
  3. تعد أجهزة كشف الوجه ذات التعلم العميق هي الأكثر موثوقية وستمنحك أفضل دقة ، ولكنها تتطلب موارد حسابية أكثر من شلالات Haar و HOG


لتحديد طريقة مناسبة لمهمتنا ، تم إجراء تحليل مقارن لخوارزميتين: سلسلة Haar و MTCNN (الشبكة العصبية التلافيفية متعددة المهام المتتالية). في الحالة الأولى ، تحتوي مكتبة OpenCV بالفعل على العديد من المصنفات المعدة مسبقًا للوجه ، والعينين ، والابتسامة ، وما إلى ذلك (يتم تخزين ملفات XML في مجلد / opencv / data / haarcascades) ، وفي الحالة الثانية ، تحتاج إلى تثبيت المكتبة باستخدام الأمر pip install mtcnn ...



استيراد المكتبات المطلوبة



import cv2
from mtcnn import MTCNN
import matplotlib.pyplot as plt
image = cv2.cvtColor(cv2.imread('f.jpg'), cv2.COLOR_BGR2RGB) #  


فيما يلي الكود لاختبار تشغيل خوارزميات



MTCNN:



detector = MTCNN() #  
result = detector.detect_faces(image)  #    
for i in range(len(result)): 
bounding_box = result[i]['box']  #   
cv2.rectangle(image, (bounding_box[0], bounding_box[1]),
(bounding_box[0]+bounding_box[2], bounding_box[1] + bounding_box[3]),
           (0,155,255), 2) #     
plt.imshow(image) #   


شلال هار:



face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') #   XML-
faces = face_cascade.detectMultiScale(image, 1.3, 5)  #    
for (x,y,w,h) in faces: #      
    cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),2) #     
plt.imshow(image) #   


دعونا نجري سلسلة من التجارب للتحقق من جودة الخوارزميات.



- صورة شخص واحد





- عدة أشخاص في الصورة





- عدة أشخاص في الصورة ، في حالة عدم توجيه النظرة إلى الإطار





- عدة أشخاص في الصورة ، عند إخفاء جزء من وجوههم ، على سبيل المثال ، الأقنعة





يمكننا أن نستنتج أنه في ظل الظروف المثالية (الوضوح العالي للصورة ، يتم توجيه الوجه بدقة إلى الإطار) ، تعمل الخوارزميتان بشكل لا تشوبه شائبة ، ولكن عند أدنى انحراف عن هذه الظروف ، تبدأ سلسلة Haar بالفشل. لذلك ، ركز الاختيار على استخدام نموذج MTCNN.



الآن بعد أن توصلنا إلى اختيار طريقة لاكتشاف الوجوه في الصورة ، دعنا ننتقل إلى المهمة نفسها. لتحديد العمر والجنس ، تم استخدام نموذجين مختلفين ، تم تدريبهما على كمية هائلة من البيانات. تم تدريب كلا النموذجين من قبل ليفي وهاسنر ، ونُشر عملهما الأول في عام 2015 تحت عنوان التصنيف العمري والجنساني باستخدام الشبكات العصبية التلافيفية". أظهروا في عملهم أن التدريب باستخدام الشبكات العصبية التلافيفية العميقة (CNNs) يمكن أن يحقق مكاسب كبيرة في الأداء في مهام التنبؤ بالعمر والجنس. يمكن تنزيل



نموذج تم تدريبه على مجموعة بيانات Adience للتنبؤ بالعمر من الرابط 1 (* .caffemodel) والرابط 2 (* .prototxt) هذا النموذج يحل مشكلة التصنيف وليس الانحدار. ينقسم النطاق العمري إلى فترات زمنية معينة ["(0-2)" ، "(4-6)" ، "(8-12)" ، "(15-20)" ، "(25-32)" ، "(38 -43) "،" (48-53) "،" (60-100) "] ، كل منها عبارة عن فئة منفصلة يمكن للنموذج التنبؤ بها.



لتحديد الجنس ، تم أخذ نموذج من المستودعللحصول على مقال " فهم الشبكات العصبية العميقة ومقارنتها حسب تصنيف العمر والجنس. " يمكن تنزيل النماذج من الرابط 1 (* .caffemodel) ومن الرابط 2 (* .prototxt). يستخدم النموذج بنية GoogleNet وقد تم تدريبه مسبقًا على مجموعة بيانات ImageNet .



كما ترى ، يتم تمثيل كل نموذج بملفين ، مما يعني أنه تم تدريبه باستخدام Caffe (إطار عمل تعلم آلي عميق يهدف إلى سهولة الاستخدام ، وسرعة عالية ونمطية). الملف الذي يحتوي على ملحق prototxt مسؤول عن بنية الشبكة ، والملف بامتداد caffemodel لوزن النموذج.



يتم تقديم الكود الرئيسي بإيجاز أدناه ، كحجة للنموذج الذي نمرر الشخص المحدد أعلاه.



AGE_BUCKETS = ["(0-2)", "(4-6)", "(8-12)", "(15-20)", "(25-32)","(38-43)", "(48-53)", "(60-100)"]
gender_list=['Male','Female']
faceBlob = cv2.dnn.blobFromImage(face, 1.0, (227, 227), (78.4, 87.7, 114.8), swapRB=False)
  ageNet.setInput(faceBlob)
  age_preds = ageNet.forward()
  age_i = age_preds[0].argmax()
  age = AGE_BUCKETS[age_i]
  ageConfidence = age_preds[0][age_i]
             age_text = "{}: {:.2f}%".format(age, ageConfidence * 100) #   
  genderNet.setInput(faceBlob)
  gender_preds = genderNet.forward()
  gender_i = gender_preds[0].argmax()
  gender=gender_list[gender_i]
  genderConfidence = gender_preds[0][gender_i]
  gender_text = "{}: {:.2f}%".format(gender, genderConfidence * 100) #   
   y = y1 - 10 if y1 - 10 > 10 else y1 + 10
   cv2.rectangle(image, (x1, y1), (x1+width, y1 + height), (0,155,255),2) 
   v2.putText(image, display_text, (x1, y),
   cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)


النتائج التي تم الحصول عليها أثناء تطوير الخوارزمية







كما ترى ، لا يُظهر النموذج دائمًا النتيجة بشكل صحيح ، وأحيانًا يقوم بتعيين جنس ذكر للصور التي يتم تصوير النساء فيها. ربما يكون هذا بسبب التاريخ غير المتوازن الذي تم فيه تدريب النموذج. شريطة أن يكون لديك موارد الحوسبة اللازمة ، يمكنك محاولة تدريب النموذج بنفسك ، سيستغرق الأمر بعض الوقت ، ولكن مع مجموعة بيانات متوازنة وبنية شبكة ومعلمات تدريب محددة بشكل صحيح ، قد تتحسن الدقة.



All Articles