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

bilinear

双线性插值是目前在语义分割中用的比较多的一种方式,比如FCN中就是用的这种方法。
这种方法特点是不需要进行学习,运行速度快,操作简单。只需要设置好固定的参数值即可,设置的参数就是中心值需要乘以的系数。
一个简单的例子可以参考如下(来自互联网):
这里写图片描述
接着,同样的道理,使用f(R1), f(R2)进行插值,推导出来f( P )就可以了.
具体的实现方式,可以直接参考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)

如果看了上面的简单实例和具体代码还不会使用bilinear,就看最后一个例子,这里以FCN举例,
在FCN的berkerly官方caffe实现,以voc-fcn32/train.prototxt举例,bilinear部分代码如下:

layer {
  name: "score_fr"
  type: "Convolution"
  bottom: "fc7"
  top: "score_fr"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  convolution_param {
    num_output: 21
    pad: 0
    kernel_size: 1
  }
}
layer {
  name: "upscore"
  type: "Deconvolution"
  bottom: "score_fr"
  top: "upscore"
  param {
    lr_mult: 0
  }
  convolution_param {
    num_output: 21
    bias_term: false
    kernel_size: 64
    stride: 32
  }
}

其中,upscore层使用surgery.py中的upsample_filt函数进行实现(本文第一段代码),相当于设置参数type: ‘bilinear’,这个很容易实现。通过测试可以发现,在forward-propagation过程中,score_fr层的blob shape是[1, 21, 16, 16],经过bilinear后变为[1, 21, 544, 544]。依照代码简单分析就可以发现bilinear的具体计算流程如下:
(1) 64%2 == 0,所以center的坐标为(31.5, 31.5),note在python中下标从0开始
(2) 计算出一个64x64的矩阵,每个位置根据代码所示填数,其实就是线性规则
(3) 二维来看,将score_fr层的16x16的每一个位置的坐标放在31.5位置,也就是在相邻元素之间插入32个位置,周边补充32个位置,不同元素对插入的不同值有影响,则相互叠加,最后将原来的16x16的元素移除,也就形成了32x17 = 544,也就是具体upscore层算出来的值
放点东西,形象表示一下:
32个元素 [16x16中的(0,0)元素] 32个元素 [16x16中的(0,1)元素] 32个元素
其中,中括号中的元素不可见

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的最终结果,具体过程脑补吧

unpooling

也就是反池化,不需要学习,用的不是太多,参考论文Visualizing and Understanding Convolutional Networks,还有SegNet和DeconvNet
简单原理:在池化过程中,记录下max-pooling在对应kernel中的坐标,在反池化过程中,将一个元素根据kernel进行放大,根据之前的坐标将元素填写进去,其他位置补0
实现代码可以看SegNet的实现

end

简单捋了一遍,帮助理解

  • 33
    点赞
  • 154
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
### 回答1: 目标检测是计算机视觉的一项重要任务,其主要目的是在图像或视频找到特定对象的位置和边界框。目标检测可以分为两种计算方法:上采样Upsampling)方法和下采样(Downsampling)方法。 上采样方法主要是通过增加图像分辨率来检测目标。该方法的基本思路是将原始图像放大到目标检测器所需的分辨率,并使用特征提取算法来寻找目标。上采样方法可以使用多种技术,如插值、卷积等。这些技术可用于对图像进行高质量的缩放,以使目标检测器能够检测到目标。 下采样方法则是通过降低图像分辨率来检测目标。该方法的基本思路是在降低图像分辨率的同时,保留有关目标形状、大小和纹理等方面的信息。下采样方法可以使用多种技术,如池化、卷积等。这些技术可用于从图像提取特征,并生成对目标位置和边界框的估计。 总之,目标检测是通过使用上采样或下采样方法,通过对图像进行特征提取和计算来寻找特定对象的位置和边界框。其上采样方法通过增加图像分辨率来检测目标,而下采样方法则通过降低图像分辨率来检测目标。 ### 回答2: 目标检测上采样和下采样是为了在不同层级的特征图上实现目标检测算法的多尺度检测。 上采样是指将低分辨率的特征图放大到高分辨率,常用的方法有最邻近插值、双线性插值和转置卷积。最邻近插值是通过简单地复制像素值来放大图像,双线性插值则是通过对最近的4个像素进行加权平均得到新的像素值。转置卷积则是通过卷积核进行卷积操作,但是将输入特征图的像素值插入到输出特征图的特定位置,从而实现放大的效果。上采样的目的是为了恢复特征图的细节信息,使得目标更容易被检测出来。 下采样则是将高分辨率的特征图缩小到低分辨率,常用的方法有池化操作。池化操作可以通过取平均值或者最大值等方式将一个大的像素块缩小到一个像素值,从而减少特征图的尺寸。下采样的目的是为了降低计算复杂度,同时增强特征的感受野,使得模型能够更好地处理目标的整体信息。 通常,目标检测算法会使用多个尺度的特征图进行检测,低层级的特征图能够更好地捕捉细节信息,而高层级的特征图则能够捕捉更加抽象的语义信息。上采样和下采样的计算原理在目标检测算法起到了对特征图进行适当放大和缩小的作用,从而更好地匹配目标的尺度,提高检测的准确性和效果。 ### 回答3: 目标检测上采样和下采样是指将图像从原始分辨率调整到不同的分辨率,以适应模型的需求。下采样是降低分辨率,上采样是增加分辨率。 下采样通过减少每个基元(如像素)的数量来降低分辨率。常用的下采样算法有平均池化和最大池化。平均池化取每个区域内像素值的平均值作为下采样后的值,最大池化则取最大值作为下采样后的值。下采样过程,丢失了一些细节信息,但可以减少计算量,加快运算速度,并提取出图像的主要特征。 上采样通过增加每个基元的数量来增加分辨率。最常用的上采样算法是反卷积算法,也称为转置卷积。反卷积通过在原始图像间插入零值来扩展基元,然后通过卷积进行滤波操作,从而获得更高的分辨率。上采样可以增加图像的细节信息,使其更接近原始图像。 总结起来,下采样通过减少基元的数量来降低分辨率,丢失一些细节信息;而上采样通过增加基元的数量来增加分辨率,使图像更接近原始图像。这些操作在目标检测被广泛应用,可以提高模型的性能和准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值