Multi-task convolutional neural networks 人脸对齐
<nobr aria-hidden="true"> </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> </math>MTCNN是2016年ECCV上的一篇文章,做的事情就是人脸检测,以及人脸部分关键点标定.MTCNN的过程和思想都集中在下面这个图.
这个图片大概就是说,MTCNN是由3个网络结构组成(P-Net,R-Net,O-Net)的.下面分别介绍一下MTCNN的这个3个网络结构.
<nobr aria-hidden="true"> </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> </math>Proposal Network (P-Net):该网络结构主要获得了人脸区域的候选窗口和边界框的回归向量。并用该边界框做回归,对候选窗口进行校准,然后通过非极大值抑制(NMS)来合并高度重叠的候选框。
<nobr aria-hidden="true"> </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> </math>Refine Network (R-Net):该网络结构还是通过边界框回归和NMS来去掉那些false-positive区域。只是由于该网络结构和P-Net网络结构有差异,多了一个全连接层,所以会取得更好的抑制false-positive的作用。
<nobr aria-hidden="true"> </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> </math>Output Network (O-Net):该层比R-Net层又多了一层卷基层,所以处理的结果会更加精细。作用和R-Net层作用一样。但是该层对人脸区域进行了更多的监督,同时还会输出5个地标(landmark)。
<nobr aria-hidden="true"> </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> </math>论文中也给出了详细的网络结构如下图:
MTCNN还有更加详细的prototxt的网络结构,可以看这篇博客:https://blog.csdn.net/qq_14845119/article/details/52680940,或者是自己将https://github.com/kpzhang93/MTCNN_face_detection_alignment/tree/master/code/codes/MTCNNv1/model这里面的prototxt文件可视化之后观察.
训练过程的损失函数
<nobr aria-hidden="true"> </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> </math>MTCNN特征描述子主要包含3个部分,人脸/非人脸分类器,边界框回归,地标定位。
人脸分类:
这是人脸分类的交叉熵损失函数,其中, <nobr aria-hidden="true"> pi </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> <msub> <mi> p </mi> <mi> i </mi> </msub> </math>为是人脸的概率, <nobr aria-hidden="true"> ydeti </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> <msubsup> <mi> y </mi> <mi> i </mi> <mrow class="MJX-TeXAtom-ORD"> <mi> d </mi> <mi> e </mi> <mi> t </mi> </mrow> </msubsup> </math>为背景的真实标签。
边界框回归:
这个式子是通过欧氏距离计算的回归损失。其中,带尖的y为通过网络预测得到,不带尖的y为实际的真实的背景坐标。其中,y为一个(左上角x,左上角y,长,宽)组成的四元组。
地标定位:
和边界回归一样,这个式子还是计算网络预测的地标位置和实际真实地标的欧式距离,并最小化该距离。其中,带尖的y为通过网络预测得到,不带尖的y为实际的真实的地标坐标。由于一共5个点,每个点2个坐标,所以,y属于十元组。
多个人的情况:
<nobr aria-hidden="true"> </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> </math>整个的训练学习过程就是最小化上面的这个函数,其中,N为训练样本数量, <nobr aria-hidden="true"> αj </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> <msub> <mi> α </mi> <mi> j </mi> </msub> </math>表示任务的重要性, <nobr aria-hidden="true"> βji </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> <msubsup> <mi> β </mi> <mi> i </mi> <mi> j </mi> </msubsup> </math>为样本标签, <nobr aria-hidden="true"> Lji </nobr> <math xmlns="http://www.w3.org/1998/Math/MathML"> <msubsup> <mi> L </mi> <mi> i </mi> <mi> j </mi> </msubsup> </math>为上面的损失函数。在训练过程中,为了取得更好的效果,作者每次只后向传播前70%样本的梯度,这样来保证传递的都是有效的数字。
参考文章:
https://blog.csdn.net/qq_14845119/article/details/52680940
https://blog.csdn.net/sinat_24143931/article/details/78778656