![e7dfc8d0ab2a10cac8f6c24048c6f472.gif](https://i-blog.csdnimg.cn/blog_migrate/17679ec644ffb9e995b77ea5c38cfe7c.gif)
极市导读
本文整理了最近一年之内的轻量级人脸检测算法,独立编写一个包含多种轻量级人脸检测算法集合的程序,对它们进行了汇总整理,以及效果的对比。共有10种人脸检测和1个人脸关键点检测。>>加入极市CV技术交流群,走在计算机视觉的最前沿
最近在AIZOO 里看到轻量级人脸检测算法大盘点的文章,里面还提供了Github源码地址,我就把它们逐个下载到本地Win10-CPU机器上,调试通过运行。
Github链接:https://github.com/hpc203/10kinds-light-face-detector-align-recognition
去年在Github下载过一个包含6种人脸检测的程序,分别是Pyramidbox,DSFD,S3FD,TinyFace,FaceBox,MTCNN,但是这些算法大多是重量级的网络模型,它在一幅图片上的人脸检测结果和运行耗时统计直方图如下。
运行效果如下图所示:
![8d55081c75cf348ce5882e29fafd28fe.png](https://i-blog.csdnimg.cn/blog_migrate/224f36be6414652c6b3a4d91c02d6553.png)
耗时效果统计对比:
![ecbcf00757afe99a96b54861d418db4c.png](https://i-blog.csdnimg.cn/blog_migrate/ad6b64a05d3b47a16814090c4d35cef3.png)
可以看到PyramidBox,DSFD,S3FD,TinyFace这4个模型是非常耗时的,对于比赛刷榜,我们可以用这种很大的模型,但是在工业界非常不实用,假如要部署到 ARM 的嵌入式设备上,大概率直接卡死。
因此我就整理了最近一年之内的轻量级人脸检测算法的程序,独立编写一个包含多种轻量级人脸检测算法集合的程序。PyTorch是我最喜欢的深度学习框架,在部署模型的前向推理时,我更喜欢用Opencv的dnn模块。因而,我收集到的轻量级人脸检测算法的程序如果是基于PyTorch框架的,我就不会对代码做较大的改动,如果程序是基于Caffe, Tensorflow或者Darknet的,我会把程序改写成用Opencv的dnn模块做人脸检测。最后我整理了10种人脸检测算法,它们分别是:
Ultra-Light-Fast-Generic-Face-Detector,程序里简写为ultraface
LFFD:A Light and Fast Face Detector for Edge Devices,程序里简写为lffdface
CenterFace, 程序里简写为centerface
DBFace, 程序里简写位dbface
RetinaFace, 程序里简写为retinaface
MTCNN, 程序里简写为mtcnn
SSD, 程序里简写为ssdface
facebox,程序里简写为facebox
yoloface,程序里简写为yoloface
于仕琪老师提出的libfacedetection, 程序里简称为libface
此外,我编写的程序里还包含 PFLD: A Practical Facial Landmark Detector,它是一个简单、快速、超高精度人脸特征点检测算法。到此一共有10种人脸检测和1个人脸关键点检测的程序,我用面向对象的思想把每一种人脸检测算法写成一个类的形式,里面包含构造函数__init__和成员函数detect。最后,编写一个主函数,来做这10种人脸检测算法在同一幅图上的人脸检测结果和运行耗时的比较。我编写的这套程序在github上的地址是
https://github.com/hpc203/10kinds-light-face-detector-align-recognition
我分别测试了两幅图片,第一幅图片的检测结果和运行耗时统计直方图如下:
耗时对比如下图:
![88a716eacfd825ccd9d75c688fb5365c.png](https://i-blog.csdnimg.cn/blog_migrate/f5151243c8b8bee82e1d142bbbbff984.png)
第2幅图片的检测结果和运行耗时统计直方图如下:
耗时对比如下图:
![547606ea65a4b9da36151f09e9f97be9.png](https://i-blog.csdnimg.cn/blog_migrate/393445aec4ddb9a3e135635ac2713d3d.png)
这两幅测试图片有鲜明代表性,一幅是只有2个人脸,另一幅是有好多个人脸的。ssdface和libface的运行速度最快,但是在有密集人脸的场景里,它们漏检了很多人脸。综合两幅图片的检测结果,考虑检测准确率和运行耗时的折中权衡,retinaface和lffdface是最优选择。retinaface运行耗时虽然比lffdface的要略长一点,但是retinaface的输出里有5个关键点。
在我的程序里还有提取人脸特征向量和计算人脸特征向量距离的模块,这两个模块再加上前面的人脸检测和关键点检测(做人脸对齐)的模块,这样就组成了人脸检测+人脸对齐+人脸识别,这时候你就可以构造一个实时的人脸识别系统。具体实现方式可以参见github代码里的README.md。程序有不足的地方,还请同行多多指教。
推荐阅读
OpenCV中支持的人脸检测方法整理与汇总
人脸关键点检测的数据集与核心方法发展综述
人脸关键点检测综述(含论文、数据集、方法等)
![f160bb5709b9aba46d233cb62e7566a2.png](https://i-blog.csdnimg.cn/blog_migrate/d9d6059d45ab1f4556e2a8c45da907a9.jpeg)
![9f68fc37f38417e5f062b95f86dcfa99.png](https://i-blog.csdnimg.cn/blog_migrate/31af766746f68d1320af20330702ebd2.png)
![2c456fd6a89801951620f72931418a28.gif](https://i-blog.csdnimg.cn/blog_migrate/448b30877326e56f50239c7f3f19af99.gif)