计算机取样方式,计算机视觉中upsampling(上采样)的三种方式

bilinear

双线性插值是目前在语义分割中用的比较多的一种方式,比如FCN中就是用的这种方法。 这种方法特点是不需要进行学习,运行速度快,操作简单。只需要设置好固定的参数值即可,设置的参数就是中心值需要乘以的系数。 一个简单的例子可以参考如下(来自互联网): a4c26d1e5885305701be709a3d33442f.png

具体的实现方式,可以直接参考fcn.berkerlyvision.org中的surgery.py如下:

def

upsample_filt(size):

"""

Make a 2D bilinear kernel suitable for

upsampling of the given (h, w) size.

"""

factor = (size + 1) // 2

if size % 2 == 1:

center =

factor - 1

else:

center =

factor - 0.5

og = np.ogrid[:size, :size]

return (1 - abs(og[0] - center) / factor) *

\

(1 - abs(og[1] - center) /

factor)

Deconvolution

Deconvolution是目前争议比较多的方法,主要是名字上的争议,由于实现上采用转置卷积核的方法,所以有人说应该叫(transposed

convolution),但是思想上是为了还原原有特征图,类似消除原有卷积的某种效果,所以叫反卷积(deconvolution).

Caffe中叫deconvolution,这里就继续沿用这个名字.

要理解deconv,要先了解conv的具体是实现方式,在实现过程中,为了使卷积运算更快的执行,通常转化为矩阵乘法进行处理(因为矩阵乘法有一些加速计算库)。卷积计算通常的两种实现方式是:在caffe中使用im2col的方法,在其他的地方使用toeplitz

matrix(托普利兹矩阵)进行实现。

具体例子参看知乎https://www.zhihu.com/question/43609045?sort=created

为了更容易地实现deconvolution,直接使deconv的前向传播模拟conv的反向传播,当然,这里只是为了保证尺寸大小互逆,并不能保证值的还原。具体思路可以参考这篇博客http://blog.csdn.net/zsz_shsf/article/details/53201669。

做几个小例子帮助理解:

(1)

关于第一节中bilinear的在caffe中使用deconvolution进行实现,上节的bilinear论述过程中使用固定值计算的方法,本节从deconv可视化计算的角度进行理解,https://github.com/vdumoulin/conv_arithmetic

63个元素

[16x16中的(0,0)元素] 31个元素 [16x16中的(0,1)元素]

31个元素

其中,中括号中的元素可见

对以上过程进行卷积运算,注意这里stride

使用1, 最终输出大小为(63+32x15+64-64)/1 + 1 =

544

这里可以脑补一下计算过程,相当于第一节中的手算叠加

(2)

对bilinear使用转置运算进行实现,先将64x64的卷积核转化为toeplitz

matrix,然后转置,得到544x544,256的矩阵,然后将score_fr转化为1,

256的矩阵,两者矩阵乘法,得到544x544的最终结果,具体过程脑补吧

---------------------

作者:明天去哪

来源:CSDN

原文:https://blog.csdn.net/u014451076/article/details/79156967

版权声明:本文为博主原创文章,转载请附上博文链接!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值