論文閱讀-SelectiveStereo

文章目錄

  • 1 概述
  • 2 模塊
    • 2.1 SelectiveIGEV和IGEV的差異
    • 2.2 上下文空間注意力
      • 2.2.1 通道注意力
      • 2.2.2 空間注意力
    • 2.3 SRU
  • 3 效果
  • 參考資料

1 概述

本文主要結合代碼對Selective的創新點進行針對性講解,相關的背景知識可以參考我寫的另兩篇文章論文閱讀-RaftStereo和論文閱讀-IGEV。
SelectiveStereo的創新點總結來說就只有一項,在RaftStereo和IGEV的基礎上,提出了分別提取圖像高頻信息和低頻信息并融合的迭代算子SRU(Selective Recurrent Unit),另一個Contextual Spatial Attention(CSA)模塊是為其服務的。
SelectiveStereo對RaftStereo和IGEV都進行了改進,下面以IGEV為例進行具體說明。

2 模塊

2.1 SelectiveIGEV和IGEV的差異

從代碼上看,SelectiveStereo和IGEV的差異只有兩處。一處是在計算inp_list的時候,SelectiveStereo用到了通道注意力self.cam,并使用空間注意力self.sam進一步得到了注意力圖att;另一處是在使用self.update_block進行計算的時候,SelectiveIGEV額外多了att作為輸入。
SelectiveStereo的相關代碼為

class IGEVStereo(nn.Module):def forward(self, image1, image2, iters=12, flow_init=None, test_mode=False):# 此處省略部分代碼...cnet_list = self.cnet(image1, num_layers=self.args.n_gru_layers)net_list = [torch.tanh(x[0]) for x in cnet_list]inp_list = [torch.relu(x[1]) for x in cnet_list]# 不同點1inp_list = [self.cam(x) * x for x in inp_list]att = [self.sam(x) for x in inp_list]# 此處省略部分代碼...for itr in range(iters):disp = disp.detach()geo_feat = geo_fn(disp, coords)with autocast(enabled=self.args.mixed_precision, dtype=getattr(torch, self.args.precision_dtype, torch.float16)):# 不同點2net_list, mask_feat_4, delta_disp = self.update_block(net_list, inp_list, geo_feat, disp, att)

IGEV的相關代碼為

class IGEVStereo(nn.Module):def forward(self, image1, image2, iters=12, flow_init=None, test_mode=False):# 此處省略部分代碼...cnet_list = self.cnet(image1, num_layers=self.args.n_gru_layers)net_list = [torch.tanh(x[0]) for x in cnet_list]inp_list = [torch.relu(x[1]) for x in cnet_list]# 不同點1inp_list = [list(conv(i).split(split_size=conv.out_channels//3, dim=1)) for i,conv in zip(inp_list, self.context_zqr_convs)]# 此處省略部分代碼...for itr in range(iters):disp = disp.detach()geo_feat = geo_fn(disp, coords)with autocast(enabled=self.args.mixed_precision, dtype=getattr(torch, self.args.precision_dtype, torch.float16)):# 不同點2net_list, mask_feat_4, delta_disp = self.update_block(net_list, inp_list, geo_feat, disp, iter16=self.args.n_gru_layers==3, iter08=self.args.n_gru_layers>=2)

2.2 上下文空間注意力

為實現不同感受野和頻率信息的融合,上下文空間注意力(Contextual Spatial Attention,簡稱CSA)模塊通過提取上下文信息作為引導的多層級注意力圖譜。如圖2-1所示,CSA可劃分為兩個子模塊:通道注意力增強(Channel Attention Enhancement,簡稱CAE)和空間注意力提取器(Spatial Attention Extractor,簡稱SAE)。這兩個子模塊源自CBAM框架,作者進行了簡化以更好地適配立體匹配任務。
上下文注意力示意圖

圖2-1 上下文注意力示意圖

2.2.1 通道注意力

通道注意力的代碼實現如下所示,結合圖2-1左側的示意圖應該比較容易理解。在給定上下文信息圖 c∈RC×H×Wc∈R^{ C×H×W}cRC×H×W 的情況下,首先對空間維度進行平均池化和最大池化操作,分別得到兩個特征圖favgf_{avg}favg?fmax∈RC×1×1f_{max}∈R^{C×1×1}fmax?RC×1×1。接著通過兩個獨立的卷積層對這些特征圖進行特征變換,也就是代碼中的self.fc,是一個bottleneck結構,如果改成殘差的形式就和yolo中的bottleneck一致了。隨后將這兩個特征圖相加,并使用sigmoid函數將其轉換為0到1之間的權重Mc∈RC×1×1M_c∈R^{C×1×1}Mc?RC×1×1。最后通過逐元素乘積運算,初始特征圖能夠捕捉哪些通道具有數值高的特征值需要增強,哪些通道具有數值低的特征值需要抑制。

class ChannelAttentionEnhancement(nn.Module):def __init__(self, in_planes, ratio=16):super(ChannelAttentionEnhancement, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.max_pool = nn.AdaptiveMaxPool2d(1)self.fc = nn.Sequential(nn.Conv2d(in_planes, in_planes // 16, 1, bias=False),nn.ReLU(),nn.Conv2d(in_planes // 16, in_planes, 1, bias=False))self.sigmoid = nn.Sigmoid()def forward(self, x):avg_out = self.fc(self.avg_pool(x))max_out = self.fc(self.max_pool(x))out = avg_out + max_outreturn self.sigmoid(out)

回看2.1節中SelectiveStereo對應的代碼,self.cam生成了inp_list,而IGEV中是通過簡單的卷積生成的inp_list,因此SelectiveStereo的inp_list特征表達能力會更強一些。
那么這個inp_list的作用是什么呢?看過我的另一篇博客論文閱讀-IGEV的話可以知道inp_list對應于ConvGRU中的偏置項,而在SelectiveStereo中,作者選擇使用了RaftConvGRU,那么inp_list就不是偏置項了,直接作為卷積的輸入了。我覺得作者應該是認為經過sigmoid的結果作為偏置項不太合適才選擇了RaftConvGRU。
這里也把ConvGRU和RaftConvGRU的代碼放出來,方便讀者查看。
RaftConvGRU代碼如下,inp_list被concat在x當中。

class RaftConvGRU(nn.Module):def __init__(self, hidden_dim=128, input_dim=256, kernel_size=3, dilation=1):super(RaftConvGRU, self).__init__()self.convz = nn.Conv2d(hidden_dim+input_dim, hidden_dim, kernel_size, padding=(kernel_size+(kernel_size-1)*(dilation-1))//2, dilation=dilation)self.convr = nn.Conv2d(hidden_dim+input_dim, hidden_dim, kernel_size, padding=(kernel_size+(kernel_size-1)*(dilation-1))//2, dilation=dilation)self.convq = nn.Conv2d(hidden_dim+input_dim, hidden_dim, kernel_size, padding=(kernel_size+(kernel_size-1)*(dilation-1))//2, dilation=dilation)def forward(self, h, x):hx = torch.cat([h, x], dim=1)z = torch.sigmoid(self.convz(hx))r = torch.sigmoid(self.convr(hx))q = torch.tanh(self.convq(torch.cat([r*h, x], dim=1)))h = (1-z) * h + z * qreturn h

ConvGRU代碼如下,inp_list就是[cz, cr, cq]

class ConvGRU(nn.Module):def __init__(self, hidden_dim, input_dim, kernel_size=3):super(ConvGRU, self).__init__()self.convz = nn.Conv2d(hidden_dim+input_dim, hidden_dim, kernel_size, padding=kernel_size//2)self.convr = nn.Conv2d(hidden_dim+input_dim, hidden_dim, kernel_size, padding=kernel_size//2)self.convq = nn.Conv2d(hidden_dim+input_dim, hidden_dim, kernel_size, padding=kernel_size//2)def forward(self, h, cz, cr, cq, *x_list):x = torch.cat(x_list, dim=1)hx = torch.cat([h, x], dim=1)z = torch.sigmoid(self.convz(hx) + cz)r = torch.sigmoid(self.convr(hx) + cr)q = torch.tanh(self.convq(torch.cat([r*h, x], dim=1)) + cq)h = (1-z) * h + z * qreturn h

2.2.2 空間注意力

空間注意力的代碼如下所示,結合圖2-1右側的示意圖應該比較容易理解。采用和通道注意力相同的池化操作,但這次將池化維度調整為通道維度,對應于代碼中的avg_outmax_out。隨后將這些池化結果拼接成R2×H×WR^{2×H×W}R2×H×W的圖像,并通過帶有sigmoid函數的卷積層生成最終注意力圖。回顧之前的處理流程可以發現,該注意力圖在需要高頻信息的區域具有高權重值,因為這些信息在上下文信息中具有較高的特征價值。而對需要低頻信息的區域則賦予較低權重。總體而言,該注意力圖能明確區分不同頻率信息需求的區域。這個圖有點像邊緣圖,物體的邊緣即使圖像中的高頻信息區域。

class SpatialAttentionExtractor(nn.Module):def __init__(self, kernel_size=7):super(SpatialAttentionExtractor, self).__init__()self.samconv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):avg_out = torch.mean(x, dim=1, keepdim=True)max_out, _ = torch.max(x, dim=1, keepdim=True)x = torch.cat([avg_out, max_out], dim=1)x = self.samconv(x)return self.sigmoid(x)

2.3 SRU

SRU看代碼就非常容易理解了,它設計了兩個GRU。一個GRU的kernel_size小,捕獲圖像中的高頻信息,只需要小的感受野,如邊緣,最終的結果和表示圖像中高頻區域的注意力att相乘;另一個GRU的kernel_size大,捕獲圖像中的低頻信息,如平面,最終的結果和表示圖像中低頻區域的注意力1-att相乘。如果既不是高頻也不是低頻的,att就會趨于0.5,那么就會結合self.small_gruself.large_gru兩者的信息。

class SelectiveConvGRU(nn.Module):def __init__(self, hidden_dim=128, input_dim=256, small_kernel_size=1, large_kernel_size=3):super(SelectiveConvGRU, self).__init__()self.small_gru = RaftConvGRU(hidden_dim, input_dim, small_kernel_size)self.large_gru = RaftConvGRU(hidden_dim, input_dim, large_kernel_size)def forward(self, att, h, *x):x = torch.cat(x, dim=1)h = self.small_gru(h, x) * att + self.large_gru(h, x) * (1 - att)return h

SRU的示意圖如下圖2-2所示。
SRU示意圖

圖2-2 SRU示意圖

3 效果

加入SelectiveStereo之后,RaftStereo和IGEV的效果在不同的update次數下都有提升,如下表3-1所示。
不同update次數下SelectiveStereo的效果

表3-1 不同update次數下SelectiveStereo的效果

IGEV和SelectiveIGEV可視化效果對比如下圖3-1所示,SelectiveIGEV的細節部分效果明顯更好。
IGEV和SelectiveIGEV可視化效果對比

圖3-1 IGEV和SelectiveIGEV可視化效果對比

SelectiveStereo在SceneFlow數據集和不同模型的EPE指標對比如下表3-2所示。
SelectiveStereo在SceneFlow數據集和不同模型的EPE指標對比

表3-2 SelectiveStereo在SceneFlow數據集和不同模型的EPE指標對比

SelectiveStereo在KITTI數據集和不同模型的EPE指標對比如下表3-3所示。
SelectiveStereo在KITTI數據集和不同模型的EPE指標對比

表3-3 SelectiveStereo在KITTI數據集和不同模型的EPE指標對比

整體來說,使用了SelectiveStereo后效果方面會得到全方面的提升,不過速度方面是會下降的,因為引入了把一個GRU標成了大小兩個GRU,且多了注意力的計算步驟。

參考資料

[1] Selective-Stereo: Adaptive Frequency Information Selection for Stereo Matching
[2] https://github.com/Windsrain/Selective-Stereo.git
[3] https://github.com/gangweix/IGEV.git

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96342.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96342.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96342.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入分析神馬 M56S+ 202T 礦機參數與性能特點

引言在比特幣(BTC)和比特幣現金(BCH)等主流加密貨幣的挖掘過程中,礦機的選擇直接關系到挖礦的效率與收益。神馬 M56S 202T礦機是SHA-256算法的礦機,憑借其強大的算力和高效的能效比,成為了礦工們…

36.2Linux單總線驅動DS18B20實驗(詳細講解代碼)_csdn

想必看過我很多次博客的同學,都知道了編寫驅動的流程! 這里我們還是按照以前的習慣來一步一步講解! 單總線驅動,在F103和51單片機的裸機開發中是經常見的。 linux驅動代碼編寫實際上就是,端對端的編程! 就是…

【雜類】應對 MySQL 處理短時間高并發的請求:緩存預熱

一、什么是緩存預熱?1. 核心概念??緩存預熱(Cache Warm-up)?? 是指在系統??正式對外提供服務之前??,或??某個高并發場景來臨之前??,??主動??將后續極有可能被訪問的熱點數據從數據庫(MySQL…

點評項目(Redis中間件)第三部分短信登錄,查詢緩存

可以直接看后面Redis實現功能的部分基于session實現短信登錄發送短信驗證碼前端請求樣式業務層代碼Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {Overridepublic Result sendCode(String phone, HttpSession se…

線性方程求解器的矩陣分裂

大概思路是對的&#xff0c;但是查老師可能會出現幻覺&#xff0c;小心食用 &#x1f603;這段代碼是在初始化迭代法求解器&#xff0c;構建迭代矩陣和分裂矩陣。以下是詳細解釋&#xff1a; if init_from_func or init_from_input:# 1. 存儲剛度矩陣self.stiff_p stiff_p# 2.…

【Beetle RP2350】雷達模塊 CEM5861G-M11 開發使用指南

一、硬件介紹 1、產品特點 Beetle RP2350【RP2350A_QFN60】是一款基于RP2350微控制器的高性能迷你開發板&#xff0c;雙核雙架構設計&#xff08;支持 Arm Cortex-M33或Hazard3 RISC-V內核&#xff09;為開發者提供靈活的性能配置。 雙核雙架構&#xff0c;性能自由切換 采…

高通Android 13 開機黑屏問題深度剖析與解決方案

1. 問題概述 在 Android 13 系統定制化開發過程中&#xff0c;開機流程的調試與優化頗具挑戰性。一個典型問題是&#xff1a;當開機動畫播放完畢后&#xff0c;設備會先出現數秒黑屏&#xff0c;然后才進入鎖屏界面。本文基于開機日志分析&#xff0c;結合實際項目經驗&#x…

騰訊推出AI CLI工具CodeBuddy,國內首家同時支持插件、IDE和CLI三種形態的AI編程工具廠商

2025年9月9日&#xff0c;騰訊正式推出自研AI CLI工具CodeBuddy code&#xff0c;成為國內首家同時支持插件、IDE和CLI三種形態的AI編程工具廠商。這一創新不僅填補了國內市場在全形態AI編程工具領域的空白&#xff0c;更以編碼時間縮短40%、AI生成代碼占比超50%的硬核數據&…

零基礎學習QT的第二天-組件基礎知識

組件聲明以及設置屬性 所有的組件的基類為&#xff1a;QtObject&#xff0c;在c中名稱為&#xff1a;QObject。 在qml和c名稱有所區別&#xff0c;例如在Qml中QtObject&#xff0c;在C會省略一個t(QObject) 聲明組件的方式&#xff1a; 組件名 {屬性名:值}在實際應用中&#xf…

像素圖生成小程序開發全解析:從圖片上傳到Excel圖紙

像素圖生成小程序開發全解析&#xff1a;從圖片上傳到Excel圖紙 前言 在數字化創作和工藝設計領域&#xff0c;像素圖生成工具具有廣泛的應用價值&#xff0c;無論是十字繡設計、LED燈陣布置還是復古游戲美術創作。本文將詳細解析一個功能完整的像素圖生成小程序的開發過程&…

mac-intel操作系統go-stock項目(股票分析工具)安裝與配置指南

1. 項目基礎介紹 go-stock 是一個基于Wails和NaiveUI開發的AI賦能股票分析工具。旨在為用戶提供自選股行情獲取、成本盈虧展示、漲跌報警推送等功能。它支持A股、港股、美股等市場&#xff0c;能夠進行市場整體或個股的情緒分析、K線技術指標分析等功能。所有數據均保存在本地…

spring-單例bean是線程安全的嗎

其中可修改的成員變量有線程不安全問題&#xff0c;不可修改的無狀態的 userService是沒有線程安全問題的 spring框架中有一個 Scope注解&#xff0c;默認的值就是singleton&#xff0c;單例的。 不是線程安全的&#xff0c;一般來說&#xff0c;我們在bean中注入的對象都是無狀…

CM1033系列 3串鋰電池保護IC - 高精度±25mV 內置延時 多型號可選(含鐵鋰)

1. 核心亮點 高精度多重保護&#xff1a;專為3串電池組設計&#xff0c;提供過充、過放、三級過流&#xff08;含短路&#xff09;、充電過流及斷線檢測等全方位保護&#xff0c;電壓檢測精度高達25mV。超低功耗&#xff1a;工作電流典型值僅7μA&#xff0c;休眠電流低至4μA&…

【第23話:定位建圖】SLAM后端優化方法詳解

SLAM 后端優化方法詳解 SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;后端優化是SLAM系統中的關鍵環節&#xff0c;負責對前端輸出的傳感器數據進行全局一致性優化&#xff0c;消除累積誤差。后端通常基于圖優化框架&#xff08;如g2o、GTSAM&#xff09…

MongoDB 備份與恢復終極指南:mongodump 和 mongorestore 深度實戰

MongoDB 備份與恢復終極指南&#xff1a;mongodump 和 mongorestore 深度實戰引言&#xff1a;數據守護者的使命第一部分&#xff1a;基礎概念與核心原理1.1 邏輯備份 vs. 物理備份&#xff1a;根本性的區別1.2 核心工具介紹第二部分&#xff1a;mongodump 備份實戰詳解2.1 基礎…

鴻蒙的“分布式架構”理念:未來操作系統的關鍵突破

一、引言&#xff1a;為什么需要分布式架構&#xff1f; 隨著移動互聯網的發展&#xff0c;智能設備不斷普及。用戶身邊可能同時擁有 手機、平板、PC、電視、手表、耳機、智能音箱、車機 等多種終端設備。 但現實中&#xff0c;我們常遇到以下問題&#xff1a; 不同設備系統割…

MySQL 事務管理與鎖機制:解決并發場景下的數據一致性問題

前言在電商下單、金融轉賬、庫存扣減等并發業務場景中&#xff0c;若不控制數據操作的原子性與隔離性&#xff0c;極易出現 “超賣”“重復扣款”“臟讀數據” 等問題。MySQL 的事務管理與鎖機制是解決這些問題的核心技術&#xff0c;也是后端開發者必須掌握的生產環境能力。本…

MySQL集群高可用架構

一、MySQL高可用之組復制&#xff08;MGR&#xff09;1.1 組復制核心特性與優勢MySQL Group Replication&#xff08;MGR&#xff09;是基于分布式一致性協議&#xff08;Paxos&#xff09;實現的高可用集群方案&#xff0c;核心特性包括&#xff1a;自動故障檢測與恢復&#x…

判別模型 VS 生成模型

1. 判別模型&#xff08;Discriminative Models&#xff09;判別模型直接學習輸入特征&#xff08;X&#xff09;與輸出標簽&#xff08;Y&#xff09;之間的映射關系&#xff0c;即直接對條件概率P(Y|X)進行建模。判別模型關注于如何區分不同類別的數據。特點&#xff1a;直接…

代碼隨想錄算法訓練營第三十一天 | 合并區間、單調遞增的數字

合并區間&#xff1a; 這里還是先對左區間進行排序&#xff0c;判斷重疊區間&#xff0c;首先判斷是否存在元素&#xff0c;存在那么就將元素的第一個放到結果中&#xff0c;那么判斷重疊就是當前元素的左區間和結果集里的最后元素的右區間進行判斷&#xff0c;如果重疊&#x…