上采样相关技术

news2025/7/17 16:08:52

一、参考资料

上采样和上卷积的区别
怎样通俗易懂地解释反卷积?
卷积和池化的区别、图像的上采样(upsampling)与下采样(subsampled)
[读论文]用全卷积Res网络做深度估计
对抗生成网络GAN系列——DCGAN简介及人脸图像生成案例
深度学习中常用的几种卷积(上篇):标准二维卷积、转置卷积、1*1卷积(附Pytorch测试代码)

二、相关介绍

1. 上采样与下采样

无论下采样(缩放图像)还是上采样(放大图像),采样方式有很多种。如最近邻插值双线性插值均值插值中值插值等方法。

1.1 上采样(Upsample)

在应用在计算机视觉的深度学习领域,由于输入图像通过卷积神经网络(CNN)提取特征后,输出的尺寸往往会变小,而有时我们需要将图像恢复到原来的尺寸以便进行进一步的计算(e.g.图像的语义分割)。这个采用扩大图像尺寸,实现图像由小分辨率到大分辨率的映射的操作,叫做上采样(Upsample)。上采样,又称为图像插值(interpolating),即为放大图像的过程。
在这里插入图片描述

上采样有3种常见的方法:双线性插值(bilinear interpolation),转置卷积(Transposed Convolution),反池化(Unpooling)。

1.2 下采样(subsample)

下采样又称为降采样(downsample),主要目的是缩小图像尺寸,使得图像符合显示区域的大小,或者生成对应图像的缩略图。在计算机视觉中,CNN特征提取过程即为下采样过程。

对于一幅图像I尺寸为M*N,对其进行s倍下采样,即得到(M/s)*(N/s)尺寸的得分辨率图像,当然s应该是M和N的公约数才行,如果考虑的是矩阵形式的图像,就是把原始图像s*s窗口内的图像变成一个像素,这个像素点的值就是窗口内所有像素的均值

2. 上卷积(Up-convolution)

upconv上卷积是什么? monodepth源码阅读

Deeper Depth Prediction with Fully Convolutional Residual Networks

2.1 方法一(base版)

Up-convolution,又称为upconv,是通过插值增加特征图的空间分辨率。其结构如下图所示:在这里插入图片描述
在这里插入图片描述

Up-convolution包含三个过程:

  1. un-pooling上池化过程。把特征图中的一个元素映射成2×2的大小,左上角是这个元素,其他三个格子都是零;
  2. 卷积过程。用5×5的卷积进行卷积计算;
  3. ReLu激活过程。

2.2 方法二(改进版)

Deeper Depth Prediction with Fully Convolutional Residual Networks

基于base版本改进的fast up-convolution,其
在这里插入图片描述
在这里插入图片描述

3. Deconvolution

Learning deconvolution network for semantic segmentation
在这里插入图片描述

4. 上投影(up-projection)

Deeper Depth Prediction with Fully Convolutional Residual Networks

We call this new up-sampling block up-projection since it extends the idea of the projection connection to up-convolutions.

将投影连接引入到up-convolution中,称之为up-projection。
在这里插入图片描述

5. convolution+pooling

卷积+池化操作,构成convolution+pooling层。

6. unpooling+convolution

是convolution+pooling的逆向操作,构成unpooling+convolution层。

三、上采样相关方法

1. 转置卷积(Transposed Convolution)

怎样通俗易懂地解释反卷积?

转置卷积(Transposed Convolution)

抽丝剥茧,带你理解转置卷积(反卷积)

1.1 引言

对于很多生成模型(如GAN中的生成器、自动编码器(Autoencoder)、语义分割等模型),我们通常希望进行与正常卷积相反的转换,即我们希望执行上采样,比如自动编码器或者语义分割。(对于语义分割,首先用编码器提取特征图,然后用解码器回复原始图像大小,这样来分类原始图像的每个像素。)实现上采样的传统方法是应用插值方案或人工创建规则。而神经网络等现代架构则倾向于让网络自己自动学习合适的变换,无需人类干预。为了做到这一点,我们可以使用转置卷积。

1.2 转置卷积的概念

转置卷积(Transposed Convolution) 在语义分割或者对抗神经网络(GAN)中比较常见,其主要作用是做上采样(UpSampling)。

转置卷积又叫反卷积、逆卷积。不过转置卷积是目前最为正规和主流的名称,因为这个名称更加贴切的描述了卷积的计算过程,而其他的名字容易造成误导。在主流的深度学习框架中,如TensorFlow,Pytorch,Keras中的函数名都是conv_transpose。所以学习转置卷积之前,我们一定要弄清楚标准名称,遇到他人说反卷积、逆卷积也要帮其纠正,让不正确的命名尽早的淹没在历史的长河中。

我们先说一下为什么人们很喜欢将转置卷积称为反卷积或逆卷积。首先举一个例子,将一个4x4的输入通过3x3的卷积核在进行普通卷积(无padding, stride=1),将得到一个2x2的输出。而转置卷积将一个2x2的输入通过同样3x3大小的卷积核将得到一个4x4的输出,看起来似乎是普通卷积的逆过程。就好像是加法的逆过程是减法,乘法的逆过程是除法一样,人们自然而然的认为这两个操作似乎是一个可逆的过程。转置卷积不是卷积的逆运算(一般卷积操作是不可逆的),转置卷积也是卷积。对于同一个卷积核,经过转置卷积操作之后只能恢复到原来的大小(shape),数值与原来不同。所以转置卷积的名字就由此而来,而并不是“反卷积”或者是“逆卷积”,不好的名称容易给人以误解。

转置卷积和直接卷积有很大的区别,直接卷积是用一个“小窗户”去看一个“大世界”,而转置卷积是用一个“大窗户”的一部分去看“小世界”。

1.3 转置卷积操作

转置卷积核大小为k,步长s,填充p,则转置卷积的运算步骤可以归为以下几步:

  1. 首先,在元素间填充s-1个零元素(等于0不用填充);
  2. 然后,在特征图四周填充k-p-1个零元素;
  3. 接着,对卷积核进行上下、左右翻转;
  4. 最后,以stride=1,padding=0,做卷积操作。

1.4 转置卷积示例

假设,输入层为2x2,转置卷积核大小为k=3,步长stride=1,填充padding=0,通过转置卷积后,得到大小4x4的特征图。
在这里插入图片描述
在这里插入图片描述

值得一提的是,可以通过改变padding和stride,将2x2的输入映射到不同的图像尺寸。如下图,stride=2,则在元素间填充1个零元素;padding=0,则在特征图四周填充2个零元素。通过转置卷积后,得到大小5x5的特征图。
在这里插入图片描述

1.5 棋盘效应(Checkerboard Artifacts)

棋盘效应(Checkerboard Artifacts)
卷积操作总结(三)—— 转置卷积棋盘效应产生原因及解决
Deconvolution and Checkerboard Artifacts

棋盘效应是由于转置卷积的“不均匀重叠”(Uneven overlap)的结果,使图像中某个部位的颜色比其他部位更深。
在这里插入图片描述

1.6 代码示例

import torch
import torch.nn as nn


def transposed_conv_official():
    feature_map = torch.as_tensor([[1, 0],
                                   [2, 1]], dtype=torch.float32).reshape([1, 1, 2, 2])
    print(feature_map)
    trans_conv = nn.ConvTranspose2d(in_channels=1, out_channels=1,
                                    kernel_size=3, stride=1, bias=False)
    trans_conv.load_state_dict({"weight": torch.as_tensor([[1, 0, 1],
                                                           [0, 1, 1],
                                                           [1, 0, 0]], dtype=torch.float32).reshape([1, 1, 3, 3])})
    print(trans_conv.weight)
    output = trans_conv(feature_map)
    print(output)


def transposed_conv_self():
    feature_map = torch.as_tensor([[0, 0, 0, 0, 0, 0],
                                   [0, 0, 0, 0, 0, 0],
                                   [0, 0, 1, 0, 0, 0],
                                   [0, 0, 2, 1, 0, 0],
                                   [0, 0, 0, 0, 0, 0],
                                   [0, 0, 0, 0, 0, 0]], dtype=torch.float32).reshape([1, 1, 6, 6])
    print(feature_map)
    conv = nn.Conv2d(in_channels=1, out_channels=1,
                     kernel_size=3, stride=1, bias=False)
    conv.load_state_dict({"weight": torch.as_tensor([[0, 0, 1],
                                                     [1, 1, 0],
                                                     [1, 0, 1]], dtype=torch.float32).reshape([1, 1, 3, 3])})
    print(conv.weight)
    output = conv(feature_map)
    print(output)


def main():
    transposed_conv_official()
    print("---------------")
    transposed_conv_self()


if __name__ == '__main__':
    main()

输出结果

tensor([[[[1., 0.],
          [2., 1.]]]])
Parameter containing:
tensor([[[[1., 0., 1.],
          [0., 1., 1.],
          [1., 0., 0.]]]], requires_grad=True)
tensor([[[[1., 0., 1., 0.],
          [2., 2., 3., 1.],
          [1., 2., 3., 1.],
          [2., 1., 0., 0.]]]], grad_fn=<SlowConvTranspose2DBackward>)
---------------
tensor([[[[0., 0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0., 0.],
          [0., 0., 1., 0., 0., 0.],
          [0., 0., 2., 1., 0., 0.],
          [0., 0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0., 0.]]]])
Parameter containing:
tensor([[[[0., 0., 1.],
          [1., 1., 0.],
          [1., 0., 1.]]]], requires_grad=True)
tensor([[[[1., 0., 1., 0.],
          [2., 2., 3., 1.],
          [1., 2., 3., 1.],
          [2., 1., 0., 0.]]]], grad_fn=<ThnnConv2DBackward>)

Process finished with exit code 0

2. 反池化(Unpooling)

Unpooling是pooling操作的逆向过程,可以提高特征图的空间分辨率。

2.1 方法一

最大池化的逆向过程,在最大值的位置补最大值,其他位置补0。
在这里插入图片描述

2.2 方法二

Learning to Generate Chairs with Convolutional Neural Networks
Deeper Depth Prediction with Fully Convolutional Residual Networks

在这里插入图片描述

用2x2的块进行反池化操作,左上角为实值,其他补0。

2.3 方法三

Adaptive Deconvolutional Networks for Mid and High Level Feature Learning

在卷积神经网络中,最大池化操作是不可逆的,但可以通过一组转换变量来记录每个池化区域内最大值的位置,从而获得近似的反池化。
在这里插入图片描述

3D最大池化。特征图z划分为2x2的区域,每个区域用不同颜色表示。对每个区域进行最大池化操作,得到池化图p和转换图s。其中,k表示维度,转换图s记录了每个区域最大值的位置。

2.4 方法四

Visualizing and Understanding Convolutional Networks
在这里插入图片描述
在这里插入图片描述

2.5 方法五

Learning deconvolution network for semantic segmentation

反池化对于输入对象的重建特别有用。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1103022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP通信-快速入门

TCP通信模式演示 注意&#xff1a;在java中只要是使用java.net.Socket类实现通信&#xff0c;底层即是使用了TCP协议。 Socket api public Socket(String host , int port) 创建发送端的Socket对象与服务端连接&#xff0c;参数为服务端程序的ip和端口。 OutputStream getO…

[PyTorch]即插即用的热力图生成

先上张效果图&#xff0c;本来打算移植霹雳老师的使用Pytorch实现Grad-CAM并绘制热力图。但是看了下代码&#xff0c;需要骨干网络按照标准写法&#xff08;即将特征层封装为features数组&#xff09;&#xff0c;而我写的网络图省事并没有进行封装&#xff0c;改造网络的代价又…

大数据Flink(九十八):SQL函数的归类和引用方式

文章目录 SQL函数的归类和引用方式 一、SQL 函数的归类

算法、推理、部署,面了40多个大佬的感想

今年三月份到现在陆陆续续面了40来个人&#xff0c;有实习生&#xff0c;有校招生&#xff0c;也有来社招的大佬们。面了挺久&#xff0c;有些总结和感想&#xff0c;发出来和大家交流交流&#xff0c;也趁着这个机会为之后参与校招的同学提供一些学习方向。 我面的岗位主要是…

【STL】平衡二叉树

前言 对于之前普通的二叉搜索树&#xff0c;其搜索的效率依靠树的形状来决定&#xff0c;如下&#xff1a; 可以看到 A图 中的树比较彭亨&#xff0c;搜索一个元素的效率接近 O(logN) &#xff1b;而 B图 中的形状也符合搜索二叉树&#xff0c;但是很不平衡&#xff0c;这时的…

SamSung三星笔记本NP930QCG-K02CN原装出厂OEM预装Win10系统

下载链接&#xff1a;https://pan.baidu.com/s/13GsR_r9caJkLjiWWaXa30Q?pwdncp9 系统自带指纹驱动、声卡,网卡,显卡等所有驱动、三星出厂时主题壁纸、系统属性三星专属LOGO标志、Office办公软件等三星出厂时自带的预装程序 由于时间关系,绝大部分资料没有上传&#xff0c;不…

SpringCloud: sentinel热点参数限制

一、定义controller package cn.edu.tju.controller;import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockException; import org.springframework.web.bind.annotation.PathVariable; import org.springframewo…

出详图和工程图(上)-SOLIDWORKS 2024新功能

保持尺寸链共线 即使空间有限&#xff0c;您也可以确保尺寸链保持共线。 当尺寸文本和箭头重叠时&#xff0c;您可以选择最合适的选项。 要在尺寸文本重叠时保持尺寸链共线&#xff1a; 1. 单击工具 > 选项 > 文档属性 > 尺寸 > 线性 > 尺寸链。 2. 在共线选…

Nginx的安装——window环境

1、下载Nginx 在官网下载稳定版本&#xff1a; http://nginx.org/en/download.html 以nginx/Windows-1.24.0为例&#xff0c;直接下载 nginx-1.24.0.zip。 下载后解压&#xff0c;解压后如下&#xff1a; 2、启动nginx 在window环境下启动nginx的方法有以下两种&#xff1a; …

Hadoop3教程(二十):MapReduce的工作机制总结

文章目录 &#xff08;109&#xff09;MapTask工作机制&#xff08;110&#xff09;ReduceTask工作机制&并行度ReduceTask工作机制MapTask和ReduceTask的并行度决定机制 &#xff08;122&#xff09;MapReduce开发总结参考文献 &#xff08;109&#xff09;MapTask工作机制…

数据存储工程解决

在构建大规模爬虫系统时&#xff0c;数据存储是一个至关重要的环节。面对大量数据的处理和存储&#xff0c;我们需要采取一些工程化的解决方案&#xff0c;以确保数据的有效管理和快速检索。在本文中&#xff0c;我将与大家分享一些关于大规模爬虫数据存储的解决方案&#xff0…

Linux中的主要系统调用

Linux 操作系统中就是创建进程。创建进程的系统调用叫fork。在 Linux 里&#xff0c;要创建一个新的进程&#xff0c;需要一个老的进程调用 fork 来实现&#xff0c;其中老的进程叫作父进程&#xff08;Parent Process&#xff09;&#xff0c;新的进程叫作子进程&#xff08;C…

【刷题篇】回溯算法(广度优先搜索(一))

文章目录 N 叉树的层序遍历腐烂的橘子单词接龙打开转盘锁 N 叉树的层序遍历 给定一个 N 叉树&#xff0c;返回其节点值的层序遍历。&#xff08;即从左到右&#xff0c;逐层遍历&#xff09;。 树的序列化输入是用层序遍历&#xff0c;每组子节点都由 null 值分隔&#xff08;参…

AADL 端到端流延迟分析示例项目 Latency-case-study 简述

一、项目概述 latency-case-study 项目是一个增量延迟分析系统。该系统从系统的总体框架开始&#xff0c;逐步迭代增进&#xff0c;最终建立起系统的模型并实现对模型的分析。&#xff08;个人觉得这个过程有一些类似于“自顶向下&#xff0c;逐步求精”的过程&#xff09; 示…

它来了,xhadmin多应用Saas框架正式发布!

这是一个很激动人心的时刻&#xff0c;因为这个框架从立项到现在已经一年多的时间了&#xff0c;先给大家欣赏下颜值吧。 上图所示是总后台的首页截图&#xff0c;看上去还是比较满意的&#xff0c;不过后续还有一些小小的调整。 应用市场的效果也是相当炸裂的&#xff0c;整体…

Windows10找不到msvcr100.dll如何修复呢?详细有效的修复方法分享

在使用Windows10操作系统的过程中&#xff0c;我们经常会遇到各种各样的技术问题。其中&#xff0c;一些常见的问题是关于系统文件丢失或损坏&#xff0c;如“找不到msvcr100.dll”的错误。这个问题在Windows 10系统中尤其常见&#xff0c;msvcr100.dll是一个动态链接库文件&am…

用友NC-Cloud uploadChunk 任意文件上传漏洞

一、漏洞描述 用友 NC Cloud&#xff0c;大型企业数字化平台&#xff0c; 聚焦数字化管理、数字化经营、数字化商业&#xff0c;帮助大型企业实现 人、财、物、客的全面数字化&#xff0c;从而驱动业务创新与管理变革&#xff0c;与企业管理者一起重新定义未来的高度。为客户提…

收集灵感都有哪些网站推荐?

设计是一件非常令人兴奋的事情。特别是最常见的平面设计&#xff0c;作为一种传达想法或信息的视觉表达形式&#xff0c;被要求不仅突出个性和主题&#xff0c;而且具有创造力和美感&#xff0c;使许多设计师在灵感枯竭时疯狂。此时&#xff0c;浏览一些平面设计网站&#xff0…

YOLOv8涨点技巧:手把手教程,注意力机制如何在不同数据集上实现涨点的工作,内涵多种网络改进方法

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文独家改进&#xff1a;手把手教程&#xff0c;解决注意力机制引入到YOLOv8在自己数据集不涨点的问题点&#xff0c;本文提供五种改进方法来解决此问题&#xff1b; ContextAggregation | 亲测在血细胞检测项目中涨点&#xff0c;…

C/C++文件操作(细节满满,part2)

该文章上一篇&#xff1a;C/C文件操作&#xff08;细节满满&#xff0c;part1&#xff09;_仍有未知等待探索的博客-CSDN博客 个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏&#xff1a;C语言疑难_仍有未知等待探索的博客-CSDN博客 目录 …