本文来自《DSFD: Dual Shot Face Detector》,时间线为2018年10月,是南理工Jian Li在腾讯优图实验室实习时候的作品。在WIDER FACE,FDDB上效果也超过了PyramidBox和SRN。

0 引言

最近在比赛上拿到最好成绩的人脸检测模型大致可以分成2类:

  • 基于RPN的网络,这种网络是2阶段模型
  • 基于SSD这种一次shot检测,直接预测边界框和置信度。

而一次shot的检测器因其高预测速度和简单的系统设计而更受青睐。不过分析下来,仍然有以下三个问题未完全解决:

  • 特征学习:当前特征金字塔网络(feature pyramid network,FPN)广受应用,然而FPN只是将high-level和low-level的输出网络层简单合并了下,并未考虑到当前层的信息,而且基于锚之间的上下文关系信息都被忽略了;
  • loss设计:主流使用的是目标检测中传统的loss函数,为了解决类别不平衡问题,Focal loss可以重点关注一个稀疏的硬样本的训练。为了使用所有原始和增强的特征,《Feature agglomeration networks for single stage face detection》提出层级loss以更有效训练网络。然而上面这些loss函数都没考虑到feature map在不同level上需要渐进学习的能力;
    ps:平滑L1 loss有助于阻止梯度爆炸
  • 锚匹配策略:基本上,每个feature map上面的预定义锚集合是通过在图片上平铺不同尺度和长宽比的框完成的。许多别人先前的工作分析了锚的合理尺度和锚的补偿策略,以此来增加正锚的数量。然而这些策略忽略了数据增强中的随机采样。人脸尺度的连续性和大量不同尺度的锚仍然会导致负锚和正锚之间比例的差距

本文提出了一个新的人脸检测框架叫DSFD(dual shot face detector),其继承了SSD的结构:

  • 首先,结合PyramidBox中low-level的FPN与RFBNet中的感受野块(receptive field block,RFB),提出一个特征增强模块(feature enhance module,FEM)来增强特征的判别性和鲁棒性;
  • 其次,受到《Feature agglomeration networks for single stage face detection》中层级loss(hierarchical loss)和PyramidBox中的金字塔锚的启发,将更小的锚平铺到higher-level feature map cell上可以获得更多关于分类的语义信息和更多关于检测的高分辨率定位信息。提出渐进锚loss(progressive anchor,loss,PAL),通过一组更小的锚去计算辅助有监督loss,以辅助特征学习;
  • 最后,提出一个改进锚匹配方法(improved anchor matching,IAM),在DSFD中融合锚划分策略和基于锚的数据增强方法去,以提供更好的回归器初始化,让锚和ground-truth人脸尽可能匹配。


图1显示更小的锚平湖和改进的锚与ground-truth人脸的匹配可以消除尺度和遮挡的问题,从而提升人脸检测性能。

1 结构

1.1 DSFD的结构(Pipeline of DSFD)

DSFD的结构如图2。

作者也采用如PyramidBox和S3FD中一样的策略,通过扩展VGG16作为DSFD的基底骨干网络,即将VGG16的全连接层替换成其他辅助的卷积层。作者选择conv3_3,conv4_3,conv5_3,conv_fc7,conv6_2,conv7_2作为first shot检测器层,以生成6个original feature maps,其对应命名为,\(of_1\),\(of_2\),\(of_3\),\(of_4\),\(of_5\),\(of_6\);然后,作者提出的FEM可以将这些original feature maps 转换成6个增强的feature maps,其对应命名为\(ef_1\),\(ef_2\),\(ef_3\),\(ef_4\),\(ef_5\),\(ef_6\),它们与对应的original feature maps有相同的size,通过将他们输入到SSD类型的头部,以此构建second shot 检测层。注意到训练图片的输入size是640,这意味着lowest-level层到highest-level层的feature map的size 从160到5。不同于S3FD和PyramidBox,在使用FEM对感受野增强和新的锚设计策略后,原则上就没必要让(stride,锚,感受野)这三个size满足等比例间隔原则。因此,DSFD更灵活也更鲁棒。同时,original和enhanced shot有2个不同的loss。分别被命名为第一次shot渐进式锚loss(first shot progressive anchor loss, FSL)和第二次shot渐进式锚loss(second shot progressive anchor loss, SSL)。

1.2 特征增强模块(Feature Enhance Module)

这里提出的FEM模块主要是为了增强original features 让特征变得更据辨识性和鲁棒性。对于当前锚\(a(i,j,l)\),FEM会利用包含当前层锚\(a(i-1,j-1,l)\),\(a(i-1,j,l)\),...\(a(i,j-+1,l)\),\(a(i+1,j+1,l)\)和上层锚\(a(i,j,l+1)\)的不同维度信息。具体的,关联锚\(a(i,j,l)\)的feature map cell可以通过数学定义:

这里\(c_{i,j,l}\)是在第\(l\)层中feature maps上坐标为\((i,j)\)的cell,\(f\)表示扩张卷积(dilation convolution),逐元素相乘和上采样操作的组合,\(\gamma, \delta\)分别表示当前层信息和上一层信息。

如图3所示,其是FEM的原理,主要是受到FPN和RFB的启发。这里:

  • 首先用1x1卷积核去归一化feature maps;
  • 然后,上采样上一层feature maps并与当前层进行逐元素相乘;
  • 最后,将feature maps划分成3个部分,并连接对应的3个子网络,每个子网络包含不同数量的扩张卷积层。

1.3 渐进锚loss(Progressive Anchor Loss)

DSFD采用的是多任务loss,因为其可以让original和enhanced feature maps的训练任务以两个shots进行训练。首先,DSFD的second shot anchor-based 多任务loss函数定义如下:
\[L_{SSL}(p_i,p_i^*,t_i,g_i,a_i)=\frac{1}{N}(\sum_iL_{conf}(p_i,p_i^*)+\beta\sum_ip_i^*L_{loc}(t_i,g_i,a_i))\]
这里\(N\)是匹配的密集边界框的个数;\(L_{conf}\)是基于2个类(人脸和背景)的softmax loss;\(L_{loc}\)是基于锚\(a_i\)下,介于参数化的预测边界框\(t_i\)和ground-truth边界框\(g_i\)之间的平滑L1 loss;当\(p_i^*=1(p_i^*=\{0,1\})\)时,锚\(a_i\)是正类,且此时位置loss也是激活的。\(\beta\)是一个权衡这两个loss的超参数。相比于同一个level中的enhanced feature maps,original feature maps针对分类的语义信息更少,但是有更多针对检测的高分辨率定位信息。因此,作者认为original feature maps可以检测和分类更小的人脸。因此,作者提出了基于一组更小锚的first shot 多任务loss:
\[L_{FSL}(p_i,sp_i^*,t_i,g_i,sa_i)=\frac{1}{N}(\sum_iL_{conf}(p_i,sp_i^*)+\beta \sum_ip_i^*L_{loc}(t_i,g_i,sa_i))\]
这两个shot loss可以组合成一个渐进式锚loss:
\[L_{PAL}=L_{FSL}(a)+L_{SSL}(sa)\]
这里first shot中锚的size是second shot中的一半。在预测阶段,只采用second shot的输出,这意味着预测阶段并不会有额外的计算代价。

1.4 改进的锚匹配策略(Improved Anchor Matching)

在训练中,需要计算正锚和负锚以决定对应人脸边界框是哪一个锚。当前锚匹配方法是基于锚和ground-truth人脸之间双向选择。因此锚的设计和增强的人脸采样是协同的,以此尽可能让锚和人脸进行相配,以此提供回归器更好的初始化。

表1显示DSFD的锚设计细节,每个feature map cell是如何关联固定shape的锚的。这里基于人脸尺度的统计信息,将锚尺度的比例设为1.5:1。original feature中锚的size是enhanced feature中的一半。另外,在数据增强上:

  • 基于\(\frac{2}{5}\)的概率,采用PyramidBox中data-anchor-sampling相似的基于锚的采样,其是在一个图片中随机选择一个人脸(裁剪的子图片包含人脸),并将子图和选择的人脸之间size比例设置为\(\frac{640}{rand(16,32,64,128,256,512)}\);
  • 基于\(\frac{3}{5}\)的概率,采用SSD中的数据增强方法。

2 实验结果分析


.

face detection[DSFD]的更多相关文章

  1. Clash Detection

    Clash Detection eryar@163.com Abstract. Clash detection is used for the model collision check. The p ...

  2. YOLO: Real-Time Object Detection

    YOLO detection darknet框架使用 YOLO 训练自己的数据步骤,宁广涵详细步骤说明

  3. tensorfolw配置过程中遇到的一些问题及其解决过程的记录(配置SqueezeDet: Unified, Small, Low Power Fully Convolutional Neural Networks for Real-Time Object Detection for Autonomous Driving)

    今天看到一篇关于检测的论文<SqueezeDet: Unified, Small, Low Power Fully Convolutional Neural Networks for Real- ...

  4. 使用intellij的svn时提示出错: Can't use Subversion command line client: svn.Errors found while svn working copies detection.

    使用Intellij的svn时提示出错:Can't use Subversion command line client: svn. Errors found while svn working co ...

  5. 论文阅读(Chenyi Chen——【ACCV2016】R-CNN for Small Object Detection)

    Chenyi Chen--[ACCV2016]R-CNN for Small Object Detection 目录 作者和相关链接 方法概括 创新点和贡献 方法细节 实验结果 总结与收获点 参考文献 ...

  6. 论文阅读(Xiang Bai——【TIP2014】A Unified Framework for Multi-Oriented Text Detection and Recognition)

    Xiang Bai--[TIP2014]A Unified Framework for Multi-Oriented Text Detection and Recognition 目录 作者和相关链接 ...

  7. 论文阅读(Xiang Bai——【arXiv2016】Scene Text Detection via Holistic, Multi-Channel Prediction)

    Xiang Bai--[arXiv2016]Scene Text Detection via Holistic, Multi-Channel Prediction 目录 作者和相关链接 方法概括 创新 ...

  8. 论文阅读(Zhuoyao Zhong——【aixiv2016】DeepText A Unified Framework for Text Proposal Generation and Text Detection in Natural Images)

    Zhuoyao Zhong--[aixiv2016]DeepText A Unified Framework for Text Proposal Generation and Text Detecti ...

  9. 论文阅读(Xiang Bai——【CVPR2015】Symmetry-Based Text Line Detection in Natural Scenes)

    Xiang Bai--[CVPR2015]Symmetry-Based Text Line Detection in Natural Scenes 目录 作者和相关链接 方法概括 创新点和贡献 方法细 ...

随机推荐

  1. Keystone, Start, Failed to Load Bson

    If you have installed the Keystone.js, and properly installed mongodb, but when tried to start the k ...

  2. 转载:使用redis+flask维护动态代理池

    githu源码地址:https://github.com/Germey/ProxyPool更好的代理池维护:https://github.com/Python3WebSpider/ProxyPool ...

  3. 杨学明老师推出全新课程--《敏捷开发&IPD和敏捷开发结合的实践》

    课时:13小时(2天) 敏捷开发&IPD和敏捷开发结合的实践 讲  师:杨学明 [课程背景] 集成产品开发(IPD).集成能力成熟度模型(CMMI).敏捷开发(Agile Developmen ...

  4. Oracle EBS R12 GL_IMPORT_REFERENCES 映射

    非原创. 转自出处: http://alloracleapps.com/oracle_apps/gl_import_references-columns-mapping-11i-vs-r12/

  5. python 中文报错

    解决的办法为:在程序的开头写入如下代码,这就是中文注释 #coding=utf-8

  6. C++实现第三方资源释放与载入过程(以DLL为例)

    简介 我们经常看见有一些程序开始执行时会释放一些文件,以便于后续操作.例如一些病毒为了便于传播和隐藏,经常把一些需要用的动态库或是驱动文件打包进一个可执行文件中,再由需要使用的时候,再临时释放和加载. ...

  7. VMware安装系统时"无法创建新虚拟机: 不具备执行此操作的权限"的解决方案

    作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在VMware中安装操作系统时,遇到以下这种情况 问题主要出在虚拟机文件的位置选择上,不应该选在VMwa ...

  8. #000 Python 入门第一题通过扩展,学到了更多的知识

    #1写在前面的话 我觉得这样学习或许能够在学习的过程中事半功倍 第一道简单的python编写代码输出10行带标号的“Hello,world.”,具体效果参阅输入输出示例 1:Hello,world. ...

  9. Linux 简介(day1)

    一.Linux 诞生于1991年 二.创始人:林纳斯.托瓦茨(Linus Torvalds) 三.logo:企鹅 四.Linux完整系统包括 1.Linux kernel (Linux 内核) 2.f ...

  10. spark SQL读取ORC文件从Driver启动到开始执行Task(或stage)间隔时间太长(计算Partition时间太长)且产出orc单个文件中stripe个数太多问题解决方案

    1.背景: 控制上游文件个数每天7000个,每个文件大小小于256M,50亿条+,orc格式.查看每个文件的stripe个数,500个左右,查询命令:hdfs fsck viewfs://hadoop ...