YOLOv5 | 卷積模塊 | 提高網絡的靈活性和表征能力的動態卷積【附代碼+小白可上手】

💡💡💡本專欄所有程序均經過測試,可成功執行💡💡💡

輕量級卷積神經網絡由于其低計算預算限制了CNNs的深度(卷積層數)和寬度(通道數),導致了性能下降和表示能力受限的問題。而動態卷積恰好能解決這一問題,這是一種增加模型復雜性而不增加網絡深度或寬度的新設計。本文給大家帶來的教程是將YOLOv5的Conv用Dynamic_conv替換來提取特征。文章在介紹主要的原理后,將手把手教學如何進行模塊的代碼添加和修改,并將修改后的完整代碼放在文章的最后,方便大家一鍵運行,小白也可輕松上手實踐。此外還增加了進階模塊,來提高學有能力的同學進一步增長知識。幫助您更好地學習深度學習目標檢測YOLO系列的挑戰。

專欄地址:?YOLOv5改進+入門——持續更新各種有效漲點方法 點擊即可跳轉

目錄

1.原理

2. 代碼實現

2.1 將代碼添加到YOLOv5中

2.2 新增yaml文件

2.3 注冊模塊

2.4 執行程序

3. 完整代碼分享

4. GFLOPs

5. 進階

6. 總結


1. 原理

論文地址Dynamic Convolution: Attention over Convolution Kernels——點擊即可跳轉

官方代碼官方代碼倉庫——點擊即可跳轉

動態卷積的是基于注意力機制的,它允許網絡動態地選擇和組合多個卷積核,以適應輸入數據的不同部分或特征。

  1. 多個卷積核的選擇

    在傳統的卷積操作中,每個卷積層通常使用固定的卷積核。而在動態卷積中,會事先定義一組多個卷積核,這些卷積核可能具有不同的大小和形狀。
  2. 注意力機制

    動態卷積通過引入注意力機制來決定在每個位置使用哪些卷積核。這個注意力可以根據輸入數據的不同部分或特征動態地調整,以使網絡能夠更好地捕捉輸入數據的相關信息。
  3. 卷積核的組合

    根據注意力機制的輸出,動態卷積會動態地選擇并組合多個卷積核。這種組合可以通過加權求和的方式進行,其中每個卷積核的權重由注意力機制確定。
  4. 非線性激活

    組合后的卷積核將應用于輸入數據,并通過非線性激活函數(如ReLU)產生輸出特征圖。
  5. 網絡訓練

    在訓練過程中,網絡將根據損失函數反向傳播并更新注意力機制的參數,以使網絡能夠學習到適合任務的最佳注意力分配方式。

總的來說,動態卷積通過引入注意力機制和動態地選擇和組合多個卷積核,使網絡能夠更靈活地適應輸入數據的不同部分或特征,從而提高網絡的表征能力和性能。

2. 代碼實現

2.1 將代碼添加到YOLOv5中

關鍵步驟一: 將下面代碼粘貼到/projects/yolov5-6.1/models/common.py文件中

import torch
import torch.nn as nn
import torch.nn.functional as Fclass attention2d(nn.Module):def __init__(self, in_planes, ratios, K, temperature, init_weight=True):super(attention2d, self).__init__()assert temperature%3==1self.avgpool = nn.AdaptiveAvgPool2d(1)if in_planes!=3:hidden_planes = int(in_planes*ratios)else:hidden_planes = Kself.fc1 = nn.Conv2d(in_planes, hidden_planes, 1, bias=False)self.fc2 = nn.Conv2d(hidden_planes, K, 1, bias=False)self.temperature = temperatureif init_weight:self._initialize_weights()def _initialize_weights(self):for m in self.modules():if isinstance(m, nn.Conv2d):nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')if m.bias is not None:nn.init.constant_(m.bias, 0)def updata_temperature(self):if self.temperature!=1:self.temperature -=3print('Change temperature to:', str(self.temperature))def forward(self, x):x = self.avgpool(x)x = self.fc1(x)x = F.relu(x)x = self.fc2(x).view(x.size(0), -1)return F.softmax(x/self.temperature, 1)class Dynamic_conv2d(nn.Module):def __init__(self, in_planes, out_planes, kernel_size, ratio=0.25, stride=1, padding=0, dilation=1, groups=1, bias=True, K=4,temperature=34, init_weight=True):super(Dynamic_conv2d, self).__init__()assert in_planes%groups==0self.in_planes = in_planesself.out_planes = out_planesself.kernel_size = kernel_sizeself.stride = strideself.padding = paddingself.dilation = dilationself.groups = groupsself.bias = biasself.K = Kself.attention = attention2d(in_planes, ratio, K, temperature)self.weight = nn.Parameter(torch.Tensor(K, out_planes, in_planes//groups, kernel_size, kernel_size), requires_grad=True)if bias:self.bias = nn.Parameter(torch.Tensor(K, out_planes))else:self.bias = Noneif init_weight:self._initialize_weights()#TODO 初始化def _initialize_weights(self):for i in range(self.K):nn.init.kaiming_uniform_(self.weight[i])def update_temperature(self):self.attention.updata_temperature()def forward(self, x): # 將batch視作維度變量,進行組卷積,因為組卷積的權重是不同的,動態卷積的權重也是不同的softmax_attention = self.attention(x)batch_size, in_planes, height, width = x.size()x = x.view(1, -1, height, width)# 變化成一個維度進行組卷積weight = self.weight.view(self.K, -1)# 動態卷積的權重的生成, 生成的是batch_size個卷積參數(每個參數不同)aggregate_weight = torch.mm(softmax_attention, weight).view(-1, self.in_planes, self.kernel_size, self.kernel_size)if self.bias is not None:aggregate_bias = torch.mm(softmax_attention, self.bias).view(-1)output = F.conv2d(x, weight=aggregate_weight, bias=aggregate_bias, stride=self.stride, padding=self.padding,dilation=self.dilation, groups=self.groups*batch_size)else:output = F.conv2d(x, weight=aggregate_weight, bias=None, stride=self.stride, padding=self.padding,dilation=self.dilation, groups=self.groups * batch_size)output = output.view(batch_size, self.out_planes, output.size(-2), output.size(-1))return output

動態卷積的流程如下:

  1. 準備多個卷積核

    首先,定義一組多個卷積核,這些卷積核可能具有不同的大小和形狀。這些卷積核將作為動態卷積的基本構建單元。
  2. 計算注意力分布

    對于輸入數據的每個位置,通過一個注意力網絡或者其他注意力機制,計算出相應位置的注意力分布。這個注意力分布表示了不同卷積核在當前位置的重要程度。
  3. 動態卷積操作

    根據注意力分布,動態地選擇和組合多個卷積核。通常是通過對每個卷積核的權重進行加權求和來實現,其中每個卷積核的權重由對應位置的注意力分布確定。
  4. 應用非線性激活

    將組合后的卷積核應用于輸入數據,并通過非線性激活函數(如ReLU)產生輸出特征圖。
  5. 網絡訓練

    訓練過程中,通過反向傳播算法優化注意力網絡或其他注意力機制的參數,以使網絡能夠學習到適合任務的最佳注意力分配方式。同時,也會更新卷積核的參數,使得網絡能夠學習到更好的特征表示。
  6. 重復步驟3至5

    在每個位置上重復執行動態卷積操作,直到整個輸入數據被處理完畢,生成最終的輸出特征圖。

總結動態卷積通過引入注意力機制來動態選擇和組合多個卷積核,從而使網絡能夠更靈活地適應輸入數據的不同部分或特征,從而提高網絡的表征能力和性能。

2.2 新增yaml文件

關鍵步驟二:在/projects/yolov5-6.1/models下新建文件 yolov5_dynamic.yaml并將下面代碼復制進去

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
anchors:- [10,13, 16,30, 33,23]  # P3/8- [30,61, 62,45, 59,119]  # P4/16- [116,90, 156,198, 373,326]  # P5/32# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2[-1, 1, Conv, [128, 3, 2]],  # 1-P2/4[-1, 3, C3, [128]],[-1, 1, Conv, [256, 3, 2]],  # 3-P3/8[-1, 6, C3, [256]],[-1, 1, Conv, [512, 3, 2]],  # 5-P4/16[-1, 9, C3, [512]],[-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32[-1, 3, C3, [1024]],[-1, 1, SPPF, [1024, 5]],  # 9]# YOLOv5 v6.0 head
head:[[-1, 1, Dynamic_conv2d, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]],  # cat backbone P4[-1, 3, C3, [512, False]],  # 13[-1, 1, Dynamic_conv2d, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]],  # cat backbone P3[-1, 3, C3, [256, False]],  # 17 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]],  # cat head P4[-1, 3, C3, [512, False]],  # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]],  # cat head P5[-1, 3, C3, [1024, False]],  # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]

溫馨提示:本文只是對yolov5l基礎上添加swin模塊,如果要對yolov8n/l/m/x進行添加則只需要指定對應的depth_multiple 和 width_multiple。


# YOLOv5n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple# YOLOv5s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple# YOLOv5l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple# YOLOv5m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple# YOLOv5x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple
2.3 注冊模塊

關鍵步驟三:在yolo.py中注冊, 大概在260行左右添加 ‘Dynamic_conv2d’

2.4 執行程序

在train.py中,將cfg的參數路徑設置為yolov5_AKConv.yaml的路徑

建議大家寫絕對路徑,確保一定能找到

?🚀運行程序,如果出現下面的內容則說明添加成功🚀

3. 完整代碼分享

https://pan.baidu.com/s/1iePDb_lNUhRKhWOevDRp3g?pwd=xs2y

提取碼: xs2y?

4. GFLOPs

關于GFLOPs的計算方式可以查看:百面算法工程師 | 卷積基礎知識——Convolution

未改進的YOLOv5l的GFLOPs

?改進后的YOLOv5l的GFLOPs

5. 進階

如果想計算量變化更小,如何修改呢,看過我的修改你是否學會了呢?不如動手試試吧

如果你想嘗試但又不知從何下手,可以在評論區問問大家,我看到后也會及時回復

6. 總結

動態卷積是一種通過引入注意力機制,動態選擇和組合多個卷積核的方法,以提高卷積神經網絡的表征能力和性能。通過在每個位置上根據輸入數據的不同部分或特征動態調整卷積核的選擇和權重,動態卷積能夠更靈活地捕獲輸入數據的相關信息,并產生更具表征能力的特征表示。在訓練過程中,網絡通過反向傳播算法優化注意力機制的參數,并更新卷積核的參數,從而學習到適合任務的最佳注意力分配方式和特征表示,進而提高了網絡的性能,優化圖像分類或目標檢測的準確率。

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

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

相關文章

三分鐘一條AI小和尚視頻 ,日引300+創業粉。單日變現四位數 全套工具

經過六個月的不懈努力和無數次的嘗試錯誤,我終于找到了一個高效引流和積累粉絲的新策略,并愿意與大家無私分享。這一次,我將詳盡地介紹這個方法,建議朋友們多次觀看以徹底掌握其精髓。 簡而言之,該策略主要依托于AI繪…

C語言文件編程

C語言文件編程 第一部分 基本概念 1、Linux文件類型 1.-普通文件:存在于外部存儲器中,用于存儲普通數據。 1.txt 1.c 1.mp3 1.mp4 2.d目錄文件:用于存放目錄項,是文件系統管理的重要文件類型。 文件夾 3.p管道文件&#x…

基于springboot+vue的“漫畫之家”系統

開發語言:Java框架:springbootJDK版本:JDK1.8服務器:tomcat7數據庫:mysql 5.7(一定要5.7版本)數據庫工具:Navicat11開發軟件:eclipse/myeclipse/ideaMaven包:…

全新交友盲盒+付費進群二合一源碼 包含全套源碼+教程

盲盒交友脫單系統源碼,帶教程,免授權這套源碼已經替你們搭建測試過了 附帶進群系統,定位是正常的 申明需要無限回調,沒有回調的搭建出來不能用不要說源碼不能用 全新系統方便大家使用,已經錄制好詳細的教程&#xf…

【Linux】-Spark分布式內存計算集群部署[20]

注意: 本節的操作,需要前置準備好Hadoop生態集群,請先部署好Hadoop環境 簡介 Spark是一款分布式內存計算引擎,可以支持海量數據的分布式計算。 Spark在大數據體系是明星產品,作為最新一代的綜合計算引擎&#xff0c…

閑話 .NET(6):.NET Core 各個版本的特性

前言 之前我們聊了一下 .NET Core 有哪些優勢,.NET Core 發展非常迅速,不過短短幾年,.NET Core 已經發布 .NET 8 了,基本上保持了一年一個版本的速度,每個版本都有自己的獨有特性,下面我們來簡單的盤點一下…

【一篇文章搞定電腦重裝,簡單易懂,速來學習!】

大家好!今天給大家帶來一篇非常實用的文章——電腦系統重裝教程。不管你是電腦小白還是有一定基礎的用戶,這個教程都能滿足你的需求。我們將從前期準備到具體的重裝步驟,一步步教你如何重裝電腦系統。 教程 介紹 [教程名稱]:u盤…

electron-vite-vue配置

1.安裝vite pnpm create vite 2.安裝electron 用npm下載不過來QAQ 下載失敗的話就重新下一遍 cnpm i -D electron 3.安裝concurrently 用來執行多個程序 pnpm i concurrently 4.配置package.json {"name": "demo","private": true,"…

Java學習51-常用類 集合類Collection Arrays數組類

Arrays數組類 & 集合類Collection 內存層面需要針對多個數據進行存儲,此時可以考慮的容器有:數組,集合類 數組Arrays介紹: 數組存儲多個數據方面的特點: 數組一旦初始化,其長度是確定的。 數組中的多…

AIGC行業的發展前景與市場需求

簡介:探討當前時機是否適合進入AIGC行業,考慮行業發展階段和市場需求。 方向一:行業前景 AIGC(人工智能生成內容)行業是近年來隨著人工智能技術的快速發展而興起的一個新興領域,它涉及到使用人工智能技術來…

可視化大屏開發,知道了這些經驗以及解決方案,效率至少提升2倍!(完結篇)

大家好,我是日拱一卒的攻城師不浪,專注可視化、數字孿生、前端、nodejs、AI學習、GIS等學習沉淀,這是2024年輸出的第16/100篇文章; 前言 之前寫了兩篇可視化大屏開發的經驗總結,小伙伴們反應還不錯。 最近&#xff0…

上海企業ESG標準實施啟動儀式暨首屆城市可持續發展北外灘論壇,萊巍爵CEO瞿偉鋒再獲殊榮,綻放異彩

2024年5月20日,上海企業ESG標準實施啟動儀式暨首屆城市可持續發展北外灘論壇在虹口區白玉蘭廣場成功舉行,上海市工業經濟聯合會會長管維鏞,上海市市場監督管理總局副局長王益洋,聯合國工業發展組織投資與技術促進辦公室主任趙曉蕾…

【Flutter】Dialog組件PageView組件

🔥 本文由 程序喵正在路上 原創,CSDN首發! 💖 系列專欄:Flutter學習 🌠 首發時間:2024年5月27日 🦋 歡迎關注🖱點贊👍收藏🌟留言🐾 目…

Shiro+Jwt+Redis

如何整合ShiroJwtRedis,以及為什么要這么做 我個人認為 ①為什么用shiro:“ShiroJwtRedis”模式和“單純的shiro”模式相比,主要用的是shiro里面的登錄認證和權限控制功能 ②為什么用jwt:“ShiroJwt”模式和“ShiroCookie”模式相…

生命在于學習——Python人工智能原理(2.1)

二、機器學習 1、機器學習的定義 機器學習是指從有限的觀測數據中學習出具有一般性的規律,并利用這些規律對未知數據進行預測的方法,通俗的講,機器學習就是讓計算機從數據中進行自動學習,得到某種知識。 傳統的機器學習主要關注…

1分鐘快速掌握JSON格式

文章目錄 先說理論代碼舉例對象型數組型總結 先說理論 下面是JSON的幾種簡單數據類型: 數據類型描述數字型JavaScript中的雙進度浮點類型,通常根據具體情況定義,這里是沒有特殊的整形的。字符串型帶雙引號的Unicode,帶反斜杠轉義布爾型true…

圖形學初識--雙線性插值算法

文章目錄 為什么需要雙線性插值算法?雙線性插值算法是什么?如何雙線性插值?結尾:喜歡的小伙伴可以點點關注贊哦 為什么需要雙線性插值算法? ChatGP回答: 雙線性插值(bilinear interpolation&am…

AI繪畫圖生圖有什么用?

隨著AI滲透到我們生活中的各個角落,AI繪畫圖生圖的出現,更是在藝術領域引起了廣泛的關注和討論。那么,AI繪畫圖生圖究竟有什么作用呢? 首先,AI繪畫圖生圖能夠極大地提高創作效率。傳統的繪畫過程需要藝術家們花費大量的時間和精力…

2024年怎么下載學浪app視頻

想要在2024年緊跟潮流,成為一名優秀的學浪用戶嗎?今天就讓我們一起探索如何下載學浪app視頻吧! 學浪視頻下載工具打包 學浪下載工具打包鏈接:百度網盤 請輸入提取碼 提取碼:1234 --來自百度網盤超級會員V10的分享…

第14章-藍牙遙控小車 手把手做藍牙APP遙控小車 藍牙串口通訊講解

本文講解手機藍牙如何遙控小車,如何編寫串口通信指令 第14章-手機遙控功能 我們要實現藍牙遙控功能,藍牙遙控功能要使用:1.單片機的串口、2.藍牙通信模塊 所以我們先調試好:單片機的串口->藍牙模塊->接到一起聯調 14.1-電腦控制小車 完成功能…