https://blog.csdn.net/qq_21949357/article/details/80538255

这篇论文其实读起来还是比较难懂的,主要是细节部分很需要推敲,尤其是deformable的卷积如何实现的一步上,在写这篇博客之前,我也查阅了很多其他人的分享或者去github找代码,当然也不敢说完全了解了这种特殊的卷积……仅仅做一点自己的阅读心得与体会吧。这是一篇很有意义的工作,但是和深度学习很多论文一样,在读完之后内心也不免有着种种疑云。

Deformable Convolutional Networks

论文链接:https://arxiv.org/abs/1703.06211
代码链接:https://github.com/msracver/Deformable-ConvNets(官方实现,但是release的版本是迁移到MXNet上的,速度和performance上有些出入)
MSRA的文章,严格意义上讲,deformable convolutional不仅仅只适用于object detection,作为对常见的卷积的一种改良,它可以广泛应用在各个网络中,和空洞卷积一样,是对传统卷积的改良,而且某种意义上也可以说是空洞卷积的进一步拓展。

1. Background

这篇文章的motivation其实比较简单,我们都知道,常规的卷积,包括池化这些操作,不管你怎么累加,基本得到的都是矩形框……这个其实非常不贴合实际,在对不规则的目标建模的时候有非常大的局限性。
作者认为克服建模形变困难主要是两种方法:

通过提供变化足够丰富的大量训练样本,让训练器强行记忆拟合
设计能够检测到形变的特征和算法,这方面主要还是以hand-crafted的特征为主,这种在对付没有考虑到的形变和过于复杂的形变的时候其实比较无力
CNN其实不具有旋转不变性和尺度不变性的,所以本质上CNN是用的策略1,缺乏判断形变的策略依据。局限性比较多,比如固定的box对于灵活物体来说非常僵硬,比如同一层的特征图的不同位置可能对应的是不同形状的物体,但是都和同一个卷积做计算。(理解这一点比较重要,涉及到后面对deformable卷积的理解)
作为对上述问题的解决方案,作者提出了一种新的卷积方式deformable convolution,在此基础上提出了一种新的RoI pooling方法deformable RoI pooling。主要思路就是卷积操作不是在规规矩矩的3x3的格子里做了,而是有了种种偏移,如下图所示:

至于这个位置偏移是怎么做的?看下个部分
2. Deformable Convolutional Networks

2.1 deformable卷积的计算公式

我们知道,一般的卷积是这种形式的:

留意到p0是中心点,pn是属于R的3x3的kernel的9个位置,因此这是在3x3方格内采样的一个规则卷积,而可形变的卷积就是在x(po+pn)之中再加上一个偏移量:

在实际当中,因为添加的这个偏移量往往是小数,导致比较难处理,作者采用的办法是双线性差值,根据相邻的点来进行计算具体公式如下,留意到这里的a-b如果差值大于1了,g就是0,所以只有比较接近的点才对线性差值的点有效果:

(以上是公式化的内容,关于差值内容如何求导可以到附录里面找)

2.2 偏置求法

重点来了,怎么得到这个偏移量?,可变卷积神经网络的示意图如下图所示:

deformable convolution在特征图的每个位置都生成一个偏移量,注意是特征图的每个位置而不是卷积核的每个位置,我之前也经常误解为后者……实际上这里的特征图经过conv得到一个2N的offset field,N就是通道数,field是和feature map相同的,这样HxWxN的feature map就得到了一个HxWx2N的offset filed,正好每个feature map位置有两个偏移量。
然后将偏移量对应到原来feature map的每个位置,就可以在原来的feature map上做deformable卷积了~还不理解的话可以看这篇博客https://blog.csdn.net/u011974639/article/details/79996353,是对照着代码讲的,很详细,不过这个只是帮助理解原理的,不能直接用,没有重写op,太慢。
还需要注意的一点是,如果input feature map到output feature map用的是空洞卷积之类的特殊结构的话,生成offset field的卷积也要使用相应的结构以保证一致。

2.3 Deformable RoI Pooling

为RoI pooling添加deformable机制其实和卷积的非常类似。因为本身RoI pooling的时候和卷积一样,选取的也是方形区域,我们要做的也是增加偏移量。原来的RoI pooling过程可以表示为如下:

那么新的RoI pooling计算公式则如下:

而它的偏移量的网络结构和计算过程如下图所示:

其中,要注意的有两点:

feature map此处是用fc来学习的,而且也不是直接学习最终偏移量,而是学习头上带三角号的那个变量……
这个变量会和(w, h)做点乘,然后再乘以一个尺度因子,其中w,h是RoI的宽和高,而伽马是一个0.1的常数因子……个人理解,前者是为了让deformable能和RoI的尺度结合起来,更好地估计偏移位置;而后者是为了防止偏移量太大甚至超出RoI和整个图像……之前也看到有人认为,DNN网络最后几层经常会出现感受野不足的情况,所以空洞卷积才会效果比一般卷积好,如果不加约束,deformable的RoI可能无限制地扩大,这个观念我还不是很理解,日后如果有了新发现再更新吧
另外就是作者还搞出了一个和R-FCN的位置敏感比较类似的另一种RoI方法,同样是考虑deformable因素的,叫Position-Sensitive (PS) RoI Pooling,这里就不详细介绍了
2.4 deformable networks

这个部分没什么太多内容要介绍的,因为deformable卷积使用前后feature map是不变化的,因此大致上就是将卷积和Pooling方法直接替换到一些主流方法里就好……一些网络设置就不谈了,说两个我感觉比较重要的点:

学习offset的那些参数怎么初始化和学习:作者采用的是0初始化,然后按照网络其它参数学习率的ββ倍来学习,这个\beata\beata默认是1,但在某些情况下,比如faster rcnn中的fc的那些,是0.01
并不是所有的卷积都一股脑地换成可行变卷积就是好的,在提取到一些语义特征后使用形变卷积效果会更好一点,一般来说是网络靠后的几层
3. 网络理解和实验结果

3.1 对deformable卷积的理解

作者绘制了一些图来方便我们理解deformable卷积,例如常规卷积和可形变卷积的一些对比:

最上面的top feature map的activation units,中间层和最下层是上一层和上上层的卷积,可以看到它们产生的过程。这张图应该会更清晰一点的:

绿色的点是activation units,而红色的点是激活点在3个level的deformable filters采样位置(一共9的三次方700多个点),左中右分别是背景类,小目标和中等目标的采样点分布,和传统的卷积还是产生了很大差异的。
另外也有关于RoI pooling中的9个Bin和gt的图,可以看到和传统的方法的差别,RoI pooling也会根据物体产生形变:

作者认为可形变卷积的优势还是很大的,包括:

对物体的形变和尺度建模的能力比较强
感受野比一般卷积大很多,因为有偏移的原因,实际上相关实验已经表明了DNN网络很多时候受感受野不足的条件制约;但是一般的空洞卷积空洞是固定的,对不同的数据集不同情况可能最适合的空洞大小是不同的,但是可形变卷积的偏移是可以根据具体数据的情况进行学习的
另外值得一提的是,作者发现可形变卷积可以适应物体的尺度,而背景类的尺度一般在medium和large尺寸的物体之间,作者认为这说明large的目标可以更有效帮助我们识别干扰,也算是无心插柳吧。
3. 2 实验结果

这是作者给出的最终结果,class-aware RPN是指分类别的RPN,可以视作一个简易版本的SSD,而对DeepLab的方法笔者也不是很了解。

总的来说,这个工作亮点是很多,包括对卷积的改良,知乎上对这个工作有一些讨论包括评论我觉得还是很不错的:
https://www.zhihu.com/question/57493889/answer/153369805 (包括评论),卷积改变为类似采样的思路都是很有意义的。但是看完之后总感觉也有一些疑问,比如怀疑是否一层网络真的能有效学习偏置,不同图片的大量不同物体在offset优化上会不会引发竞争什么的,不过都属于很难量化和考察的内容了,最后还是要靠实验结果说话,大概是目前炼丹的通病吧,有兴趣的也可以留言讨论下~
---------------------
作者:littleYii
来源:CSDN
原文:https://blog.csdn.net/qq_21949357/article/details/80538255
版权声明:本文为博主原创文章,转载请附上博文链接!

目标检测论文阅读:Deformable Convolutional Networks的更多相关文章

  1. 三维目标检测论文阅读:Deep Continuous Fusion for Multi-Sensor 3D Object Detection

    题目:Deep Continuous Fusion for Multi-Sensor 3D Object Detection 来自:Uber: Ming Liang Note: 没有代码,主要看思想吧 ...

  2. 论文阅读笔记三十八:Deformable Convolutional Networks(ECCV2017)

    论文源址:https://arxiv.org/abs/1703.06211 开源项目:https://github.com/msracver/Deformable-ConvNets 摘要 卷积神经网络 ...

  3. 图像处理论文详解 | Deformable Convolutional Networks | CVPR | 2017

    文章转自同一作者的微信公众号:[机器学习炼丹术] 论文名称:"Deformable Convolutional Networks" 论文链接:https://arxiv.org/a ...

  4. 深度学习方法(十三):卷积神经网络结构变化——可变形卷积网络deformable convolutional networks

    上一篇我们介绍了:深度学习方法(十二):卷积神经网络结构变化--Spatial Transformer Networks,STN创造性地在CNN结构中装入了一个可学习的仿射变换,目的是增加CNN的旋转 ...

  5. Deformable Convolutional Networks

    1 空洞卷积 1.1 理解空洞卷积 在图像分割领域,图像输入到CNN(典型的网络比如FCN)中,FCN先像传统的CNN那样对图像做卷积再pooling,降低图像尺寸的同时增大感受野,但是由于图像分割预 ...

  6. AAAI2019 | 基于区域分解集成的目标检测 论文解读

    Object Detection based on Region Decomposition and Assembly AAAI2019 | 基于区域分解集成的目标检测 论文解读 作者 | 文永亮 学 ...

  7. Deep Learning 33:读论文“Densely Connected Convolutional Networks”-------DenseNet 简单理解

    一.读前说明 1.论文"Densely Connected Convolutional Networks"是现在为止效果最好的CNN架构,比Resnet还好,有必要学习一下它为什么 ...

  8. CVPR2019目标检测论文看点:并域上的广义交

    CVPR2019目标检测论文看点:并域上的广义交 Generalized Intersection over Union Generalized Intersection over Union: A ...

  9. CVPR2019:无人驾驶3D目标检测论文点评

    CVPR2019:无人驾驶3D目标检测论文点评 重读CVPR2019的文章,现在对以下文章进行点评. Stereo R-CNN based 3D Object Detection for Autono ...

随机推荐

  1. python的执行顺序

    为了区分是主动执行(如python test.py)还是被动调用(如import test),python用__name__来进行标识. 当主动执行时,__name__为__main__,当被调用时, ...

  2. golang 中 channel 的非阻塞访问方法

    在golang中,基本的channel读写操作都是阻塞的,如果你想要非阻塞的,可以使用如下示例: 即只要在select中加入default,阻塞立即变成非阻塞: package main import ...

  3. Centos7 zookeeper单机/集群安装详解和开机自启

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...

  4. map+case结构使用技巧

    people.txt文本如下 lyzx1, lyzx2, lyzx3, lyzx4, lyzx5, lyzx6, lyzx7, lyzx7,,哈哈 托塔天王 import org.apache.spa ...

  5. cocos2d JS 错误异常抛出捕获和崩溃拦截

    Error对象 一旦代码解析或运行时发生错误,JavaScript引擎就会自动产生并抛出一个Error对象的实例,然后整个程序就中断在发生错误的地方. Error对象的实例有三个最基本的属性: nam ...

  6. linux c语言开发工具

    ---恢复内容开始--- C语言编译全过程剖析 编译的概念:编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统 ...

  7. EL的隐含对象 (二)【访问作用域范围的隐含对象】

    在EL中提供了4个用于访问作用域范围的隐含对象,即pageScope.requestScope.sessionScope和applicationScope.应用这4个隐含对象指定所要查找的标识符的作用 ...

  8. mysql set

    sql server中变量要先申明后赋值: 局部变量用一个@标识,全局变量用两个@(常用的全局变量一般都是已经定义好的): 申明局部变量语法:declare @变量名 数据类型:例如:declare ...

  9. C# mongodb中内嵌文档数组条件查询

    样例数据: {      "_id" : "1064621564857",      "cNo" : "1064621564857 ...

  10. 《Semantic Sentence Matching with Densely-connected Recurrent and Co-attentive Information》DRCN 句子匹配

    模型结构 首先是模型图: 传统的注意力机制无法保存多层原始的特征,根据DenseNet的启发,作者将循环网络的隐层的输出与最后一层连接. 另外加入注意力机制,代替原来的卷积.由于最后的特征维度过大,加 ...