(转)人脸检测(MTCNN)和人脸特征点检测(TCDCN)

http://www.cnblogs.com/ranjiewen/articles/8039591.html

《Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks》论文解读。

本文来自于中国科学院深圳先进技术研究院,目前发表在arXiv上,是2016年4月份的文章,算是比较新的文章。 
论文地址:

https://kpzhang93.github.io/MTCNN_face_detection_alignment/

概述

相比于R-CNN系列通用检测方法,本文更加针对人脸检测这一专门的任务,速度和精度都有足够的提升。R-CNN,Fast R-CNN,FasterR-CNN这一系列的方法不是一篇博客能讲清楚的,有兴趣可以找相关论文阅读。类似于TCDCN,本文提出了一种Multi-task的人脸检测框架,将人脸检测和人脸特征点检测同时进行。论文使用3个CNN级联的方式,和Viola-Jones类似,实现了coarse-to-fine的算法结构。

框架

算法流程

pipeline

当给定一张照片的时候,将其缩放到不同尺度形成图像金字塔,以达到尺度不变。

Stage 1:使用P-Net是一个全卷积网络,用来生成候选窗和边框回归向量(bounding box regression vectors)。使用Bounding box regression的方法来校正这些候选窗,使用非极大值抑制(NMS)合并重叠的候选框。全卷积网络和Faster R-CNN中的RPN一脉相承。

Stage 2:使用N-Net改善候选窗。将通过P-Net的候选窗输入R-Net中,拒绝掉大部分false的窗口,继续使用Bounding box regression和NMS合并。

Stage 3:最后使用O-Net输出最终的人脸框和特征点位置。和第二步类似,但是不同的是生成5个特征点位置。

CNN结构

本文使用三个CNN,结构如图:

CNN

训练

这个算法需要实现三个任务的学习:人脸非人脸的分类,bounding box regression和人脸特征点定位。

MTCNN特征描述子主要包含3个部分,人脸/非人脸分类器,边界框回归,地标定位。

人脸分类:

上式为人脸分类的交叉熵损失函数,其中,pi为是人脸的概率,yidet为背景的真实标签。

边界框回归:

上式为通过欧氏距离计算的回归损失。其中,带尖的y为通过网络预测得到,不带尖的y为实际的真实的背景坐标。其中,y为一个(左上角x,左上角y,长,宽)组成的四元组。

地标定位:

和边界回归一样,还是计算网络预测的地标位置和实际真实地标的欧式距离,并最小化该距离。其中,,带尖的y为通过网络预测得到,不带尖的y为实际的真实的地标坐标。由于一共5个点,每个点2个坐标,所以,y属于十元组。

多个输入源的训练:

整个的训练学习过程就是最小化上面的这个函数,其中,N为训练样本数量,aj表示任务的重要性,bj为样本标签,Lj为上面的损失函数。

在训练过程中,为了取得更好的效果,作者每次只后向传播前70%样本的梯度,这样来保证传递的都是有效的数字。有点类似latent SVM,只是作者在实现上更加体现了深度学习的端到端。

在训练过程中,y尖和y的交并集IoU(Intersection-over-Union)比例:

0-0.3:非人脸

0.65-1.00:人脸

0.4-0.65:Part人脸

0.3-0.4:地标

训练样本的比例,负样本:正样本:part样本:地标=3:1:1:2

αdet=1,αbox=0.5,αlandmark=1

(5)online hard sample mining

传统的难例处理方法是检测过一次以后,手动检测哪些困难的样本无法被分类,本文采用online hard sample mining的方法。具体就是在每个mini-batch中,取loss最大的70%进行反向传播,忽略那些简单的样本。

实验

本文主要使用三个数据集进行训练:FDDB,Wider Face,AFLW。

A、训练数据

本文将数据分成4种:

Negative:非人脸 
Positive:人脸 
Part faces:部分人脸 
Landmark face:标记好特征点的人脸

分别用于训练三种不同的任务。Negative和Positive用于人脸分类,positive和part faces用于bounding box regression,landmark face用于特征点定位。

B、效果

本文的人脸检测和人脸特征点定位的效果都非常好。关键是这个算法速度很快,在2.6GHZ的CPU上达到16fps,在Nvidia Titan达到99fps。

总结

本文使用一种级联的结构进行人脸检测和特征点检测,该方法速度快效果好,可以考虑在移动设备上使用。这种方法也是一种由粗到细的方法,和Viola-Jones的级联AdaBoost思路相似。

类似于Viola-Jones:1、如何选择待检测区域:图像金字塔+P-Net;2、如何提取目标特征:CNN;3、如何判断是不是指定目标:级联判断。

附录

在目标检测论文中,常出现的一些方法有Bounding box regression,IoU,NMS。这里具体介绍一下。

Bounding box regression

这边有个很好的答案了:

http://www.caffecn.cn/?/question/160

简单而言就是将预测的框移动到实际的框,输入特征是候选区域提取的特征,目标是两个框的变化值。

IoU

重叠度(IOU):

物体检测需要定位出物体的bounding box,就像下面的图片一样,我们不仅要定位出车辆的bounding box 我们还要识别出bounding box 里面的物体就是车辆。

这里写图片描述

对于bounding box的定位精度,有一个很重要的概念: 因为我们算法不可能百分百跟人工标注的数据完全匹配,因此就存在一个定位精度评价公式:IOU。 它定义了两个bounding box的重叠度,如下图所示

iou

IoU=(A∩B)/A∪B


就是矩形框A、B的重叠面积占A、B并集的面积比例。

非极大值抑制(NMS):

RCNN会从一张图片中找出n个可能是物体的矩形框,然后为每个矩形框为做类别分类概率:

car

就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制的方法是:先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F。 
(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值; 
(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。 
(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。 
就这样一直重复,找到所有被保留下来的矩形框。 
非极大值抑制(NMS)顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不讨论通用的NMS算法,而是用于在目标检测中用于提取分数最高的窗口的。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。

  • TCDCN(Tasks-Constrained Deep Convolutional Network)

文章提出TCDCN(Tasks-Constrained Deep Convolutional Network),使用与人脸相关的属性共同来学习人脸的特征点位置,通过这种多任务的学习,来提高人脸特征点检测的鲁棒性。具体而言,就是在人脸特征点检测时候,同时进行多个任务(包括性别、是否戴眼镜、是否微笑以及脸部姿势)的学习。使用这些辅助属性可以帮助更好的定位特征点。

这种多任务学习的困难在于:不同的任务有不同的特点,有不同的收敛速度。针对这两个问题,作者给出的解决方法分别是tasks-constrained deep model和task-wise early stopping。文章所提出的方法优于当时已存在的方法,特别是能处理有严重遮挡和姿势变化的情况,而且减少了模型的复杂度。

上图展示了其他辅助属性的检测结果,人脸特征点检测这一任务可以与多个辅助任务同时进行,对比以前的CNN和Cascaded  CNN,文章具有更好的表现性

要点:

(1)对于不同的任务,具有不同的特点,文章给出的解决方法是tasks-constrained deep model

传统的多任务学习给每个任务都赋予相同的权重:

一般的多任务学习则把主任务(特征点)和其他任务(辅助属性)分开处理,如下:

而文章采用对主任务(regression)采用最小二乘法作为损失函数,对辅助任务(classification)使用交叉熵损失函数,如下:

从这个式子上可以看到,损失函数的前半部分(f为线性函数)就是特征点检测,后边部分(p为softmax函数)是不同分类任务的loss相加,最后一项是正则化项。

在训练的时候,各个任务使用相同的特征,只有在最后一级的时候才根据任务的不同做不同的处理(线性回归/分类)。

(2)不对于多任务而言,不同的任务有着不同的损失函数,学习难度也不同,因此它们的收敛速度也可能相异。现有的解决这个问题的方法是通过探索这些任务的关系来解决,比如说通过所有任务的权重协方差矩阵,但是这篇文章提出了一个更有依据的方法:task-wise early stopping

当辅助任务达到最好的表现之后,这个任务对主任务就没有什么帮助了,这个时候就可以停止这个任务。那我们如何判断这个辅助任务是否起到了它应起的作用呢,我们应该什么时候终止这个任务呢?如下式所示,前一部分表示训练误差的趋势,后一部分表示跟训练误差相比的泛化误差。如果两式乘积超过了某个阈值,则终止该任务。

文章所述,使用的是SGD(stochastic gradient descent)来更新任务的权重以及网络的过滤器,后向传播计算梯度使用的策略如下:

TCDCN所用的框架如下,输入是一个40x40的灰色图像,特征提取阶段包括4个卷积层、3个池化层和1个全连接层,过滤器的权重在空间上不是共享的,这意味着在输入map中使用的是不同的过滤器集合。选择绝对值整流的双曲正切作为激活函数;最大池化在没有重叠的区域进行,跟在四个卷积层后的全连接层生成一个特征向量,这个特征向量在估计阶段的时候被多个任务共享,其中线性回归(Linear regression)用来得出标记点位置,多个逻辑回归(logistic regression)用来处理其他多个人任务。

评估准则使用的额是均值误差和失败率来衡量,mean error通过计算landmark和the ground truths的距离,然后相对于双目距离进行标准化得出,Mean error大于10%则认为失败。

下图是Facial Landmark Detection(FLD)和用其他辅助属性进行比较的结果,很明显可以看出使用辅助属性进行特征点检测的误差和失败率比没有使用辅助属性的要低得多,而且使用的辅助属性越多,性能及越好。

还推荐一篇作者同类型的文章:《Learning Deep Representation  for Face Alignment with Auxiliary Arribute》提出用辅助属性的脸部对齐的深度表示

猜你喜欢

转载自blog.csdn.net/zyb418/article/details/88636998