Face Detection paper 1st season

基于深度学习的目标检测研究进展 
长文干货!走近人脸检测:从 VJ 到深度学习(上) 
长文干货!走近人脸检测:从VJ到深度学习(下)

讲讲上面没有的。 
关于目标检测,怎么去衡量一个目标检测器的好坏? 
显然这个答案是检测速度和检测精度,这是最主要的两个指标,其它的包括训练时间,算法复杂度,算法的适应能力(不同场景,不同类别)。速度的评价指标按时间计算就可以了,对于精度的评价指标包含检测框和分类精度。

  • 检测框,一般就是IOU(交并比)
  • 分类的评价指标就有点多了,有 Precision, Accuracy, Recall, Miss Rate, FPPI(False Positive per Image).我有点懵了,那么多指标到底时怎么算的?

将算法预测的结果分成四种情况。 
1. 正确肯定( True Positive,TP):预测为真,实际为真 
2. 正确否定( True Negative,TN):预测为假,实际为假 
3. 错误肯定( False Positive,FP):预测为真,实际为假 
4. 错误否定( False Negative,FN):预测为假,实际为真

Precision = TP/(TP+FP),若实际上都为假,预测总为真,则Precision=0 
Recall = TP/(TP+FN),若实际上都为真,预测总为假,则Recall=0 
Miss Rate = FN/(TP + FN),反映真被误判为假 
Accuracy = (TP + TN)/(P+N) = (TP + TN)/(TP + FN + FP + TN) 
FPPI = (False Positive 次数)/N, N为图片数

参考内容 [机器学习指标大汇总]:http://www.36dsj.com/archives/42271

知道了如何衡量一个目标检测器的好坏,怎样设计检测器了? 
检测的基本思路

窗口特征提取分类检测结果
  • 窗口

    • silding window
    • MCG
    • Selective Search
    • RPN…
  • 特征提取

    • Harr, HOG, LBP, CNN
  • 分类

    • SVM, Softmax
  • 检测结果

    • NMS,边框回归,窗口合并

设计目标检测器最简单有效的方法就是在别人已有的方法上改进。目前目标检测的方法大体分为R-CNN系列和级联系列两类,另外还有基于回归的YOLO,SSD,浅层+深层特征组合使用的Hypercolumns, HyperNet[8],不同大小的 RoI 用不同层的特征Scale Dependent Pooling[9],densebox。R-CNN系列上面已经提供了参考资料,所以这里谈谈上面没有提及的R-FCN,该方法在Faster R-CNN上进一步加速,去掉了检测分支各个ROI之间的重复计算,在feature map提取k*k个位置敏感区,别人的blog。此外,浅层+深层组合,浅层保留了局部细节,利于边框的准确定位。深层特征,更抽象的特征,利于分类。

设计的两条线路

  • 从准到快,R-CNN → Fast R-CNN → Faster R-CNN → R-FCN。
  • 从快到准,基于级联结构检测器。

对于特定的目标检测:人脸的检测要比通用的目标检测在速度上具有更高的要求,实际应用的特定目标检测会在经典的级联基础上修改,为了增加检测速度,可以采取的措施:减小单个CNN的复杂度,多个级联(例如卷积核大小5*5可以分为2个3*3的级联,可参考GoogleNet),加大滑步,减小输入窗口规模,若窗口不够准,可以增加校准模块。

Joint Training of Cascaded CNN for Face Detection

人脸检测中级联卷积神经网络的联合训练[7] 
复现最好在caffe-fast-rcnn上进行,因为FaceCraft相比之前的separate cascaded networks修改了bbox location。训练的时候是模块单独训练,然后joint做fine-tune,还是从一开始就joint training? 文中提过threshold layer用于难负样本挖掘(这么翻译好别扭,harder negative ming),那么我倾向于前者,joint起来做fine-tune。 
这里写图片描述


Joint Face Detection and Alignment using Multi-task Cascaded CNN

使用多任务级联卷积神经网络进行人脸检测和对齐【6】这篇文章对【5】进行了如下改进:
减少了滤波数量
滤波器大小由5×5 改为 3×3 以减少计算量
在线样本挖掘

这里写图片描述

整个架构由R-Net, R-Net, O-Net组成。P-Net区域网络用于获取人脸候选窗口以及bbox回归。R-Net对P-Net进行进一步筛选,O-Net输出网络同R-Net。需要对face,bbox,landmark进行分别训练,例如当训练face时,只采用face的loss,其余的loss设置为0,有点“有我没他”意思。文章后面提出了Multi-source training也仅仅给出了一个overall learning target(整体学习目标公式)。


A CNN Cascade for Face Detection

一种基于级联的卷积神经网络的人脸检测【5】

这里写图片描述
利用CNN提取特征然后级联的方式检测人脸,由三个弱分类器组成了一个强分类器,对no-faces的检测有很好的加速作用。detection nets 和calibration nets的结构上是相同的,只在输出层有所差异,detection nets的输出是一个二分类,以判断faces和no-faces。calibration nets的输出为45classes的候选项,优化bbox。

这里写图片描述

候选区域的划定,有N个三维的候选参数 {[sn,xn,yn]}Nn=1 决定。文中指定了N=45个参数。 

sn{0.83,0.91,1.0,1.10,1.21}

xn{0.17,0,0.17}

yn{0.17,0,0.17}

(xxnwsn,yynhsn,wsn,hsn)

分别计算每一个detection nets的输出人脸图像的bbox的bbox calibration,然后较准确的bbox,最后输出的
{[s,x,y]}=1Zn=1N[sn,xN,yn]I(cn>t)

这里写图片描述

下图间接的反应的检测步骤,该图说明了calibration net有利于提高Recall。

这里写图片描述

NMS

参考论文 ICPR2006-*Efficient Non-Maximum Suppression


A Fast and Accurate Unconstrained Face Detector

http://www.cbsr.ia.ac.cn/users/scliao/projects/npdface/index.html 
https://github.com/CitrusRokid/OpenNPD


From Facial Parts Responses to Face Detection

基于DCN的高效(局部)人脸检测[3]


Multi-view Face Detection Using Deep CNN

基于深度卷积神经网络的多视角人脸检测方法[2],来自yahoo,可自适应多角度及部分遮挡,与R. Girshick et al. feature hierarchies for accurate object detection and semantic segmentation 不同,该方法不需要额外的components,例如分割,bounding-box回归,SVM。

github 1, github 2

数据采用AFLW,为了提高正样本数量,对图片进行随机子窗口采样,将IOU>0.5的列为正样本。通过随机反转来增加数据量。文中没有提负样本的处理方法,总结:将IOU<0.3的作为负样本。正负样本比例为1:2~3(本文采用1:3),此外采用Hard negative mining方法重复训练。

训练方式是在AlexNet的model上进行fine-tunned,fine-tune的方法采用50K迭代,batch size为128,正负样本比1:3,输入图片大小227x227。

与AlexNet不同的是,DDFD(本文检测方法)把全连接通过reshaping的方法改成卷积,不仅使处理任意大小的图片成为可能,同时包含了face classifier的heat-map。

因为CNN只响应227 x227大小的区域,所以通过对图片进行scale来获取新的heat-map用来检测不同大小的face。最后通过heat-map计算face proposals +SVM对图片进行分类,NMS对face进行定位。


这里写图片描述

如何将全连接层转换为全卷积连接层?

heatmap的实现参考net_surgery

# Load the original network and extract the fully connected layers' parameters.
net = caffe.Net('../models/bvlc_reference_caffenet/deploy.prototxt', 
                '../models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel', 
                caffe.TEST)
params = ['fc6', 'fc7', 'fc8']
# fc_params = {name: (weights, biases)}
fc_params = {pr: (net.params[pr][0].data, net.params[pr][1].data) for pr in params}

for fc in params:
    print '{} weights are {} dimensional and biases are {} dimensional'.format(fc, fc_params[fc][0].shape, fc_params[fc][1].shape)

# Load the fully convolutional network to transplant the parameters.
net_full_conv = caffe.Net('net_surgery/bvlc_caffenet_full_conv.prototxt', 
                          '../models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel',
                          caffe.TEST)
params_full_conv = ['fc6-conv', 'fc7-conv', 'fc8-conv']
# conv_params = {name: (weights, biases)}
conv_params = {pr: (net_full_conv.params[pr][0].data, net_full_conv.params[pr][1].data) for pr in params_full_conv}

for conv in params_full_conv:
    print '{} weights are {} dimensional and biases are {} dimensional'.format(conv, conv_params[conv][0].shape, conv_params[conv][1].shape)

for pr, pr_conv in zip(params, params_full_conv):
    conv_params[pr_conv][0].flat = fc_params[pr][0].flat  # flat unrolls the arrays
    conv_params[pr_conv][1][...] = fc_params[pr][1]

net_full_conv.save('net_surgery/bvlc_caffenet_full_conv.caffemodel')
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

Joint Cascade Face Detection and Alignment

C++ implementation of Joint Cascade Face Detection and Alignment[1].


Read More

  1. 怎么把人脸检测的速度做到极致?

Resources

  1. Fine-grained evaluation of face detection in the wild该网站同时给出了不少发表在顶会牛刊的人脸检测算法的检测结果及论文列表(部分有开源代码)
  2. Build a Face Detection App Using Node.js and OpenCV by Lukas White (OpenCV+Node.js构建在线人脸检测服务)
  3. 免费人脸检测库libfacedetection

[1]D. Chen, S. Ren, Y. Wei, X. Cao, and J. Sun. Joint Cascade Face Detection and Alignment. ECCV, 2014. 
[2]S. S. Farfade, M. Saberian, and L-J Li. Multi-view Face Detection Using Deep Convolutional Neural Networks. ICMR, 2015. 
[3]Shuo Yang, Ping Luo, Chen Change Loy, Xiaoou Tang. From Facial Parts Responses to Face Detection: A Deep Learning Approach. ICCV, 2015. 
[4]Shengcai Liao, Anil K. Jain, and Stan Z. Li, “A Fast and Accurate Unconstrained Face Detector,” IEEE Transactions on Pattern Analysis and Machine Intelligence, 2015 
[5]Haoxiang Li, A Convolutional Neural Network Cascade for Face Detection. 
[6]Kaipeng Zhang, et al. Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks 
[7]Qin H, Yan J, Li X, et al. Joint Training of Cascaded CNN for Face Detection[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 3456-3465. 
[8]Towards Accurate Region Proposal Generation and Joint Object Detection. CVPR 2016 
[9]Fast and Accurate CNN Object Detector with Scale Dependent Pooling 
and Cascaded Rejection Classifiers. CVPR 2016.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值