YOLOv8有效漲點,添加GAM注意力機制,使用Wise-IoU有效提升目標檢測效果

目錄

摘要

基本原理

通道注意力機制

空間注意力機制

GAM代碼實現?

Wise-IoU?

WIoU代碼實現

yaml文件編寫

完整代碼分享(含多種注意力機制)


摘要

人們已經研究了各種注意力機制來提高各種計算機視覺任務的性能。然而,現有方法忽視了保留通道和空間方面的信息以增強跨維度交互的重要性。因此,我們提出了一種全局注意力機制,通過減少信息減少和放大全局交互表示來提高深度神經網絡的性能。引入了具有多層感知器的 3D 排列,用于通道注意以及卷積空間注意子模塊。在 CIFAR-100 和 ImageNet-1K 上對所提出的圖像分類任務機制的評估表明,我們的方法穩定優于最近使用 ResNet 和輕量級 MobileNet 的幾種注意力機制。

基本原理

目標的設計是一種減少信息縮減并放大全局維度交互特征的機制。我們采用 CBAM 的順序通道空間注意力機制并重新設計子模塊。整個過程如圖 所示。

GAM結構圖
通道注意力機制

通道注意力子模塊使用 3D 排列來保留三個維度的信息。然后,它使用兩層 MLP(多層感知器)放大跨維度通道空間依賴性。 (MLP是一種編碼器-解碼器結構,其縮減比為r,與BAM相同。)通道注意子模塊如圖所示。?

通道注意力子模塊
空間注意力機制

在空間注意力子模塊中,為了關注空間信息,我們使用兩個卷積層進行空間信息融合。我們還使用與 BAM 相同的通道注意子模塊的縮減率 r。同時,最大池化會減少信息并產生負面影響。我們刪除池化以進一步保留特征圖。因此,空間注意力模塊有時會顯著增加參數的數量。為了防止參數顯著增加,我們在 ResNet50 中采用帶有通道洗牌的組卷積。沒有組卷積的空間注意力子模塊如圖所示。?

空間注意力子模塊
GAM代碼實現?
class GAM_Attention(nn.Module):def __init__(self, c1, c2, group=True, rate=4):super(GAM_Attention, self).__init__()self.channel_attention = nn.Sequential(nn.Linear(c1, int(c1 / rate)),nn.ReLU(inplace=True),nn.Linear(int(c1 / rate), c1))self.spatial_attention = nn.Sequential(nn.Conv2d(c1, c1 // rate, kernel_size=7, padding=3, groups=rate) if group else nn.Conv2d(c1, int(c1 / rate),kernel_size=7,padding=3),nn.BatchNorm2d(int(c1 / rate)),nn.ReLU(inplace=True),nn.Conv2d(c1 // rate, c2, kernel_size=7, padding=3, groups=rate) if group else nn.Conv2d(int(c1 / rate), c2,kernel_size=7,padding=3),nn.BatchNorm2d(c2))def forward(self, x):b, c, h, w = x.shapex_permute = x.permute(0, 2, 3, 1).view(b, -1, c)x_att_permute = self.channel_attention(x_permute).view(b, h, w, c)x_channel_att = x_att_permute.permute(0, 3, 1, 2)# x_channel_att=channel_shuffle(x_channel_att,4) #last shufflex = x * x_channel_attx_spatial_att = self.spatial_attention(x).sigmoid()x_spatial_att = channel_shuffle(x_spatial_att, 4)  # last shuffleout = x * x_spatial_att# out=channel_shuffle(out,4) #last shufflereturn out

以上代碼添加在 ./ultralytics/nn/modules/conv.py 中

Wise-IoU?

Yolov7提出的損失函數是GIoU(Generalized Intersection over Union),能在更廣義的層面上計算IoU(Intersection over Union),但是當兩個預測框完全重合時,不能反映出實際情況,此時GIoU就要退化為IoU,并且GIoU對每個預測框與真實框均要計算最小外接框,故損失函數計算及收斂速度受到限制。
為了彌補這種遺憾,改進的網絡中使用了WIoU(Wise-IoU)作為損失函數。WIoU v3作為邊界框回歸損失,包含一種動態非單調機制,并設計了一種合理的梯度增益分配,該策略減少了極端樣本中出現的大梯度或有害梯度。該損失方法計算更多地關注普通質量的樣本,進而提高網絡模型的泛化能力和整體性能。

雖然幾種主流損失函數都采用靜態聚焦機制,但WIoU不僅考慮了方位角、質心距離和重疊面積,還引入了動態非單調聚焦機制。 WIoU應用合理的梯度增益分配策略來評估錨框的質量。WIoU有三個版本。 WIoU v1 設計了基于注意力的預測框損失,WIoU v2 和 WIoU v3 添加了聚焦系數。

wiou原理圖

最小的包圍盒(綠色)和中心點的連接(紅色),其中并集的面積為?Su = wh + wgthgt ? WiHi .

WIoU代碼實現
def WIoU(cls, pred, target, self=None):self = self if self else cls(pred, target)dist = torch.exp(self.l2_center / self.l2_box.detach())return self._scaled_loss(dist * self.iou)

?下面的代碼替換loss.py的class BboxLoss

class BboxLoss(nn.Module):def __init__(self, reg_max, use_dfl=False):"""Initialize the BboxLoss module with regularization maximum and DFL settings."""super().__init__()self.reg_max = reg_maxself.use_dfl = use_dfldef forward(self, pred_dist, pred_bboxes, anchor_points, target_bboxes, target_scores, target_scores_sum, fg_mask):"""IoU loss."""weight = target_scores.sum(-1)[fg_mask].unsqueeze(-1)loss,iou = bbox_iou(pred_bboxes[fg_mask], target_bboxes[fg_mask], xywh=False,type_='WIoU')loss_iou=loss.sum()/target_scores_sum# DFL lossif self.use_dfl:target_ltrb = bbox2dist(anchor_points, target_bboxes, self.reg_max)loss_dfl = self._df_loss(pred_dist[fg_mask].view(-1, self.reg_max + 1), target_ltrb[fg_mask]) * weightloss_dfl = loss_dfl.sum() / target_scores_sumelse:loss_dfl = torch.tensor(0.0).to(pred_dist.device)return loss_iou, loss_dfl
yaml文件編寫
# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parameters
nc: 1  # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'# [depth, width, max_channels]n: [0.33, 0.25, 1024]  # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPss: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPsm: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPsl: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx: [1.00, 1.25, 512]   # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs# YOLOv8.0n backbone
backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]]  # 0-P1/2- [-1, 1, Conv, [128, 3, 2]]  # 1-P2/4- [-1, 3, C2f, [128, True]]- [-1, 1, Conv, [256, 3, 2]]  # 3-P3/8- [-1, 6, C2f, [256, True]]- [-1, 1, Conv, [512, 3, 2]]  # 5-P4/16- [-1, 6, C2f, [512, True]]- [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32- [-1, 3, C2f, [1024, True]]- [-1, 3, GAM_Attention, [1024]]- [-1, 1, SPPF, [1024, 5]]  # 10# YOLOv8.0n head
head:- [-1, 1, nn.Upsample, [None, 2, 'nearest']]- [[-1, 6], 1, Concat, [1]]  # cat backbone P4- [-1, 3, C2f, [512]]  # 13#- [-1, 1, GAM_Attention, [512,512]]- [-1, 1, nn.Upsample, [None, 2, 'nearest']]- [[-1, 4], 1, Concat, [1]]  # cat backbone P3- [-1, 3, C2f, [256]]  # 16 (P3/8-small)#- [-1, 1, GAM_Attention, [256,256]]- [-1, 1, Conv, [256, 3, 2]]- [[-1, 13], 1, Concat, [1]]  # cat head P4- [-1, 3, C2f, [512]]  # 19 (P4/16-medium)#- [-1, 1, GAM_Attention, [512,512]]- [-1, 1, Conv, [512, 3, 2]]- [[-1, 10], 1, Concat, [1]]  # cat head P5- [-1, 3, C2f, [1024]]  # 22 (P5/32-large)#- [-1, 1, GAM_Attention, [1024,1024]]- [[16, 19, 22], 1, Detect, [nc]]  # Detect(P3, P4, P5)
完整代碼分享(含多種注意力機制)

內涵SA,CBAM,GAM,ECA等多種注意力機制

鏈接: https://pan.baidu.com/s/1T9bVifTPCRMv2t7eREsuEw?pwd=nbrt 提取碼: nbrt?

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

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

相關文章

【C/C++隨筆】static 的用法和作用

「前言」所有文章已經分類好,放心食用 「歸屬專欄」C語言 | C嘎嘎 「主頁鏈接」個人主頁 「筆者」楓葉先生(fy) static 的用法和作用??? static作用: 作用1修改存儲方式:用 static 修飾的變量存儲在靜態區…

項目解決方案: 實時視頻拼接方案介紹(中)

目 錄 1.實時視頻拼接概述 2.適用場景 3.系統介紹 4. 拼接方案介紹 4.1基于4K攝像機的拼接方案 4.2采用1080P平臺3.0 橫向拼接 4.2.1系統架構 4.2.2系統功能 4.2.3方案特色 4.2.4適用場景 4.2.5設備選型 4.3縱橫兼顧,豎屏拼接 4.3.1系統…

如何使用ArcGIS Pro創建最低成本路徑

雖然兩點之間直線最短,但是在實際運用中,還需要考慮地形、植被和土地利用類型等多種因素,需要加權計算最低成本路徑,這里為大家介紹一下計算方法,希望能對你有所幫助。 數據來源 教程所使用的數據是從水經微圖中下載…

十四、計算機視覺-形態學梯度

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 一、梯度的概念二、梯度的應用三、梯度如何實現 一、梯度的概念 形態學梯度(Morphological Gradient)是數字圖像處理中的一種基本操作&…

MATLAB中回調定義

目錄 指定回調的方法 回調函數語法 傳遞額外輸入參數 將回調定義為默認值 指定回調的方法 要使用回調屬性,將回調代碼賦予該屬性。使用以下技術之一: 引用函數執行的函數句柄。 包含函數句柄和其他參數的元胞數組 計算為有效 MATLAB 表達式的字符向…

pytorch 圖像的卷積操作

目錄 1.卷積核基本參數說明 2.卷積相關操作說明 3.卷積操作示例 1.卷積核基本參數說明 pytorch進行圖像卷積操作之前,需要把圖像素格式進行分離,比如一個圖像為rgb格式,把R,G,B取出來作為一個ndarray,前文講過&#…

Linux 下 socket 編程介紹及 TCP 客戶端與服務端創建示例

目錄 socket 編程接口TCP 服務端TCP 客戶端更多內容 本文介紹了 Linux 下的 socket 編程,及總結了使用 socket 接口實現 TCP 服務端和客戶端的示例代碼。 socket 編程接口 socket() 函數:用于創建一個新的 socket 描述符: int socket(int …

Linux內核MMC框架

1.mmc的概念 1.MMC MultiMedia Card,多媒體存儲卡, 但后續泛指一個接口協定(一種卡式),能符合這接口的內存器都可稱作mmc儲存體,工作電壓:高電壓為2.7~3.6 V,低電壓為1.65&#xf…

【微服務】微服務中常用認證加密方案總結

目錄 一、前言 二、登錄認證安全問題 3.1 認證方式選擇 三、常用的加密方案 3.1 MD5加密算法 3.1.1 md5特點 3.1.2 md5原理 3.1.3 md5使用場景 3.2 AES加密算法 3.2.1 AES簡介 3.2.2 AES加解原理 3.2.3 AES算法優缺點 3.2.4 AES算法使用場景 3.3 RSA加密算法 3.3…

Flutter Dio進階:使用Flutter Dio攔截器實現高效的API請求管理和身份驗證刷新

Flutter筆記 使用Flutter Dio攔截器實現高效的API請求管理和身份驗證刷新 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article…

金融業被網絡攻擊了怎么辦,如何治理和風險控制?

近年來,網絡罪犯的人數和復雜程度都在增加,網絡罪犯的目標鎖定變得更具策略性,更加專注于最大效率和獲利。隨著有關全球網絡犯罪的數據持續涌入,可以看出金融服務企業已然成為頭號鎖定目標。雖然金融服務企業在網絡安全人員、工具…

圖論例題解析

1.圖論基礎概念 概念 (注意連通非連通情況,1節點) 無向圖: 度是邊的兩倍(沒有入度和出度的概念) 1.完全圖: 假設一個圖有n個節點,那么任意兩個節點都有邊則為完全圖 2.連通圖&…

【MySQL】SQL 優化

MySQL - SQL 優化 1. 在 MySQL 中,如何定位慢查詢? 1.1 發現慢查詢 現象:頁面加載過慢、接口壓力測試響應時間過長(超過 1s) 可能出現慢查詢的場景: 聚合查詢多表查詢表數據過大查詢深度分頁查詢 1.2 通…

錯誤筆記:Anaconda 錯誤(閃退、無法安裝等) + Pycharm 錯誤(無法啟動)+ python 報錯

Anaconda 錯誤 1、導航器啟動中發生-- 閃退 方法一: Windows下: 1)使用管理員運行:conda prompt 2)執行命令 conda update anaconda-navigator 方法二: 重置Anaconda配置:anaconda-navigator…

C語言第三十四彈---動態內存管理(下)

?個人主頁: 熬夜學編程的小林 💗系列專欄: 【C語言詳解】 【數據結構詳解】 動態內存管理 1、動態內存經典筆試題分析 1.1、題目1 1.2、題目2 1.3、題目3 1.4、題目4 2、柔性數組 2.1、柔性數組的特點 2.2、柔性數組的使用 2.3、…

【c++】計算樹的深度和節點數

在C語言中,計算給定樹的層數(深度)和節點總數通常需要使用遞歸方法。首先,我們需要定義樹的節點結構。這里假設我們處理的是一棵二叉樹,每個節點有兩個子節點(左子節點和右子節點)。 下面是一個…

5.STL源碼解析-算法、仿函數、適配器

算法 STL算法總覽 仿函數與適配器 C標準模板庫(STL)是C程序員的得力工具,提供了許多強大而高效的數據結構和算法。在STL中,仿函數(Functor)和適配器(Adapter)是兩個重要的概念…

C語言文件操作(fputs() 和 puts() 有兩個小區別)

fputs() 和 puts() 有兩個小區別: 1.puts() 只能向標準輸出流輸出,而 fputs() 可以向任何流輸出。 2.使用 puts() 時,系統會在自動在其后添加換行符;而使用 fputs() 時,系統不會自動添加換行符。 那么這是不是意味著使…

【C++精簡版回顧】17.io流,流中提供的函數

1.流含義 2.流類 3.流對象 4.流對象的函數 舉例&#xff1a; 要求&#xff1a;數據結構中經常需要對齊輸出數據&#xff0c;應該怎么做&#xff1f; 1.頭文件 #include<iomanip> 2.創建表格頭 cout << setiosflags(ios::left) << setw(8) << "姓名…

BUGKU 網站被黑

打開環境&#xff0c;什么都沒發現&#xff0c;使用蟻劍掃描一下&#xff0c;發現shell.php&#xff0c;打開 使用BP抓包&#xff0c;進行爆破 得到密碼&#xff1a;hack 進去得到flag