Ultra-Light-Fast-Generic-Face-Detector-1MB
1MB轻量级通用人脸检测模型
作者表示该模型设计是为了边缘计算设备以及低功耗设备(如arm)设计的实时超轻量级通用人脸检测模型。它可以用于arm等低功耗计算设备,实现实时的通用场景人脸。
检测推理同样适用于移动终端或pc机。
作者加入widerface测试代码,完善部分测试数据及添加MNN、NCNN C++推理代码等。
- 从模型大小来看,默认的fp32精度(.pth)文件大小为1.04~1.1MB,推理帧int8约为300KB。
- 在模型计算中,320x240的输入分辨率约为90~109mflops。
- 该模型有两个版本,版本slim(简化速度稍快)、版本rfb(带有修改后的rfb模块,精度更高)。
- 提供使用320x240和640x480不同输入分辨率的Widerface培训的预培训模型,以便更好地在不同的应用场景中工作。
- 支持onxx导出,易于移植推理。
作者测试过PC运行环境
- Ubuntu16.04、Ubuntu18.04、Windows 10(inference)
- Python3.6
- Pytorch1.2
- CUDA10.0 + CUDNN7.6
我们来看下速度、精度和模型大小对比数据
训练集是使用Retinaface提供的清洁过的Wideface标记以及Wideface数据集生成的,以生成VOC训练集(PS:以下测试结果由我本人测试,结果可能有所不同)。
Widerface测试情况
宽面测试集中的测试精度(单标度输入分辨率:320*240)
模型Easy SetMedium SetHard Setlibfacedetection v1(caffe)0.650.50.233libfacedetection v2(caffe)0.7140.5850.306官方 Retinaface-Mobilenet-0.25 (Mxnet)0.7450.5530.232version-slim0.7650.6620.385version-RFB0.7840.6880.418
宽面测试集中的测试精度(单刻度输入分辨率:VGA 640*480)
模型Easy SetMedium SetHard Setlibfacedetection v1(caffe)0.7410.6830.421libfacedetection v2(caffe)0.7730.7180.485官方 Retinaface-Mobilenet-0.25 (Mxnet)0.8790.8070.481version-slim0.7570.7210.511version-RFB0.8510.810.541
看看在树莓派推理速度
树莓pi 4b mnn推理测试时间(ms)(arm/a72x4/1.5ghz/输入分辨率:320x240/int8量化)
模型1核2核3核4核libfacedetection v12816129.7官方 Retinaface-Mobilenet-0.25 (Mxnet)462518.515version-slim2916129.5version-RFB3519.614.811
我们来看看模型大小数据比较
几种主流开源轻量级人脸检测模型的大小比较:
模型模型文件大小(MB)libfacedetection v1(caffe)2.58libfacedetection v2(caffe)3.34官方 Retinaface-Mobilenet-0.25 (Mxnet)1.68version-slim1.04version-RFB1.11
生成voc格式的训练数据集和训练流程
一、下载wideface官方网站数据集或下载我提供的培训集并将其提取到./data文件夹:
(1)过滤掉10px*10px面后干净的wideface数据压缩包
(2)完整的未过滤小面宽面数据压缩包
(注:如果下载上述(1)中的过滤包,则无需执行此步骤)
二、由于宽空间中有许多小而不清晰的面,不利于有效模型的收敛,因此需要进行过滤。训练时,默认值是过滤10像素x 10像素的脸大小。
运行./data/wide_face_2_voc_add_landmark.py
python3 ./data/wider_face_2_voc_add_landmark.py
程序运行并完成后,将在./data目录中生成更宽的
“u 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
三、VOC训练集已准备就绪,在项目的根目录中有两个脚本
train_mb_tiny_fd.sh和train_mb_tiny_rfb_fd.sh。
四、前者用于训练slim版本模型,后者用于训练rfb版本模型。已设置默认参数。有关微调,请参阅./train.py中每个训练超参数的说明。
运行train_mb_tiny_fd.sh和train_mb_tiny_rfb_fd.sh
sh train_mb_tiny_fd.sh 或者 sh train_mb_tiny_RFB_fd.sh
我们来看看几张分辨率为640*480的人脸检测效果图:
- 如果实际的生产场景是中距离、大面和小面,建议使用输入尺寸输入尺寸:320(320x240)分辨率训练,并使用320x240图像尺寸输入进行预测推理,例如使用提供的预训练模型。用于推理的mb_tiny_rfb_fd_train_320.pth输入。
- 如果实际的生产场景是中长距离、小面和大量面,建议:
- (1)最优:输入大小输入大小:640(640x480)分辨率训练,并使用相同或更大的输入大小进行预测推理,如使用提供的训练前模型mb_tiny_rfb_fd_train_640.pth进行推理,误报率更低。
- (2)次优:输入大小输入大小:320(320x240)分辨率训练,并使用480x360或640x480大小输入进行预测推理,对小脸更敏感,误报会增加。
- 每个场景的最佳结果都需要调整输入分辨率,以便在速度和精度之间取得平衡。
- 过大的输入分辨率会提高小人脸的召回率,但也会增加大、近距离人脸的误报率,推理速度会成倍增加。
- 输入分辨率过小会显著加快推理速度,但会大大降低小人脸的召回率。
- 制作场景的输入分辨率应尽量与模型训练的输入分辨率一致,上下浮动不宜过大。
相关数据集及代码大家可以在Github上找得到。