常见的上采样操作以及其Pytorch实现

news2024/11/15 7:57:23

文章目录

  • 常见的上采样操作以及其Pytorch实现
  • 一、[插值](https://www.cnblogs.com/zhaozhibo/p/15024928.html)
    • 1.最近邻插值
    • 2.双线性插值
    • 3.双三次插值
  • 二、反卷积
  • 三、sub-pixel Convolution
  • 四、其它方法
    • 1.[superpoint](https://arxiv.org/abs/1911.11763)使用方法
    • 2.待补充

常见的上采样操作以及其Pytorch实现

整理一下常见的上采样操作,主要有线性插值、反卷积、sub-pixel Convolution等

一、插值

插值方法主要分为最近临插值、双线性插值、双三次插值 。

1.最近邻插值

最近邻插值选取与待填充位置最近的像素值作为该位置的值。Pytorch代码如下:

import torch
import torch.nn as nn

input = torch.arange(1, 5, dtype=torch.float32).view(1, 1, 2, 2)
print(input)

tensor([[[[1., 2.],
          [3., 4.]]]])
# 最近邻插值
nearest_interpolation = nn.UpsamplingNearest2d(scale_factor=2)
print(nearest_interpolation(input))

tensor([[[[1., 1., 2., 2.],
          [1., 1., 2., 2.],
          [3., 3., 4., 4.],
          [3., 3., 4., 4.]]]])

官方介绍如下:

在这里插入图片描述

2.双线性插值

最近邻插值虽然简单,但是会带来明显的棋盘效应以及演示网页。

假设反卷积生成的图像中,包含1只黑猫,黑猫身体部分的像素颜色应该是平滑过渡的。或者极端的说,身体部分应该全部都是黑色的。而在实际生成的图像中,该部分却是由深深浅浅的近黑方块组成的,很像棋盘的网络。这就是所谓的棋盘效应。现在显著性检测还存在的一个问题就是,在像素级的视觉任务中,会出现这个棋盘效应。这个效应在深度卷积神经网络中的影响是很大的。比如:如果在FCN的输出中出现这个效应,那么这个网络的训练就有可能失败,并且结果完全错误。而这些效应出现的源头就是上采样机制,一般出现在反卷积中。就是在反卷积过程中,当卷积核大小不能被步长整除时,反卷积就会出现重叠问题,插零的时候,输出结果会出现一些数值效应,就像棋盘一样。

最近邻插值的一个改进算法是双线性插值。计算算法如下,其中 P 为待计算元素 , Q 11 、 Q 12 、 Q 21 、 Q 22 代表与 P 最相邻的四个元素 P为待计算元素,Q_{11}、Q_{12}、Q_{21}、Q_{22}代表与P最相邻的四个元素 P为待计算元素,Q11Q12Q21Q22代表与P最相邻的四个元素。计算公式如下:

在这里插入图片描述

在这里插入图片描述

Pytorch实现如下:

# 双线性插值
Bilinear_interpolation = nn.UpsamplingBilinear2d(scale_factor=2)
print(Bilinear_interpolation(input))

tensor([[[[1.0000, 1.3333, 1.6667, 2.0000],
          [1.6667, 2.0000, 2.3333, 2.6667],
          [2.3333, 2.6667, 3.0000, 3.3333],
          [3.0000, 3.3333, 3.6667, 4.0000]]]])

官方文档介绍如下:

在这里插入图片描述

3.双三次插值

这个算法计算过程有点复杂,这里不再详细论述。

Pytorch代码如下,其中mode 可使用的上采样算法,有nearest, linear, bilinear bicubic and trilinear. 默认使用 nearest

Bicubic_interpolation = nn.Upsample(scale_factor=2, mode='bicubic', align_corners=True)
print(Bicubic_interpolation(input))

tensor([[[[1.0000, 1.3148, 1.6852, 2.0000],
          [1.6296, 1.9444, 2.3148, 2.6296],
          [2.3704, 2.6852, 3.0556, 3.3704],
          [3.0000, 3.3148, 3.6852, 4.0000]]]])

Bicubic_interpolation = nn.Upsample(scale_factor=2, mode='bicubic', align_corners=False)
print(Bicubic_interpolation(input))

tensor([[[[0.6836, 1.0156, 1.5625, 1.8945],
          [1.3477, 1.6797, 2.2266, 2.5586],
          [2.4414, 2.7734, 3.3203, 3.6523],
          [3.1055, 3.4375, 3.9844, 4.3164]]]])

官方文档介绍如下:

在这里插入图片描述

二、反卷积

好了,接下来就是利用深度学习算法来进行上采样了。反卷积又叫转置卷积,这里推荐一个简短的介绍反卷积工作原理的视频。简单地说,反卷积就是先往图像或特征图上填充很多的0,然后利用正常卷积去卷。

反卷积是一种特殊的卷积,总是可以使用一种卷积来模拟反卷积的过程。然而该方式将引入许多‘0’的行和‘0’的列,导致实现上非常的低效。并且,反卷积只能恢复尺寸,并不能恢复数值,因此经常用在神经网络中作为提供恢复的尺寸,具体的数值往往通过训练得到。此外,反卷积有一个严重的问题就是棋盘效应(上面双线性插值介绍过)。常见的解决棋盘效应的做法为先插值Resize再卷积。

Pytorch代码如下:

Transposed = nn.ConvTranspose2d(1, 1, 3, stride=1, padding=0)
print(Transposed(input))

tensor([[[[ 0.2539,  0.7710,  0.4962, -0.2961],
          [ 0.5497,  1.3513,  0.5077, -0.2974],
          [-0.0971, -0.7856, -0.6271,  0.6010],
          [ 0.6732,  0.5091, -0.6448, -0.2129]]]],
       grad_fn=<ConvolutionBackward0>)

官方文档介绍如下:

在这里插入图片描述

在这里插入图片描述

三、sub-pixel Convolution

普通的上采样采用的临近像素填充算法,主要考虑空间因素,没有考虑channel因素,上采样的特征图人为修改痕迹明显,图像分割与GAN生成图像中效果不好。为了解决这个问题,ESPCN中提到了亚像素上采样方式。具体原理如下:

img

这种操作能够将原来维度为 B × C × H × W B\times C \times H \times W B×C×H×W变成 B × C × s H × s W B\times C\times sH\times sW B×C×sH×sW。主要过程分为两步:

  • 先通过几个正常卷积层将维度从 B × C × H × W B\times C \times H \times W B×C×H×W变成 B × s C × H × W B\times sC \times H \times W B×sC×H×W
  • 然后通过Pixel Shuffle操作将维度从 B × s C × H × W B\times sC \times H \times W B×sC×H×W变成 B × C × s H × s W B\times C \times sH \times sW B×C×sH×sW

Pixel Shuffle的主要功能就是将这 s 2 s^2 s2 个通道的特征图组合为新的的 B × C × s H × s W B\times C \times sH \times sW B×C×sH×sW上采样结果。具体来说,就是将原来一个低分辨的像素划分为 s 2 s^2 s2 个更小的格子,利用 s 2 s^2 s2 个特征图对应位置的值按照一定的规则来填充这些小格子。按照同样的规则将每个低分辨像素划分出的小格子填满就完成了重组过程。在这一过程中模型可以调整 s 2 s^2 s2 个shuffle通道权重不断优化生成的结果。

卷积的Pytorch实现不用多说,关于Pixel Shuffle的实现Pytorch已经可以直接调用类,如下:

pixel_shuffle = nn.PixelShuffle(3) # 这里的3就是s
input = torch.randn(1, 9, 4, 4)
output = pixel_shuffle(input)
print(output.size())

torch.Size([1, 1, 12, 12]) # 可以看到通道数变小s²倍,长宽分别扩大s倍

官方文档介绍如下:

在这里插入图片描述

四、其它方法

1.superpoint使用方法

在这里插入图片描述

上面的Interest Point Decoder使用的是将特征图reshape操作,和上面的Pixel Shuffle类似,都是将维度从 B × s C × H × W B\times sC \times H \times W B×sC×H×W变成 B × C × s H × s W B\times C \times sH \times sW B×C×sH×sW。这里代码就不再展示了就是用来reshape和permute(维度变化)。

Descriptor Decoder使用的是三线性插值。

2.待补充

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

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

相关文章

Word 设置标题编号

用到了多级列表&#xff0c;所谓多级列表&#xff0c;就是为段落标上编号&#xff0c;并不一定就要对文字使用&#xff0c; 教程参考自Word 多级列表编号方法总结&#xff08;二&#xff09;——自定义编号 - 知乎 直接看我的就好了 假设我们有一个需求 类似于这样的三级标题…

【SpringBoot】面试必杀技-泰山陨石坠,SpringBoot中主启动类的run方法启动流程是什么?

开头导语由Chatgpt完成 当今互联网行业中&#xff0c;Java后端开发岗位的竞争异常激烈&#xff0c;对于面试者来说&#xff0c;掌握一些技巧和知识点将有助于脱颖而出。而对于SpringBoot框架的使用和运行机制&#xff0c;更是Java后端开发岗位中不可或缺的技能点之一。在Spring…

Python里的元组、列表和字典区别

列表&#xff1a;可更改、有序、可重复、元素可以是任何对象 列表示例&#xff1a;[1,a,[2,3]] 元组&#xff1a;不可更改、有序、可重复、元素可以是任何对象 元组示例&#xff1a;(b,1,[2,3]) 字典&#xff1a;可更改、无序、键不可重复、键不可变、值可以是任何对象&…

【Redis-面试题及持久化方案】Redis相关面试题(缓存穿透、缓存击穿、缓存雪崩) Redis两种持久化方案详情对比(RDB、AOF)

【Redis-面试题及持久化方案】Redis相关面试题&#xff08;缓存穿透、缓存击穿、缓存雪崩&#xff09; & Redis两种持久化方案详情对比&#xff08;RDB、AOF&#xff09; 1&#xff09;Redis 面试题1.1.高频面试题&#xff1a;缓存穿透、缓存击穿、缓存雪崩1.2.低频面试题&…

校友小程序定制开发 带我们回到那个学生时代

学生时代总是给人一种单纯美好的感觉&#xff0c;也会是每个人记忆深处最深刻的回忆&#xff0c;尤其是一起学习生活几年的同窗随着毕业不得不各奔东西&#xff0c;但是大家都对母校有着不一样的情怀&#xff0c;也想有一个什么东西能够把各个高校校友联系在一起。校友小程序开…

瑞芯微 Rockchip rknn 模型在线预编译

瑞芯微 Rockchip rknn 模型在线预编译 flyfish 主机Host环境 Distributor ID: Ubuntu Description: Ubuntu 22.04.2 LTS Release: 22.04 Codename: jammy开发板Target环境 RV1126一 主机连接开发板 用线连起来后&#xff0c;查看usb信息 没权限的提示 no permissions (…

微信小程序笔记(1)

小程序笔记 小程序一个页面为什么有四个文件&#xff1f; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZVdz4I1W-1681982063887)(C:\Users\26387\AppData\Roaming\Typora\typora-user-images\image-20230419170019877.png)] wxss&#xff1a;写页…

对学历贬值的再观察

最近在求职市场上观察到这样一个现象&#xff0c;有些4年前硕士学历就能进入的职业&#xff0c;现在都要博士了&#xff0c;不免让人有一种4年书白读的感觉。所以想再观察一下学历贬值&#xff0c;平复一下心情&#xff08;不是&#xff09;。 学历贬值的原因&#xff1a;供大于…

day1 Flappy bird项目介绍

项目介绍 功能分析&#xff1a; 1、按下空格小鸟上升&#xff0c;不按下落&#xff1b; 2、搭建小鸟需要穿过的管道&#xff1b; 3、管道自动左移和创建&#xff1b; 4、小鸟触碰到管道游戏结束&#xff1b; 知识储备&#xff1a; 1、C语言&#xff1b; 2、数据结构 -…

【Vue2源码】响应式原理

【Vue2源码】响应式原理 文章目录 【Vue2源码】响应式原理Vue响应式的核心设计思路整体流程响应式中的关键角色检测变化注意事项响应式原理数据观测重写数组7个变异方法增加__ob__属性__ob__有两大用处&#xff1a; Vue.js 基本上遵循 MVVM&#xff08;Model–View–ViewModel&…

[oeasy]python0135_变量名与下划线_dunder_声明与赋值

变量定义 回忆上次内容 变量 就是 能变的量上次研究了 变量标识符的 规则 第一个字符 应该是 字母或下划线合法的标识符可以包括 大小写字母数字下划线 还研究了字符串(str)的函数 isidentifier查询字符串 是否为合法标识符 最后发现 这个isidentifier函数有时候不好使&…

实战iOS App 重签名

熟悉iOS开发的同学都知道,iOS应用的上架流程主要分为以下几步: 创建开发者账号借助辅助工具appuploader创建证书,描述文件iTunes connect创建App打包IPA上传App Store等待审核在签名的流程中,有一个App重签名的步骤,主要针对的是一些大公司有多个App的情况,多个App一个申…

Linux设备驱动开发 - S3C2440时钟分析

By: fulinux E-mail: fulinuxsina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅&#xff01; 你的喜欢就是我写作的动力&#xff01; 目录 系统框架图FLCK,HCLK,PCLK时钟源的选择 时钟体系流程流程分析驱动中的clk 系统框架图 2440是一个SOC(system on …

【网络编程】网络编程 和 Socket 套接字认识

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;Java EE初阶&#x1f447; 目 录 &#x1f3a7;一. 网络编程基础&#x1f3ba;1. 为什么需要网络编程&#xff1f;&#x1f3b7;2. 什么是网络编程&#x1f3b8;3. 网络编程中的基础概念 &#x1f3bf;二. So…

继续学习Easyx

画圆角矩形函数&#xff1a;roundrect&#xff0c;前四个参数是和矩形一样的&#xff0c;表示先画一个矩形&#xff0c;然后就是要画它的圆角了&#xff0c;要怎么画它的圆角&#xff1f;这里使用四个一样的椭圆来将它的四个角画出来&#xff0c;而在这个里面的椭圆不再需要四个…

MySQL8.0.33主从复制配置记录

目录 1. 下载2. 解压3.重命名4.创建存储数据文件5. 设置用户组并赋权6. 初始化MySQL7.配置文件8. 启动MySQL9. 设置软连接&#xff0c;并重启MySQL10. 登录并更改密码11. 开放远程连接12. 连接工具测试连接MySQL13. 开机自启配置14.从服务器配置15. 主库配置16. 从库配置17. 测…

功率MOS管烧毁,有这些原因

功率MOS管烧毁的原因以及相应的预防措施。在本文中&#xff0c;我将会介绍功率MOS管的基本结构、工作原理&#xff0c;以及可能导致功率MOS管烧毁的原因&#xff0c;并提供相应的解决方案。 1. 功率MOS管的基本结构和工作原理 功率MOS管是一种常用的功率电子器件&#xff0c;…

SpringBoot集成MyBatis-plus

SpringBoot集成MyBatis-plus 一、Mybatis-Plus简介1.简介2.特性3.官网及文档地址 二、入门案例1.开发环境2.创建数据库及表3.创建Springboot项目导入依赖4.配置application.yml5.启动类6.实体类7.添加mapper8.添加UserController9.日志配置 三、CURD1.BaseMapper2.通用Service …

事件主循环

一、事件主循环 1、事件处理主流程 libevent的事件循环主要是通过event_base_loop函数来完成&#xff0c;其主要的操作如下&#xff1a; 1、根据timer-heap中的事件最小超时时间&#xff0c;计算系统I/O demultiplexer的最大等待时间。例如&#xff1a;当底层使用的是Linux提供…

Android系统启动流程--system_server进程的启动流程

紧接上一篇zygote进程的启动流程&#xff0c;上一篇的结尾提到zygote进程中会fock出一个system_server进程&#xff0c;用于启动和管理Android系统中大部分的系统服务&#xff0c;本篇就来分析system_server进程是如何创建并运行的以及它都做了哪些重要的工作。 //文件路径&am…