文章目录
【精华】最强六大开源轻量级人脸检测项目分析
随着深度学习的兴起,工业界和学术界越来越多的使用基于深度学习的方法,而不是传统的基于模板匹配,纹理提取或者像素积分图等方法。因为人脸检测本身并不属于特别复杂的任务,因此轻量级的深度学习模型即可满足该任务。本文汇总了六大开源的人脸检测项目。
虽说深度学习是个黑箱,但基于深度学习的通用目标检测算法(例 如 Faster-RCNN,SSD,YoloV3、 RetinaNet 等)的检测效果和鲁棒性,远远的超过基于纹理、边缘、Harr 特征、Sift 特征的传统计算机视觉方法,而且近几年随着模型压缩、量化技术的进步,模型运行速度也越来越快。
对于通用的目标检测算法,以大家常用的 SSD 和 YoloV3 算法为例,因为算法在设计之初,是为 Pascal VOC 或者 COCO 这种 20 类 和 80 类的多类别任务设计的,因此其 backbone 网络,也就是特征提取网络一般使用 VGG16、Darknet53、ResNet18 这种网络,这些网络的一个通用特点是,其卷积层的卷积核数目通常比较多(例如 256,512),导致模型参数量动辄几千万,运算量巨大。
如果我们拿这些通用目标检测算法来检测一类,比如只检测人脸、行人或者车辆时,使用那么多的卷积核数量、那么深的网络其实是不必要的。如果要检测 80 个类别,可能需要更多参数量来拟合,但是对于一两个类别,其实是有点杀鸡用宰牛刀了,如果你的任务不复杂,却用了 ResNet18/34 这种网络,你会发现很多卷积核的激活,其实是 0,导致白白多增加了很多计算量。所以,针对特定的人脸检测任务,其实一些非常轻量级的网络即可满足任务要求。
对于比赛刷榜,我们可以用很大的模型,例如某 AI 公司在 WiderFace 上夺冠的模型,结构用 RetinaNet,backbone 用 ResNet152,另外,FPN 结构也安排上,多模型融合安排上,更多的 anchor 组数安排上,这样的模型对于刷榜非常实用,但是在工业界非常不实用,假如要部署到 ARM 的嵌入式设备上,大概率直接卡死。
随着 AI 落地为王时代的到来,大家越来越注重精度和速度的权衡(trade off),本文精选了六大轻量级的开源人脸检测项目,并对其进行简单赏析和介绍。
言归正传,下面我们按照 Github 上 star 数目从高到低依次介绍。
1 libfacedetection
Github star: 9.3k
作者:于仕琪
链接:https://github.com/ShiqiYu/libfacedetection
模型参数量:232 万,体积 3.34M
前几天元峰已经对该项目进行过一次介绍了,该项目使用一个 SSD 架构的人脸检测模型,在酷睿 i7 的 CPU 上,320x240 分辨率下可以达到 296.21 FPS,下图是该项目在不同分辨率和单线程下的速度概览。
模型结构也比较简单,就是一个轻量级的 SSD 架构,共四个定位层,而且借鉴了 RetinFace 的关键点方法,可以同时回归 5 个关键点。模型体积只有 232 万,体积仅有 3.34M
该项目的最大亮点,其实是于老师搞了一个纯 C++ 的推理版本,不依赖第三方深度学习库,非常有利于工程部署。
2 Ultra-Light-Fast-Generic-Face-Detector-1MB
Github star: 4.7k
作者:Linzaer
链接:https://github.com/Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB
体积:1.04M, int8 量化后 300KB
该模型是针对边缘计算设备设计的人脸检测模型。并提供了精简网络和 RFB 网络两种,在 320x240 的输入分辨率下 90~109 FPS 左右。
该模型的结构与上述于老师的模型结构非常相似,也是 SSD 架构,共有 4 个定位层,模型结构如下图所示。
另外,该项目提供了 NCNN、MNN、Caffe、Onnx、Opencv 的推理代码,可以给我们部署项目提供大量参考样例。
3 A-Light-and-Fast-Face-Detector-for-Edge-Devices
Github star: 897
作者:YonghaoHe
链接:https://github.com/YonghaoHe/A-Light-and-Fast-Face-Detector-for-Edge-Devices
体积:6.1 M
从名字可以看出来,这也是一个面向边缘设备的检测模型,该模型同样是 SSD 架构的,不过相比前述两个模型,该模型有八个定位层,分别对应 tiny、small、medium 和 large 四个尺度,backbone 网络共有 25 个卷积层。
该模型在 Nvidia TX2 下,320x240 分辨率下可以达到 50.92 FPS。
另外,该 repo 还提供了人头检测、行人检测、车辆检测的代码和模型。
4 CenterFace
Github star: 607
作者:Star-Clouds
链接:https://github.com/Star-Clouds/CenterFace
体积:7.3 M、同精度小模型 2.3M
CenterFace 是 anchor free 的模型结构,应该算是 CenterNet 针对人脸检测任务的特例,这一点上跟 RetinaFace 作为 RetinaNet 的在人脸任务的特例有异曲同工之妙,而且该模型同时回归了五个关键点。
该网络的 backbone 是 MobileNetV2,额外添加了 FPN 结构。
下图是 CenterFace 的速度,在 2080TI 上可以仅 4.4ms。Anchor Free 的模型,没有 NMS 的过程,也能节省很多后处理时间。
5 DBFace
Github star: 195
作者:dlunion
链接:https://github.com/dlunion/DBFace
体积:7.03M
DBFace 是一个 Anchor Free 的网络结构,模型原理可以说与 CenterFace 非常相似。这里不再展开详细的介绍了。
6 RetinaFace MobileNet0.25
Github star: 不好定义(6.4k)
作者:yangfly
链接:https://github.com/deepinsight/insightface/issues/669
体积:1.68M
这个项目来自于知名的 InsightFace 项目,该项目在 Github 有 6.4k star,InsightFace 提出了知名的 RetinaFace、ArcFace 算法,而且开源了详细的训练代码和预训练模型,可以说是非常良心的开源项目。
但是 RetinaFace(应该是受 RetianNet 的结构启发而成)本身的 backbone 是 ResNet50,yangfly 大佬将其替换为了 MobileNet0.25,模型大小仅 1.68MB。RetinaFace 的模型结构如下,这里的 backbone 网络是 MobileNet 0.25。
根据作者的开源结果,我们对以上 6 大开源轻量级人脸检测做一个速度和准确度的对比汇总。
名称 | 模型大小(MB) | 速度(FPS) | WiderFace Easy | WiderFace Medium | WiderFace Hard |
---|---|---|---|---|---|
libfacedetection | 3.34 | 296(i7CPU, 320x240) | 0.773 | 0.718 | 0.485 |
UltraLightFace | 1.04 | 109( 320x240) | 0.853 | 0.819 | 0.539 |
LightFast | 5.81 | 131(Titan xp, 640x480) | 0.910 | 0.881 | 0.780 |
CenterFace | 7.3 | 227(2080TI,640x480) | 0.931 | 0.924 | 0.870 |
DBFace | 7.03 | 0.905 | 0.896 | 0.794 | |
RetinaFace MobileNet0.25 | 1.68 | 0.887 | 0.87 | 0.791 |