(即插即用模塊-特征處理部分) 三十二、(TGRS 2024) MDAF 多尺度雙表示對齊過濾器

在這里插入圖片描述

文章目錄

  • 1、Multiscale Dual-Representation Alignment Filter
  • 2、代碼實現

paper:SFFNet: A Wavelet-Based Spatial and Frequency Domain Fusion Network for Remote Sensing Segmentation

Code:https://github.com/yysdck/SFFNet


1、Multiscale Dual-Representation Alignment Filter

頻率域特征和空間域特征分別捕捉圖像的不同方面和屬性,但它們之間存在語義差異。直接將兩者融合可能導致特征表示不一致,無法充分發揮各自優勢。需要一種方法來對齊兩者的語義,并選擇更具代表性的特征進行融合。所以這篇論文提出一種 多尺度雙表示對齊過濾器(Multiscale Dual-Representation Alignment Filter),其主要包含以下兩點:多尺度映射 (Multiscale Mapping):使用不同尺度的豎條卷積對頻率域特征和空間域特征進行處理。將處理后的特征拼接并進行 1x1 卷積,得到統一尺度的矩陣 Q, K, V 作為輸入。多域注意力融合 (MDAF):設計了 DAF (Dual-Representation Alignment Filter) 結構,利用交叉注意力機制實現語義對齊和特征選擇。通過查詢對方及其自身的鍵值對計算注意力,并進行特征加權,最終實現特征選擇。

實現過程:

  1. 多尺度映射:對空間域特征 Fs 和頻率域特征 Ff 分別進行多尺度映射,得到兩組矩陣 (Q1, K1, V1) 和 (Q2, K2, V2)
  2. DAF 計算:計算 DAF 輸出 F1 和 F2:(1)F1 = δ1×1(Attn(Q2, K1, V1)):使用 Ff 的 Q, K, V 與 Fs 的 K, V 計算注意力,并進行特征加權。(2)F2 = δ1×1(Attn(Q1, K2, V2)):使用 Fs 的 Q, K, V 與 Ff 的 K, V 計算注意力,并進行特征加權。
  3. MDAF 輸出:將 F1 和 F2 拼接得到最終的輸出特征。

Multiscale Dual-Representation Alignment Filter 結構圖:
在這里插入圖片描述


2、代碼實現

import torch
import torch.nn as nn
import torch.nn.functional as F
import numbers
from einops import rearrangedef to_3d(x):return rearrange(x, 'b c h w -> b (h w) c')def to_4d(x, h, w):return rearrange(x, 'b (h w) c -> b c h w', h=h, w=w)class BiasFree_LayerNorm(nn.Module):def __init__(self, normalized_shape):super(BiasFree_LayerNorm, self).__init__()if isinstance(normalized_shape, numbers.Integral):normalized_shape = (normalized_shape,)normalized_shape = torch.Size(normalized_shape)assert len(normalized_shape) == 1self.weight = nn.Parameter(torch.ones(normalized_shape))self.normalized_shape = normalized_shapedef forward(self, x):sigma = x.var(-1, keepdim=True, unbiased=False)return x / torch.sqrt(sigma + 1e-5) * self.weightclass WithBias_LayerNorm(nn.Module):def __init__(self, normalized_shape):super(WithBias_LayerNorm, self).__init__()if isinstance(normalized_shape, numbers.Integral):normalized_shape = (normalized_shape,)normalized_shape = torch.Size(normalized_shape)assert len(normalized_shape) == 1self.weight = nn.Parameter(torch.ones(normalized_shape))self.bias = nn.Parameter(torch.zeros(normalized_shape))self.normalized_shape = normalized_shapedef forward(self, x):mu = x.mean(-1, keepdim=True)sigma = x.var(-1, keepdim=True, unbiased=False)return (x - mu) / torch.sqrt(sigma + 1e-5) * self.weight + self.biasclass LayerNorm(nn.Module):def __init__(self, dim, LayerNorm_type):super(LayerNorm, self).__init__()if LayerNorm_type == 'BiasFree':self.body = BiasFree_LayerNorm(dim)else:self.body = WithBias_LayerNorm(dim)def forward(self, x):h, w = x.shape[-2:]return to_4d(self.body(to_3d(x)), h, w)class MDAF(nn.Module):def __init__(self, dim, num_heads=8, LayerNorm_type='WithBias'):super(MDAF, self).__init__()self.num_heads = num_headsself.norm1 = LayerNorm(dim, LayerNorm_type)self.norm2 = LayerNorm(dim, LayerNorm_type)self.project_out = nn.Conv2d(dim, dim, kernel_size=1)self.conv1_1_1 = nn.Conv2d(dim, dim, (1, 7), padding=(0, 3), groups=dim)self.conv1_1_2 = nn.Conv2d(dim, dim, (1, 11), padding=(0, 5), groups=dim)self.conv1_1_3 = nn.Conv2d(dim, dim, (1, 21), padding=(0, 10), groups=dim)self.conv1_2_1 = nn.Conv2d(dim, dim, (7, 1), padding=(3, 0), groups=dim)self.conv1_2_2 = nn.Conv2d(dim, dim, (11, 1), padding=(5, 0), groups=dim)self.conv1_2_3 = nn.Conv2d(dim, dim, (21, 1), padding=(10, 0), groups=dim)self.conv2_1_1 = nn.Conv2d(dim, dim, (1, 7), padding=(0, 3), groups=dim)self.conv2_1_2 = nn.Conv2d(dim, dim, (1, 11), padding=(0, 5), groups=dim)self.conv2_1_3 = nn.Conv2d(dim, dim, (1, 21), padding=(0, 10), groups=dim)self.conv2_2_1 = nn.Conv2d(dim, dim, (7, 1), padding=(3, 0), groups=dim)self.conv2_2_2 = nn.Conv2d(dim, dim, (11, 1), padding=(5, 0), groups=dim)self.conv2_2_3 = nn.Conv2d(dim, dim, (21, 1), padding=(10, 0), groups=dim)def forward(self, x1,x2):b, c, h, w = x1.shapex1 = self.norm1(x1)x2 = self.norm2(x2)attn_111 = self.conv1_1_1(x1)attn_112 = self.conv1_1_2(x1)attn_113 = self.conv1_1_3(x1)attn_121 = self.conv1_2_1(x1)attn_122 = self.conv1_2_2(x1)attn_123 = self.conv1_2_3(x1)attn_211 = self.conv2_1_1(x2)attn_212 = self.conv2_1_2(x2)attn_213 = self.conv2_1_3(x2)attn_221 = self.conv2_2_1(x2)attn_222 = self.conv2_2_2(x2)attn_223 = self.conv2_2_3(x2)out1 = attn_111 + attn_112 + attn_113 +attn_121 + attn_122 + attn_123out2 = attn_211 + attn_212 + attn_213 +attn_221 + attn_222 + attn_223out1 = self.project_out(out1)out2 = self.project_out(out2)k1 = rearrange(out1, 'b (head c) h w -> b head h (w c)', head=self.num_heads)v1 = rearrange(out1, 'b (head c) h w -> b head h (w c)', head=self.num_heads)k2 = rearrange(out2, 'b (head c) h w -> b head w (h c)', head=self.num_heads)v2 = rearrange(out2, 'b (head c) h w -> b head w (h c)', head=self.num_heads)q2 = rearrange(out1, 'b (head c) h w -> b head w (h c)', head=self.num_heads)q1 = rearrange(out2, 'b (head c) h w -> b head h (w c)', head=self.num_heads)q1 = torch.nn.functional.normalize(q1, dim=-1)q2 = torch.nn.functional.normalize(q2, dim=-1)k1 = torch.nn.functional.normalize(k1, dim=-1)k2 = torch.nn.functional.normalize(k2, dim=-1)attn1 = (q1 @ k1.transpose(-2, -1))attn1 = attn1.softmax(dim=-1)out3 = (attn1 @ v1) + q1attn2 = (q2 @ k2.transpose(-2, -1))attn2 = attn2.softmax(dim=-1)out4 = (attn2 @ v2) + q2out3 = rearrange(out3, 'b head h (w c) -> b (head c) h w', head=self.num_heads, h=h, w=w)out4 = rearrange(out4, 'b head w (h c) -> b (head c) h w', head=self.num_heads, h=h, w=w)out = self.project_out(out3) + self.project_out(out4) + x1+x2return outif __name__ == '__main__':x = torch.randn(4, 64, 128, 128).cuda()y = torch.randn(4, 64, 128, 128).cuda()model = MDAF(64).cuda()out = model(x,y)print(out.shape)

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

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

相關文章

Python 中為什么 hash(-1) == hash(-2)?

推薦超級課程: 本地離線DeepSeek AI方案部署實戰教程【完全版】Docker快速入門到精通Kubernetes入門到大師通關課AWS云服務快速入門實戰目錄 讓我們從哪里開始?獲取源代碼!讓我們瀏覽一下這是正確/完整的答案嗎?結論前幾天在瀏覽 Reddit 時,我在 r/Python 上看到了這樣一個…

基于PySide6與pycatia的CATIA繪圖比例智能調節工具開發全解析

引言:工程圖紙自動化處理的技術革新 在機械設計領域,CATIA圖紙的比例調整是高頻且重復性極強的操作。傳統手動調整方式效率低下且易出錯。本文基于PySide6pycatia技術棧,提出一種支持智能比例匹配、實時視圖控制、異常自處理的圖紙批處理方案…

macos下 ragflow二次開發環境搭建

參考官網鏈接 https://ragflow.io/docs/dev/launch_ragflow_from_source虛擬環境 git clone https://github.com/infiniflow/ragflow.git cd ragflow/ # if not pipx, please install it at first pip3 install pipxpipx install uv uv sync --python 3.10 --all-extras 安裝 …

libva之ffavdemo分析

ffavdemo 代碼庫實現了一個基于FFmpeg和VAAPI的硬件加速視頻解碼與渲染框架,主要用于演示視頻解碼與渲染的完整硬件加速流程。支持多種渲染后端(X11、DRM、EGL),適應不同顯示環境。包含視頻處理過濾器,可進行格式轉換和…

JavaWeb 課堂筆記 —— 09 MySQL 概述 + DDL

本系列為筆者學習JavaWeb的課堂筆記,視頻資源為B站黑馬程序員出品的《黑馬程序員JavaWeb開發教程,實現javaweb企業開發全流程(涵蓋SpringMyBatisSpringMVCSpringBoot等)》,章節分布參考視頻教程,為同樣學習…

精品推薦 | 湖倉一體電商數據分析平臺實踐教程合集(視頻教程+設計文檔+完整項目代碼)

精品推薦,湖倉一體電商數據分析平臺實踐教程合集,包含視頻教程、設計文檔及完整項目代碼等資料,供大家學習。 1、項目背景介紹及項目架構 2、項目使用技術版本及組件搭建 3、項目數據種類與采集 4、實時業務統計指標分析一——ODS分層設計與數…

【人工智能】大語言模型多義詞解析技術揭秘——以“項目“歧義消解為例

今天田辛老師和小伙伴探討了一個有趣的多義詞問題, 在人工智能技術日新月異的今天,大語言模型(LLM)對自然語言的理解能力已經達到令人驚嘆的水平。大模型到底是如何去區分多義詞的? 比如:當用戶提到"…

【maxENT】最大熵模型(Maximum Entropy Model)R語言實現

文章目錄 一、相關package介紹1.1 dismo 包1.2 raster包1.3 常見問題與解決 二、代碼示例 🟢🟠先看:【maxENT】最大熵模型(Maximum Entropy Model)介紹與使用(maxENT軟件) ASCII文件太大&#…

哈希表-算法小結

哈希表 map set 數組 在C中,set 和 map 分別提供以下三種數據結構,其底層實現以及優劣如下表所示: 集合底層實現是否有序數值是否可以重復能否更改數值查詢效率增刪效率std::set紅黑樹有序否否O(log n)O(log n)std::multiset紅黑樹有序是否…

OpenCompass模型評估

OpenCompass面向大模型的開源方和使用者, 提供開源、高效、全面的大模型評測開放平臺。 一、OpenCompass文檔 1.基礎安裝 使用Conda準備 OpenCompass 運行環境: conda create --name opencompass python3.10 -y conda activate opencompass2. 安裝 Op…

博途 TIA Portal之1200做主站與有意思的板子做MODBUS_RTU通訊

做為博途的硬件,1200和1500本體都不具有串口通訊功能,只能使用擴展板或是通訊模塊完成。 其中1200使用CB1241或CM1241進行串口通訊,本文將使用CM1241進行演示。 1、硬件介紹 1200的PLC一臺,有意思的板子(以下簡單4D板)一臺。 其中1200帶擴展模塊CM1241 RS232;4D板使…

【深度學習與實戰】3.1 邏輯回歸模型

?1. 定義與核心思想? 邏輯回歸(Logistic Regression)是一種用于?二分類問題?的統計學習方法,通過?sigmoid函數?將線性回歸的輸出映射到[0,1]區間,表示樣本屬于某一類別的概率?。 ?本質?:廣義線性模型&#x…

AI三萬字論文生成效果——隨機森林在信用卡欺詐分析

以下內容全文由AI制作,有gemini和gpt模型配合一次性生成(即未來我們會發布的功能),一次性生成的三萬多字論文效果。 標題:隨機森林在信用卡欺詐分析中的應用研究 摘要 信用卡欺詐已成為全球金融領域面臨的嚴峻挑戰…

質檢LIMS系統在半導體制造行業的應用 半導體質量革命的現狀

在半導體這個“工業皇冠上的明珠”領域,納米級的精度要求與質量管控如同硬幣的兩面。隨著芯片制程向3nm、2nm演進,傳統質檢模式已難以滿足海量數據、復雜工藝的質量追溯需求。質檢LIMS實驗室系統作為質量管理的中樞神經,正在重構半導體制造的…

idea手動創建resources文件夾

有時maven沒有構建成功可能造成,resources文件夾不創建的現象 此時我們可以手動創建 手動創建

利用Ruby的Typhoeus編寫爬蟲程序

Typhoeus是一個基于libcurl的HTTP客戶端,支持并行請求,適合高效爬取數據。用戶可能想要一個簡單的例子,或者需要處理更復雜的情況,比如分頁、并發請求或者數據解析。 首先,我應該檢查用戶是否已經安裝了Typhoeus。通常…

【mllm】——x64模擬htp的后端無法編譯debug

mllm, qnn, x64 code:https://github.com/UbiquitousLearning/mllm 1. 問題 通過自定義qualcomm graph使用高通的htp后端進行llm推理,網絡暫時只有mllm,和https://github.com/chraac/llama.cpp。qualcomm是支持x64模擬htp推理的,這樣比較好d…

JDK(Java Development Kit)從發布至今所有主要版本 的詳細差異、新增特性及關鍵更新的總結,按時間順序排列

以下是 JDK(Java Development Kit)從發布至今所有主要版本 的詳細差異、新增特性及關鍵更新的總結,按時間順序排列: 1. JDK 1.0 (1996) 發布年份:1996年1月23日關鍵特性: Java首次正式發布。核心語言特性…

撰寫學位論文Word圖表目錄的自動生成

第一步:為圖片和表格添加題注 選中圖片或表格 右鍵點擊需要編號的圖片或表格,選擇 【插入題注】(或通過菜單欄 引用 → 插入題注)。 設置題注標簽 在彈窗中選擇 標簽(如默認有“圖”“表”,若無需自定義標…

Xcode為不同環境配置不同的環境變量

一般有三種方式: 一、通過多Target 二、通過scheme,也就是多configurations 三、通過.xcconfig文件 先來看第二種方式:通過scheme,也就是多configurations,包括自定義User-settings 第一步:增加configurations,Xcode默認為我們生成了…