內(nèi)蒙古地區(qū)做推廣網(wǎng)站搜索引擎推廣試題
?????💡💡💡本文改進(jìn)內(nèi)容:SimAM是一種輕量級(jí)的自注意力機(jī)制,其網(wǎng)絡(luò)結(jié)構(gòu)與Transformer類似,但是在計(jì)算注意力權(quán)重時(shí)使用的是線性層而不是點(diǎn)積
yolov9-c-CoordAtt summary: 972 layers, 51024476 parameters, 51024444 gradients, 238.9 GFLOPs
?改進(jìn)結(jié)構(gòu)圖如下:
YOLOv9魔術(shù)師專欄
???????????????????????????????????? ????????????????????????????
包含注意力機(jī)制魔改、卷積魔改、檢測(cè)頭創(chuàng)新、損失&IOU優(yōu)化、block優(yōu)化&多層特征融合、?輕量級(jí)網(wǎng)絡(luò)設(shè)計(jì)、24年最新頂會(huì)改進(jìn)思路、原創(chuàng)自研paper級(jí)創(chuàng)新等
??????????????????????????????????????????????????????????????????
??? 新開專欄暫定免費(fèi)限時(shí)開放,后續(xù)每月調(diào)價(jià)一次???
🚀🚀🚀?本項(xiàng)目持續(xù)更新 | 更新完結(jié)保底≥50+ ,沖刺100+🚀🚀🚀
🍉🍉🍉?聯(lián)系WX: AI_CV_0624?歡迎交流!🍉🍉🍉
YOLOv9魔改:注意力機(jī)制、檢測(cè)頭、blcok魔改、自研原創(chuàng)等
?YOLOv9魔術(shù)師
💡💡💡全網(wǎng)獨(dú)家首發(fā)創(chuàng)新(原創(chuàng)),適合paper !!!
💡💡💡 2024年計(jì)算機(jī)視覺頂會(huì)創(chuàng)新點(diǎn)適用于Yolov5、Yolov7、Yolov8等各個(gè)Yolo系列,專欄文章提供每一步步驟和源碼,輕松帶你上手魔改網(wǎng)絡(luò) !!!
💡💡💡重點(diǎn):通過(guò)本專欄的閱讀,后續(xù)你也可以設(shè)計(jì)魔改網(wǎng)絡(luò),在網(wǎng)絡(luò)不同位置(Backbone、head、detect、loss等)進(jìn)行魔改,實(shí)現(xiàn)創(chuàng)新!!!
?1.YOLOv9原理介紹
?
論文:?2402.13616.pdf (arxiv.org)
代碼:GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information摘要:?如今的深度學(xué)習(xí)方法重點(diǎn)關(guān)注如何設(shè)計(jì)最合適的目標(biāo)函數(shù),從而使得模型的預(yù)測(cè)結(jié)果能夠最接近真實(shí)情況。同時(shí),必須設(shè)計(jì)一個(gè)適當(dāng)?shù)募軜?gòu),可以幫助獲取足夠的信息進(jìn)行預(yù)測(cè)。然而,現(xiàn)有方法忽略了一個(gè)事實(shí),即當(dāng)輸入數(shù)據(jù)經(jīng)過(guò)逐層特征提取和空間變換時(shí),大量信息將會(huì)丟失。因此,YOLOv9 深入研究了數(shù)據(jù)通過(guò)深度網(wǎng)絡(luò)傳輸時(shí)數(shù)據(jù)丟失的重要問題,即信息瓶頸和可逆函數(shù)。作者提出了可編程梯度信息(programmable gradient information,PGI)的概念,來(lái)應(yīng)對(duì)深度網(wǎng)絡(luò)實(shí)現(xiàn)多個(gè)目標(biāo)所需要的各種變化。PGI 可以為目標(biāo)任務(wù)計(jì)算目標(biāo)函數(shù)提供完整的輸入信息,從而獲得可靠的梯度信息來(lái)更新網(wǎng)絡(luò)權(quán)值。此外,研究者基于梯度路徑規(guī)劃設(shè)計(jì)了一種新的輕量級(jí)網(wǎng)絡(luò)架構(gòu),即通用高效層聚合網(wǎng)絡(luò)(Generalized Efficient Layer Aggregation Network,GELAN)。該架構(gòu)證實(shí)了 PGI 可以在輕量級(jí)模型上取得優(yōu)異的結(jié)果。研究者在基于 MS COCO 數(shù)據(jù)集的目標(biāo)檢測(cè)任務(wù)上驗(yàn)證所提出的 GELAN 和 PGI。結(jié)果表明,與其他 SOTA 方法相比,GELAN 僅使用傳統(tǒng)卷積算子即可實(shí)現(xiàn)更好的參數(shù)利用率。對(duì)于 PGI 而言,它的適用性很強(qiáng),可用于從輕型到大型的各種模型。我們可以用它來(lái)獲取完整的信息,從而使從頭開始訓(xùn)練的模型能夠比使用大型數(shù)據(jù)集預(yù)訓(xùn)練的 SOTA 模型獲得更好的結(jié)果。對(duì)比結(jié)果如圖1所示。
?
?YOLOv9框架圖
1.1 YOLOv9框架介紹
YOLOv9各個(gè)模型介紹
?
2.?SimAM:無(wú)參Attention
論文:?http://proceedings.mlr.press/v139/yang21o/yang21o.pdf
????????SimAM(Simple Attention Mechanism)是一種輕量級(jí)的自注意力機(jī)制,其網(wǎng)絡(luò)結(jié)構(gòu)與Transformer類似,但是在計(jì)算注意力權(quán)重時(shí)使用的是線性層而不是點(diǎn)積。其網(wǎng)絡(luò)結(jié)構(gòu)如下:
輸入序列 -> Embedding層 -> Dropout層 -> 多層SimAM層 -> 全連接層 -> Softmax層 -> 輸出結(jié)果
其中,SimAM層由以下幾個(gè)部分組成:
-
多頭注意力層:輸入序列經(jīng)過(guò)多個(gè)線性映射后,分成多個(gè)頭,每個(gè)頭計(jì)算注意力權(quán)重。
-
殘差連接層:將多頭注意力層的輸出與輸入序列相加,保證信息不會(huì)丟失。
-
前向傳遞層:對(duì)殘差連接層的輸出進(jìn)行線性變換和激活函數(shù)處理,再與殘差連接層的輸出相加。
-
歸一化層:對(duì)前向傳遞層的輸出進(jìn)行層歸一化處理,加速訓(xùn)練并提高模型性能。
通過(guò)多層SimAM層的堆疊,模型可以學(xué)習(xí)到輸入序列中的長(zhǎng)程依賴關(guān)系,并生成對(duì)應(yīng)的輸出序列。
?
?在不增加原始網(wǎng)絡(luò)參數(shù)的情況下,為特征圖推斷三維注意力權(quán)重
1、提出優(yōu)化能量函數(shù)以發(fā)掘每個(gè)神經(jīng)元的重要性
2、針對(duì)能量函數(shù)推導(dǎo)出一種快速解析解,不超過(guò)10行代碼即可實(shí)現(xiàn)。?
表格給出了ImageNet數(shù)據(jù)集上不同注意力機(jī)制的性能對(duì)比,從中可以看到:
- 所有注意力模塊均可以提升基線模型的性能;
- 所提SimAM在ResNet18與ResNet101基線上取得了最佳性能提升;
- 對(duì)于ResNet34、ResNet50、ResNeXt50、MobileNetV2,所提SimAM仍可取得與其他注意力相當(dāng)性能;
- 值得一提的是,所提SimAM并不會(huì)引入額外的參數(shù);
- 在推理速度方面,所提SimAM與SE、ECA相當(dāng),優(yōu)于CBAM、SRM。
1.1?加入yolov8?modules.py
中
?
? ? ??
3.SimAM加入到Y(jié)OLOv9
3.1新建py文件,路徑為models/attention/attention.py
###################### SimAM #### start by AI&CV ###############################
import torch
from torch import nn
from torch.nn import init
import torch.nn.functional as Fclass SimAM(torch.nn.Module):def __init__(self,c1, 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)
###################### SimAM #### end by AI&CV ###############################
3.2修改yolo.py
1)首先進(jìn)行引用
from models.attention.attention import *
2)修改def parse_model(d, ch): ?# model_dict, input_channels(3)
在源碼基礎(chǔ)上加入SimAM
elif m is nn.BatchNorm2d:args = [ch[f]]###attention #####elif m in {EMA_attention,CoordAtt,SimAM}:c2 = ch[f]args = [c2, *args]###attention #####
3.3?yolov9-c-SimAM.yaml
# YOLOv9# parameters
nc: 80 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # 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[-1, 1, SimAM, [512]], # 10]# YOLOv9 head
head:[# elan-spp block[-1, 1, SPPELAN, [512, 256]], # 11# 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]], # 14# 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]], # 17 (P3/8-small)# avg-conv-down merge[-1, 1, ADown, [256]],[[-1, 14], 1, Concat, [1]], # cat head P4# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 20 (P4/16-medium)# avg-conv-down merge[-1, 1, ADown, [512]],[[-1, 11], 1, Concat, [1]], # cat head P5# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 23 (P5/32-large)# multi-level reversible auxiliary branch# routing[5, 1, CBLinear, [[256]]], # 24[7, 1, CBLinear, [[256, 512]]], # 25[9, 1, CBLinear, [[256, 512, 512]]], # 26# conv down[0, 1, Conv, [64, 3, 2]], # 27-P1/2# conv down[-1, 1, Conv, [128, 3, 2]], # 28-P2/4# elan-1 block[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]], # 29# avg-conv down fuse[-1, 1, ADown, [256]], # 30-P3/8[[24, 25, 26, -1], 1, CBFuse, [[0, 0, 0]]], # 31 # elan-2 block[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 32# avg-conv down fuse[-1, 1, ADown, [512]], # 33-P4/16[[25, 26, -1], 1, CBFuse, [[1, 1]]], # 34 # elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 35# avg-conv down fuse[-1, 1, ADown, [512]], # 36-P5/32[[26, -1], 1, CBFuse, [[2]]], # 37# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 38# detection head# detect[[32, 35, 38, 17, 20, 23], 1, DualDDetect, [nc]], # DualDDetect(A3, A4, A5, P3, P4, P5)]