目录
1、场景需求
人脸检测可能是一个比较老的话题,你会发现网上有一大堆的state-of-art人脸检测算法。但是本文关注的是轻量级的人脸检测算法,主要的目的是将其应用到ARM等一些嵌入式设备中,在满足性能的同时获得实时的检测速度。通过大量的筛选之后,你会发现真正适合于ARM端的人脸检测算法屈指可数。下面就让我们进入正题吧。
2、libfacedetection
2.1 相关链接
2.2 算法简介
- 这是一个开放算法包,用于基于cnn 的图像人脸检测。cnn 模型已转换为c源文件中的静态变量。源代码不依赖于任何其他库。你需要的只是一个C++编译器。您可以在Windows、Linux、ARM 和任何平台上编译源代码,并使用C++编译器。
- SIMD指令用于加快检测速度。如果使用Intel CPU 或Neon for ARM,则可以启用AVX2。
2.3 算法效果展示
2.4 算法性能展示
上图展示了部分该算法的检测速度,640x480分辨率的图片在CPU上使用多线程可以获得81fps,基本上可以满足现实场景中的一些需要。除此之外,该算法在Cortex-A53 (ARMv8) 64-bit SoC @ 1.4GHz上使用多线程后的运行时间为174.89ms左右;如果使用ARM多核+NEON+INT8量化等有望达到实时的运行速度。
3、Ultra-Light-Fast-Generic-Face-Detector-1MB
3.1 相关链接
3.2 算法简介
该模型是针对边缘计算设备基于libfacedetection 替换压缩网络设计的轻
量人脸检测模型。该模型具有以下的特点:
- 在模型大小上,默认FP32 精度下(.pth)文件大小为1.04~1.1MB,推理框
架int8 量化后大小为300KB 左右; - 在模型计算量上,320x240 的输入分辨率下90~109 MFlops 左右;
- 模型有两个版本,version-slim(主干精简速度略快),version-RFB(加入了
修改后的RFB 模块,精度更高); - 提供320x240、640x480 不同输入分辨率下使用widerface 训练的预训练模型,
更好的工作于不同的应用场景; - 支持onnx 导出,便于移植推理。
3.3 算法效果展示
3.4 算法性能展示
上图展示了该算法的运行速度和模型大小。通过观察,我们可以得出该算法模型大小仅有1M左右,小于libfacedetection算法;除此之外,320x240大小的输入在ARM A72x4的设备上的运行时间是11ms左右,运行的速度大概是100fps,达到了实时性的要求。
4、BlazeFace
4.1 相关链接
4.2 算法简介
BlazeFace,一种轻量级且性能良好的人脸检测器,专门用于ARM GPU 推理。它在ARM设备上以 200–1000+fps 的速度运行。这种超实时性能使其能够应用于任何需要精确的面部感兴趣区域作为任务特定模型(如 2d/3d 面部关键点或几何估计、面部特征或表情分类和面部区域分割)增强现实等。我们的贡献包括一个轻量级的特征提取网络,但不同于 MobileNetV1/V2,一个 基于SSD的GPU 友好的anchor机制,和一个改进的 分辨率策略替代NMS。
4.3 算法效果展示
4.4 算法性能展示
上图展示了该算法的运行速度,通过观察我们可以得出:1)改进的BlazeFace算法比原始的MobileNet-V2速度更快,大约提升了3倍左右;2)BlazeFace的检测速度很快,在Huawei P20上面的运行时间是5.8ms。
5、FaceBoxes
5.1 相关链接
5.2 算法简介
FaceBoxe是一种新的人脸检测方法,称之为 FaceBoxe,它在速度和准确度上都具有优异的性能。此外,FaceBoxes 的检测速度和人脸的个数无关。该算法在单核 CPU 上的运行速度是 20FPS,在 VGA 分辨率的 GPU 上面的速度是 125FPS。
5.3 算法效果展示
5.4 算法性能展示
上图展示了FaceBoxe算法的性能。与MTCNN相比,该算法具有更高的mAP值;除此之外,该算法在E5-2660V3CPU上面可以获得20fps的运行速度,如果采用OpenVIO进行优化加速之后,应该可以获得更加惊艳的效果。
6、RetinaFace
6.1 相关链接
6.2 算法简介
RetinaFace 是一种鲁棒的单阶段人脸检测算法,该算法联合外部监督和自监督的多任务学习来在不同尺度的人脸图片上进行精确定位,通过使用轻量级骨干网,RetinaFace 可以实时运行在单个 CPU 核上。
6.3 算法效果展示
6.4 算法性能展示
上图展示了RetinaFace算法的性能。通过观察我们可以发现,当使用MobileNet-v2作为Backbones时,640x480的输入图片在ARM上的运行时间为61.2ms,即运行的速度为16fps,这个速度基本可以满足某些场景的需要。
7、LFFD
7.1 相关链接
7.2 算法简介
LFFD 是一种用于边缘器件的轻量且快速的人脸检测算法。LFFD 在准确度和时延上都有很大的平衡,不仅模型体积小,而且具有较快的推理速度,同时可以获得较高的准度。在实际应用中,我们已经将其部署在云和边缘设备(如nvidia jetson 系列和基于ARM 的嵌入式系统)中。实际上,LFFD 是一个通用的检测框架,适用于多个类型的检测,如人脸检测、行人检测、头部检测、车辆检测等。一般来说,长边和短边的平均比率小于5 的对象适合使用该算法进行检测。
7.3 算法效果展示
7.4 算法性能展示
上图展示了LFFD算法的性能。640x480的图片输入到ARM设备中,该算法的运行时间为4114.15ms,和前面的几个算法相比,这个算法的运行速度相对来说比较慢,我测试过该算法在Android设备上面的速度,还是可以满足 一些对时间要求不是很苛刻的场景。
8、EagleEye
8.1 相关链接
8.2 算法简介
EagleEye,在低功耗的设备上在速度和精度之间达到了很好的折衷。EagleEye 具有低的 FLOPS 的同时具有低的容量。论文中提出了五种策略来提升算法的速度和精度,主要包括卷积分解、设计了一个高效的上下文模块,Focal loss 等。
8.3 算法效果展示
8.4 算法性能展示
上图展示了EagleEye算法的性能。精度方面而言,该算法比MTCNN的mAP值高出了2个点;速度方面而言,640x480的输入在ARM设备中的运行时间为20fps,基本能够满足现实场景的需要;模型大小方面而言,该算法的模型参数为0.23M,模型大小为1M左右,内存占用率为13.9M。
参考资料
[1] libfacedetection
[2] Ultra-Light-Fast-Generic-Face-Detector-1MB
[3] blazeface
[4] FaceBoxes
[5] RetinaFace
[6] LFFD
[7] EagleEye
注意事项
[1] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:[email protected]),我会在第一时间回复大家,谢谢大家的关注.
[2] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。
[3] 如果您在阅读本博客时遇到不理解的地方,希望您可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。
[4] 本文测试的图片可以通过该链接进行下载。网盘链接- 提取码:xh2i。
[5] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊,备注“项目”!!!