本文来自《Detecting Faces Using Region-based Fully Convolutional Networks》,又是腾讯ai实验室的作品。时间线为2017年9月。

0 引言


如图所示,影响人脸检测的涉及到人脸遮挡,人脸尺寸,光照条件,各种姿态,丰富的表情等等。fast/faster rcnn模型都是基于r-cnn模型的方法,并通过ROI的方式逐区域的进行检测。然而直接在全卷积网络上(例如ResNet)使用特定区域操作的方法,因为强大的分类能力反而导致检测性能不足。相较而言,R-FCN是都通过全卷积方式来处理该问题的。R-FCN的卷积网络是基于整个图片进行计算共享的,这是的对训练和测试的性能都有提升。相比于R-CNN,R-FCN提出了使用更少的逐区域层来平衡分类和检测的训练,自然地将全卷积网络与基于区域的模块相结合。

作为目标检测中的一个子领域,人脸检测因为采用了基于区域的方法而效果大大提升。且基于R-FCN的模型效果更优于基于R-CNN的人脸检测效果。基于通用人脸的尺寸,作者精心设计了锚和ROI的尺度。因为考虑到人脸的部分结构比较难检测,所以作者引入了一个位置敏感平均池化来生产嵌入特征,以此增强辨识性,并消除了每个人脸部分中非均匀分布的影响。并且,作者采用了多尺度训练和测试方法。同时也引入了在线硬样本挖掘方法加速训练。
本文主要贡献如下:

  • 提出了一个人脸检测框架,通过整合几种新想法去考虑人脸的特殊属性。因为提出的方法是基于R-FCN,所以也适合人脸检测,故而得名face rfcn;
  • 引入一个新颖的位置敏感平均池化去重新权重化得分map上的嵌入响应,并消除每个人脸部分上非均匀贡献的影响。
  • 在WIDER FACE和FDDB上获得了最好;

1 结构


为了提升R-FCN架构对人脸检测的性能,这里有三方面的改进:

  • 引入额外更小的锚,并将位置敏感ROI池化改的更小以适应很小人脸的检测;
  • 提出在R-FCN最后一层特征投票层使用位置敏感平均池化而不是通常的平均池化;
  • 采用多尺度训练。在训练阶段采用在线硬样本挖掘策略,在测试阶段将多尺度检测结果聚合起来去提升效果。

1.1 基于R-FCN的基本结构

R-FCN是一个基于区域的全卷积网络,最初是用来做目标检测的。不同于其他基于区域的检测器(例如Faster RCNN),R-FCN构建一个更深的全卷积网络,且通过在整个图片上共享计算,从而没有增加速度负载。R-FCN建立在ResNet 101上,包含了RPN和一个R-FCN模块。
在R-FCN中的ResNet结构主要扮演特征提取器。ResNet构建了一个非常深的网络,用于提取高度表征的图像特征。这些特征可以抓取相当大的感受野,而这其中很小的人脸检测也能得益于其抓取的上下文信息。从ResNet的最终输出feature map上,RPN可以根据锚生成一系列ROI。这些ROI再送入两个分离的R-FCN模块中位置敏感ROI池化层,以生成类别得分map和边界框预测map。在R-FCN的最后,在分类得分map和边界框预测map上分别使用全局平均池化以各自融合类别得分和边界框预测。

有两个采用R-FCN而不是R-CNN的优势:

  • 位置敏感ROI池化巧妙的通过池化一组特征map到一个输出得分map的具体位置上,从而将位置信息编码到每个ROI中;
  • 在ResNet中,没有非自然的加入全连接网络层,R-FCN的feature map可以训练更具表达性和更容易的学到类别得分和人脸的边界框。

基于R-FCN,作者提出了几个修改点以提升检测效果。对于更好的检测小脸,作者引入了更多更小尺度的锚(1到64个像素)。这些更小的锚 非常有助于抓取极端小的人脸。另外,作者设定了更小的池化尺度以池化位置敏感ROI,以此减少冗余信息。并修正了后续的投票机制(平均池化)并提出了位置敏感平均池化。最终在ResNet的最后阶段采用了atrous卷积,从而在更大感受野中没有丢失上下文信息下保证feature map的尺度。

1.2 位置敏感的平均池化

在原始R-FCN中,全局平均池化是将位置敏感ROI池化后的特征融合到一个维度上。该操作会导致每个位置人脸呈现均匀分布。然而人脸的每个位置在检测而言都是非均匀的。例如在人脸识别中,《Recognizing imprecisely localized, partially occluded, and expression variant faces from a single sample per class》人眼通常需要比嘴巴获得更多关注。直观上,我们相信这样的假设,即不同的人脸区域的重要性肯定是不同的。因此,作者提出了对位置敏感ROI池化的输出中每个位置进行权重化,从而重新权重每个区域,这被称为位置敏感平均池化。

形式化上,假设\(\bar{X}=\{X_i|i=1,2,...M\}\)表示一个位置敏感ROI池化层的输出M个featuremap,并且\(X_i=\{x_{i,j}|j=1,2,...,N^2\}\)表示第\(i_{th}\)个feature map,这里\(N\)表示池化的feature map的尺度,位置敏感平均池化计算特征响应值的权重化后的平均值,以此从\(\bar{X}\)得到平均特征\(Y=\{y_i|i=1,2,...M\}\),这里\(y_i\)表示为:
\[y_i=\frac{1}{N^2}\sum_{j=1}^{N^2}w_jx_{i,j}\]
这里\(w_j\)表示第\(j-th\)个位置的权重,注意到位置敏感平均池化就是在每个响应的位置上执行特征嵌入然后进行平均池化。因此,在大多数流行的DNN结构上都可以方便的实现位置敏感平均池化。

1.3 多任务训练和预测

受到《Face R-CNN》的启发,作者也采用了多尺度训练和测试的策略。在训练阶段,将输入的图片最短边resize成1024或者1200个像素。这里的训练策略保证模型可以鲁棒性的检测不同尺度的目标,特别是小型人脸。在线硬样本挖掘也是一个简单但是有效的策略。在训练阶段,采用OHEM保证每个mini-batch上正负样本比例1:3。在测试阶段,对每个测试图片建立一个金字塔,金字塔的每个尺度都独立进行测试(即一张图片会经过网络好几次)。然后将每个尺度的结果最后融合到原尺度图片上。

1.4 实现细节

这里训练时候的超参数类似face r-cnn。不过不同于face rcnn,作者采用的ResNet 101是在imagenet上预训练过的。特别是,在整个训练过程中将ResNet101模型的核参数固定住,以此保证特征提取器的稳定。
在RPN阶段,face rfcn枚举了多个锚的配置以准确的搜索人脸。通过结合大范围的尺度和长宽比,从而构建多尺度锚。这些锚然后映射到原始图像上以计算与ground-truth的IOU的得分,然后采用下列规则:

  • 最高IOU得分的锚被标记为正样本;
  • IOU超过0.7的被标记为正样本;
  • 如果IOU低于0.3,则标记为负样本。

R-FCN随后基于处理过的锚(候选框)进行训练,这里正样本和负样本的IOU分别是大于0.5的,和在0.1与0.5之间的。RPN和R-FCN同时基于softmax loss和平滑L1 loss联合训练。
在某个IOU得分上,会采用NMS来规范化这些锚。并通过OHEM来训练硬样本。RPN的minibatch大小为256,R-FCN的batchsize为128.大致上实现了end-to-end的训练方式。
.

face detection[Face R-FCN]的更多相关文章

  1. [Object Tracking] Contour Detection through Tensorflow running on smartphone

    From: 手机端运行卷积神经网络的一次实践 -- 基于 TensorFlow 和 OpenCV 实现文档检测功能 貌似不错的东西:移动端视觉识别模型:MobileNets Holistically- ...

  2. R 语言词云wordcloud

    来源:http://blog.chinaunix.net/uid-25135004-id-4311592.html wordcloud函数--用于绘制词云图 用法: wordcloud(words,f ...

  3. Image Processing and Analysis_8_Edge Detection:Multiresolution edge detection techniques ——1995

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

  4. Image Processing and Analysis_8_Edge Detection:Finding Edges and Lines in Images by Canny——1983

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

  5. {Reship}{Code}{CV}

    UIUC的Jia-Bin Huang同学收集了很多计算机视觉方面的代码,链接如下: https://netfiles.uiuc.edu/jbhuang1/www/resources/vision/in ...

  6. UIUC同学Jia-Bin Huang收集的计算机视觉代码合集

    转自:http://blog.sina.com.cn/s/blog_631a4cc40100wrvz.html   UIUC的Jia-Bin Huang同学收集了很多计算机视觉方面的代码,链接如下: ...

  7. 基于 TensorFlow 在手机端实现文档检测

    作者:冯牮 前言 本文不是神经网络或机器学习的入门教学,而是通过一个真实的产品案例,展示了在手机客户端上运行一个神经网络的关键技术点 在卷积神经网络适用的领域里,已经出现了一些很经典的图像分类网络,比 ...

  8. [ZZ] UIUC同学Jia-Bin Huang收集的计算机视觉代码合集

    UIUC同学Jia-Bin Huang收集的计算机视觉代码合集 http://blog.sina.com.cn/s/blog_4a1853330100zwgm.htmlv UIUC的Jia-Bin H ...

  9. Computer Vision Resources

    Computer Vision Resources Softwares Topic Resources References Feature Extraction SIFT [1] [Demo pro ...

  10. 深度学习阅读列表 Deep Learning Reading List

    Reading List List of reading lists and survey papers: Books Deep Learning, Yoshua Bengio, Ian Goodfe ...

随机推荐

  1. 一个AI产品经理怎么看AI的发展

    一个AI产品经理怎么看AI的发展 https://www.jianshu.com/p/bed6b22ae837 最近一直在思考这个问题,人工智能接下来的几年会有什么样的发展,是否真的能够在很多工作岗位 ...

  2. bitnami_redmine3.3.0-1 问题及备份恢复

    1. 服务不见了处理方法: 安装Bitnami Redmine之后,会生成5个与之相关的进程,分别是 redmineApache redmineMySQL redmineSubversion redm ...

  3. Android为TV端助力 史上最简单易懂的跨进程通讯(Messenger)!

    不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递m ...

  4. Android为TV端助力 post带数据请求方式,传递的数据格式包括json和map

    如下: public static String httpPost(String url, String json) { try { URL u = new URL(url); HttpURLConn ...

  5. tab 切换实现方法

    ul li 实现方法(只适用于,一个页面只有一组ul>li) <!--menu--> <div class="nav"> <ul class=& ...

  6. Jupyter Notebook默认工作路径的修改

    相信每一个学习Python的童鞋,都尝试过Jupyter Notebook,所以我也就不多介绍,真的还不错哎这软件. 不过美中不足的,就是它的默认工作路径,每次打开都是系统盘的Administrato ...

  7. 原型模式ProtoType

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/3/4 21:49 # @Author : ChenAdong # @emai ...

  8. linux hadoop2.x快速安装

    ........ http://blog.csdn.net/se7en_q/article/details/47258007

  9. 转:EditPuls 5.0 注册码

    EditPlus5.0注册码 注册名 Vovan 注册码 3AG46-JJ48E-CEACC-8E6EW-ECUAW EditPlus3.x注册码 EditPlus注册码生成器链接 http://ww ...

  10. NSMutableArray 增删操作测试

    NSMutableArray *testArray = [NSMutableArray array]; [testArray addObject:"]; [testArray addObje ...