深度學習(第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.pswp.cn/diannao/83429.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83429.shtml
英文地址,請注明出處:http://en.pswp.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…