專欄介紹:YOLOv9改進系列 | 包含深度學習最新創新,主力高效漲點!!!
一、論文摘要
????????由于內存和計算資源有限,在嵌入式設備上部署卷積神經網絡是困難的。特征圖中的冗余是那些成功的細胞神經網絡的一個重要特征,但在神經結構設計中很少進行研究。本文提出了一種新的Ghost模塊,通過少量的計算生成更多的特征圖。基于一組內在特征圖,我們以低廉的成本應用一系列線性變換來生成許多重影特征圖,這些重影特征圖可充分揭示內在特征背后的信息。所提出的Ghost模塊可以作為即插即用組件來升級現有的卷積神經網絡。Ghost瓶頸被設計為堆疊Ghost模塊,然后可以輕松地建立輕量級GhostNet。
適用檢測目標:? ?輕量化或移動端部署
二、Ghost Conv模塊詳解
《GhostNet: More Features from Cheap Operations》
????????論文地址:? https://arxiv.org/abs/1911.11907
?2.1 模塊簡介
????????Ghost Conv的主要思想:? 通過一系列線性變換,以很小的計算量從原始特征發掘所需信息的“Ghost”特征圖(Ghost feature maps)
?總結:?一種類似殘差的模塊
Ghost Conv模塊的原理圖
三、Ghost Conv模塊使用教程
3.1 Ghost Conv模塊的代碼
class GhostConv(nn.Module):"""Ghost Convolution https://github.com/huawei-noah/ghostnet."""def __init__(self, c1, c2, k=1, s=1, g=1, act=True):"""Initializes the GhostConv object with input channels, output channels, kernel size, stride, groups andactivation."""super().__init__()c_ = c2 // 2 # hidden channelsself.cv1 = Conv(c1, c_, k, s, None, g, act=act)self.cv2 = Conv(c_, c_, 5, 1, None, c_, act=act)def forward(self, x):"""Forward propagation through a Ghost Bottleneck layer with skip connection."""y = self.cv1(x)return torch.cat((y, self.cv2(y)), 1)
3.2 在YOlO v9中的添加教程
閱讀YOLOv9添加模塊教程或使用下文操作
? ? ? ? 1.?將YOLOv9工程中models下common.py文件中增加模塊的代碼。
?????????2.?將YOLOv9工程中models下yolo.py文件中的第718行(可能因版本變化而變化)增加以下代碼。
RepNCSPELAN4, SPPELAN, GhostConv}:
3.3 運行配置文件
# 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, GhostConv, [512, 3]], # 38# detection head# detect[[31, 34, 38, 16, 19, 22], 1, DualDDetect, [nc]], # DualDDetect(A3, A4, A5, P3, P4, P5)]
3.4 訓練過程
歡迎關注!