YOLOv9有效提點|加入SE、CBAM、ECA、SimAM等幾十種注意力機制(一)


專欄介紹:YOLOv9改進系列 | 包含深度學習最新創新,主力高效漲點!!!


一、本文介紹

????????本文將以SE注意力機制為例,演示如何在YOLOv9種添加注意力機制!


?《Squeeze-and-Excitation Networks》

????????SENet提出了一種基于“擠壓和激勵”(SE)的注意力模塊,用于改進卷積神經網絡(CNN)的性能。SE塊可以適應地重新校準通道特征響應,通過建模通道之間的相互依賴關系來增強CNN的表示能力。這些塊可以堆疊在一起形成SENet架構,使其在多個數據集上具有非常有效的泛化能力。


《CBAM:Convolutional Block Attention Module》

????????CBAM模塊能夠同時關注CNN的通道和空間兩個維度,對輸入特征圖進行自適應細化。這個模塊輕量級且通用,可以無縫集成到任何CNN架構中,并可以進行端到端訓練。實驗表明,使用CBAM可以顯著提高各種模型的分類和檢測性能。


《ECA-Net:?Efficient?Channel?Attention?for?Deep?Convolutional?Neural?Networks》

????????通道注意力模塊ECA,可以提升深度卷積神經網絡的性能,同時不增加模型復雜性。通過改進現有的通道注意力模塊,作者提出了一種無需降維的局部交互策略,并自適應選擇卷積核大小。ECA模塊在保持性能的同時更高效,實驗表明其在多個任務上具有優勢。


《SimAM: A Simple, Parameter-Free Attention Module?for Convolutional Neural Networks》

????????SimAM一種概念簡單且非常有效的注意力模塊。不同于現有的通道/空域注意力模塊,該模塊無需額外參數為特征圖推導出3D注意力權值。具體來說,SimAM的作者基于著名的神經科學理論提出優化能量函數以挖掘神經元的重要性。該模塊的另一個優勢在于:大部分操作均基于所定義的能量函數選擇,避免了過多的結構調整

?

適用檢測目標:? ?YOLOv9模塊通用改進


二、改進步驟

????????以下以SE注意力機制為例在YOLOv9中加入注意力代碼,其他注意力機制同理!

?2.1 復制代碼

????????將SE的代碼輔助到models包下common.py文件中。

?2.2?修改yolo.py文件

? ? ? ? 在yolo.py腳本的第700行(可能因YOLOv9版本變化而變化)增加下方代碼。

        elif m in (SE,):args.insert(0, ch[f])

2.3?創建配置文件

? ? ? ? 創建模型配置文件(yaml文件),將我們所作改進加入到配置文件中(這一步的配置文件可以復制models? - > detect 下的yaml修改。)。對YOLO系列yaml文件不熟悉的同學可以看我往期的yaml詳解教學!

YOLO系列 “.yaml“文件解讀-CSDN博客

# YOLOv9
# Powered bu https://blog.csdn.net/StopAndGoyyy
# parameters
nc: 80  # number of classes
depth_multiple: 1  # model depth multiple
width_multiple: 1  # layer channel multiple
#activation: nn.LeakyReLU(0.1)
#activation: nn.ReLU()# anchors
anchors: 3# YOLOv9 backbone
backbone:[[-1, 1, Silence, []],  # conv down[-1, 1, Conv, [64, 3, 2]],  # 1-P1/2# conv down[-1, 1, Conv, [128, 3, 2]],  # 2-P2/4# elan-1 block[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 3# avg-conv down[-1, 1, ADown, [256]],  # 4-P3/8# elan-2 block[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 5# avg-conv down[-1, 1, ADown, [512]],  # 6-P4/16# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 7# avg-conv down[-1, 1, ADown, [512]],  # 8-P5/32# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 9]# YOLOv9 head
head:[# elan-spp block[-1, 1, SPPELAN, [512, 256]],  # 10# up-concat merge[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 7], 1, Concat, [1]],  # cat backbone P4# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 13# up-concat merge[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 5], 1, Concat, [1]],  # cat backbone P3# elan-2 block[-1, 1, RepNCSPELAN4, [256, 256, 128, 1]],  # 16 (P3/8-small)# avg-conv-down merge[-1, 1, ADown, [256]],[[-1, 13], 1, Concat, [1]],  # cat head P4# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 19 (P4/16-medium)# avg-conv-down merge[-1, 1, ADown, [512]],[[-1, 10], 1, Concat, [1]],  # cat head P5# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 22 (P5/32-large)# multi-level reversible auxiliary branch# routing[5, 1, CBLinear, [[256]]], # 23[7, 1, CBLinear, [[256, 512]]], # 24[9, 1, CBLinear, [[256, 512, 512]]], # 25# conv down[0, 1, Conv, [64, 3, 2]],  # 26-P1/2# conv down[-1, 1, Conv, [128, 3, 2]],  # 27-P2/4# elan-1 block[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 28# avg-conv down fuse[-1, 1, ADown, [256]],  # 29-P3/8[[23, 24, 25, -1], 1, CBFuse, [[0, 0, 0]]], # 30  # elan-2 block[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 31# avg-conv down fuse[-1, 1, ADown, [512]],  # 32-P4/16[[24, 25, -1], 1, CBFuse, [[1, 1]]], # 33 # elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 34# avg-conv down fuse[-1, 1, ADown, [512]],  # 35-P5/32[[25, -1], 1, CBFuse, [[2]]], # 36# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 37[-1, 1, SE, [16]],  # 38# detection head# detect[[31, 34, 38, 16, 19, 22], 1, DualDDetect, [nc]],  # DualDDetect(A3, A4, A5, P3, P4, P5)]

3.1?訓練過程

? ? ? ? 最后,復制我們創建的模型配置,填入訓練腳本(train_dual)中(不會訓練的同學可以參考我之前的文章。),運行即可。

YOLOv9 最簡訓練教學!-CSDN博客

??

??


SE代碼

class SE(nn.Module):def __init__(self, channel, reduction=16):super(SE, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.fc = nn.Sequential(nn.Linear(channel, channel // reduction, bias=False),nn.ReLU(),nn.Linear(channel // reduction, channel, bias=False),nn.Sigmoid())def forward(self, x):b, c, _, _ = x.size()y = self.avg_pool(x).view(b, c)y = self.fc(y).view(b, c, 1, 1)return x * y.expand_as(x)

CBAM代碼

class CBAMBlock(nn.Module):def __init__(self, channel=512, reduction=16, kernel_size=7):super().__init__()self.ca = ChannelAttention(channel=channel, reduction=reduction)self.sa = SpatialAttention(kernel_size=kernel_size)def init_weights(self):for m in self.modules():if isinstance(m, nn.Conv2d):init.kaiming_normal_(m.weight, mode='fan_out')if m.bias is not None:init.constant_(m.bias, 0)elif isinstance(m, nn.BatchNorm2d):init.constant_(m.weight, 1)init.constant_(m.bias, 0)elif isinstance(m, nn.Linear):init.normal_(m.weight, std=0.001)if m.bias is not None:init.constant_(m.bias, 0)def forward(self, x):b, c, _, _ = x.size()out = x * self.ca(x)out = out * self.sa(out)return out

ECA代碼

class ECAAttention(nn.Module):def __init__(self, kernel_size=3):super().__init__()self.gap = nn.AdaptiveAvgPool2d(1)self.conv = nn.Conv1d(1, 1, kernel_size=kernel_size, padding=(kernel_size - 1) // 2)self.sigmoid = nn.Sigmoid()def init_weights(self):for m in self.modules():if isinstance(m, nn.Conv2d):init.kaiming_normal_(m.weight, mode='fan_out')if m.bias is not None:init.constant_(m.bias, 0)elif isinstance(m, nn.BatchNorm2d):init.constant_(m.weight, 1)init.constant_(m.bias, 0)elif isinstance(m, nn.Linear):init.normal_(m.weight, std=0.001)if m.bias is not None:init.constant_(m.bias, 0)def forward(self, x):y = self.gap(x)  # bs,c,1,1y = y.squeeze(-1).permute(0, 2, 1)  # bs,1,cy = self.conv(y)  # bs,1,cy = self.sigmoid(y)  # bs,1,cy = y.permute(0, 2, 1).unsqueeze(-1)  # bs,c,1,1return x * y.expand_as(x)

SimAM代碼

class SimAM(torch.nn.Module):def __init__(self, e_lambda=1e-4):super(SimAM, self).__init__()self.activaton = nn.Sigmoid()self.e_lambda = e_lambdadef __repr__(self):s = self.__class__.__name__ + '('s += ('lambda=%f)' % self.e_lambda)return s@staticmethoddef get_module_name():return "simam"def forward(self, x):b, c, h, w = x.size()n = w * h - 1x_minus_mu_square = (x - x.mean(dim=[2, 3], keepdim=True)).pow(2)y = x_minus_mu_square / (4 * (x_minus_mu_square.sum(dim=[2, 3], keepdim=True) / n + self.e_lambda)) + 0.5return x * self.activaton(y)

如果覺得本文章有用的話給博主點個關注吧!


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

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

相關文章

向上生長筆記

第一章 成為一個很厲害的人(持續輸入,反復練習) 為什么要學習及如何學習 1、自毀趨勢(熵增),故需要能量輸入(負熵流) //引申:水往低處流是趨勢,學習是逆趨勢。 2、持續輸入能量(物質和信息),…

linux本地安裝nginx教程

1.安裝編譯工具及庫文件 yum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel pcre-devel 2.下載 nginx包到指定位置 wget https://nginx.org/download/nginx-1.18.0.tar.gz 3.解壓包 tar -zxvf nginx-1.18.0.tar.gz #解壓 4.在你想安裝nginx的…

力扣2月最后三天的每日一題

力扣2月最后三天的每日一題 前言2867.統計樹中的合法路徑數目思路確定1e5中的質數統計每個點的連接情況開始對質數點進行處理完整代碼 2673.使二叉樹所有路徑值相等的最小代價思路完整代碼 2581.統計可能的樹根數目思路建立連通關系將猜測數組變為哈希表,方便查詢利…

2280. 最優標號(最小割,位運算)#困難,想不到

活動 - AcWing 給定一個無向圖 G(V,E),每個頂點都有一個標號,它是一個 [0,2^31?1] 內的整數。 不同的頂點可能會有相同的標號。 對每條邊 (u,v),我們定義其費用 cost(u,v) 為 u 的標號與 v 的標號的異或值。 現在我們知道一些頂點的標號…

七通道NPN 達林頓管GC2003,專為符合標準 TTL 而制造,最高工作電壓 50V,耐壓 80V

GC2003 內部集成了 7 個 NPN 達林頓晶體管,連接的陣列,非常適合邏輯接口電平數字電路(例 如 TTL,CMOS 或PMOS 上/NMOS)和較高的電流/電壓,如電燈電磁閥,繼電器,打印機或其他類似的負…

讀《代碼整潔之道》有感

最近讀了一本書,名字大家都看到了:《代碼整潔之道》,之前一直只是聽說過這本書的大名,卻一直沒有進行拜讀,最近想起來了就想著看一看,不看不要緊,看了之后就像吃了炫邁,根本停不下來…

MATLAB環境下腦電信號EEG的譜分析

腦電信號一直伴隨著人類的生命,腦電波是腦神經細胞發生新陳代謝、離子交換時細胞群興奮突觸電位總和,腦電信號的節律性則和丘腦相關,含有豐富的大腦活動信息。通常我們所接觸的腦電圖都是頭皮腦電圖,在有些特殊場合還需要皮下部位…

10.廣域網技術

1. PPP實驗點這里(拓撲代碼) 2. PPPoE配置實驗點這里(拓撲代碼) 目錄 一、廣域網二、PPP協議三、PPP鏈路建立過程1-LCP(鏈路協商)四、PPP鏈路建立過程2-PAP/CHAP(認證協商,可選&…

linux系統多個mysql時的部署和服務注冊

在一次實際部署過程中,碰到了服務器已經部署了一個mysql服務. 再部署新的mysql時,特別注意不能與另一個mysql互相影響.記錄一次部署中存在的問題和解決方法. 因為已存在mysql,新的mysql部署采用的是mysql.tar.gz解壓手動安裝,避免.rpm或者.deb等自動安裝方式覆蓋了已有mysql的配…

python語言1

一、pytho中的注釋 1.1注釋的理解 程序員在代碼中對代碼功能解釋說明的標注性文字可以提高代碼的可讀性注釋的內容將被python解釋器忽略,不被計算機執行 1.2注釋的分類 注釋分為:單行注釋、多行注釋、中文聲明注釋 (1)單行注…

LeetCode240題:搜索二維矩陣II(python3)

代碼思路: “根節點” 對應的是矩陣的 “左下角” 和 “右上角” 元素,以 matrix 中的左下角元素為標志數 flag ,則有: 若 flag > target ,則 target 一定在 flag 所在行的上方 ,即 flag 所在行可被消去&#xff0c…

kotlin安卓開發教程視頻,2024年Android開發陷入飽和

Android基礎 1、什么是ANR 如何避免它? 如果耗時操作需要讓用戶等待,那么可以在界面上顯示進度條。 2、View的繪制流程;自定義View如何考慮機型適配;自定義View的事件 3、分發機制;View和ViewGroup分別有哪些事件分…

Java協議解析:探索網絡編程的核心

引言 在當今數字化時代,網絡編程扮演著日益重要的角色,而Java協議則成為這個領域中不可或缺的一部分。隨著互聯網的普及和各種網絡應用的不斷涌現,對網絡通信的要求也變得越來越嚴格,這就需要對Java協議進行深入的理解和探索。本…

【知識管理】計算全局效率 Network global efficiency

這句話提到的“全局效率”(global efficiency)是網絡中信息傳遞效率的一個衡量指標,它是網絡中最短路徑長度的倒數的平均值。為了更好地理解這個概念,讓我們分解這個定義: 最短路徑長度(Shortest Path Len…

輸出數據庫全部表的外鍵引用拓撲結構

執行 sql: SELECTconstraint_name,table_name,column_name,referenced_table_name,referenced_column_name FROMinformation_schema.key_column_usage WHEREtable_schema ${databaseName} ANDreferenced_table_name IS NOT NULL 將執行結果復制到臨時文件中&#…

【Leetcode每日一刷】貪心算法|122.買賣股票的最佳時機 II、55. 跳躍游戲

一、122.買賣股票的最佳時機 II 力扣題目鏈接 🦄解題思路: 首先需要明確的幾個點: 當前只能有最大一支股票每一天操作只能3選1:買or賣or休息 此外,對于貪心,總有像下面圖示的一種直覺:如果…

力扣SQL50 產品銷售分析 I 查詢

Problem: 1068. 產品銷售分析 I 思路 left join on:左連接 Code select p.product_name, s.year, s.price from Sales s left join Product p on s.product_id p.product_id

靠譜的車【華為OD機試-JAVAPythonC++JS】

題目描述 程序員小明打了一輛出租車去上班。出于職業敏感,他注意到這輛出租車的計費表有點問題,總是偏大。 出租車司機解釋說他不喜歡數字4,所以改裝了計費表,任何數字位置遇到數字4就直接跳過,其余功能都正常。 比如&…

Scaffold 腳手架

Scaffold 腳手架 Scaffold 腳手架組件是一個核心組件,它為開發者提供了一個標準的、可定制的應用界面框架。androidx.compose.material3.Scaffold 包含了應用界面的基礎元素,如狀態欄、導航欄、頂部應用欄(TopAppBar)等。通過 Sc…

Windows的Docker-Desktop安裝與問題總結

目錄 Docker-Desktop安裝步驟 環境配置 Docker-Desktop安裝問題總結 問題1:docker-desktop setting界面一直加載轉圈 問題2:docker鏡像的存儲位置變更(防止C盤空間不足) 參考文獻: Docker-Desktop安裝步驟 環境…