如何使用CNN來检测人脸?这里有个简单易学的教程!

一般我们作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提供动力。而且这款套件附带了大量开箱即用的示例模型,用户离线即可使用。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值