人脸检测之MTCNN:训练过程详解

转载于:https://blog.csdn.net/wfei101/article/details/79935037

个人比较看好MTCNN的,最起码把检测和定位做到一起,并且做的还不错;也算是不错的尝试;

MTCNN主要包括三个部分,PNet,RNet,ONet

其中PNet在训练阶段的输入尺寸为12*12,RNet的输入尺寸为24*24, ONet的输入尺寸为48*48. PNet网络参数最小,ceffemodel仅有28.2KB, 所以速度最快.RNet的网络参数次之,caffemodel大小为407.9KB, ONet的caffemodel大小为1.6M,三个网络合起来不到2M.

 celebA:http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html

测试阶段大概过程

首先图像经过金字塔,生成多个尺度的图像,然后输入PNet, PNet由于尺寸很小,所以可以很快的选出候选区域,但是准确率不高,不同尺度上的判断出来的人脸检测框,然后采用NMS算法,合并候选框,然后根据候选框提取图像,之后缩放到24*24的大小,作为RNet的输入,RNet可以精确的选取边框,一般最后只剩几个边框,最后缩放到48*48的大小,输入ONet,判断后选框是不是人脸,ONet虽然速度较慢,但是由于经过前两个网络,已经得到了高概率的边框,所以输入ONet的图像较少,然后ONet输出精确的边框和关键点信息,只是在第三个阶段上才显示人脸特征定位;前两个阶段只是分类,不显示人脸定点的结果。

训练数据库

论文中作者主要使用了Wider_face 和CelebA数据库,其中Wider_face主要用于检测任务的训练,CelebA主要用于关键点的训练.训练集分为四种:负样本,正样本,部分样本,关键点样本. 三个样本的比例为3: 1: 1: 2

训练主要包括三个任务

人脸分类任务:利用正样本和负样本进行训练

人脸边框回归任务:利用正样本和部分样本进行训练

关键点检测任务:利用关键点样本进行训练

训练数据整理:

Wider_face包含人脸边框标注数据,大概人脸在20万,CelebA包含边框标注数据和5个点的关键点信息.对于三个网络,提取过程类似,但是图像尺寸不同.

第一阶段:使用widerface的数据框和celebA的数据裁剪出来正负样本和特征点的位置,根据loss来回归人脸框;输入网络中人脸大小都是12*12的大小的人脸;阈值较小

第二阶段阶段:使用widerface的数据框和celebA的数据裁剪出来正负样本和特征点的位置,根据loss来回归人脸框;输入网络中人脸大小都是24*24的大小的人脸;用第一阶段生成的模型生成后选框,之后把后选框缩放到24*24大小,之后送入到网络中使用;使用的widerface和celebA的数据集,阈值较小

第三阶段阶段:输入网络中人脸大小都是48*48的大小的人脸;用第二阶段生成的模型生成后选框,之后把后选框缩放到48*48大小,之后送入到网络中使用;使用的widerface和celebA的数据集,使用widerface的数据框和celebA的数据裁剪出来正负样本和特征点的位置,根据loss来回归人脸框,阈值较大

其实后一个阶段实在前一个阶段上训练的模型,微调模型,让检测效果更好;

正负样本,部分样本提取:

1.从Wider_face随机选出边框,然后和标注数据计算IOU,如果大于0.65,则为正样本,大于0.4小于0.65为部分样本,小于0.4为负样本.

2.计算边框偏移.对于边框,(x1,y1)为左上角坐标,(x2,y2)为右下角坐标,新剪裁的边框坐标为(Xn1,Yn1),(xn2,yn2),width,height.则offset_x1 = (x1 - xn1)/width,同上,计算另三个点的坐标偏移.

3.对于正样本,部分样本均有边框信息,而对于负样本不需要边框信息

关键点样本提取

1. 从celeba中提取,可以根据标注的边框,在满足正样本的要求下,随机裁剪出图片,然后调整关键点的坐标.

loss修改

由于训练过程中需要同时计算3个loss,但是对于不同的任务,每个任务需要的loss不同.所有在整理数据中,对于每个图片进行了15个label的标注信息,不同阶段的loss的权重是不同的;

1. 第1列:为正负样本标志,1正样本,0负样本,2部分样本,3关键点信息

2. 第2-5列:为边框偏移,为float类型,对于无边框信息的数据,全部置为-1

3. 第6-15列:为关键点偏移,为float类型,对于无边框信息的数据,全部置为-1

4. 不同阶段的判断不同,根据选择是否使用分类的loss,回归框的loss,还是关键点的loss;

修改softmax_loss_layer.cpp 增加判断,只对于1, 0计算loss值,修改euclidean_loss_layer.cpp 增加判断,对于置为-1的不进行loss计算

困难样本选择

论文中作者对与人脸分类任务,采用了在线困难样本选择,实现过程如下:

修改softmax_loss_layer.cpp,根据计算出的loss值,进行排序,只对于70%的值较低的数据,进行反向传播.

猜你喜欢

转载自blog.csdn.net/pingfan2014/article/details/81301036