DDFD人脸检测算法是由Farfade等人[3]在2015年发表的。该算法是一种基于深度学习的人脸检测算法,并可以进行多角度的人脸检测。通常进行多角度人脸检测的算法需要训练大量的模型捕捉各个方向的人脸,还需要对面部关键点或者面部姿势进行注解,这些方法工作量大,比较复杂。DDFD人脸检测算法只需要一个基于深度卷积神经网络的模型(Deep Dense Face Detector,DDFD),就可以检测各个方向的人脸。
4.2.1 DDFD人脸检测算法的使用
关于DDFD人脸检测算法的程序,Farfade等人没有公开源代码和检测器,本书使用的程序来自文献[4]和文献[5]。
新建一个项目,名称为:Face Detection_CNN-master。该项目包含主要程序[6]和训练好的模型[7],本书只是利用该算法进行检测。
注意:该算法需要在Caffe环境下运行。
读者可根据实际情况,在test.py文件中修改检测图片和检测结果的存放路径,具体如下。
检测图片路径:
face_detection('face.txt')
face.txt是包含检测图像名称的文档。
检测结果路径:
imageFile.save("result/" + str(img_count) + ".jpg")
修改路径后,运行test.py即可使用DDFD人脸检测算法进行人脸检测。
如果读者需要自行训练模型,则可按照如下步骤处理。
(1)运行image_preprocess.py。该程序是为了对图片进行预处理,使用AFLW[8]数据库,对于每张图片,如果检测到的人脸与真实的人脸区域重叠面积大于0.5,则认为是正样本;如果小于0.3,则认为是负样本。
(2)运行train.sh。该程序使用AlexNet[9]在AFLW数据库上继续训练,训练后得到的模型为alexNet__iter_60000.caffemodel[7]。
(3)参考文献[10]将全连接层通过改变参数改成卷积层。
(4)最后运行test.py。该程序可以得到每张图片的热度图,通过热度图定位人脸区域。
如果读者对检测结果不是很满意,则可以修改test.py里面的函数face_detection中参数factor的值和delim中的值,具体如下。
4.2.2 DDFD人脸检测算法的原理
使用AFLW数据库,对于每张图片来说,如果与检测到的人脸重叠面积大于0.5,则认为是正样本。所有图片缩放到227×227像素。作者通过使用预训练模型AlexNet Model和AFLW数据库进行调优训练,在调优过程中,设置最大迭代次数为50K,批处理大小为128个,其中96个为正样本,32个为负样本。
作者使用的网络结构与AlexNet网络类似,AlexNet网络包含8层,前5层为卷积层,后3层为全连接层。作者首先通过重新设置网络参数将最后三层全连接层改成了卷积层,这样就可以通过使用修改后的网络提取任何尺寸的图片的热度图。热度图中的每一个点代表存在面部区域的概率值,对应原来图片中227×227像素的区域。然后使用NMS(非最大值抑制)机制来最终确定人脸区域。最后对图片进行缩放,并分别对缩放得到的图片进行检测,从而得到最终的人脸区域结果。
4.2.3 DDFD人脸检测算法的检测结果
经过大量的测试发现,DDFD人脸检测算法能够很好地检测多角度人脸,但是检测结果中有很多噪声,根据文献[3]中提到的结论,该算法的检测效果应该是很好的。但是本书测试结果有很多噪声,可能是因为本书程序中训练的模型不好,或者test.py参数没有设置好。在图4-2中,我们呈现了一些有代表性的图片的检测结果。
图4-2 DDFD人脸检测算法的检测结果