国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Yolov5】Yolov5添加ASFF, 網(wǎng)絡(luò)改進(jìn)優(yōu)化

這篇具有很好參考價(jià)值的文章主要介紹了【Yolov5】Yolov5添加ASFF, 網(wǎng)絡(luò)改進(jìn)優(yōu)化。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

?????? Yolov5添加ASFF??????

前言

Yolov5是單階段目標(biāo)檢測(cè)算法的一種,網(wǎng)上有很多改進(jìn)其性能的方法,添加ASFF模塊就是其中一種,但是ASFF本身是用于Yolov3的,在v5中無(wú)法直接應(yīng)用,且網(wǎng)上許多博客都是介紹這個(gè)模塊的原理,沒(méi)有直接可以應(yīng)用的代碼程序,我這里提供一種方案,如果有什么錯(cuò)誤或理解不到位的地方,歡迎評(píng)論區(qū)指正。


一、ASFF來(lái)源及功能

ASFF:Adaptively Spatial Feature Fusion (自適應(yīng)空間特征融合)
論文來(lái)源:Learning Spatial Fusion for Single-Shot Object Detection
代碼地址:ASFF

關(guān)于ASFF的功能,在網(wǎng)絡(luò)中所起到的作用,網(wǎng)上已有許多博客,這里不再多說(shuō),可以參考以下幾位博主的博文:

  • 叫我西瓜超人
  • 藍(lán)翔技校的碼農(nóng)
  • Bruce_0712

個(gè)人的理解,ASFF就是對(duì)特征圖金字塔的每一張圖片進(jìn)行卷積、池化等處理提取權(quán)重,然后在作用在某一層上,試圖利用另外兩層的信息來(lái)改善指定層次的特征提取能力。

但是在作者實(shí)驗(yàn)后發(fā)現(xiàn),加入ASFF模塊后,mAP值僅僅從原始網(wǎng)絡(luò)的92.8%提高到93.8%。然而網(wǎng)絡(luò)的參數(shù)量卻翻了一倍達(dá)到1200萬(wàn)+,訓(xùn)練時(shí)的顯存消耗、訓(xùn)練時(shí)間也多了不少,感覺(jué)有點(diǎn)得不償失??。


提示:下面給出我所用的ASFF代碼以及如何在Yolov5/6.0中使用

二、ASFF代碼

這里的代碼我結(jié)合yolov5的網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行過(guò)修改,所以會(huì)與原代碼不同.

第一步,在models/common.py文件最下面添加下面的代碼:

def add_conv(in_ch, out_ch, ksize, stride, leaky=True):
    """
    Add a conv2d / batchnorm / leaky ReLU block.
    Args:
        in_ch (int): number of input channels of the convolution layer.
        out_ch (int): number of output channels of the convolution layer.
        ksize (int): kernel size of the convolution layer.
        stride (int): stride of the convolution layer.
    Returns:
        stage (Sequential) : Sequential layers composing a convolution block.
    """
    stage = nn.Sequential()
    pad = (ksize - 1) // 2
    stage.add_module('conv', nn.Conv2d(in_channels=in_ch,
                                       out_channels=out_ch, kernel_size=ksize, stride=stride,
                                       padding=pad, bias=False))
    stage.add_module('batch_norm', nn.BatchNorm2d(out_ch))
    if leaky:
        stage.add_module('leaky', nn.LeakyReLU(0.1))
    else:
        stage.add_module('relu6', nn.ReLU6(inplace=True))
    return stage


class ASFF(nn.Module):
    def __init__(self, level, rfb=False, vis=False):
        super(ASFF, self).__init__()
        self.level = level
        # 特征金字塔從上到下三層的channel數(shù)
        # 對(duì)應(yīng)特征圖大小(以640*640輸入為例)分別為20*20, 40*40, 80*80
        self.dim = [512, 256, 128]
        self.inter_dim = self.dim[self.level]
        if level==0: # 特征圖最小的一層,channel數(shù)512
            self.stride_level_1 = add_conv(256, self.inter_dim, 3, 2)
            self.stride_level_2 = add_conv(128, self.inter_dim, 3, 2)
            self.expand = add_conv(self.inter_dim, 512, 3, 1)
        elif level==1: # 特征圖大小適中的一層,channel數(shù)256
            self.compress_level_0 = add_conv(512, self.inter_dim, 1, 1)
            self.stride_level_2 = add_conv(128, self.inter_dim, 3, 2)
            self.expand = add_conv(self.inter_dim, 256, 3, 1)
        elif level==2: # 特征圖最大的一層,channel數(shù)128
            self.compress_level_0 = add_conv(512, self.inter_dim, 1, 1)
            self.compress_level_1 = add_conv(256, self.inter_dim, 1, 1)
            self.expand = add_conv(self.inter_dim, 128, 3, 1)

        compress_c = 8 if rfb else 16  #when adding rfb, we use half number of channels to save memory

        self.weight_level_0 = add_conv(self.inter_dim, compress_c, 1, 1)
        self.weight_level_1 = add_conv(self.inter_dim, compress_c, 1, 1)
        self.weight_level_2 = add_conv(self.inter_dim, compress_c, 1, 1)

        self.weight_levels = nn.Conv2d(compress_c*3, 3, kernel_size=1, stride=1, padding=0)
        self.vis= vis


    def forward(self, x_level_0, x_level_1, x_level_2):
        if self.level==0:
            level_0_resized = x_level_0
            level_1_resized = self.stride_level_1(x_level_1)

            level_2_downsampled_inter =F.max_pool2d(x_level_2, 3, stride=2, padding=1)
            level_2_resized = self.stride_level_2(level_2_downsampled_inter)

        elif self.level==1:
            level_0_compressed = self.compress_level_0(x_level_0)
            level_0_resized =F.interpolate(level_0_compressed, scale_factor=2, mode='nearest')
            level_1_resized =x_level_1
            level_2_resized =self.stride_level_2(x_level_2)
        elif self.level==2:
            level_0_compressed = self.compress_level_0(x_level_0)
            level_0_resized =F.interpolate(level_0_compressed, scale_factor=4, mode='nearest')
            level_1_compressed = self.compress_level_1(x_level_1)
            level_1_resized =F.interpolate(level_1_compressed, scale_factor=2, mode='nearest')
            level_2_resized =x_level_2

        level_0_weight_v = self.weight_level_0(level_0_resized)
        level_1_weight_v = self.weight_level_1(level_1_resized)
        level_2_weight_v = self.weight_level_2(level_2_resized)
        levels_weight_v = torch.cat((level_0_weight_v, level_1_weight_v, level_2_weight_v),1)
        levels_weight = self.weight_levels(levels_weight_v)
        levels_weight = F.softmax(levels_weight, dim=1)

        fused_out_reduced = level_0_resized * levels_weight[:,0:1,:,:]+\
                            level_1_resized * levels_weight[:,1:2,:,:]+\
                            level_2_resized * levels_weight[:,2:,:,:]

        out = self.expand(fused_out_reduced)

        if self.vis:
            return out, levels_weight, fused_out_reduced.sum(dim=1)
        else:
            return out

二、ASFF融合Yolov5網(wǎng)絡(luò)

第二步,在models/yolo.py文件的Detect類(lèi)下面添加下面的類(lèi)(我的是在92行加的)

class ASFF_Detect(Detect):
    # ASFF model for improvement
    def __init__(self, nc=80, anchors=(), ch=(), inplace=True):  # detection layer
        super().__init__(nc, anchors, ch, inplace)
        self.nl = len(anchors)
        self.asffs = nn.ModuleList(ASFF(i) for i in range(self.nl))
        self.detect = Detect.forward

    def forward(self, x): # x中的特征圖從大到小,與ASFF中順序相反,因此輸入前先反向
        x = x[::-1]
        for i in range(self.nl):
            x[i] = self.asffs[i](*x)
        return self.detect(self, x[::-1])

第三步,在有yolo.py這個(gè)文件中,出現(xiàn) Detect, Segment這個(gè)代碼片段的地方加入ASFF_Detect,例如我的177行中改動(dòng)后變成:
【Yolov5】Yolov5添加ASFF, 網(wǎng)絡(luò)改進(jìn)優(yōu)化
一共會(huì)改三處類(lèi)似的地方,我的分別是177,211,353行。

三、構(gòu)建使用ASFF的網(wǎng)絡(luò)

第四步,在models文件夾下新創(chuàng)建一個(gè)文件,命名為yolov5s-ASFF.yaml,然后把下面的內(nèi)容粘貼上去:

# YOLOv5 ?? by Ultralytics, GPL-3.0 license

# Parameters
nc: 2  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # 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, Conv, [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, Conv, [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, ASFF_Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

四、查看效果

第五步,在終端中輸入命令:
python models/yolo.py --cfg=yolov5s-ASFF.yaml
運(yùn)行后可以看到我們修改后的模型就被打印出來(lái)了:
【Yolov5】Yolov5添加ASFF, 網(wǎng)絡(luò)改進(jìn)優(yōu)化
后續(xù)訓(xùn)練也是按照原模型的流程進(jìn)行。

如果覺(jué)得本文對(duì)你有幫助,不妨動(dòng)動(dòng)小手點(diǎn)個(gè)贊,你的三連是作者更新的最大動(dòng)力????

最后添加一下本文代碼的倉(cāng)庫(kù)地址(可能有些許差異):https://gitee.com/inavacuum/yolov5_modified文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-400724.html

到了這里,關(guān)于【Yolov5】Yolov5添加ASFF, 網(wǎng)絡(luò)改進(jìn)優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • YOLOv5改進(jìn) | 一文匯總:如何在網(wǎng)絡(luò)結(jié)構(gòu)中添加注意力機(jī)制、C3、卷積、Neck、SPPF、檢測(cè)頭

    本篇文章的內(nèi)容是在大家得到一個(gè)改進(jìn)版本的C3一個(gè)新的注意力機(jī)制、或者一個(gè)新的卷積模塊、或者是檢測(cè)頭的時(shí)候如何替換我們YOLOv5模型中的原有的模塊,從而用你的模塊去進(jìn)行訓(xùn)練模型或者檢測(cè)。因?yàn)樽罱_(kāi)了一個(gè)專(zhuān)欄里面涉及到挺多改進(jìn)的地方,不能每篇文章都去講解

    2024年02月19日
    瀏覽(27)
  • 改進(jìn)YOLOv5:添加EMA注意力機(jī)制

    改進(jìn)YOLOv5:添加EMA注意力機(jī)制

    提示:文章寫(xiě)完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 本文主要介紹一種在YOLOv5-7.0中添加EMA注意力機(jī)制的方法。EMA注意力機(jī)制原論文地址,有關(guān)EMA注意力機(jī)制的解讀可參考文章。 在yolov5的models文件中新建一個(gè)名為EMA.py文件,將下述代碼復(fù)制到EMA.py文件中并

    2024年02月09日
    瀏覽(31)
  • YOLOv5改進(jìn)系列(1)——添加SE注意力機(jī)制

    YOLOv5改進(jìn)系列(1)——添加SE注意力機(jī)制

    從這篇開(kāi)始我們進(jìn)入YOLOv5改進(jìn)系列。那就先從最簡(jiǎn)單的添加注意力機(jī)制開(kāi)始吧?。ǎ幔┄J 【YOLOv5改進(jìn)系列】前期回顧: YOLOv5改進(jìn)系列(0)——重要性能指標(biāo)與訓(xùn)練結(jié)果評(píng)價(jià)及分析 目錄

    2024年02月03日
    瀏覽(36)
  • YOLOv5改進(jìn)算法之添加CA注意力機(jī)制模塊

    YOLOv5改進(jìn)算法之添加CA注意力機(jī)制模塊

    目錄 ? 1.CA注意力機(jī)制 2.YOLOv5添加注意力機(jī)制 送書(shū)活動(dòng) ? CA(Coordinate Attention)注意力機(jī)制是一種用于加強(qiáng)深度學(xué)習(xí)模型對(duì)輸入數(shù)據(jù)的空間結(jié)構(gòu)理解的注意力機(jī)制。CA 注意力機(jī)制的核心思想是引入坐標(biāo)信息,以便模型可以更好地理解不同位置之間的關(guān)系。如下圖: 1. 輸入特征

    2024年02月09日
    瀏覽(30)
  • (超詳細(xì))7-YOLOV5改進(jìn)-添加 CoTAttention注意力機(jī)制

    (超詳細(xì))7-YOLOV5改進(jìn)-添加 CoTAttention注意力機(jī)制

    1、在yolov5/models下面新建一個(gè)CoTAttention.py文件,在里面放入下面的代碼 代碼如下: 2、找到y(tǒng)olo.py文件,進(jìn)行更改內(nèi)容 在29行加一個(gè) from models.CoTAttention import CoTAttention , 保存即可 3、找到自己想要更改的yaml文件,我選擇的yolov5s.yaml文件(你可以根據(jù)自己需求進(jìn)行選擇),將剛剛寫(xiě)

    2024年01月21日
    瀏覽(35)
  • (超詳細(xì))2-YOLOV5改進(jìn)-添加SimAM注意力機(jī)制

    (超詳細(xì))2-YOLOV5改進(jìn)-添加SimAM注意力機(jī)制

    1、在yolov5/models下面新建一個(gè)SimAM.py文件,在里面放入下面的代碼 代碼如下: 2、找到y(tǒng)olo.py文件,進(jìn)行更改內(nèi)容 在26行加一個(gè) from models SimAM import SimAM , 保存即可 3、找到自己想要更改的yaml文件,我選擇的yolov5s.yaml文件(你可以根據(jù)自己需求進(jìn)行選擇),將剛剛寫(xiě)好的模塊SimAM加

    2024年01月17日
    瀏覽(69)
  • (超詳細(xì))4-YOLOV5改進(jìn)-添加ShuffleAttention注意力機(jī)制

    (超詳細(xì))4-YOLOV5改進(jìn)-添加ShuffleAttention注意力機(jī)制

    1、在yolov5/models下面新建一個(gè)ShuffleAttention.py文件,在里面放入下面的代碼 代碼如下: 2、找到y(tǒng)olo.py文件,進(jìn)行更改內(nèi)容 在28行加一個(gè) from models.ShuffleAttention import ShuffleAttention , 保存即可 3、找到自己想要更改的yaml文件,我選擇的yolov5s.yaml文件(你可以根據(jù)自己需求進(jìn)行選擇),

    2024年01月23日
    瀏覽(31)
  • [YOLOv7/YOLOv5系列算法改進(jìn)NO.4]添加ECA通道注意力機(jī)制

    [YOLOv7/YOLOv5系列算法改進(jìn)NO.4]添加ECA通道注意力機(jī)制

    ?前? ? ? 言 作為當(dāng)前先進(jìn)的深度學(xué)習(xí)目標(biāo)檢測(cè)算法YOLOv5,已經(jīng)集合了大量的trick,但是在處理一些復(fù)雜背景問(wèn)題的時(shí)候,還是容易出現(xiàn)錯(cuò)漏檢的問(wèn)題。此后的系列文章,將重點(diǎn)對(duì)YOLOv5的如何改進(jìn)進(jìn)行詳細(xì)的介紹,目的是為了給那些搞科研的同學(xué)需要?jiǎng)?chuàng)新點(diǎn)或者搞工程項(xiàng)目的

    2024年02月05日
    瀏覽(28)
  • Yolov5改進(jìn)算法之添加Res2Net模塊

    Yolov5改進(jìn)算法之添加Res2Net模塊

    目錄 1. Res2Net介紹 1.1 Res2Net的背景和動(dòng)機(jī) 1.2 Res2Net的基本概念 2. YOLOV5添加Res2Net模塊 ? Res2Net (Residual Resolution Network)是一種用于圖像處理和計(jì)算機(jī)視覺(jué)任務(wù)的深度卷積神經(jīng)網(wǎng)絡(luò)架構(gòu)。它旨在解決傳統(tǒng)的ResNet(Residual Network)存在的問(wèn)題,如對(duì)不同尺度和分辨率特征的建模不足

    2024年02月10日
    瀏覽(15)
  • YOLOv5改進(jìn)系列(11)——添加損失函數(shù)之EIoU、AlphaIoU、SIoU、WIoU

    YOLOv5改進(jìn)系列(11)——添加損失函數(shù)之EIoU、AlphaIoU、SIoU、WIoU

    【YOLOv5改進(jìn)系列】前期回顧: YOLOv5改進(jìn)系列(0)——重要性能指標(biāo)與訓(xùn)練結(jié)果評(píng)價(jià)及分析 YOLOv5改進(jìn)系列(1)——添加SE注意力機(jī)制

    2024年02月11日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包