Deformable Convolution Networks

Deformable Convolution Networks

论文链接

1.双线性插值原理

由于可形变卷积在获取偏移位置像素点时候,需要用到双线性插值,所以我就把它先放到上面,并附上参考链接:
参考链接

  • 线性插值
    线性插值是指插值函数为一次多项式的插值方式,其在插值节点上的插值误差为零。也就是连接两个已知量的直线来确定在这两个已知量之间的一个未知量的值的办法。
    Tanlang

转换为公式计算:
Tanlang

  • 双线性插值

    既然单个维度的线性插值误差较大,那么很自然的会想到从多维度的角度去减小误差,这就是双线性插值,其核心思想是在两个方向分别进行一次线性插值。

Tanlang

我们的目标是得到未知函数f在绿色点P(x,y)的像素值,已知Q11(x1,y1)、Q12(x1,y2)、Q21(x2,y1)、Q22(x2,y2)的坐标以及对应的像素值。首先在x方向进行插值,得到R1和R2,然后在y方向进行插值,得到P,这就是整个的数学计算思路,计算公式如下:
在这里插入图片描述

再进行y方向插值:

Tanlang

知道了这些,就可以构造一个双线性插值核,在图像上滑动就可以得到对应点的像素值了。

  • 图像处理中的双线性插值

    图像上采样时,插值不是在原图中插值,而是指另外创建一个矩阵进行插值计算。

    假设我们有一张大小为nm的源图像,目标图像大小为ab。那么两幅图像的边长比分别为:n/a和m/b。

    注意,通常这个比例不是整数,编程存储的时候要用浮点型。

    目标图像的第(i,j)个像素点(i行j列)可以通过边长比对应回源图像。其对应坐标为(in/a,jm/b)。
    显然,这个对应坐标一般来说不是整数,而非整数的坐标是无法在图像这种离散数据上使用的。

    双线性插值通过寻找距离这个对应坐标最近的四个像素点,来计算该点的值(灰度值或者RGB值)。如果你的对应坐标是(2.5,4.5),那么最近的四个像素是(2,4)、(2,5)、(3,4)、(3,5)。若图像为灰度图像,那么(i,j)点的灰度值可以通过一下公式计算:
    f(i,j)=w1p1+w2p2+w3p3+w4p4.
    其中,pi(i=1,2,3,4)为最近的四个像素点,wi(i=1,2,3,4)为各点相应权值。

2.可形变的卷积

2.1Motivation

Tanlang

图 1 面临挑战

​ 如图1所示,视觉识别中的一个关键挑战是如何适应对象比例、姿态、视点和部分变形中的几何变化的问题,这个就是可形变卷积的动机。

论文里说,当时解决这个问题的办法有两种:

  • 构建一个有充分多形态学变化的图像的数据集

  • 使用变换不变的特征和算法

但是这两种方法是有很多缺陷的,比如:

  • 制作有形态学变化的图像,只能用已知的知识扩充数据,设计特征和算法
  • 不变特征和算法的手工设计对于过于复杂的变换可能是困难的或不可行的,即使它们是已知的

​ 最近几年,卷积神经网络在计算机视觉任务中的影响力非常大,但是CNN核是固定的,以至于限制了它对未知的几何学形变的建模能力

所以作者出于这个动机,给CNN 引入了两个新模块,大大提高了神经网络的几何变换建模能力

分别是:形变卷积、形变RoI
Tanlang

图 2 可形变卷积图示

图2 中是论文中给读者展示的一个Deformable Convolution 图例,左1 是一个标准的卷积,它的卷积核上的参数和feature map对应相乘,其他三幅图,展示的是有旋转,尺寸大小的形变卷积,形变卷积时,卷积核上的参数是和原来feature map上对应的点加上偏置offset后得到的新位置的特征值相乘。可能有点绕口,没事,看下面论文的形变卷积实现部分解读。

2.2 Deformable Convolutional Networks 实现部分

Tanlang

图 3 3x3形变卷积图示

这幅图很清晰的说明了形变卷积的结构,即对输入的Feature map (W X H X N)进行一次普通卷积后,得到一个 W x H x 2N的offset field ,其中2倍的通道数刚好就是可以得到一个像素点在x和y轴方向的偏移。再让得到对应的偏移像素点与卷积核中对应的权重相乘就好了。

  • 普通卷积w

    对于普通的卷积由两个步骤组成:

    (1)在输入特征图x上使用规则的卷积核进行采样;

    (2)由w加权的采样值的总和

    例如

    在输入的feature map 上与3x3卷积核R相乘的区域也是3x3, 所以可以设,在feature map上与卷积相乘的区域参数位置由以下表达式表示:

R = {(−1,−1),(−1,0), . . . ,(0,1),(1,1)}

则相乘后的输出为:
Tanlang

  • 形变卷积

而在形变卷积中,feature map上的相乘区域需要添加一个偏移量offset, {∆pn|n = 1, …, N}, 输出为:

Tanlang

注意: 得到的偏移量∆pn 可能是一个小数,而feature map 上的都是整数位置,所以就用到了双线性插值(bilinear interpolation),去计算这个小数点位置的像素值,然后再去乘与卷积核对应的权重值

计算公式如下:

Tanlang

其中p = p0+pn+ ∆pn ,q表示的是临近的4个点, G(·,·) 是一个双线性插值核,x(q)就是4个临近点对应的像素值.

双线性插值核公式:

Tanlang

其中满足条件 g(a, b) = max(0,1 − |a − b|).

也就是a与b差值大于1,则置0,所以只有比较接近的点才对线性差值的点有效果, 如图4所示,只有在1x1的网格上的4个点有作用

Tanlang

图 4 双线性插值

为了让模型可以学习offset偏移,要对上面线性插值操作的两个公式进行梯度求导,和反向传播。

2.3 Deformable RoI Pooling

​ 在所有基于区域提出的目标检测方法中都会使用RoI池化。它可以将任意大小的输入矩形区域转换为固定大小的特征,这是它的一大特点。

对于一个ROI池化操作,会把一个region proposal 分在 k*k 个 bins里 ,对每个bin做一个平均池化操作,最后输出 k * k 的特征图 y。

  • 普通RoI

计算公式:

Tanlang

bin(i, j) 是表示的是bin的位置,bin也就是region proposal里的一个大框

y(i, j) 是生成的特征图在i行j列的像素值

nij 表示的是bin里的像素个数

p0+p 是bin里的像素位置

  • 形变RoI池化

    计算公式:

Tanlang

和形变卷积一样,添加了一个偏移量∆p

  • 获得offset的过程图示如下:

Tanlang

和形变卷积相比,它是多加了一个FC层, 去生成标准化的偏移量offset, 其中:

Tanlang

伽马y, 是一个经验值,论文里取值为 0.1

  • Position-Sensitive (PS) RoI Pooling

这个是作者用形变思想设计的另外一种池化结构,它的结构图如下:

Tanlang

和一般池化不同,它用了全卷积结构,这个我没有再去细看了,等之后工作要用再去仔细看下吧

2.4 总结

可变形卷积和RoI形变模块都具有与其普通版本相同的输入和输出。因此,它们可以很容易地取代已经有的普通结构。

在论文中,作者记录了他把形变卷积用到当时最先进的CNN构架网络上,做了一些实验,实验结果如下:

Tanlang

Tanlang

总的来说,在普通的CNN架构中加入Deformabale Convolutional 使得模型的精度提高一点,但是也带来了参数量的少量增加,以及推理时间的加长。
而对于这个深度模型工具怎么用?是否使用? 那就是仁者见仁,智者见智了。

好了,
到这里就结束了我的总结!
如果觉得这篇博客对你有帮助,让你神清气爽,心情愉悦!
继承礼尚往来的优良传统,也请您帮我点个赞!

参考博客:
博客一
博客二

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

檀良月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值