最近在微信公众号里看到轻量级人脸检测算法大盘点的文章,里面还提供了github源码地址,我就把它们逐个下载到本地win10-cpu机器上,调试通过运行。去年在github下载过一个包含6种人脸检测的程序,分别是pyramidbox,dsfd,s3fd,tinyface,facebox,mtcnn,但是这些算法大多是重量级的网络模型,它在一幅图片上的人脸检测结果和运行耗时统计直方图如下

可以看到pyramidbox,dsfd,s3fd,tinyface这4个模型是非常耗时的,对于比赛刷榜,我们可以用这种很大的模型,但是在工业界非常不实用,假如要部署到 ARM 的嵌入式设备上,大概率直接卡死。

因此我就整理了最近一年之内的轻量级人脸检测算法的程序,独立编写一个包含多种轻量级人脸检测算法集合的程序。pytorch是我最喜欢的深度学习框架,在部署模型的前向推理时,我更喜欢用opencv的dnn模块。因而,我收集到的轻量级人脸检测算法的程序如果是基于pytorch框架的,我就不会对代码做较大的改动,如果程序是基于caffe,tensorflow或者darknet的,我会把程序改写成用opencv的dnn模块做人脸检测。最后我整理了10种人脸检测算法,它们分别是:

(1) Ultra-Light-Fast-Generic-Face-Detector,程序里简写为ultraface

(2) LFFD:A Light and Fast Face Detector for Edge Devices,程序里简写为lffdface

(3) CenterFace, 程序里简写为centerface

(4) DBFace, 程序里简写位dbface

(5) RetinaFace, 程序里简写为retinaface

(6) MTCNN, 程序里简写为mtcnn

(7) SSD, 程序里简写为ssdface

(8) facebox,程序里简写为facebox

(9) yoloface,程序里简写为yoloface

(10) 于仕琪老师提出的libfacedetection, 程序里简称为libface

此外,我编写的程序里还包含 PFLD: A Practical Facial Landmark Detector,它是一个简单、快速、超高精度人脸特征点检测算法。到此一共有10种人脸检测和1个人脸关键点检测的程序,我用面向对象的思想把每一种人脸检测算法写成一个类的形式,里面包含构造函数__init__和成员函数detect。最后,编写一个主函数,来做这10种人脸检测算法在同一幅图上的人脸检测结果和运行耗时的比较。我编写的这套程序在github上的地址是 

https://github.com/hpc203/10kinds-light-face-detector-align-recognition

我分别测试了两幅图片,第一幅图片的检测结果和运行耗时统计直方图如下

第2幅图片的检测结果和运行耗时统计直方图如下

其中facebox和retinaface分pytorch和dnn两种版本的,因此图上显示的是12种人脸检测网络的比较。这两幅测试图片有鲜明代表性,一幅是只有2个人脸,另一幅是有好多个人脸的。ssdface,retinaface的dnn版本,facebox的dnn版本和libface这4种人脸检测程序的运行速度最快,但是在有密集人脸的场景里,它们漏检了很多人脸。综合两幅图片的检测结果,考虑检测准确率和运行耗时的折中权衡,retinaface和lffdface是最优选择。retinaface运行耗时虽然比lffdface的要略长一点,但是retinaface的输出里有5个关键点。retinaface的dnn版本和libface的输入尺寸有320和640这两种选择,可以通过输入参数开控制尺寸的选择。如果不是在密集场景里做人脸检测,那么retinaface的dnn版本和libface是最佳选择。

在我的程序里还有提取人脸特征向量和计算人脸特征向量距离的模块,这两个模块再加上前面的人脸检测和关键点检测(做人脸对齐)的模块,这样就组成了人脸检测+人脸对齐+人脸识别,这时候你就可以构造一个实时的人脸识别系统。具体实现方式可以参见github代码里的README.md。程序有不足的地方,还请同行多多指教。

此外,我还编写了一套纯使用yolo系列的神经网络做人脸检测+人脸关键点检测,人脸关键点检测输出106个关键点,程序代码的地址是:https://github.com/hpc203/yoloface-landmark106

此外,根据AIZOO提供的已经训练好的使用SSD检测人脸口罩模型,我编写了一套使用opencv部署SSD检测人脸是否戴口罩的程序,程序包含C++和Python两种版本的实现。程序仅仅只依赖opencv库,就可以做深度学习目标检测,这套程序代码的下载地址是:https://github.com/hpc203/FaceMaskDetection-dnn

5月1日,我编写了一套yolov5检测人脸和关键点的程序,只依赖opencv库就可以运行,程序包含C++和Python两个版本的,我把代码发布在github上,地址是

https://github.com/hpc203/yolov5-face-landmarks-opencv 和 https://github.com/hpc203/yolov5-face-landmarks-opencv-v2

此外还有FCOS式的人脸检测器SCRFD,它也是检测人脸和关键点。在10月17日,我编写了一套使用OpenCV部署SCRFD人脸检测的程序,依然是包含C++和Python两个版本的。我把代码发布在github上,地址是

https://github.com/hpc203/scrfd-opencv

在11月6日,我在github发布了使用OpenCV部署libface人脸检测和SFace人脸识别,包含C++和Python两种版本的程序,仅仅只依赖OpenCV库就能运行。源码地址是:

https://github.com/hpc203/libface-sface_detect-recognition-opencv

人脸检测和人脸识别模块是由人脸识别领域的两位大牛设计的, 其中人脸检测是南科大的于仕琪老师设计的,人脸识别模块是北邮的邓伟洪教授设计的。 人脸检测示例程序在opencv-master/samples/dnn/face_detect.cpp里,起初我在win10系统里,在visual stdio 2019 里新建一个空项目,然后把opencv-master/samples/dnn/face_detect.cpp拷贝进来作为主程序,尝试编译,发现编译不通过。 仔细看代码可以发现face_detect.cpp里使用了类的继承和虚函数重写,这说明依赖包含了其他的.cpp和.hpp头文件的。因此我就编写一套程序, 人脸检测和人脸识别程序从opencv源码里剥离出来,只需编写一个main.cpp文件,就能运行人脸检测和人脸识别程序。于仕琪老师设计的libface人脸检测,有一个特点就是输入图像的尺寸是动态的,也就是说对输入图像不需要做resize到固定尺寸,就能输入到 神经网络做推理的,此前我发布的一些人脸检测程序都没有做到这一点,而且模型文件.onnx只有336KB。因此,这套人脸检测模型是 非常有应用价值的。在下载完代码之后,在visual stdio 2019里新建一个空项目,配置opencv,然后把main.cpp和weights文件拷贝进去,接下来编译运行就可以了。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐