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

yolov5-7.0 添加BiFPN

這篇具有很好參考價值的文章主要介紹了yolov5-7.0 添加BiFPN。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1. BiFPN特征融合

BiFPN是目標檢測中神經(jīng)網(wǎng)絡架構設計的選擇之一,為了優(yōu)化目標檢測性能而提出。主要用來進行多尺度特征融合,對神經(jīng)網(wǎng)絡性能進行優(yōu)化。來自EfficientDet: Scalable and Efficient Object Detection這篇論文。
在這篇論文中,作者主要貢獻如下:

  • 首先,提出了一種加權雙向特征金字塔網(wǎng)絡(BIFPN),該網(wǎng)絡可以簡單快速的實現(xiàn)多尺度特征融合
  • 其次,提出了一種Compound Scaling方法,該方法可以同時對所有的主干網(wǎng)絡、特征網(wǎng)絡和框/類預測網(wǎng)絡的分辨率、深度和寬度進行統(tǒng)一縮放
    雙向特征金字塔網(wǎng)絡BIFPN
    yolov5-7.0 添加BiFPN,yolov5模型修改,YOLO,深度學習,計算機視覺
    對于多尺度特征統(tǒng)合,在融合不同的輸入特征時,以往的研究(FPN以及一些對FPN的改進工作)大多是沒有去別的特征相加;然而由于這些不同的輸入特征具有不同的分辨率,因此對特征融合的貢獻往往也是不平等的。
    為了解決這個問題,作者提出了一種簡單卻有效的加權特征金字塔網(wǎng)絡BiFPN,引入了可學習的全職來學習不同輸入特征的貢獻,同時反復應用自頂而下和自下而上的多尺度特征融合。
  • 新的Neck部分—BiFPN:多尺度特征融合的目的,是聚合不同分辨率的特征;以往的特征融合方法對所有輸入特征一視同仁,為了解決這個問題,BiFPN引入了加權策略(類似于attention,SENet中的注意力通道)
    FPN:p3-p7是輸入圖像的下采樣,分辨率分別為輸入圖像的 1 / 2 i 1/2^i 1/2i,最后特征融合的公式為:
    yolov5-7.0 添加BiFPN,yolov5模型修改,YOLO,深度學習,計算機視覺
    其中,Resize的通常操作是upsampling 或者 downsampling
  • 加權:加上一個可學習的權重,也就是 O = ∑ i w i ? I i O=\sum_iw_i\cdot I_i O=i?wi??Ii?,其中 w i w_i wi?是一個可學習的參數(shù),如果不對 w i w_i wi?進行限制,很容易導致訓練不穩(wěn)定,于是作者很自然的想到了對每個權重使用softmax,即 O = ∑ i e i w ? + ∑ j w j ? I i O = \sum_i \frac{e^w_i}{\epsilon + \sum_j w_j}\cdot I_i O=i??+j?wj?eiw???Ii?,但是這樣速度太慢了,于是又提出了加速限制方法 O = ∑ i w i ? + ∑ j w j ? I i O = \sum_i \frac{w_i}{\epsilon + \sum_j w_j}\cdot I_i O=i??+j?wj?wi???Ii?
  • 雙向 :最終的特征圖結合了雙向尺度鏈接和快速歸一化融合。
    具體例子由下圖所描述:
    yolov5-7.0 添加BiFPN,yolov5模型修改,YOLO,深度學習,計算機視覺

2. yolov5添加BiFPN(以yolov5s為例)

2.1 修改yolov5s.yaml

BiFPN_Add本質(zhì)是add操作,不是concat操作,因此,BiFPN_Add的各個輸入層要求大小完全一致(通道數(shù)、feature map大小等),因此,這里要修改之前的參數(shù)[-1, 13, 6],來滿足這個要求:

  • -1層就是上一層的輸出,原來上一層的輸出channel數(shù)為256,這里改成512
  • 13層就是這里[-1, 3, C3, [512, False]], # 13
  • 這樣修改后,BiFPN_Add各個輸入大小都是[bs,256,40,40]
  • 最后BiFPN_Add后面的參數(shù)層設置為[256, 256]也就是輸入輸出channel數(shù)都是256
    將concat替換成BIFPN_ADD
# YOLOv5 ?? by Ultralytics, GPL-3.0 license

# Parameters
nc: 80  # 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 BiFPN head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, BiFPN_Add2, [256, 256]],  # 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, BiFPN_Add2, [128, 128]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [512, 3, 2]],  # 為了BiFPN正確add,調(diào)整channel數(shù)
   [[-1, 13, 6], 1, BiFPN_Add3, [256, 256]],  # cat P4 <--- BiFPN change 注意v5s通道數(shù)是默認參數(shù)的一半
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, BiFPN_Add2, [256, 256]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

** 打印模型參數(shù)**
對模型文件進行測試并查看輸出結果

          from  n    params  module                                  arguments                     
  0                -1  1      3520  models.common.Conv                      [3, 32, 6, 2, 2]              
  1                -1  1     18560  models.common.Conv                      [32, 64, 3, 2]                
  2                -1  1     18816  models.common.C3                        [64, 64, 1]                   
  3                -1  1     73984  models.common.Conv                      [64, 128, 3, 2]               
  4                -1  2    115712  models.common.C3                        [128, 128, 2]                 
  5                -1  1    295424  models.common.Conv                      [128, 256, 3, 2]              
  6                -1  3    625152  models.common.C3                        [256, 256, 3]                 
  7                -1  1   1180672  models.common.Conv                      [256, 512, 3, 2]              
  8                -1  1   1182720  models.common.C3                        [512, 512, 1]                 
  9                -1  1    656896  models.common.SPPF                      [512, 512, 5]                 
 10                -1  1    131584  models.common.Conv                      [512, 256, 1, 1]              
 11                -1  1         0  torch.nn.modules.upsampling.Upsample    [None, 2, 'nearest']          
 12           [-1, 6]  1     65794  models.common.BiFPN_Add2                [256, 256]                    
 13                -1  1    296448  models.common.C3                        [256, 256, 1, False]          
 14                -1  1     33024  models.common.Conv                      [256, 128, 1, 1]              
 15                -1  1         0  torch.nn.modules.upsampling.Upsample    [None, 2, 'nearest']          
 16           [-1, 4]  1     16514  models.common.BiFPN_Add2                [128, 128]                    
 17                -1  1     74496  models.common.C3                        [128, 128, 1, False]          
 18                -1  1    295424  models.common.Conv                      [128, 256, 3, 2]              
 19       [-1, 13, 6]  1     65795  models.common.BiFPN_Add3                [256, 256]                    
 20                -1  1    296448  models.common.C3                        [256, 256, 1, False]          
 21                -1  1    590336  models.common.Conv                      [256, 256, 3, 2]              
 22          [-1, 10]  1     65794  models.common.BiFPN_Add2                [256, 256]                    
 23                -1  1   1051648  models.common.C3                        [256, 512, 1, False]          
 24      [17, 20, 23]  1    229245  models.yolo.Detect                      [80, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [128, 256, 512]]
Model Summary: 278 layers, 7384006 parameters, 7384006 gradients, 17.2 GFLOPs

2.2 修改commen.py

添加下面的代碼:

# 結合BiFPN 設置可學習參數(shù) 學習不同分支的權重
# 兩個分支add操作
class BiFPN_Add2(nn.Module):
    def __init__(self, c1, c2):
        super(BiFPN_Add2, self).__init__()
        # 設置可學習參數(shù) nn.Parameter的作用是:將一個不可訓練的類型Tensor轉換成可以訓練的類型parameter
        # 并且會向宿主模型注冊該參數(shù) 成為其一部分 即model.parameters()會包含這個parameter
        # 從而在參數(shù)優(yōu)化的時候可以自動一起優(yōu)化
        self.w = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True)
        self.epsilon = 0.0001
        self.conv = nn.Conv2d(c1, c2, kernel_size=1, stride=1, padding=0)
        self.silu = nn.SiLU()

    def forward(self, x):
        w = self.w
        weight = w / (torch.sum(w, dim=0) + self.epsilon)
        return self.conv(self.silu(weight[0] * x[0] + weight[1] * x[1]))


# 三個分支add操作
class BiFPN_Add3(nn.Module):
    def __init__(self, c1, c2):
        super(BiFPN_Add3, self).__init__()
        self.w = nn.Parameter(torch.ones(3, dtype=torch.float32), requires_grad=True)
        self.epsilon = 0.0001
        self.conv = nn.Conv2d(c1, c2, kernel_size=1, stride=1, padding=0)
        self.silu = nn.SiLU()

    def forward(self, x):
        w = self.w
        weight = w / (torch.sum(w, dim=0) + self.epsilon)  # 將權重進行歸一化
        # Fast normalized fusion
        return self.conv(self.silu(weight[0] * x[0] + weight[1] * x[1] + weight[2] * x[2]))

2.3 修改yolo.py

parse_model函數(shù)中找到elif m is Concat:語句,在其后面加上BiFPN_Add相關語句:

elif m is Concat:
    c2 = sum(ch[x] for x in f)
# 添加bifpn_add結構
elif m in [BiFPN_Add2, BiFPN_Add3]:
    c2 = max([ch[x] for x in f])

2.4 optimizer的修改

之前的版本需要修改train.py,向優(yōu)化器中添加BIFPN的權重參數(shù),將BiFPN_Add2和BiFPN_Add3函數(shù)中定義的w參數(shù),加入g1

    g0, g1, g2 = [], [], []  # optimizer parameter groups
    for v in model.modules():
        # hasattr: 測試指定的對象是否具有給定的屬性,返回一個布爾值
        if hasattr(v, 'bias') and isinstance(v.bias, nn.Parameter):  # bias
            g2.append(v.bias)  # biases
        if isinstance(v, nn.BatchNorm2d):  # weight (no decay)
            g0.append(v.weight)
        elif hasattr(v, 'weight') and isinstance(v.weight, nn.Parameter):  # weight (with decay)
            g1.append(v.weight)
        # BiFPN_Concat
        elif isinstance(v, BiFPN_Concat2) and hasattr(v, 'w') and isinstance(v.w, nn.Parameter):
            g1.append(v.w)
        elif isinstance(v, BiFPN_Concat3) and hasattr(v, 'w') and isinstance(v.w, nn.Parameter):
            g1.append(v.w)

按照之前的版本是可以直接在train.py進行修改的,但是在yolov5-v7.0版本中,這個部分優(yōu)化成智能的optimizer。
yolov5-v7.0中,大概在150行左右加入了智能的optimizer。
yolov5-7.0 添加BiFPN,yolov5模型修改,YOLO,深度學習,計算機視覺

optimizer = smart_optimizer(model, opt.optimizer, hyp['lr0'], hyp['momentum'], hyp['weight_decay'])

接著進入這個函數(shù),可以發(fā)現(xiàn)optimizer這個函數(shù)進行重構,之前的一重for循環(huán)優(yōu)化成兩重for

def smart_optimizer(model, name='Adam', lr=0.001, momentum=0.9, decay=1e-5):
    # YOLOv5 3-param group optimizer: 0) weights with decay, 1) weights no decay, 2) biases no decay
    g = [], [], []  # optimizer parameter groups
    bn = tuple(v for k, v in nn.__dict__.items() if 'Norm' in k)  # normalization layers, i.e. BatchNorm2d()
    for v in model.modules():
        for p_name, p in v.named_parameters(recurse=0):
            if p_name == 'bias':  # bias (no decay)
                g[2].append(p)
            elif p_name == 'weight' and isinstance(v, bn):  # weight (no decay)
                g[1].append(p)
            else:
                g[0].append(p)  # weight (with decay)


    if name == 'Adam':
        optimizer = torch.optim.Adam(g[2], lr=lr, betas=(momentum, 0.999))  # adjust beta1 to momentum
    elif name == 'AdamW':
        optimizer = torch.optim.AdamW(g[2], lr=lr, betas=(momentum, 0.999), weight_decay=0.0)
    elif name == 'RMSProp':
        optimizer = torch.optim.RMSprop(g[2], lr=lr, momentum=momentum)
    elif name == 'SGD':
        optimizer = torch.optim.SGD(g[2], lr=lr, momentum=momentum, nesterov=True)
    else:
        raise NotImplementedError(f'Optimizer {name} not implemented.')

    optimizer.add_param_group({'params': g[0], 'weight_decay': decay})  # add g0 with weight_decay
    optimizer.add_param_group({'params': g[1], 'weight_decay': 0.0})  # add g1 (BatchNorm2d weights)
    LOGGER.info(f"{colorstr('optimizer:')} {type(optimizer).__name__}(lr={lr}) with parameter groups "
                f'{len(g[1])} weight(decay=0.0), {len(g[0])} weight(decay={decay}), {len(g[2])} bias')
    return optimizer

與以前的代碼相比,相似度很高,雖然g0, g1, g2 = [], [], []被 g = [], [], []所替代,但這些就是我們需要關注的地方。文章來源地址http://www.zghlxwxcb.cn/news/detail-580883.html

  • 新版將這個地方關于weight的順序翻轉了一下,這樣只要不是bias或者weight no decay,那么就全都歸結于weight with decay上.
  • 與之前需要elif 進行判斷Bi_FPN進行模型的添加相比,這里不在需要添加判斷條件了,因為最后的else會把 剩余非bias 和非weight nodecay 部分全部加到weight with decay上。
  • 也就是說,添加其他Neck時,不需要額外對optimizer進行添加elif判斷,也就實現(xiàn)了一個所謂智能的優(yōu)化。
    所以新版本對于參數(shù)g的修改,結論就是不修改,直接略過即可,智能優(yōu)化器會對多余的部分進行自動增加權重

到了這里,關于yolov5-7.0 添加BiFPN的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • YOLOv5 更換Neck之 BiFPN

    ??想了解YOLO系列算法更多教程歡迎訂閱我的專欄?? 對于基礎薄弱的同學來說,推薦閱讀《目標檢測藍皮書》??,里面涵蓋了豐富的目標檢測實用知識,是你迅速掌握目標檢測的理想選擇! 如果想了解 YOLOv5 和 YOLOv7 系列算法的訓練和改進,可以關注專欄《YOLOv5/v7 改進實戰(zhàn)

    2024年02月06日
    瀏覽(26)
  • yoloV5更換BiFPN結合小目標檢測層

    yoloV5更換BiFPN結合小目標檢測層

    本文章純屬記錄學習使用,我也不太明白是否為小目標檢測層,不對的地方還希望一塊交流 ? yolov5初始模型在特征融合時只對P3、P4、P5、三個特征層進行了融合,添加小目標檢測層的目的是把P2 (也就是yaml文件中第二個conv層得到的特征圖) 也加入到特征融合中。 P2位于低特

    2023年04月15日
    瀏覽(16)
  • YOLOv5改進 | 融合改進篇 | 華為VanillaNet + BiFPN突破漲點極限

    本文給大家?guī)淼母倪M機制是 華為VanillaNet 主干 配合 BiFPN 實現(xiàn)融合漲點,這個主干是一種注重極簡主義和效率的神經(jīng)網(wǎng)絡我也將其進行了實驗,?其中的BiFPN不用介紹了從其發(fā)布到現(xiàn)在一直是比較熱門的改進機制,其主要思想是通過多層級的特征金字塔和雙向信息傳遞來提高

    2024年02月20日
    瀏覽(23)
  • yolov5-7.0簡單訓練教程

    yolov5-7.0簡單訓練教程

    yolov5-7.0簡單訓練教程。 可以自己去git上下載,沒有梯子的點這里去百度網(wǎng)盤下載資源 點擊下載資源包:objectdetection_script-master 將下載到的腳本目錄中的yolo文件夾內(nèi)的文件復制到y(tǒng)olov5-7.0的根目錄下。 Annotations:存放VOC格式的標注的XML文件 JPEGImages:存放數(shù)據(jù)集里的圖片,圖片

    2024年02月02日
    瀏覽(27)
  • YOLOv5系列全新升級——yolov5-v7.0實時實例分割全面集成

    YOLOv5系列全新升級——yolov5-v7.0實時實例分割全面集成

    自從YOLOv5誕生依賴,社區(qū)就很活動,官方的更新頻度也很高,檢測系列一路迭代升級,集成融合了各種新穎的技術和tricks,目前最新已經(jīng)更新到了v6.1版本,在我之前的博客里面也有詳細教程講解,感興趣的話可以自行移步,文章如下: 《基于自建數(shù)據(jù)集【海底生物檢測】使

    2024年02月01日
    瀏覽(24)
  • 【目標檢測】YOLOv5-7.0:加入實例分割

    【目標檢測】YOLOv5-7.0:加入實例分割

    前段時間,YOLOv5推出7.0版本,主要更新點是在目標檢測的同時引入了實例分割。 目前,YOLOv5團隊已經(jīng)轉向了YOLOv8的更新,因此,7.0版本大概率是YOLOv5的最終穩(wěn)定版。 官方公告中給出了YOLOv5-7.0的更新要點: 推出了基于coco-seg的實例分割預訓練模型 支持Paddle Paddle模型導出 自動

    2024年02月11日
    瀏覽(16)
  • YOLOv5-7.0訓練中文標簽的數(shù)據(jù)集

    YOLOv5-7.0訓練中文標簽的數(shù)據(jù)集

    鏈接:https://pan.baidu.com/s/1KSROxTwyYnNoNxI5Tk13Dg? 提取碼:8888 (1)將metric.py中: 將 改為:? ? Windows11: ?Ubuntu20.04:? (2)將general.py中: 將 改為:? Windows11: ? ?Ubuntu20.04:? ? ? ? (3)將plots.py 中: 在頭文件處加上: Windows11: ? ?Ubuntu20.04:? ?? 在plots.py找到class? Annotator: ?? 將 改

    2024年02月02日
    瀏覽(25)
  • 使用訓練好的YOLOV5模型在已有XML標注文件中添加新類別

    ????????訓練完一個YOLOV5模型后,可以使用模型快速在已有XML標注文件中添加新類別,下面是在已有XML標注文件中添加新類別的具體腳本: ?以上代碼需要修改run函數(shù)中的:weights為yolov5模型路徑,source為圖片數(shù)據(jù)和xml標注文件所在文件夾,修改的xml也在source路徑下。親測

    2024年02月15日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領取紅包

二維碼2

領紅包