一般我们作face detection最常用的选择无非是OpenCV的Cascade classifier,如果要求高辨识率,那么效果较好的Dlib则是考虑的选项,但,您有想过改用深度学习(CNN)方式来检测人脸吗?
使用Cascade classifier或Dlib的Face detection侦测脸孔的痛苦,就在于一些低照度场所或者非正面的角度经常检测失败,将背景误报为人脸的情况更是屡见不鲜,这类问题尤以OpenCV 的Cascade classifier为甚,不过,透过deep learning方式相信可大幅减少这类的情况。
下面介绍如何用YOLO来训练face detection,至于一般人所关心的face dataset从何而来?那就让系统自动产生吧,我们可以先透过OpenCV或Dlib检测出脸孔后,写支程式将这些脸孔区域产生VOC格式的xml档案,所以我们不需要费力的label照片,比较花时间的,反而是事后针对OpenCV或Dlib所自动label的脸孔进行review,以避免没有未检测出或误报的错误资料
使用Dlib取得人脸并自动label
我特地撰写了三个工具,分别针对实时影像、影片、相片取得大量的脸孔相片并进行自动face labeling。这三支程式都会自动识别影像中是否有人脸,若有的话便产生VOC xml格式的label档,并且将image档及label档放置于指定的资料夹中。
1.grep_faces_from_webcam.py
只要执行该代码,web camera便会持续的进行摄影、辨识、label人脸,并产生可用于训练的人脸dataset。
2.grep_faces_from_video.py
你可以给它一个资料夹路径,里面放置各类型的影片(mp4, mov, avi…等),该代码会把所有影片中所能抓出的人脸制作成人脸dataset。
3.grep_faces_from_image.py
与上一支代码类似,但资料夹路径里面放置的是各类型的图片(jpg, png, bmp…等),该程式会把该资料夹中所有能抓出的人脸制作成人脸dataset。
代码说明:
将Dlib传回的face bounding box资讯写入VOC xml template。
VOC XML范本:由两个部份所组成
xml_object.txt为xml_file.txt的一部份,位于<segmented>标签后方,定义了相片中每一个bbox的左上角(x, y)及右下角(x, y)。
xml_file.txt
xml_object.txt
开始训练
1.准备face dataset
利用上述的三种代码,产生了3,042张已自动label完成的人脸dataset。
资料夹 Images/
资料夹 labels/
2.开始YOLO训练
直接使用我写好的YOLO快速训练script:
git clone https://github.com/ch-tseng/makeYOLOv3
编辑train.py,修改下列参数:
path的分隔字元(for Windows和Linux users)
folderCharacter = “/"
dataset的xml档案路径(VOC format)
xmlFolder = “您的label资料夹path"
dataset的image档案路径
imgFolder = “您的images资料夹path “
你所label的class列表,请修改为您用于label脸的名称。
classList = { “face":0 }
指定转换后的YOLO training dataset的放置路径,建议与您的images资料夹path平行。
(若无此folder程式会自动create)
saveYoloPath = “/XXX/XXX/yolo"
要产生那一版YOLO model(yolov3或yolov3-tiny)
modelYOLO = “yolov3-tiny"
dataset要分出多少比例作为test dataset?
testRatio = 0.2
要产生的YOLO cfg目录及相关档案名称
(若无此folder程式会自动create)
cfgFolder = “cfg.yoloface"
cfg_obj_names = “obj.names"
cfg_obj_data = “obj.data"
训练时每个batch及subdivision的数量,亦即每次会取numBatch除上numSubdivision个image来训练,若您的GPU RAM不够大,建议您可调整此两个值。
numBatch = 24
numSubdivision = 8
darknet执行档的path
darknetEcec = “../darknet/darknet"
3.修改完上述的参数后,便可以执行python3 train.py开始训练YOLO的脸部孔侦测模型了。
测试比较
我们找一个影片,然后同步执行OpenCV的cascade classifier、Dlib的face detect以及刚刚训练好的YOLO侦测脸孔模型,三个同时来比较看看YOLO的脸孔侦测效果如何。
首先,我们发现YOLO很平顺不间断的持续侦测框选影片中的脸孔,Dlib及OpenCV则偶尔中断,OpenCV尤其严重。此外,YOLO的泛化能力相当强,也就是它能学习到物体的generalizable representations,比如,在下方的影格中可看出YOLO比起另外两种更能准确的侦测到所有的人脸:
最后
当我们需要高人脸检出率,且硬体资源有GPU可使用时,采用YOLO是相当不错的选择,除了可侦测脸部外,同时间,还能侦测其它物件,创造出不同的应用。
除了脸部,我们还能利用Dlib提供的68点facial landmarks来训练YOLO侦测脸部各个五官的位置,这部份待未来再续。
在这里推荐一个谷歌的人脸检测开发套件——AIY Vision Kit。谷歌AIY Vision Kit(视觉套件)可以处理图像识别和计算机视觉, 支持离线识别上千种常见物体(动物、植物)以及人脸、面部表情等,可以使用机器学习查看和识别对象。所有这些都装在一个方便的小纸板盒子里,由Raspberry Pi和Intel movidius提供动力。而且这款套件附带了大量开箱即用的示例模型,用户离线即可使用。