深兰科技DBFace,被《机器之心》扒出来的“轻量级高精度人脸检测模型”
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
上周末,一篇题为《模型仅有7M:轻量级高精度人脸识别方法DBFace》的文章在国内头部的专业人工智能媒体《机器之心》上首发,并被高度评价“这个仅7M大小的人脸识别模型几乎识别出了世界最大自拍照中的所有人像!”。随后又被新浪科技、CSDN、机器学习研究会等多家科技/垂直类(自)媒体进行了转载。
对DBFace这个名字,业内人士不难联想到人工智能头部企业深兰科技(DeepBlue)。果不其然,这个模型的创建者,正是来自深兰科技下属深兰科学院算法研究所的两位“高手”——Libia和Wish。
据了解,该模型起初只是被放在了Github上,没想到被《机器之心》扒了出来,而且短短3天时间,这个开源的模型就新增了超400次使用。
今天
就跟随这两位算法大咖
一起来看看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来优化任务,其缺点在于:
预测框bbox和ground truth bbox如果没有重叠,IOU就始终为0并且无法优化。其损失函数失去了可导的性质。
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.实际运行
项目地址:https:///dlunion/DBFace
下载代码后main.py提供基于图像和摄像头的案例,我们稍加修改后:
把图像放到datas目录下,执行后,结果在detect_result中,我们看到如我们预期的结果:
下图,对于戴口罩人脸的检测(训练时并未使用戴口罩数据,因此将会加入戴口罩数据进行训练以优化模型的效果)。
这个轻量级人脸检测模型可谓是业内的一股清流,不但识别准确率高、运行门槛低,实用扩展的空间也较大。欢迎更多感兴趣的朋友前往Github体验使用!