1.背景和主题
该篇文章为中科院计算所智能信息处理重点实验室VIPL课题组,邬书哲博士在CVPR2018上的论文。论文主要针对的是在不同平面角度下的人脸检测,主题思想可以概括为Progressive Calibration Networks(PCN), 即逐步校正不同角度的人脸。
摘要
首先作者说明了多角度旋转情况下的人脸检测是十分困难和具有挑战性的(官方说辞),然后呢,作者就提出了这个PCN来进行旋转不变的人脸检测,PCN包括了3个阶段,每个阶段都做了人脸和非人脸分类,人脸bounding box的回归,人脸偏转角度计算。其中stage1和stage2只做离散分类的角度估计,stage3做连续回归的角度细估计,对人脸方向的校准(stage1,stage2,旋转人脸180度,90度等)属于后操作,也就是说在校准网络结束后做,使之渐进的校准为一个朝上的人人脸。如果使用一个模型预测各种旋转角度的人脸,可能在精度和耗时上都有损耗,所以该论文提出将校准过程分为3个渐进式步骤。在stage1和stage2上只做粗略的方向分类(离散的方向分类,如180,-180,90),最后stage3做连续的方向回归,输出校准后的人脸偏转角度,因为偏转角度已经校准到-45到45范围,所以直接使用人脸检测器检测出人脸,不用再接校准操作,PCN已经可以在CPU上达到实时。因为是渐进式的校准人脸角度,逐渐降低人脸的练准度,所以这种方法可以处理任何角度旋转的人脸。在人脸数据集FDDB和ider face test(作者自己制作的)均取得了不错的效果。
介绍
基于CNN的人脸检测器受益于CNN强大的非线性特征表达能力,但在检测旋转人脸时效果一般,因为各个角度旋转的人脸在特征在模型训练时不容易收敛,目前已有三种针对旋转人脸检测的方案:数据扩充、分而治之、旋转角度探测器(rotation router)。
数据扩充:最简单粗暴也最直观的方法,将包含向上的人头图像均匀地做360°全角度旋转生成训练数据,再用一个性能强劲的模型学习,现有的upright人脸检测模型可以直接学习,无需额外操作。但是,为了拟合如此旋转角度的人脸场景,模型性能需要比较强悍,耗时较大,就无法实时了。
分而治之:训练多个检测器,每个检测器只检测一小部分偏转角度的人脸,所有检测器结果融合后,就可以覆盖所有方向的人脸。每个检测器只需要检测特定旋转范围内的人脸,对每个检测器而言,只需要一个耗时少的浅层模型即可。但是所有检测器都需要跑一遍,整体耗时就增加了。不要和分治算法混淆了。
用一个CNN(rotation router)计算出旋转人脸的偏转角,将旋转的人脸按偏转角校准至向上后,再使用现有的upright face detector检测校准后的人脸candidates即可,这符合认知常识,添加一个rotation router计算人脸偏转角度即可,不需要额外开销。但是精准的人脸角度计算很有挑战性,为了精准的计算人脸偏转角,通常都需要使用性能强悍的CNN,耗时就又成为了瓶颈。
所以前面3种方案都是既有利又有弊端,所以啊,作者就提出了这个PCN,怎么做的呢?既然利用rotation router想一步到位计算精准的人脸偏转角度有难度,那么我们渐进式地基于cascade从粗到精一步一步计算。第一层网络先初略判断一个偏转角,再校准一下。第二层网络同样操作,进一步校准,以减少人脸偏转角度范围。第三层网络精准计算偏转角度,基于前两步骤校准后,再使用第三层网络直接输出人脸分类、偏转角度、bbox即可。整体下来模型耗时也少,可以实时。有没有感觉到这个算法好像和MTCNN的过程超级像?所以首先stage1就是对face candidates(类似mtcnn图像金字塔+滑窗)筛选candidates(face/non-face二分类),将方向朝下人脸校准为方向朝上人脸(updown clip即可),stage2与step1类似,人脸筛选(face/non-face二分类)+将step1中的upright人脸进一步校准至 [-45; 45],最后stage3输出人脸分类、偏转角度(the continuouts precise RIP angle)、bbox即可。可以看到,只有在stage3才做精准预测,stage1、2只做±90°、±180°旋转,这也保证了整个算法的时间消耗低,做到了实时。接下来作者总结了PCN的特点和优势点如下:
- PCN进阶式分步骤校准人脸偏转角度,每个小步骤都是一个基于浅层CNN的简单任务,最终可以让偏转的人脸角度逐步降低并校准,准确率高、效果好、耗时少
- step1、2只做粗校准(如下->上180°、左->右90°校准),优势有二:1 粗校准操作耗时少,易实现;2 对角度的粗分类也容易实现,可以直接在人脸分类、bbox回归的multi-task中加一个分支即可
- 在两个有挑战的数据集上-----多角度旋转的FDDB+作者手工筛选并标注的wider face test子集上(multi-oriented FDDB and a challenging subset of WIDER FACE containing rotated faces in the wild),本方案取得了不错的效果。
PCN
2.1 整体框架
类似于MTCNN,通过图像金字塔和候选人脸框得到人脸候选框,在每一个阶段通过NMS来滤掉那些分数很低的框,最后保留目标人脸框。
2.2 第一个stage的PCN
对于每个滑窗输入x,pcn1做三件事情:face/non-face分类、bbox回归、校准:
[f; t; g] = F1(x);
F1:stage1的CNN模型;
f:face confidence score,用于区分face/non-face;
t:bbox回归向量(a vector representing the prediction of bounding box regression);
g:方向得分(0~1二分类问题、输出up、down即可);
第一个目标函数,区分face/non-face:
Lcls=ylogf+(1−y)log(1−f),如果x是人脸y=1,否则y=0。第二个目标函数,尝试回归人脸的bounding box, Lreg(t,t∗)=S(t−t∗),其中t和t*代表了真实的回归框和预测的回归框,S代表损失距离L1 loss,t和 t∗可以用回归框的左上角,长宽(这里长等于宽)这3个参数来描述,写成公式就是:
tw=w∗/w
ta=(a∗+0.5w∗−a−0.5w)/w∗
tb=(b∗+0.5w∗−b−0.5w)/w∗
其中a,b,w代表了回归框左上角(x,y)和width。
第三个目标函数,对pcn1来说,就是简单的up-down二分类问题,使用softmax即可。
损失函数为:
Lcal(t,t∗)=ylog(g)+(1−y)log(1−g),整个网络的损失函数为
其中 λ是各个loss的weight!
以上操作的意思:pcn1可以类似adaboost一样,第一步大量去除容易分类的fp candidates(face/non-face),再做一次bbox归回,最后根据up-down分类结果,对candidates做upright flip,确保所有人脸bbox都是朝上,经此操作,人脸旋转角度变为[-90, 90]。将常用的upright人脸数据集做[-180, 180]旋转,以扩充为旋转数据集。在训练阶段,有3种类型的数据:
pos samples:iou vs gt > 0.7
neg samples:iou vs gt < 0.3
suspected samples:iou vs gt ∈ (0.4, 0.7)
face/non-face classification:pos & neg;
bbox regression && calibration:pos & suspected;
特别地,对于calibration网络,pos & suspected samples:
face-up:RIP angles ∈ (-65, 65)
face-down:RIP angles ∈ (-180, -115) & (115, 180)
不在此角度范围内的RIP angles不用于训练calibration分支
2.3 第二个stage的PCN
这个阶段和第一个stage很类似,唯一不同就是在calibration分支是一个三分类问题[-90;-45], [-45; 45], or [45; 90],将常用的upright人脸数据集做[-90, 90]旋转,以扩充为旋转数据集。calibration:pos & suspected;
calibration分支分类id含义:
0:[-90, -60],需要+90
1:[-30, 30],不用做操作
2:[60, 90],-90
不在此范围内的数据,不考虑用于训练
2.4 第3个stage的PCN
经过stage1、2两波操作,人脸RIP已经被校准至[-45, 45]之间(calibratedto an upright quarter of RIP angle range),此时人脸已经比较容易检测,使用pcn-3的网络就可以准确检测并回归人脸bbox。最终人脸角度把三个阶段的计算角度结果累加即可得到最终的旋转角度。这部分原理看图:
结论
论文的原理就讲完了,接下来就是作者的实验阶段了。
源码分析
待续