查看原文
其他

超轻量级通用人脸检测模型

Linzaer 极市平台 2021-09-19

加入极市专业CV交流群,与6000+来自腾讯,华为,百度,北大,清华,中科院等名企名校视觉开发者互动交流!更有机会与李开复老师等大牛群内互动!

同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流。关注 极市平台 公众号 ,回复 加群,立刻申请入群~


作者:Linzaer

来源:https://github.com/Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB




该模型设计是针对边缘计算设备低算力设备(如用ARM推理)设计的一款实时超轻量级通用人脸检测模型,旨在能在低算力设备中如用ARM进行实时的通用场景的人脸检测推理,同样适用于移动端环境(Android & IOS)、PC环境(CPU & GPU )。有如下几个特点:


  • 在模型大小方面,默认FP32精度下(.pth)文件大小为 1.1MB,推理框架int8量化后大小为 300KB 左右。

  • 在模型计算量方面,320x240的输入分辨率下仅 90~109 MFlops左右,足够轻量。

  • 模型设计有两个版本,version-slim(主干精简速度略快),version-RFB(加入了修改后的RFB模块,精度更高)。

  • 提供了320x240、640x480不同输入分辨率下使用widerface训练的预训练模型,更好的工作于不同的应用场景。

  • 无特殊算子,支持onnx导出,便于移植推理。



测试过正常的运行环境


  • Ubuntu16.04、Ubuntu18.04、Windows 10

  • Python3.6

  • Pytorch1.2

  • CUDA10.0 + CUDNN7.6



精度、速度、场景测试、模型大小比较


训练集是使用Retinaface提供的清理过的widerface标签配合widerface数据集生成VOC训练集(PS:以下测试结果均为本人测试,结果可能有部分出入)。

(  Retinaface链接:https://github.com/deepinsight/insightface/blob/master/RetinaFace/README.md


Widerface测试


  • 在WIDER FACE test集测试精度(单尺度输入分辨率:320*240)


  • 在WIDER FACE test集测试精度(单尺度输入分辨率:VGA 640*480)


终端设备推理速度


  • 树莓派4B MNN推理测试耗时 (单位:ms)(ARM/A72x4/1.5GHz/输入分辨率 : 320x240 /int8量化)


场景测试


  • 若干不同场景视频大致有效人脸检出数量测试(单位:个)(分辨率:VGA 640*480,阈值0.6) :


模型大小比较


  • 若干主流开源轻量级人脸检测模型大小比较 :



生成VOC格式训练集以及训练流程


  1. 下载widerface官网数据集或者下载我提供的训练集解压放入./data文件夹内:

    (1)过滤掉10px*10px 小人脸后的干净widerface数据压缩包 :百度云盘提取码:x5gt. ( 百度云盘提取码:x5gt. 链接:https://pan.baidu.com/share/init?surl=m600pp-AsNot6XgIiqDlOw )

    (2)未过滤小人脸的完整widerface数据压缩包 :百度云盘提取码:8748.( 百度云盘提取码:8748. 链接:https://pan.baidu.com/share/init?surl=ijvZFSb3l7C63Nbz7i6IuQ


  2. PS:如果下载的是过滤后的上述(1)中的数据包,则不需要执行这步) 由于widerface存在很多极小的不清楚的人脸,不利于高效模型的收敛,所以需要过滤,默认过滤人脸大小10像素*10像素以下的人脸。运行./data/wider_face_2_voc_add_landmark.py

python3 ./data/wider_face_2_voc_add_landmark.py


程序运行和完毕后会在./data目录下生成 wider_face_add_lm_10_10文件夹,该文件夹数据和数据包(1)解压后相同,完整目录结构如下:


data/
retinaface_labels/
test/
train/
val/
wider_face/
WIDER_test/
WIDER_train/
WIDER_val/
wider_face_add_lm_10_10/
Annotations/
ImageSets/
JPEGImages/
wider_face_2_voc_add_landmark.py
  1. 至此VOC训练集准备完毕,项目根目录下分别有 train_mb_tiny_fd.sh 和 train_mb_tiny_RFB_fd.sh 两个脚本,前者用于训练slim版本模型,后者用于训练RFB版本模型,默认参数已设置好,参数如需微调请参考 ./train.py 中关于各训练超参数的说明。

  2. 运行train_mb_tiny_fd.sh和train_mb_tiny_RFB_fd.sh即可

sh train_mb_tiny_fd.sh 或者 sh train_mb_tiny_RFB_fd.sh



时检测图片效果(输入分辨率:640x480




PS


  • 若生产实际场景为中近距离、人脸大、人脸数少,则建议采用输入尺寸input_size:320(320x240)分辨率训练,并采用320x240图片大小输入进行预测推理,如使用提供的预训练模型Mb_Tiny_RFB_FD_train_input_320.pth进行推理。

  • 若生产实际场景为中远距离、人脸中小、人脸数多,则建议采用:


(1)最优:输入尺寸input_size:640(640x480)分辨率训练,并采用640x480图片大小或者更大输入尺寸进行预测推理,如使用提供的预训练模型Mb_Tiny_RFB_FD_train_input_640.pth进行推理,更高的召回,更低的误报。


(2)次优:输入尺寸input_size:320(320x240)分辨率训练,并采用640x480图片大小输入进行预测推理,这样对于小人脸更敏感,但是误报会增加。


  • 各个场景的最佳效果需要调整输入分辨率从而在速度和精度中间取得平衡。

  • 过大的输入分辨率虽然会增强小人脸的召回率,但是也会提高大、近距离人脸的误报率,而且推理速度延迟成倍增加。

  • 过小的输入分辨率虽然会明显加快推理速度,但是会大幅降低小人脸的召回率。

  • 生产场景的输入分辨率尽量与模型训练时的输入分辨率保持一致,上下浮动不宜过大。



TODO LIST


  • 加入widerface测试代码

  • 完善部分测试数据

  • 添加MNN、NCNN C++推理代码



Reference


  • pytorch-ssd (链接:https://github.com/qfgaohao/pytorch-ssd)

  • libfacedetection(链接:https://github.com/ShiqiYu/libfacedetection/ )

  • RFBNet  (链接:https://github.com/ruinmessi/RFBNet)

  • RFSong-779 (链接:https://github.com/songwsx/RFSong-779 )

  • Retinaface (链接:https://github.com/deepinsight/insightface/blob/master/RetinaFace/README.md )



-End-


*延伸阅读




人脸检测交流群


添加极市小助手微信(ID : cv-mart),备注:研究方向-姓名-学校/公司-城市(如:目标检测-小极-北大-深圳),即可进群。(已经添加小助手的好友直接私信)


△长按添加极市小助手


其他方向如目标检测、目标跟踪、工业检测、医学影像、三维&SLAM、图像分割等,也可扫码添加极市小助手拉你进群,更有每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流,一起来让思想之光照的更远吧~



△长按关注极市平台


觉得有用麻烦给个在看啦~  

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存