paper:https://arxiv.org/abs/1804.06039
github地址:https://github.com/Rock-100/FaceKit/tree/master/PCN
人脸检测是一个老话题了,网上有很多的开源模型;但大部分模型训练时的样本都是“正角度”分布,即眼睛在上鼻子在下,使得模型的使用也限制于该类场景。但实际场景中经常出现非“正角度”的人脸。针对这种场景的人脸检测,作者在2018年提出了一种由粗到精渐进式的、检测速度高的旋转人脸检测模型,称为Progressive Calibration Networks,简称PCN,效果如下图所示。
实际场景中平面人脸角度多变,使得检测变得困难,当前已有的方法在精度或者速度上有所妥协。我们提出PCN网络,通过由粗到精的处理方式可高效率地实现平面中任意角度的人脸检测。PCN包括三个子网络,每个网络不仅检测人脸是否存在,同时给出平面旋转角度的相关预测;且在前面两个子网络中只给出粗略的角度范围而不是具体角度,来做速度和精度之间的平衡。
大部分人脸检测方法都没有考虑平面旋转角度的影响,因为这种情况下人脸特征分布多变,挑战很大。针对该问题有三种处理方法,具体阐述如下。
1)数据增强,如上图中(a)所示,产生各种角度的旋转人脸再训练模型;缺点是人脸特征分布变得复杂,使得网络结构复杂,实时性难以满足工程需求
2)分治法,如上图中(b)所示,将其分解为更小的问题分开解决,譬如可以训练4个人脸检测器分别检测4个方向的人脸;缺点是整体的运算量仍然会累积而变大
3)角度检测器,如上图中(c)所示,新增一个网络用于计算得到人脸候选区域的旋转角度,之后将这些候选区域旋转为正向人脸后再进行后续的检测;缺点是角度检测网络的误差会导致人脸误检,且角度检测网络的模型比较复杂,落地难度高
总之当前的方法都存在计算量大的问题。
因此作者提出一种渐进式处理的网络-PCN,做人脸定位的同时由粗到精的计算人脸角度。具体的,第一层网络判断人脸朝上还是朝下,将角度范围由[-180°,180°]缩小为[-90°,90°];类似的第二层网络将角度范围从[-90°,90°]缩小为[-45°,45°];第三层网络计算精确的角度。每个网络的任务简单因此网络模型简单计算量小,同时整体最终计算得到的精度也高,具体流程如下所示。
PCN的网络结构具体如下,和MTCNN十分相似,唯一不同的是增加了角度预测的输出,这里着重讲解人脸角度得分的设计部分。
具体的第一层网络中输出朝上或者朝下的角度,类似于二分类,其loss function和人脸得分相同,使用二维交叉熵损失函数。具体如下
Lcal=y*log(g)+(1-y)*log(1-g)
这里g为人脸角度得分,定义人脸朝上时真实值为1;在进行推理时首先根据人脸得分和NMS过滤非人脸区域,之后根据角度得分计算旋转角度θ1,定义人脸角度得分大于0.5时θ1=0,否则为180°。若人脸朝下,则将其顺时针旋转180°,继续后面的处理。
基本和stage1相同,不同的在于角度预测部分,这里角度预测将人脸分为[-90°,-45°],[-45°,45°],[45°,90°]三类。作者采用了三分类的one-hot编码(g0,g1,g2),且上述三类的得分真值分别为(1,0,0),(0,1,0),(0,0,1)。在进行推理时取(g0,g1,g2)中的最大值的索引为g,当g=0时取θ2=-90;g=1时取θ2=0;g=2时取θ2=90。之后将满足人脸得分与NMS阈值的人脸区域图像逆时针旋转θ2角度后继续后面的处理。
经过上述处理的人脸区域图像角度范围位于[-45°,45°]之间,这一阶段的网络会直接输出对人脸角度的预测θ3。人脸最终的整体旋转角度为θ=θ1+θ2+θ3,注意逆时针为负。下图展示了两个人脸的角度计算过程。
作者利用由粗到精的处理方式,提出了PCN网络来处理人脸角度的预测,兼顾了速度与精度,具有较高的工程化落地价值。
下一篇内容开始讲如何用C++和MNN部署该网络模型。