MTCNN 人脸

本质:多级联的检测识别器(检测+对齐+识别)

作者提出:1)边界框与人脸关键点存在内在的联系(检测和人脸对齐有内在联系)

                  2)面部对齐常用方法:1.基于回归算法  2.模板拟合方法

                   3)对于一个二分类问题,我们每层只需要较少的滤波器

现有方法: 1)像素特异性+随机森林 联合进行对齐和检测 

                 2)多任务CNN提高面部检测准确率,其中融合了浅层的弱面部检测信息

文中技巧:

   1.减少滤波器的数量并将5×5滤波器更改为3×3滤波器以减少计算,同时增加深度以获得更好的性能

   2.池化操作都是步长为2的卷积,可以进行通道信息的融合

   3.关键点定位任务学习有助于增强人脸分类和边界框回归任务

网络设计:

MTCNN 人脸

P-NET: 快速生成候选框(12-NET)       

R-NET:非人脸抑制(24-NET)

O-NET:进行人脸关键点定位(48-NET)

 

MTCNN 人脸

 

1.针对二分类问题:作者使用了交叉熵损失函数

            MTCNN 人脸

2.针对边框回归,使用了欧式距离

            MTCNN 人脸

3.针对关键点回归,仍使用欧式距离

             MTCNN 人脸

4. 对损失函数进行加权调整

              MTCNN 人脸

      P-Net和R-Net中使用:MTCNN 人脸MTCNN 人脸

      O-Net中:MTCNN 人脸

      MTCNN 人脸表示正样本或者负样本

5.难样本学习策略:

MTCNN 人脸

我们使用:

1)在P-NET中,进行样本增强(采用随机裁剪的策略形成难样本)

2)利用R-NET输出的正样本,负样本,对O-NET进行训练

3)利用R-NET 和 O-NET中输出的数据图片作为训练样本对O-NET进行训练

 

                            祝好~!

 

MTCNN训练过程https://blog.****.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%的值较低的数据,进行反向传播.

相关博客:https://blog.****.net/wfei101/article/details/80489119

LSTM:相关知识