赞
踩
reference link: https://blog.csdn.net/qq_17278169/article/details/79510209
人脸检测目的就是在一张图中找到所有的人脸。本次分享只针对人脸检测,不涉及到人脸识别。
人脸检测几种常用的方法:
① 早期的人脸检测方法是利用人工提取特征,训练分类器,进行人脸检测。例如opencv源码中自带的人脸检测器就是利用haar特征进行的人脸检测。这类方法的缺点就是在环境变化强烈的时候检测效果不理想,例如弱光条件,人脸不全。
② 从通用的目标检测算法中继承过来的人脸检测算法。例如利用faster-RCNN来检测人脸。效果不错,可以适应环境变化和人脸不全等问题,但是时间消耗很高。
③ 鉴于以上两种方法的优劣势,就有人专门研究了人脸检测的算法,同时规避了以上两种的劣势,兼具时间和性能两个优势。级联结构的卷积神经网络,例如,cascadeCNN,MTCNN。MTCNN效果要比cascadeCNN要好。
目前人脸检测任务主要是有两个方面的挑战:
① 召回率:复杂背景下的人脸的尺度变化和光照等外部因素变化导致的人脸分类困难。
(在CNN方法下解决此类问题一般都是通过加入此类样本进行训练解决问题。)
② 耗时:人脸多尺度位置定位导致的时间消耗。
MTCNN算法介绍
MTCNN(多任务级联卷积神经网络)由三个部分组成,P-Net(proposal Network),R-Net(refineNet),O-Net(outputNet)。这三个部分是相互独立的三个网络结构,相互串联的关系。每个阶段的网络都是一个多任务网络,处理的任务有三个:人脸/非人脸的判断、人脸框回归、特征点定位。
流程说明:
原始待检测图像经过resize,生成不同尺寸的图像构建图像金字塔作为网络的输入。
构建的图像金字塔,其层数由两个因素决定,第一个是设置的最小人脸minSize,第二个是缩放因子factor,最小人脸表示min(w,h),论文中说明最小人脸不能小于12,给出的缩放因子0.709可以根据公式计算图像金字塔的层数
minL=org_L*(12/minsize)*factor^(n),n={0,1,2,3,...,N}
其中n就是金字塔的层数,org_L是输入原始图像的最小边min(W,H),minisize是人为根据应用场景设定,在保证minL大于12的情况下,所有的n就构成金字塔的层。所以minsize的值越小,n的取值范围就越大,计算量就相应地增加,能够检测到的人脸越小。
第一阶段,通过浅层的CNN(P-Net)快速生成候选窗口,该网络全部由卷积层实现,获取到候选人脸窗和人脸窗的回归向量,基于人脸窗的回归向量对人脸窗进行校正,然后对所有人脸窗进行NMS(非极大值抑制),合并高度重叠的人脸窗。其具体过程就是通过图像金字塔生成的各种尺寸大小的图片,每一张图都进行一次前向传播,在每个图上得到的结果之后利用设置的阈值去掉一部分,剩下的根据缩放尺度还原到原图上的坐标,将所有的坐标信息汇总,然后NMS去除一部分冗余。
第二阶段,通过一个更复杂的CNN来处理第一阶段中被误认为人脸的“人脸窗”从而精细化人脸窗,第一阶段的输出作为第二阶段的输入,第一阶段最后产生了大量的bbox,将这些bbox根据缩放因子回推到原图上之后,将他们全部resize到24x24大小,作为第二阶段的输入。第二阶段经过网络之后同样产生大量的bbox,同样的根据阈值去掉一部分,再利用nms去掉一部分。
第三阶段,使用第二阶段中最后留下来的bbox,还原到原来的图片上之后,全部resize到48x48大小,然后输入到第三阶段,使用更为复杂的CNN进一步精细化结果并输出人脸上的5个特征点。
通过三阶的级联卷积神经网络对任务进行从粗到细的处理,并提出一种新的在线困难样本生成策略提升性能,最终输出人脸框位置和五个特征点位置。整个过程中会用到三次人脸窗回归和NMS,三个网络独立工作。
关于NMS
简单来说,输入一个图片,分类器会产生多个候选框,每个候选框会有一个得分,分数就是此框是人脸的概率。
例如这张图,一共产生了4个候选框,每个候选框都有一个得分。右下角的框得分最低,如果我们这是NMS阈值为0.6,那么这个框直接被干掉,然后川普脸上还有两个框,有一定重叠,要想去掉一个框那就得用上NMS了。一般有两种种计算方式。IOU交/并,IOM交/max。如果比值大于阈值,那么直接干掉得分低的那个框。这里手上的框没有与其他框有交集,所以它不会被NMS干掉。
其实这样传统的NMS直接干掉分数低的有点简单粗暴了,有一篇论文专门针对NMS进行了改进优化,称之为soft-nms。如果某一个框的分数较低,那么不直接将这个框干掉而是降低其置信度,通过高斯加权的方式再进行排除。文章中指出在常规算法(faster-RCNN, MTCNN)中MAP值上升一个百分点。
文章链接: 《Improving Object Detection With One Line of Code》
Github链接: https://github.com/bharatsingh430/soft-nms
MTCNN方法在FDDB数据库上测试的结果是0.95。(在1000次误检情况下的准确率)
但是,MTCNN仍然具有一些缺点。
① MTCNN的检测速度跟待检测人脸的数量有很大关系,当人脸数量变多之后,检测耗时上升会非常明显。
② 在CPU上时间消耗比较严重
③ 侧脸进行人脸对齐的时候,特征点位置不准确。
针对MTCNN的优化版本已经有很多了,例如我用过两种
1,MTCNN-light,作者将caffemodel文件转成了txt,不再依赖caffe框架,只依赖openmp,在cpu平台下运行,多线程处理速度不错,但是检测效果略有下降。
2,MTCNN-AccelerateONet,专门针对最后的ONet网络进行了加速,在GPU上加速很明显。但是速度依然会受人脸数量的影响。
MTCNN,MTCNN-light,MTCNN-Accelerate三者实验对比
方法 | 输入分辨率 | 硬件平台 | 1个人脸耗时 | 8人脸耗时 |
MTCNN | VGA | GTX1070 | 13ms | 23ms |
MTCNN-Acce | VGA | GTX1070 | 8ms | 14ms |
MTCNN-light | VGA | i5 CPU | 33ms | 45ms |
方法 | 输入分辨率 | 硬件平台 | 20人脸脸耗时 |
|
MTCNN | 5184*3456 | GTX1070 | 1.25 s |
|
MTCNN-Acce | 5184*3456 | GTX1070 | 570 ms |
|
MTCNN-light | 5184*3456 | I5CPU | 3.66 s |
|
经过对比三种方法,MTCNN-light适合应用于没有gpu的硬件平台,在VGA分辨率情况下,适当调整minSize,可以做到实时检测。
对比MTCNN和MTCNN-Acce,后者的时间消耗几乎是前者的一半,在FDDB上进行测试,后者的检测效果略差于前者。如下图所示:
上面两种方法本质都是一样的,只不过加速版在最后O-Net网络结构上面进行了修改,然后重新训练得到一个新模型。在网络结构方面,加速版只是在原始版本上将第五个卷积层后面的dropout层去掉了,然后在前面卷积层的输出参数上进行了缩减,前5个卷积层的num_output都减少了一半,从而减少了计算量。如下图所示:
dropout层在神经网络中的应用目的就是防止网络层数过多出现过拟合,根据设置的dropout_ratio参数随机停止部分神经元工作,然后输出多种情况下的平均值,这样防止出现训练过拟合。这里的改动直接将卷积层输出参数去掉一半,然后不要dropout,重新训练就可以得到和原网络差不多的效果。这种方法可以值得我们借鉴。
由于MTCNN系列的方法耗时都对待检测人脸数量敏感,并且在CPU上的表现不好。所以,faceBoxes这个方法就出现了。论文中说使用的方法可以很大幅度提高检测速度,并且不受人脸数量的影响。在FDDB上准确率0.96,但是没有人脸对齐。
faceBoxes介绍
faceBoxes主要包含两个部分:RDCL和MSCL
RDCL的全名是 Rapidly Digested Convolutional Layers,主要负责快速性
MSCL的全名是 Multiple Scale Convolutional Layers,主要负责多尺度检测
如上图所示,输入一张图,会在三个分支检测人脸,这样解决多尺度的问题。
在网络的前半部分,RDCL主要是加速,快速缩小特征图。
① Conv1,Pool1, Conv2 和 Pool2 的stride分别是4,2, 2 和 2。这样整个RDCL的stride就是32,就是说原始的输入尺寸被缩小了32次。
② 另外,通过设计合适的核尺寸来加速计算。卷积核或者池化核尺寸太大就会导致计算量增加,尺寸太小又会导致覆盖的信息不足,所以文章中直接选择了7×7,5×5 , 3×3, 3×3分别对应 Conv1, Conv2 ,Pool1,Pool2 。
③ 最后,由于为了减少计算量,减少了卷积核的数量。为了保证输出维度不变,通过使用CReLU来保持输出维度不变。
关于CReLU,CReLU论文的大致意思是在神经网络中靠前的部分,参数的分布具有很强的负相关性,随着网络的变深,这种负相关性越来越弱。在网络的前部,网络更加倾向于同时捕捉正负相位的信息,但是由于ReLU的特性将负响应抹掉了,这样造成了卷积核会存在一定冗余。
上图中,红色曲线是假设随机高斯分布生成的卷积核得到的相似度统计。蓝色的直方图是对所有的卷积核寻找其pair filter,按照相似度和数量画出的。这个图说明了随着网络深度加深,负相关性越来越小。
在网络的后半部分,MSCL主要是解决人脸多尺度的问题,这种方法增加了小人脸的召回率。
① 在网络的不同层进行检测,类似于SSD。
② 采用Inception模块。由于Inception包含多个不同的卷积分支,因此可以进一步使得感受野多样化。
Faster-RCNN中RPN对小目标检测效果不好,一定程度上是因为RPN中的anchor只跟卷积层后面几层有关系,并且小目标所能对应的anchor比较少。
最后采用增加anchor密度的方法来提高多尺度人脸的召回率
根据计算anchor密度的方法,密度=anchor大小/stride,原始Inception3网络结构中anchor大小分别为32,64,128,stride为32,所以其密度为1,2,4。Conv3_2和Conv4_2的密度都是4。为了anchor的密度均衡,所以对密度不足的anchor进行均衡化。
论文的效果还没有复现出来,目前github上开源的代码,FDDB上的检测效果只有0.91,在cpu上的时间消耗在180ms左右,640X480分辨率。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。