深度学习(第3章——亚像素卷积和可形变卷积)

前言:

本章介绍了计算机识别超分领域和目标检测领域中常常使用的两种卷积变体,亚像素卷积(Subpixel Convolution)和可形变卷积(Deformable Convolution),并给出对应pytorch的使用。


亚像素卷积Subpixel Convolution

低维特征图还原为高维特征图,在上一章已经介绍了一种常用方法:转置卷积,链接如下:深度学习(第2章——卷积和转置卷积)_转置卷积层-CSDN博客https://blog.csdn.net/wlf2030/article/details/147479684?spm=1001.2014.3001.5502

但转置卷积的核心为填充0或双线性插值再正向卷积,这种做法会导致最后还原的图像出现棋盘伪影(可以通过设置卷积核整除步长或插值上采样缓解)。

亚像素卷积也是一种上采样方法,其核心操作为重新排列多个特征图的单个像素转化为上采样特征图的亚像素,下面图可以直观展现这一过程。

也可借助代码理解。

import torch
import torch.nn as nn
r = 2  # 上采样倍率
PS = nn.PixelShuffle(r)  # 初始化亚像素卷积操作
x = torch.arange(3*4*9).reshape(1, 3*(r**2),3, 3) #3通道 r*r表示每个像素对应特征图像素数目,特征图长宽
print(f'*****************************************')
print(f'input is \n{x}, and size is {x.size()}')
y = PS(x)  #  亚像素上采样
print(f'*****************************************')
print(f'output is \n{y}, and size is {y.size()}')
print(f'*****************************************')
print(f'upscale_factor is {PS.extra_repr()}')
print(f'*****************************************')

使用torch官方提供的已经定义好的亚像素卷积层,形参为上采样倍数。这里的含义为将一个12通道的3*3的特征图上采样还原为一个3通道6*6的特征图,程序输出如下:

变为了


可形变卷积(Deformable Convolution):

传统卷积使用卷积核滑动遍历图片在目标检测的目标发生扭曲时效果较差,原因在于传统卷积固定了位置相对关系,比如对于溜冰鞋的目标检测,卷积层可能提取的特征为在轮子上的鞋子,但当图片反转时变成了轮子在鞋子上方就有可能无法检测到。为了解决相对位置变化对卷积提取的影响,可形变卷积引入一个可学习的偏移矩阵,从而能够输入内容动态调整卷积的位置,自适应地捕捉复杂空间变形。传统卷积操作作用为学习卷积区域的特征,而引入的偏置矩阵用于学习应该使用哪些位置的像素做卷积。

核心注意点:

1.偏移矩阵是针对每次卷积操作卷积核上获取对应每个像素的x,y坐标偏移量。

2.由于偏移矩阵不可能每轮训练最终像素都刚好为整数,所以需要使用双线性插值获取发生小数偏移对应位置的像素。

3.可形变卷积相当于在传统卷积前做了一步位置映射操作,其余部分不变。

结合代码:

import torch
import torch.nn as nn
from torchvision.ops import DeformConv2d# 定义可变形卷积层
class DeformableConv(nn.Module):def __init__(self, in_channels, out_channels, kernel_size=3):super().__init__()# 偏移量生成层(学习"Where")self.offset_conv = nn.Conv2d(in_channels,2 * kernel_size * kernel_size,  # 2N offsetskernel_size=kernel_size,padding=kernel_size // 2,)# 可变形卷积层(学习"What")self.deform_conv = DeformConv2d(in_channels,out_channels,kernel_size=kernel_size,padding=kernel_size // 2)def forward(self, x):# 生成偏移量offsets = self.offset_conv(x)  # [B, 2N, H, W]print(offsets.shape)# 应用可变形卷积return self.deform_conv(x, offsets)  # 同时利用卷积核权重和偏移量# 定义输入 (batch=1, channels=1, height=4, width=4)
input = torch.tensor([[[[1., 2., 3., 4.],[5., 6., 7., 8.],[9., 10., 11., 12.],[13., 14., 15., 16.]]
]], requires_grad=True)  # 需要梯度以支持反向传播
print("Input shape:", input.shape)  # [1, 1, 4, 4]dcn = DeformableConv(in_channels=1, out_channels=1, kernel_size=3)
print(dcn(input))

这里是使用一层传统卷积(offset_conv)获取偏移量矩阵,输入通道即为整个可形变卷积层的输入通道输出通道固定为2倍后续传统卷积的卷积核大小,2表示获取x,y轴上的偏移,如果是1则只能获取单个方向的偏移,乘卷积核大小是应为原本传统卷积对输入特征图的一个像素进行卷积是需要计算卷积核大小的数据,当然卷积核中每个像素都需要一对(x,y)的偏移。而获取偏移量大小的卷积层卷积核大小没有固定要求,这里建议保持和后续传统卷积的卷积核大小相同,但padding一定需要保证为设置的卷积核//2(即保证输入输出的特征图大小相同,否则会导致原特征图的像素1对1映射关系错误),同时使用torch定义好的可形变卷积,其作用在于设置偏移量矩阵后完成后续的双线性插值以及对偏移映射后的矩阵进行传统卷积,其在设置偏移量=0时数学等价于传统卷积(实际上仍然会执行双线性插值可能造成误差)。

最后输出如下:

注意训练时训练的是提取偏移量的传统卷积层卷积核参数(而非直接训练每个特征图的坐标偏移,坐标偏移实际是由这层卷积获取的,否则只训练坐标偏移参数最终相当于仍然固定了映射关系和传统卷积没有任何差异,只有训练卷积核才能让模型知道对于一张特征图应当采用怎样的偏置,以及也可以叠加获取offset矩阵的层数,这里只使用了一层卷积,从而获得更好的泛化能力)+可形变矩阵部分的卷积核参数,如果理解这段话的含义,便可以说理解了可形变卷积的核心


最后:

        目前本人研究方向有超分,目标检测和重识别,对上述方向感兴趣的小伙伴可以关注,后续会更新以上知识以及相关论文。

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

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

相关文章

大模型在腰椎间盘突出症预测与治疗方案制定中的应用研究

目录 一、引言 1.1 研究背景 1.2 研究目的与意义 二、腰椎间盘突出症概述 2.1 定义与病因 2.2 症状与诊断方法 2.3 治疗方法概述 三、大模型技术原理与应用基础 3.1 大模型的基本原理 3.2 大模型在医疗领域的应用现状 3.3 用于腰椎间盘突出症预测的可行性分析 四、…

Vue3学习(组合式API——ref模版引用与defineExpose编译宏函数)

目录 一、ref模版引用。 &#xff08;1&#xff09;基本介绍。 &#xff08;2&#xff09;核心基本步骤。(以获取DOM、组件为例) &#xff08;3&#xff09;案例&#xff1a;获取dom对象演示。 <1>需求&#xff1a;点击按钮&#xff0c;让输入框聚焦。 &#xff08;4&…

公链开发及其配套设施:钱包与区块链浏览器

公链开发及其配套设施&#xff1a;钱包与区块链浏览器的技术架构与生态实践 ——2025年区块链基础设施建设的核心逻辑与创新突破 一、公链开发&#xff1a;构建去中心化世界的基石 1. 技术架构设计的三重挑战 公链作为开放的区块链网络&#xff0c;需在性能、安全性与去中心…

Kotlin 作用域函数(let、run、with、apply、also)对比

Kotlin 的 作用域函数&#xff08;Scope Functions&#xff09; 是简化代码逻辑的重要工具&#xff0c;它们通过临时作用域为对象提供更简洁的操作方式。以下是 let、run、with、apply、also 的对比分析&#xff1a; 一、核心区别对比表 函数上下文对象引用返回值是否扩展函数…

14、Python时间表示:Unix时间戳、毫秒微秒精度与time模块实战

适合人群&#xff1a;零基础自学者 | 编程小白快速入门 阅读时长&#xff1a;约5分钟 文章目录 一、问题&#xff1a;计算机中的时间的表示、Unix时间点&#xff1f;1、例子1&#xff1a;计算机的“生日”&#xff1a;Unix时间点2、答案&#xff1a;&#xff08;1&#xff09;U…

AI日报 - 2024年5月17日

&#x1f31f; 今日概览 (60秒速览) ▎&#x1f916; 大模型前沿 | OpenAI推出自主编码代理Codex&#xff1b;Google DeepMind发布Gemini驱动的编码代理AlphaEvolve&#xff0c;能设计先进算法&#xff1b;Meta旗舰AI模型Llama 4 Behemoth发布推迟。 Codex能并行处理多任务&…

DriveMM:用于自动驾驶的一体化大型多模态模型——论文阅读

《DriveMM: All-in-One Large Multimodal Model for Autonomous Driving》2024年12月发表&#xff0c;来自中山大学深圳分校和美团的论文。 大型多模态模型&#xff08;LMM&#xff09;通过整合大型语言模型&#xff0c;在自动驾驶&#xff08;AD&#xff09;中表现出卓越的理解…

C++_STL_map与set

1. 关联式容器 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、 forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面 存储的是元素本身。那什么是…

【嵌入式开发-RGB 全彩 LED】

嵌入式开发-RGB 全彩 LED ■ RGB 全彩 LED简介■ 电路设计■ ■ RGB 全彩 LED简介 RGB 全彩 LED 模块显示不同的颜色。 ■ 电路设计 全彩 LED 使用 PA5、 蓝色&#xff08;B&#xff09; TIM2_CHN3 PA1、 绿色&#xff08;G&#xff09;TIM2_CHN2 PA2、 红色&#xff08;R&am…

计算机网络:手机和基站之间的通信原理是什么?

手机与基站之间的通信是无线通信技术的核心应用之一,涉及复杂的物理层传输、协议交互和网络管理机制。以下从技术原理、通信流程和关键技术三个层面深入解析这一过程: 一、蜂窝网络基础架构 1. 蜂窝结构设计 基本原理:将服务区域划分为多个六边形“蜂窝小区”,每个小区由*…

【Docker】Docker安装RabbitMQ

目录 1.拉取镜像 2. 创建挂载目录 3.创建和启动 4.登录管理端 1.拉取镜像 推荐使用带 Web 管理界面的官方镜像&#xff08;management&#xff09; # 拉取docker镜像 docker pull rabbitmq:management响应内容&#xff1a; 2. 创建挂载目录 创建挂载目录和日志目录 #rabb…

交叉编译源码的方式移植ffmpeg-rockchip

获取ffmpeg源码 git submodule add -f https://github.com/FFmpeg/FFmpeg.git thirdparty/FFmpeg 瑞芯微ffmpeg-rk git clone https://github.com/jjm2473/ffmpeg-rk/tree/enc# 参考的一位博主的说法 使用 ffmpeg-rochip 的好处 传统的使用硬件编解码的开发思路是&#xf…

9.0 C# 调用solidworks介绍1

一、C# 与 SolidWorks 联合开发概述 SolidWorks 提供了完整的 API(应用程序接口),允许开发者使用 C# 等编程语言进行二次开发,实现自动化设计、定制功能等。 主要技术要点包括: 1. API 结构:SolidWorks API 是基于 COM 的接口,包含数百个对象和数千个方法…

AD 多层线路及装配图PDF的输出

装配图的输出&#xff1a; 1.点开‘智能PDF’ 2. 设置显示顶层&#xff1a; 设置显示底层&#xff1a; 多层线路的输出 同样使用‘智能PDF’

SpringBoot + Shiro + JWT 实现认证与授权完整方案实现

SpringBoot Shiro JWT 实现认证与授权完整方案 下面博主将详细介绍如何使用 SpringBoot 整合 Shiro 和 JWT 实现安全的认证授权系统&#xff0c;包含核心代码实现和最佳实践。 一、技术栈组成 技术组件- 作用版本要求SpringBoot基础框架2.7.xApache Shiro认证和授权核心1.…

PCIe数据采集系统详解

PCIe数据采集系统详解 在上篇文章中&#xff0c;废了老大劲儿我们写出了PCIe数据采集系统&#xff1b;其中各个模块各司其职&#xff0c;相互配合。完成了从数据采集到高速存储到DDR3的全过程。今天我们呢就来详细讲解他们之间的关系&#xff1f;以及各个模块的关键点&#xff…

2025云智算技术白皮书

1. 云智算的演进背景 传统云计算面临三大挑战&#xff1a; 算力需求激增&#xff1a;AI大模型训练需十万卡级GPU集群&#xff0c;资源调度能力不足。网络性能瓶颈&#xff1a;TB级参数同步对低时延、高吞吐要求远超传统网络架构。服务形态单一&#xff1a;IaaS/PaaS无法覆盖A…

C语言编程中的时间处理

最简单的time 在C语言编程中&#xff0c;处理时间最简单的函数就是time了。它的原型为&#xff1a; #include <time.h> time_t time(time_t *_Nullable tloc);返回自从EPOCH&#xff0c;即1970年1月1日的零点零时零分&#xff0c;到当前的秒数。 输入参数可以是NULL。…

适应性神经树:当深度学习遇上决策树的“生长法则”

1st author: Ryutaro Tanno video: Video from London ML meetup paper: Adaptive Neural Trees ICML 2019 code: rtanno21609/AdaptiveNeuralTrees: Adaptive Neural Trees 背景 在机器学习领域&#xff0c;神经网络&#xff08;NNs&#xff09;凭借其强大的表示学习能力&…

InitVerse节点部署教程

项目介绍: InitVerse 是一个为新兴企业量身定制的自动化 Web3 SaaS 平台,只需单击几下即可快速开发和部署 DApp。在 INIChain 和 INICloud 的支持下,InitVerse 可以根据需求动态调整计算资源,实现高效的任务处理,同时提供更高的安全性、可用性和可扩展性。 系统要求: C…