当前位置: 首页 > news >正文

Deformable Convolution 可变形卷积

  可变形卷积概念出自2017年论文:Deformable Convolutional Networks

在这里插入图片描述

  顾名思义,可变形卷积的是相对于标准卷积的概念而来。
在这里插入图片描述
(a) 一个经典的 3 × 3 3 \times3 3×3 卷积,每一个卷积输入的都是绿色的部分。
(b) Deformable Convolution,虽然也是做这九个点的卷积,但是这个卷积具体采在这个像素的位置是可以变化的,所以叫做 deformable。 那么变形的量是通过学习根据输入数据得出的。其中 © 和 (d) 是两种特殊的情况。

为什么要可变形卷积?

  我们知道卷积核的目的是为了提取输入物的特征。我们传统的卷积核通常是固定尺寸、固定大小的(例如3x3,5x5,7x7.)。这种卷积核存在的最大问题就是,对于未知的变化适应性差,泛化能力不强。

  卷积单元对输入的特征图在固定的位置进行采样;池化层不断减小着特征图的尺寸。网络内部缺乏能够解决这个问题的模块,这会产生显著的问题,例如,同一CNN层的激活单元的感受野尺寸都相同,这对于编码位置信息的浅层神经网络并不可取,因为不同的位置可能对应有不同尺度或者不同形变的物体,这些层需要能够自动调整尺度或者感受野的方法。再比如,目标检测虽然效果很好但是都依赖于基于特征提取的边界框,这并不是最优的方法,尤其是对于非网格状的物体而言。

解决上述问题最直观的想法就是,我们的卷积核可以根据实际情况调整本身的形状,更好的提取输入的特征。

可变形卷积理论?

(1)首先声明一点,在可变形卷积中,可变形卷积操作和池化操作都是2维的,都是在同一 channel 上进行的,常规的卷积操作主要可以分为两部分:(1)在输入的 feature map上使用规则网格R进行采样;(2)进行加权运算, R \mathcal{R} R 定义了感受野的大小和扩张

对于在输出的 feature map上的每个位置 p 0 \mathbf{p}_0 p0,通过下列式子进行计算:
y ( p 0 ) = ∑ p n ∈ R w ( p n ) ⋅ x ( p 0 + p n ) R = { ( − 1 , − 1 ) , ( − 1 , 0 ) , ⋯   , ( 0 , 1 ) , ( 1 , 1 ) } y(\mathbf{p}_0) = \sum_{\mathbf{p}_n \in \mathcal{R}} \mathbf{w}(\mathbf{p}_n) \cdot \mathbf{x}(\mathbf{p}_0 + \mathbf{p}_n) \\ \mathcal{R} = \{(-1, -1),(-1,0), \cdots, (0,1),(1,1)\} y(p0)=pnRw(pn)x(p0+pn)R={(1,1),(1,0),,(0,1),(1,1)}
其中, p n \mathbf{p}_n pn 是对 R \mathcal{R} R 中所列位置的枚举,它就是相对于 p 0 \mathbf{p}_0 p0 这个像素点距离这个 kernel 中心的偏移,权重为 w ( ⋅ ) \mathbf{w}(\cdot) w()
对于普通的卷积,对于计算点 y ( p 0 ) y(\mathbf{p}_0) y(p0) 的特征值,它就是使用了 y ( p 0 ) y(\mathbf{p}_0) y(p0) 及其周边像素的一个加权和。

(2) Deformable Convolution:
可变形卷积的操作是不同的,在可变形网络的操作中,常规的规则网格 R \mathcal{R} R 通过增加一个偏移量进行扩张,同样的位置 p 0 \mathbf{p}_0 p0 变为:
y ( p 0 ) = ∑ p n ∈ R w ( p n ) ⋅ x ( p 0 + p n + Δ p n ) , o f f s e t s { Δ p n ∣ b = 1 , ⋯   , N } . y(\mathbf{p}_0) = \sum_{\mathbf{p}_n \in \mathcal{R}} \mathbf{w}(\mathbf{p}_n) \cdot \mathbf{x}(\mathbf{p}_0 + \mathbf{p}_n + \Delta \mathbf{p}_n ) ,\\ \rm{offsets} \{\Delta \mathbf{p}_n | b = 1,\cdots, N\}. y(p0)=pnRw(pn)x(p0+pn+Δpn),offsets{Δpn∣b=1,,N}.

现在,采样的位置变成了不规则位置,由于偏移量 Δ p n \Delta \mathbf{p}_n Δpn 通常是小数,因此我们通过双线性插值法进行实现,公式为:
x ( p ) = ∑ q G ( q , p ) ⋅ x ( q ) , p = p 0 + p n + Δ p n , G ( q , p ) = g ( q x , p x ) ⋅ g ( q y , p y ) , g ( a , b ) = max ⁡ ( 0 , 1 − ∥ a − b ∥ ) . \mathbf{x}(\mathbf{p}) = \sum_{\mathbf{q}} G(\mathbf{q}, \mathbf{p}) \cdot \mathbf{x}(\mathbf{q}), \mathbf{p} = \mathbf{p}_0 + \mathbf{p}_n + \Delta \mathbf{p}_n,\\ G(\mathbf{q}, \mathbf{p}) = g(\mathbf{q}_x, \mathbf{p}_x) \cdot g(\mathbf{q}_y, \mathbf{p}_y) , \\ g(a, b) = \max(0, 1 - \| a -b\|). x(p)=qG(q,p)x(q),p=p0+pn+Δpn,G(q,p)=g(qx,px)g(qy,py),g(a,b)=max(0,1ab).

拓展:双线性插值
首先看,双线性插值的作用,对图像进行缩放。假设原图像大小为 m × n m \times n m×n,目标图像的大小为 a × b a \times b a×b,那么两幅图像的边长比为 m / a , n / b m/a,n/b m/a,n/b。注意,通常这个比例不是整数,而非整数的坐标是无法在图像这种离散数据上使用的。双线性插值通过寻找距离这个对应坐标最近的四个像素点,来计算该点的值。比如,对应的坐标为(2.5,4.5),那么最近的像素是(2,4)(2,5)(3,4)(3,5)
若图像为灰度图像,那么 ( i , j ) (i,j) (i,j) 的灰度值可以通过以下公式计算:
f ( i , j ) = w 1 ∗ p 1 + w 2 ∗ p 2 + w 3 ∗ p 3 + w 4 ∗ p 4 f(i, j) = w1*p1 + w2*p2 + w3*p3 + w4*p4 f(i,j)=w1p1+w2p2+w3p3+w4p4
其中, p i , i = 1 , 2 , 3 , 4 p_i, i=1,2,3,4 pi,i=1,2,3,4 为最近的四个像素点, w i , i = 1 , 2 , 3 , 4 w_i, i=1,2,3,4 wi,i=1,2,3,4为各点相应权值。


可变形卷积结构形式?

注意:这里有一个非常非常非常容易混淆的点,所谓的deformable,到底deformable在哪?很多人可能以为deformable conv学习的是可变形的kernel,其实不是不是不是!本文并不是对kernel学习offset而是对feature的每个位置学习一个offset。
在这里插入图片描述

各部分维度如下:
input feature map:(batch, H, W, C)
output feature map: (batch, H, W, N)
offset field: (batch, H, W, 2N)

  offset field 通过在原图上进行标准卷积操作得到,通道数为2N表示N个2维的偏置量 ( Δ \Delta Δx , Δ \Delta Δ y) ,N 表示卷积核的个数即输出特征层的通道数。

  形变卷积过程可以描述为:首先在输入feature map上进行标准卷积得到N个2维的偏置量 ( Δ \Delta Δx , Δ \Delta Δy),然后分别对输入feature map上各个点的值进行修正(设 feature map为 P,即 P(x, y)= P(x + Δ \Delta Δx , y + Δ \Delta Δy) ,当 x + Δ \Delta Δ 为小数时,使用双线性插值计算 P( x + Δ \Delta Δx ,y + Δ \Delta Δy) )。形成 N个 feature map,然后使用 N 个卷积核一一对应进行卷积得到输出。

公式:
在这里插入图片描述
在这里插入图片描述

相关文章:

  • Go-Excelize API源码阅读(二十七)——SetRowOutlineLevel、SetColOutlineLevel
  • 详细介绍LinkedList
  • 【SSM】Spring MVC 程序开发(重点:SpringMVC 工作流程)
  • 【以太网硬件十四】以太网的MAC是干什么的?
  • RocketMQ 消费者Rebalance算法 解析——图解、源码级解析
  • 【网络安全】内网杀器之Cobalt Strike
  • 法国1油井反杀苏军2油井经典案例分析
  • 【一年总结】我的大三
  • 【TS系列】TypeScript进阶(三)
  • 动态内存管理
  • Linux05开机/重启/用户登录注销
  • MySQL索引-2聚集索引探讨
  • 【node.js从入门到精通】模块化+npm包详解
  • Android 面试需要哪些准备?
  • Vue进阶--render函数和jsx的使用
  • Google 是如何开发 Web 框架的
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 2019年如何成为全栈工程师?
  • Android 控件背景颜色处理
  • Codepen 每日精选(2018-3-25)
  • Git初体验
  • Java基本数据类型之Number
  • JS变量作用域
  • Js基础知识(一) - 变量
  • node.js
  • PermissionScope Swift4 兼容问题
  • Python学习之路16-使用API
  • V4L2视频输入框架概述
  • windows下mongoDB的环境配置
  • 多线程事务回滚
  • 欢迎参加第二届中国游戏开发者大会
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 普通函数和构造函数的区别
  • 如何胜任知名企业的商业数据分析师?
  • 使用putty远程连接linux
  • 试着探索高并发下的系统架构面貌
  • 数据可视化之 Sankey 桑基图的实现
  • 小程序开发之路(一)
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #微信小程序(布局、渲染层基础知识)
  • (1)(1.11) SiK Radio v2(一)
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (二)windows配置JDK环境
  • (论文阅读40-45)图像描述1
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)平衡树
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ***利用Ms05002溢出找“肉鸡
  • *1 计算机基础和操作系统基础及几大协议
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET连接MongoDB数据库实例教程