冠军方案解读|世界人工智能创新大赛-口罩识别方向
2020年世界人工智能创新大赛菁英挑战赛已经圆满落幕,获奖名单已于前日公布,我们邀请到了口罩识别赛题的冠军来做竞赛方案解读。
首先感谢比赛方举办这个比赛,Openvino在CPU上的加速效果很明显,非常适合CPU环境下的算法部署,通过这个比赛熟练掌握了Openvino封装部署,算是比赛的一大收获。也感谢极市工作人员邀请,以下分享我的解决方案。代码:https://github.com/whoNamedCody/Mask-Face-Detection
赛题数据:
赛题大部分数据是监控场景数据,大部分人脸都比较小,姿态较大。
任务描述:
检测图片中戴口罩和未带口罩的人脸,面向实际工程项目落地,需要在F1-score和FPS之间trade-off。
模型选择:
考虑到大部分人脸比较小,又有速度要求,因此选择CenterNet(Objects as Points)结构,CenterNet基于高斯点的方式,对小目标天生友好。因为原始的CenterNet需要训练周期比较长,因此选择了TTFNet(Training-Time-Friendly Network for Real-Time Object Detection)结构。
(1)CenterNet论文:https://arxiv.org/pdf/1904.07850代码:https://github.com/xingyizhou/CenterNet
CenterNet使用中心点表示目标,中心点定位损失函数使用Focal loss;直接回归目标的宽高WH,因为量化误差,还回归了中心点的Offset,回归使用L1 loss;不需要预设Anchor,也不需要NMS(使用3x3的MaxPooling)。
(2)TTFNet论文:https://arxiv.org/pdf/1909.00700代码:https://github.com/ZJULearning/ttfnet
CenterNet的WH回归只有中心点一个正样本,仅关注目标中心,会导致网络收敛速度慢,加重对复杂数据增强的依赖性,因此提出高斯采样,将中心点附近的进行密集的高斯采样,作为边框回归的样本,并进行高斯加权。中心点定位和CenterNet一样,使用Focal loss;回归是回归到边框的4个距离(left,top,right,bottom,这样就包含了Offset),损失函数使用Giou loss。
(3)ASFF论文:https://arxiv.org/pdf/1911.09516代码:https://github.com/ruinmessi/ASFF
为了充分利用不同尺度的特征,ASFF提出一种新的特征融合方式,在网络结构中自适应调整不同层的权重。原始的ASFF是三层FPN融合,后面我融合了四层。
(4)SSH论文:https://arxiv.org/pdf/1708.03979
使用类似SSH模块的Context Module(下图来自Retinaface,也是后面讲的SSH模块),增加感受野以及增强语义建模能力。
设计的网络结构:
骨干网使用mobilenetv2(0.5),将relu6替换为relu,使用ASFF融合不同层特征,SSH增强感受野和语义建模能力。最后模型大小大概2 Mb。
分类分支定位人脸中心点,并对人脸进行分类(mask和nomask),损失函数采用Focal loss;回归分支回归人脸中心点到边框的距离(left,top,right,bottom),损失函数采用Giou loss;优化器使用Adam,采用Step学习率。测试时使用Softnms,使用MaxPooling速度快点,但精度会差一点。(最后800x640的输入F1-score是0.76,速度大概是十几帧,由于C++测速bug,这个模型只训练一次就没有优化,最后降低输入分辨率到576x384, 将速度提到32 FPS,F1-score是0.69,因此除上述提到的外未使用其他训练trick,模型精度应该还可以提升)。
关于Openvino封装:
封装的一个比较重要的点是理解Openvino推理后的数据存储顺序,比如我的网络结构检测一张图片输出是1HW2和1HW4,使用Openvino推理的输出是可以理解为两个一维数组,长度是HW2和HW4。如下heatmap就是中心点定位的输出,x和y分别是两个类别的预测分数。其他细节见github。