作者:丹丹2502912601 | 来源:互联网 | 2023-09-11 20:09
在使用faceNet的时候,看到faceNet官方使用的人脸识别和归一化方法是MCCN(Multi-taskCascadedConvolutionalNetworks),看代码貌似
在使用faceNet的时候,看到faceNet官方使用的人脸识别和归一化方法是MCCN(Multi-task Cascaded Convolutional Networks ),看代码貌似是使用三个网络来共同完成人脸识别与面部特征点确定这个多目标工作。就顺便看了一下论文《Joint Face Detection and Alignment usingMulti-task Cascaded Convolutional Networks》。
第一个网络是一个浅层神经网络(后简称pnet) => 产生初步候选框
第二个网络是一个“more complex CNN“相较pnet更为复杂的网络(后简称rnet)=> 从初步候选框中筛选掉大量的不包括人脸的框
第三个网络是一个“more powerful CNN”相较rnet更为强大的网络(后简称onet)=> 进一步优化结果以及产生五个面部特征点(双眼,鼻尖,嘴角)
从论文上说,这套东西的效率可以达到实时检测(real time performance)。并且从检测性能上和现有技术横向对比也是有了很大提高。
阶段一:
P-Net 提案网络。输出很多的候选框。然后用非最大抑制法来合并重复度很高的框(non-maximum suppression (NMS))
阶段二:
R-Net 调优网络。接受所有阶段一的产出,并且根据面部可信度来过滤提案和优化选框范围。它的结果也要接受NMS。
阶段三:
O-Net 类似P-Net,但会用更多面部特征来要求选框。最后会额外输出五个面部特征点。
网络设计思路
减少了过滤器的数量,并把5x5的过滤器换成3x3的过滤器来减少计算量,且增加深度,以获得更好的性能表现。
激活函数用了PReLU,简单贴一下PReLU的图:
综合看这三个阶段的网络,他们都是一网多功能的高级货,目标都是一致的,只是各自重点和精确度不同,每个网络都同时具有这三个功能:是否人脸的分类器,选择选框的回归问题,人脸特征点标识。
对于是否人脸分类器损失函数选用交叉熵。
对于选框(左上角x,左上角y,截图宽,截图高)回归损失函数选用欧氏距离。
人脸特征点标识(十个值,两两一组,分别表达左眼、右眼、鼻、左嘴角、右嘴角)也是一个回归问题,用欧氏距离做损失函数。
从三个网络最终输出来说,总的来说损失函数如下:
N是样本数量;
α表示损失占比:
在第一、二阶段:
det = 1, box = 0.5 landmark = 0.5
三阶段:
det = 1, box = 0.5 landmark = 1;
L表示损失,对应上述的几种损失计算方法;
β∈{0,1} 表示对不同的样本类型的损失惩罚力度。(或许正样本的β较大,TODO 需关注)
Online Hard sample mining(在线难例选择 )
一般在线的难例都是在一个batch中选择难例,MCCN是在一batch中选择lost排名前70%的用例用于梯度回流,排除计算结果比较正确的例子,增强网络的健壮性。从MCCN对这个trick的使用结果来说,有效的提升了网络的性能。
下面(a)图即是有使用在线难例选择和没有使用在线难例选择在ROC曲线中的差异:
考证多任务网络的优势
各阶段目标重点都不一样,为何都要用多任务网络来训练?实验考证了多任务训练对获得更好单任务输出的裨益。上图(b)表中,考证了O-Net在有人脸检测任务和无人脸检测任务下的性能差别(黄线对蓝线)。也考证了O-Net在有选框回归和无选框回归下的差别(这里存疑)。
关于实验
训练数据:
整个实验过程涉及到四种不同的训练数据。(1)负例来源是IOU<0.3的图片。(2)正例是IOU>0.65的图片。(3)人脸局部,来源是IOU在0.4~0.65之间的人脸内部图。(4)人脸特征标识,即是人脸的五个特征点。这四项样本的比例是3:1:1:2 (negatives/ positives/ part face/ landmarkface) 。
因为负例和人脸局部的边界很模糊,在训练使用的时候是这样的:是否人脸分类任务使用正例和IOU在0.3~0.4之间的负例;选择选框任务使用正例和人脸局部;人脸特征点标识就用人脸特征点数据。
采例来源: 1~3种数据采自WIDER-FACE,4采自CelebA。
实验结果:
在人脸识别(是否人脸任务)上,ROC与其他人脸识别算法比较:
在五点检测上,与其他算法的对比:
据说嘴部检测优势巨大。
最后看看实时检测的效果,论文作者在打出99FPS的结果时还不忘秀一发“这可是我们用没优化的matlab代码跑出来的哟”。
end.