MTCNN论文笔记
深度学习的可解释性就很弱,再结合上多任务,可解释性就更加弱。这篇论文又是我兴冲冲来,但是没有找到想要的结果。
一、论文主要思想
利用脸部对齐和检测任务之间的关联来提高性能,框架运用三阶段的级联结构以coarse-to-fine(从粗糙到精细)的方式来预测脸和标志点的位置。提出在线复杂样本选择策略,在不需要人工样本选择的情况下自动提高性能。
二、主要贡献
- 提出一个共同实现面部检测和对齐的级联CNN框架,涉及轻量CNN达到实时的性能
- 提出一个高效方法实现在线复杂样本选择来提高性能
- 在有挑战的基准库上做了扩展实验,来显示提出的框架在面部检测和面部对齐任务上的重大性能改善
三、三阶段介绍
- 通过一个浅层CNN快速产生候选窗口
- 通过一个稍复杂的CNN将产生的窗口精修,将大量没有面部的窗口过滤掉
- 通过一个更有力的CNN精修结果,并输出面部标志点位置
四、网络框架
给定一张图片,将它resize成不同的尺寸来构建一个图像金字塔,resize后的照片是接下来三阶段级联框架的输入:
第一阶段(P-Net Proposal Network):我们应用全卷积神经网络来获取候选窗口和他们的边界框回归向量。我们使用估计的边界框回归向量来校准和候选框,然后运用非极大值抑制来组合高度重复的候选框。
第二阶段(R-Net Refine Network):进一步筛选掉没有面部的候选框,通过边界框回归校准NMS进行候选框融合。
第三阶段(O-Net):这个阶段和第二阶段类似,但在这个阶段中,我们更详细描述面部,网络将输出五个面部特征点的位置。
五、“A convolutional neural network cascade for face detection”论文效果不好的原因
1.一些过滤器缺少多样性权重限制了他们学习到差异性特征;
2.相比较其他的多类目标检测和分类任务,面部检测是一个具有挑战性的二分类,他需要更少数量的过滤器但需要更多的差异。因此我们把卷积核的尺寸从5*5改成3*3来减少计算量,同时增加深度来获得更好的性能。
六、损失函数
我们利用三个任务来训练我们的CNN检测器:face/non-face分类、边界框回归、面部标志点定位,损失函数分别为:
1.face/non-face分类
其中 是ground truth 属于{0,1},pi是网络预测一个样本有面部的概率。
(感觉这个损失函数有误,不知道是不是我论文版本的原因,根据此函数在gt=0时,loss值为负)
2.边界框回归
3.面部标志点定位
七、多源数据训练
(我理解的他说的这个多源意思是各个阶段输入的数据不一致,同时,各个阶段的主要任务也不完全一直,所以有这αβ参数)
由于我们在每个CNN中实现不同任务,在学习过程中有不同类型的训练图片,比如说face,non-face和部分对齐face。
N是训练样本量,ɑj代表任务重要性,在P-Net和R-Net中,αdet=1,αbox=0.5,αlandmark=0.5;αdet=1,αbox=0.5,αlandmark=1在O-Net中获取更加准确的面部标志点定位。Βij属于{0,1}是样本类型指示符。运用SGD来训练样本。
八、在线复杂样本选择
不同于传统的在原始分类器训练过后选择复杂样本,我们在面部分类任务中做在线复杂样本选择,自适应训练过程。
在每个mini-batch中,我们将前向传播计算到的loss进行排序,并选择前70%作为复杂样本。在方向传播阶段我们只计算复杂样本的梯度
九、一些思考
这篇论文说的是多任务,但是在证明多任务比单任务好的时候还是和之前一样用了消融思想,另外,蛮意外的是为啥网络的输入和深度都这么小,结果反而很不错,是说在16年场景下不错还是什么情况吗?
意外的是,这篇文章我更大的收获不是多任务方面,而是在线复杂样本选择方面,想在自己网络中做一些相应尝试。
接下来,打算再阅读下作者的 最新发表论文~
以上各观点都是本人的一些浅见及记录,如若理解有误,欢迎批评指正~