DBFace,被《机器之心》扒出来的轻量级高精度人脸检测模型
深兰科技上周末,一篇题为《模型仅有7M:轻量级高精度人脸识别方法DBFace》的文章在国内头部的专业人工智能媒体《机器之心》上首发后,即被新浪科技、CSDN、机器学习研究会等多家科技/垂直类(自)媒体进行了转载。
而对DBFace这个名字,业内人士更是很容易就能联想到人工智能头部企业深兰科技(DeepBlue)。果不其然,这个模型的创建者,这是来自深兰科技下属深兰科学院算法研究所的两位“高手”——刘安奇、杜金伟。
据了解,该模型起初只是被放在了Github上,没想到被《机器之心》扒了出来,而且短短3天时间,这个开源的模型就新增了近300次使用。
今天,就跟随这两位算法大咖,一起来看看DBFace是如何诞生的。
1. 网络选择
DBFace的初衷是设计一款轻量级的人脸检测器,能够在边缘计算上有效的使用,加上因为疫情缘故,对于hard类(例如戴上口罩)人脸检测显得尤为重要。因为CenterNet具有后处理的简洁高效性,以及对小目标友好等特点。综合性能和速度的考虑下,我们选择了CenterNet结构做检测任务, 采用MoblienetV3做backbone。相较于MobilenetV2, MobilenetV3在其基础上新增了 SE 、Hard-Swish Activation等模块,兼顾Infernce速度的同时并提升网络性能 。结构如下:
对于任务头的设计,我们引入了SSH的DetectModule和ContextModule,经实验验证该模块能有效的提升DBFace算法的检出性能
对于上采样设计,我们采用Upsample+Conv+Act的方式,避免使用反卷积造成可能的锯齿问题
2.Loss定义
整个网络由三部分Loss组成:热力图(HeatMap)损失, 位置坐标偏移量(BoundingBox)损失,关键点(Landmark)损失
2.1 HeatMap 损失:Focal Loss
Focal loss,该损失函数是在标准交叉熵损失基础上修改得到的。可以通过减少易分类样本的权重,使得模型在训练时更专注于难分类的样本,从而能有效的缓解类别不均衡带来的网络注意力偏差问题
这里γ取2,y=1时,α为正样本的权重,参照CenterNet,定义为目标周围半径处3*3范围为1,其他为0,目的是加强正样本的训练权重。y=0时,α为(1 - gt)4,此时GT是一个基于目标计算的椭圆高斯图,参照TTFNet(Training-Time-Friendly Network for Real-Time Object Detection)
2.2 位置坐标偏移量损失: GIoU Loss
目前大部分目标检测中主流的边界框优化采用的都是BBox的回归损失(MSE loss, L1-smooth loss等),该种方式通过距离计算损失值,从而忽略了检测框本身最显著的性质IoU。如下图所示,在L1及L2范数取到相同的值时,实际上检测效果却是差异巨大的,直接表现就是预测和真实检测框的IoU值变化较大,这说明L1和L2范数不能很好的反映检测效果。
通过IOU作为Loss来优化任务,其缺点在于:
a.预测框bbox和ground truth bbox如果没有重叠,IOU就始终为0并且无法优化。其损失函数失去了可导的性质。
b.IOU无法分辨不同方式的对齐,例如方向不一致等情况
GIOU则能很好的解决上面两个问题
假设现在有两个任意的bbox A和B,我们要找到一个最小的封闭形状C,让C可以将A和B包围在里面,然后我们计算C中没有覆盖A和B的面积占C总面积的比例,然后用A和B的IOU值减去这个比值。
2.3人脸关键点Landmark回归:WingLoss
由于SmoothL1 Loss对于较大误差时比较敏感,但是对中小误差则比较不敏感,而导致关键点无法得到精细结果,因此考虑加重对中小误差的关注,对比试验后,选择WingLoss(Wing Loss for Robust Facial Landmark Localisation with Convolutional Neural Networks)作为landmark训练loss
WingLoss
这里我们采用了w=10,e=2,同时为了避免landmark相对人脸中心和宽高带来的累积误差,因此我们对landmark是相对于人脸中心点的方式进行训练
3.数据增广
random filp、random scaling、color jittering、randomly crop square patch、image compress
检测结果及精度验证
4.实际运行
项目地址
下载代码后main.py提供基于图像和摄像头的案例,我们稍加修改后:
把图像放到datas目录下,执行后,结果在detect_result中,我们看到如我们预期的结果:
下图,对于戴口罩人脸的检测(训练时并未使用戴口罩数据,因此将会加入戴口罩数据进行训练以优化模型的效果)