MTCNN是目前应用十分广泛的基于级联的特定目标检测器,好多公司的人脸检测算法都是基于此,之前接触过该检测器,这次想再理解下其原理,学习下其思想,主要是想将PNet 、RNet 、ONet的思想应用到其他小的任务上。
PNet
PNet网络结构如下:
PNet的训练过程如下:
在训练数据目标框周围采样正样本框IOU>0.65,采样的正样本框的原始大小是在该目标框的大小附近,采样负样本框IOU<0.3,同时 0.4 < IOU < 0.65的样本为中间样本。所有采集的样本都resize到12x12,送入到网络中。PNet是全连接网络,因此12x12最终得到的分类分支为: 2x1x1 (c,w,h) 和box回归分支的大小为:4x1x1(c,w,h)。
cls分类分支的loss使用交叉熵损失,负样本标签为0,正样本标签为1。
box回归分支的loss使用MSE损失,该分支学习到的是目标框相对于正样本的偏移量,(x1, y1)、(x2, y2)是原图中目标中的左上角和右下角,(nx1,ny1)、(nx2,ny2)是原图中正样本框的左上角和右下角,size 是正样本框的大小。
offset_x1 = (x1 - nx1) / float(size)
offset_y1 = (y1 - ny1) / float(size)
offset_x2 = (x2 - nx2) / float(size)
offset_y2 = (y2 - ny2) / float(size)
PNet的使用过程如下:
使用时, 输入图片的按照金字塔的方式对原始图片进行缩放,然后送入到PNet网络,由于PNet是全连接网络,图片输入大小不受限制,因此分类分支得到 2xmxn的特征图,回归分支得到的是4xmxn的特征图,特征图上的
(
x
,
y
)
(x,y)
(x,y)需要影射到输入图片上
(
x
∗
,
y
∗
)
(x^*, y^*)
(x∗,y∗),映射关系如下:
x
∗
=
x
∗
s
t
r
i
d
e
x^* = x * stride
x∗=x∗stride
y
∗
=
y
∗
s
t
r
i
d
e
y^* = y * stride
y∗=y∗stride
w
∗
=
12
w^* = 12
w∗=12
h
∗
=
12
h^* = 12
h∗=12
PNet的作用:
PNet在训练的过程中,可以当成是一个小型的特征提取器,class的分类很好理解,就是位置的回归,这里我理解了好久,因为one-stage检测器(例如ssd 、yolo)学习的都是基于anchor的偏移量,这里我一直没有看到anchor的概念,所以重新去理解如何采样正样本,采样的时候,发现正样本的偏移量是目标框的位置相对于正样本的,并且进行了归一化。
使用的时候,PNet相当于一个固定大小(12x12)的滑动窗,然后对每次滑动的位置进行分类和回归,判断有没有目标。
观测PNnet的网络结构可以发现,只有三层卷积,一个池化,并且提取的特征长度是32 ,这是个浅小的网络,主要作用提取可能包含人脸的目标块,是个粗检测过程。
RNet 与 ONet
RNet网络结构如下:
ONet网络结构如下:
RNet或ONet训练过程如下:
训练使用 的正样本框和负 样本框的方法一致,唯一不同的是,RNet需要将采样的样本框resize到(24,24),而ONet需要将采样的样本框resize到(48,48)。将 采样的到(24,24)样本框扔到RNet进行分类判断和回归预测,同样将(48,48)送入到ONet进行训练。
RNet,ONet的使用过程如下:
PNet得到了很多可能包含人脸的目标框,然后将这些目标框仍到RNet坐二次判断和位置的修正,最后将RNet修正过的目标框仍到ONet做最后的修正,ONet 的输入的最终结果才是我们想要的结果。
RNet,ONet的作用:
1、网络深度 PNet(3个卷积1个池化) < RNet(3个卷积2个池化) < ONet (3个卷积3个池化)
2、网络提出的特征长度:PNet(32) < RNet(128) < ONet (256)
3、PNet是全连接网络,网络输入大小不受限制,RNet和ONet 不是,其网络输入必须是(24,24)和(48,48)
4、PNet 是滑动窗的作用,将图片中可能包含人脸的区域crop出来,然后又RNet 和 ONet对每个crop出来的位置框做位置修正。