Predict Age and Gender according the deteced faces with CNN and opencv

用CNN、HAAR检测视频/图像/摄像头中的人脸,用caffemodel、keras、tensorflow根据检测到的人脸进行年龄和性别的预测,可以在命令行菜单中选择检测源和检测模型,后续可以简便的扩展更多检测模型,只需安装opencv,Python,keras就可以试玩,欢迎围观。


 Predict Age and Gender

环境说明

本文介绍的工程运行环境,本文源代码以及相应文件已上传至Github.

1.  Win10 X64

文中有提到不同方法处理图片的时间,该处理时间随CPU不同而不同,测试CPU: Intel Core i7-8550U CPU with 8G RAM, win10 x64

2. python3.6 OpenCV-python

3. keras/tensorflow

安装方法参考Install keras and tensorflow cpu on Windows

参考链接

1.  diovisgood/agender

这是一个优秀的项目,作者对现有的性别和年龄预测相关的开源项目进行了很多研究,并在该项目中做了很好的总结。
本文基于该开源项目,新增了命令行菜单,可以选择检测源,选择用于检测人脸的模型,以及选择预测年龄和性别的模型,便于不同模型间检测效果的对比;同时本文更改了main.py的结构,便于后续添加更多的检测模型。
2. 本文的测试视频和图像来自于这里:
https://www.youtube.com/watch?v=cSSFRim8OK8
3.
Predict Age and Gender using Convolutional Neural Network and openCV 这篇文章中使用的人脸检测为是本文中的HAAR,年龄和性别预测为本文中提到的Caffenet。这篇文章最有趣的部分是其检测源:优酷视频的链接,通过使用python中的pafy和youtube_dl来获取检测源。但是youtube_dl通常由于youtube的措施而无法获取视频。有类似的需求的同学可以参考。

非常感谢原作者的分享!

使用步骤

1. choose detect source:videos/images/camera

videos:将要检测的视频(.mp4)放在“ videos /”文件夹中,然后选择“videos”作为检测源。
images:将要检测的图像放在文件夹images /中,然后选择“images”作为检测源。
camera:如果选择摄像头作为检测源,则程序将打开计算机的摄像头并检测其捕获的内容。

2.choose face detector: HAAR/Tensornet

HAAR:由opencv中的CascadeClassifier函数加载。
Tensornet:由opencv中的readNetFromTensorflow函数加载。

3.choose age and gender detector:ssrnet/Caffenet

ssrnet:此模型来自SSR-Net。它属于keras和tensorflow框架,该模型输出性别(数字,其中0=女性,1=男性)和年龄(数字)。
Caffenet:此模型来自
AgeGenderDeepLearning,它以Caffe模型发布,可以由opencv中的readNetFromCaffe加载。它输出性别(两个二进制类别:男性和女性)和年龄(8个类别:[0..2],[4..6],[8..12],[15..20], [25..32],[38..43],[48..53],[60..100])。
Caffe模型具有2个相关文件:
prototxt,该文件定义了神经网络中的各层,各层的输入,输出和功能。

caffemodel,包含经过训练的神经网络(经过训练的模型)的信息。

4.RUN

确认以上选项后,选择此选项后,程序将开始处理视频或图像,按ESC键可中止程序运行。
若以默认值运行,则程序将以检测videos/Tensornet/ssrnet进行检测。

程序结构

1. 创建菜单,从菜单中选择检测源,检测模型并运行。

在main.py中调用菜单并返回相应变量。

各级菜单名称存放在List中,根据当前选项决定下一步显示的菜单以及相应动作。后续若要添加更多的检测模型,将模型名称添加到相应的List中即可。

2. 加载人脸检测模型,年龄/性别检测模型,在cmd.exe中输出模型加载时间

将人脸检测模型名称及其加载函数,年龄、性别检测模型及其加载函数放在各自的字典中,main函数中根据菜单选项来决定调用内容。后续扩展模型时,准备好模型文件与相应的加载函数,将模型名称与函数名称添加到字典中即可,不需要更改main()的代码。

3. 为提高人脸检测的处理速度,将原视频帧或原图按设定尺寸缩小,并从缩小的图像中进行人脸检测。处理小图像的速度更快,但并不影响质人脸检测的质量(该结论来自于diovisgood/agender,我并未验证,有兴趣的同学可以验证一下)。

默认设定缩小后的尺寸为640*480,函数calculateParameter会根据源图像的尺寸和该设定值重新计算缩小后的尺寸,完整的代码请参考Github。

与加载模型类似,将人脸检测模型名称和人脸检测函数的名称放在字典detect_face_dict中,图像处理函数根据菜单选项调用相应的函数,后续扩展其他模型时,只需要添加模型名和检测函数,不需要修改图像处理函数。

4. 性别和年龄检测需要更多的人脸细节,因此将人脸检测的结果还原到原视频帧或原图的坐标,并从原图中获取人脸部分, 根据获取的人脸预测性别和年龄;在每个人脸周围绘制一个矩形,并在标签上标注性别和年龄,在cmd.exe中打印当前图像的处理时间(人脸检测,年龄性别预测的总时间)。

如下代码所示,性别和年龄检测模型及其相应的函数名放在字典中,方便后续扩展。

模检测型扩展

如果要添加更多的人脸检测模型或年龄性别检测模型,可按以下步骤进行:
1.准备模型文件,并将其放入合适的文件夹中。
2.将模型名称添加到menu.py中的faceList或ageList中。

3.准备新模型的加载和检测函数,注意相应函数的输入输出与现有模型相应函数的输入输出一致,将新增函数添加到main.py。
4.将新增的模型名称,以及加载和检测函数名,添加到main.py中的load_face_dict / detect_face_dict / load_agender_dict / predictAgeGender_dict词典中。词典中的模型名称应与步骤2中的名称一致。

本文到此结束,感谢阅读,谢谢支持。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Fork me on GitHub