年龄和性别预测的神经网络





获取有关一个人的年龄和性别的信息仅是通过其面部照片进行的。基于此,我们的任务可以分为两个主要阶段:



  1. 在输入图像中检测面部。
  2. 感兴趣区域(ROI-感兴趣区域)的提取以及该人的年龄和性别检测器算法的应用。


对于第1阶段,有许多现成的解决方案,例如:Haar级联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) #   


Haar级联:



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模型。



现在,我们已经找到了一种用于检测照片中人脸的方法的选择,让我们继续进行任务本身。为了确定年龄和性别,使用了两种不同的模型,并在大量数据上进行了训练。两种模型均由Levy和Hassner训练,他们的第一篇著作于2015年出版,标题为“使用卷积神经网络进行年龄和性别分类””。在他们的工作中,他们证明了使用深度卷积神经网络(CNN)进行的训练可以在年龄和性别预测任务中取得显着的性能提升。可以从链接1(* .caffemodel)和链接2(* .prototxt)下载



Adience数据集上进行年龄预测的模型,该模型解决了分类问题,而不是回归问题。年龄范围分为某些时间间隔[“(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