DIY人脸跟踪电风扇送女朋友(3)
下面要重点介绍一下深度学习技术以及yolov3目标检测网络
深度学习技术:
深度学习技术实际上是从早期的人工神经网络发展而来的。本质上就是用一个函数去拟合输入(图片)到结果(目标框)的映射。因为函数本身很复杂,无法直接求解,那就使用梯度下降的方式,寻找到函数映射错误最低的点。由于是一个黑盒优化,需要大量的输入图片和正确结果作为监督信号来进行梯度下降,所以深度学习的一个特点就是需要大量的标定数据。
Yolov3网络精简:
yolo系列是非常好的平衡了速度和精度的一个检测网络系列。其中Yolov3是目前使用的比较广泛的一个版本。有很多精简版本和改进版本。对于yolov3的精简主要有两部分,一部分是backbone的精简,一部分是检测头的精简。backbone可以直接使用轻量级的网络,head可以精简分支数目,例如将原生的3个分支减少为2个或者1个,并且使用dw卷积来替代原来的卷积,可以极大的节约参数规模和计算量。如下图所示:
这里推荐几个开源的yolo v3精简项目,已经做的比较好,我们可以直接基于这些项目进行训练。
来自 <https://github.com/dog-qiuqiu/Yolo-Fastest>
来自 <https://github.com/dog-qiuqiu/MobileNet-Yolo/tree/master/MobileNetV2-YOLOv3-Nano>
来自 <https://github.com/eric612/MobileNet-YOLO>
综合的对比下来,yolo-fastest的效果是最好的,我们就使用yolo-fastest。其网络结构图如下:
收集人脸数据:
这里我们使用开源的fddb数据集,这个数据集有很多人脸图片,但是唯一的遗憾是使用了椭圆框来标注,这对于我们的检测来说是不匹配的。一般深度学习用来做目标检测输出的都是矩形框,所以我们需要对开源的fddb标签进行转换,转换成矩形框,才能进行接下来的训练。如下图所示,红色的为原始的标签框,需要手动转换成蓝色的矩形框。为了方便大家,我已经将转换好的fddb数据上传到网盘,有需要的可以下载使用:
链接:https://pan.baidu.com/s/1B_ZGY6UD1ALGi_kEYEeVeQ
提取码:o7yi
为了在树莓派上实时的运行人脸检测,需要对yolov3进行精简,主干网络可以使用轻量级网络,例如Mobilnetv2,shufflenet或者efficeentlite等,对于检测分支,可以尽量使用dw卷积,另外可以删除不必要的分支,留下一个或者两个分支即可。
训练
前面我们选择了yolo-fastest这个框架,那么按照其官方的流程说明,再结合我放在百度云盘上的fddb数据集,很容易可以训练出一个人脸检测的模型出来,效果还不错。
部署
接下来就是对训练出来的模型进行部署。可以选择的第三方库比较多,例如MNN,NCNN等。我们这里选择ncnn,因为它出来的比较早,而且支持的网络比较多。将训练好的模型转换到ncnn支持的模型,然后部署到我们的树莓派中。这里要注意的是,ncnn转换出来的模型是使用c++接口调用的,而我们在树莓派上使用的时候,用的是python,所以需要将ncnn的模型进行一次封装,支持python的调用。后面我会把所有代码都上传github,下载下来可以直接使用python进行检测。