最简单最详细的MTCNN讲解

去年做了个人脸项目,用到了MTCNN,后面有点忘记了,去网上看了下相关的博客想回忆一下,发现真的是写的要么外行要么就是非常简单,很怀疑那帮人也是随便看些博客自己写的。特别是P-Net的输入到底是图像金字塔还是12x12固定尺寸,以及P-Net到底生不生产Landmark,都没说到。还是自己老老实实又去看了原论文,对照着代码,才看的舒服。

最简单最详细的MTCNN讲解_第1张图片

MTCNN

P-net:通过一个浅层的CNN快速筛选出许多人脸潜在候选框

R-net:通过一个更复杂的CNN网络去除大部分不存在人脸的候选框

O-Net:最后的CNN优化结果结果并输出人脸landmark

 

P-Net:全卷积网络,获得候选框和他们的bbox 回归向量,用回归向量来校准候选框,接着使用NMS来合并候选框

R-Net:输入是P-Net的候选框输出,筛除掉不存在人脸的候选框,并再次使用bbox回归校准候选框和NMS合并候选框。

O-Net:输入是R-Net的候选框输出,同时这一网络会产生对人脸更细致的的信息,最重要的是,这一网络会产生5个人脸landmark。

论文里只说O-Net会输出landmark,但是代码里,三个网络都会输出landmark。

人脸分类Loss是交叉熵

回归损失函数:

Landmark损失函数:

 

联合损失函数:

最简单最详细的MTCNN讲解_第2张图片

 

Hard sample mining:

在每个mini-batch,将前传计算的loss进行降序排序,取前70%为hard samples,反向传播的时候只计算这些样本。我看了代码,没有看到怎么进行降序排序,只是把前一个网络的输出继续分类成Negatives,Positives和Part face,可能我看的那份代码没这么干,有懂的欢迎评论。

 

训练数据划分:

Negatives:与GT的IOU小于0.3

Positives:IOU大于0.65

Part faces:IOU处于0.4-0.65

Landmark faces:标注的5个关键点

Nega和Posi用来训练人脸分类;Posi和Part训练bbox回归;landmark训练facial landmark localization。

最简单最详细的MTCNN讲解_第3张图片

WIDER Face用来训练人脸检测,Celeba训练人脸关键点,这里我是这么理解的,WIDER Face用来产生正负样本和part face样本,正样本对应label1,负样本对应0,part对应-1。正负用来训练分类,显然能理解,而负样本是没有框的(因为没有人脸啊),所以仅靠正样本的数量用来训练bbox回归,太少了,所以需要生成part face这么一类,补充样本数量专门用来训练bbox回归。因为WIDER Face数据集没有landmark属性,所以初始化为0,反正他们也不用来训练landmark localization。

Celeba数据集用来训练landmark,label=-2.bbox=0,是因为并不用他们训练分类和回归,只需要landmark_label。

 

P-Net的输入问题:将原图随机裁剪(不是缩放)成不同尺度,random(12,min(height,width)/2),再resize到12x12,也就是输入是固定为12x12,但是输入图像的确是随机大小的。P-Net是有输出landmark的。P-Net的输入也有landmark,P-Net有训练landmark。

训练步骤:

分部训练,先训练P-Net,训练完,用P-Net产生的结果经过bbox归回校准位置,再用NMS减少候选框(先reg再NMS),再分类成正负,部分样本三类,(landmark由Celeba产生,跟候选框这些都没关系),再从原图找到样本bbox对应的位置,crop出来再resize成24x24大小,作为R-Net的输入,后面R-Net到O-Net也是一样。

 

作者认为人脸检测相比物体检测(多分类)是个二分类任务,更加需要信息的差异化而不是滤波器的数量(信息的数量)。(这里我的理解是,多分类任务,不是简单的0,1,网络需要知道框里的是什么物体,自然网络需要更多的物体信息帮助,才能进行分类,而二分类,是有与没有,所以信息需要的少,但信息的差异性要更大。也就是二分类任务对于对于信息的容量可以减少,减少滤波器大小,增大数量)

这篇博文主要是针对论文里语意不清的部分,比如P-Net的输入,还要训练的具体过程等,这些必须要从实现的代码里找答案。

论文地址就不放了,百度即可。

参考的源代码:https://github.com/AITTSMD/MTCNN-Tensorflow

你可能感兴趣的:(深度学习基础)