阅读《Detecting Faces Using Inside Cascaded Contextual CNN》的理解
Detecting Faces Using Inside Cascaded Contextual CNN
这篇文章出自2017的ICCV,文章链接。其主要的贡献在两个地方:1、高层的卷积核区分复杂的负样本的能力更强,而简单的负样本在低层就可以检测出来,不用传入到后面的网络层去区分,这样既可以减少高层的计算量来节约时间,同时也可以让高层的卷积核集中于解决复杂的正负样本。所以该篇文章提出了Inside Cascaded Structure的概念,采用data routing机制来使不同的卷积层由不同类型的样本来训练。2、MTCNN类的网络训练的时候用的只是包含人脸的正样本和不包含人脸的负样本,制作正例数据时将人脸给截取出来然后resize到12,24,48三个尺度分别训练PNet,RNet,ONet,没有用到身体部位等信息。但是身体部位等信息其实是有利于人脸检测的,因此本文采取了将身体部分截取出来当成训练数据,来辅助人脸检测。
网络的整体结构如图(1)所示,分为三个网络级联:P-Net,R-Net-1,R-Net-2。P-Net是一个全卷积网络,产生可能包含目标的候选窗口。R-Net-1和R-Net-2则对目标进行进一步的目标分类和bounding box回归。
Inside Cascaded Structure
Inside Cascaded Structure主要由两部分组成:Early Rejection Classifier (ERC) and Data Routing (DR) layer。其在后两层网络中的结构如图(2)所示,在R-Net-1和R-Net-2的每一个池化层后会接着一个ERC,用来预测一个样本是否属于人脸的概率。预测的概率会被送到后面的DR层,DR层会保留正例人脸和复杂的负样本,而简单的负样本则不会送到后续的卷积层进行计算,这些选择是由阈值θ控制的。ERC采用的softmax函数分类,损失函数为交叉熵损失。
图(2)
Two-stream Contextual CNN
该篇文章整个网络如图(3)所示,在R-Net-1和R-Net-2中,输入为分辨率不同的人脸图像和人身图像,当输入图像经过卷积池化之后,会在R-Net-1和R-Net-2网络的最后阶段分别生成128维和256维的feature map。如图(4)所示,再经过特征融合,然后在Two-stream上面一个支路中进行人脸分类和bounding box回归,在下面的支路中进行人身形状的像素级分类(图像分割)。Two-stream中下支路采用的损失函数如下所示:
n表示score maps的数量,比如R-Net-1中的person part score map中的维度为33*18*17,则n为17,m表示score map中的像素总数,即33*18,绝对值符号里面的两个数分别表示预测的像素标签和真是的像素标签。
图(3)
图(4)
实验细节
三个级联网络在训练时,采用的batchsize大小分别为6000,1000,500。对于P-Net,初始学习率设为0.1,然后当迭代次数为20K,40K,60K时分别用当时的学习率除以5,总的迭代次数为70K。对于R-Net-1和R-Net-2,初始学习率设为0.01,然后当迭代次数为25K,40K,50K,60K时分别用当时的学习率除以5,总的迭代次数为70K。
对于人脸分类和bounding box回归,采用的时WIDER FACE数据集。随机截取WIDER FACE中的人脸图像,与真实bounding box的IOU大于0.65的截取图片当做正例,小于0.3的当成负例。这一过程产生了400万训练图片和100万验证集图片,其中正负样本的比为1:3。对于R-Net-1和R-Net-2,采用前一级网络的预测输出作为后一级网络的训练图片。
对于身体部分的训练,采用的数据集为COCO数据集的Person数据。先用MTCNN检测人脸,然后产生body part score maps 。
另外实验结果显示,DR层中θ的取值为0.01效果最好,身体部分训练的loss权重lambda取0.015效果最好。
最终整个网络在FDDB上的结果与对比实验如下图所示:
以上是关于该篇文章的部分内容,许多实现细节还得去阅读代码,但是作者并没有开源。如果有不对的地方,请大家指出,谢谢~