特征融合篇 | YOLOv10改進之在Neck網絡中添加加權雙向特征金字塔BiFPN

前言:Hello大家好,我是小哥談。計算機視覺任務中,特征金字塔網絡(FPN)是一種常用的方法,它通過構建不同尺度的特征圖來捕獲不同尺度的目標。然而,傳統的FPN存在一些缺點,如特征融合效率低信息流通不充分等。BIFPN則通過引入雙向的特征融合機制和加權的特征融合方法來克服這些問題。🌈 ?

? ? ?目錄

🚀1.基礎概念

🚀2.網絡結構

🚀3.添加步驟

🚀4.改進方法

🍀🍀步驟1:block.py文件修改

🍀🍀步驟2:__init__.py文件修改

🍀🍀步驟3:tasks.py文件修改

🍀🍀步驟4:創建自定義yaml文件

🍀🍀步驟5:新建train.py文件

🍀🍀步驟6:模型訓練測試

🚀1.基礎概念

加權雙向特征金字塔(Weighted Bi-directional Feature Pyramid Network,簡稱BiFPN)是一種改進的特征金字塔網絡架構,它是在傳統的Feature Pyramid Network (FPN)基礎上發展而來。相較于單向的上采樣和下采樣,BiFPN引入了雙向信息流,即不僅從低層金字塔向上層傳遞特征,也從高層金字塔向下層傳播加強過的特征

BiFPN中,每個級別都包含兩個路徑一個是自底向上的路徑,用于增強底層特征另一個是從頂到底部的路徑,通過跨層級融合的方式,使得頂層的高級語義信息能夠傳達給低層這樣做的目的是為了捕獲更豐富、更大范圍的上下文信息,提高特征表示的精確性和魯棒性。

此外,BiFPN通常會采用一些權重機制來調整信息流動的方向和程度,以便優化特征融合的質量。這些權重可以根據特征的重要性或者其他學習策略動態計算。

性能比較:

核心思想:?

雙向特征融合:傳統的FPN是單向的,即從高層特征圖向低層特征圖傳遞信息。而BiFPN在此基礎上增加了反向的信息傳遞,即從低層特征圖向高層特征圖傳遞信息。這種雙向的信息流動使得特征圖之間的信息融合更加充分。

加權特征融合:BiFPN中,不同尺度的特征圖在融合時會分配不同的權重。這些權重是可學習的參數,模型在訓練過程中會自動調整它們,以最優地融合不同尺度的特征。這樣一來,模型能夠更好地利用每個特征圖的信息,提高整體的特征表示能力

論文題目:《EfficientDet: Scalable and Efficient Object Detection》

論文地址:??http://arxiv.org/pdf/1911.09070

代碼實現:??https://github.com/google/automl/tree/master/efficientdet

說明:??????

BiFPN是本文中提出的最重要的一個結構。在此之前介紹一下其他的特征金字塔網絡(FPN)結構:

FPN:采用一種自上而下的方法來組合多尺度特征
PANet:在FPN之上增加了一個額外的自下而上的路徑聚合網絡
STDL:提出了一個利用跨尺度特征的尺度轉換模塊
M2det:提出一種融合多尺度特征的U形模塊
NAS-FPN:利用神經架構搜索來自動設計特征網絡拓撲結構
BiFPN:高效的雙向跨尺度連接和加權特征融合


🚀2.網絡結構

本文的改進是基于YOLOv10,關于其網絡結構具體如下圖所示:

YOLOv10官方倉庫地址:

https://github.com/THU-MIG/yolov10

本文所作的改進是將Neck網絡更換為BiFPN改進后的網絡結構圖具體如下圖所示:


🚀3.添加步驟

針對本文的改進,具體步驟如下所示:👇

步驟1:block.py文件修改

步驟2:__init__.py文件修改

步驟3:tasks.py文件修改

步驟4:創建自定義yaml文件

步驟5:新建train.py文件

步驟6:模型訓練測試


🚀4.改進方法

🍀🍀步驟1:block.py文件修改

在源碼中找到block.py文件,具體位置是ultralytics/nn/modules/block.py,然后將BiFPN模塊代碼添加到block.py文件末尾位置。

BiFPN模塊代碼:

# By CSDN 小哥談
class Concat_BiFPN(nn.Module):def __init__(self, dimension=1):super(Concat_BiFPN, self).__init__()self.d = dimensionself.w = nn.Parameter(torch.ones(3, dtype=torch.float32), requires_grad=True)self.epsilon = 0.0001def forward(self, x):w = self.wweight = w / (torch.sum(w, dim=0) + self.epsilon)  # 將權重進行歸一化# Fast normalized fusionx = [weight[0] * x[0], weight[1] * x[1]]return torch.cat(x, self.d)

然后,在block.py文件最上方下圖所示位置加入Concat_BiFPN

🍀🍀步驟2:__init__.py文件修改

在源碼中找到__init__.py文件,具體位置是ultralytics/nn/modules/__init__.py

修改1:在下圖所示位置加入Concat_BiFPN,具體如下圖所示:

修改2:在下圖所示位置加入Concat_BiFPN,具體如下圖所示:

🍀🍀步驟3:tasks.py文件修改

在源碼中找到tasks.py文件,具體位置是ultralytics/nn/tasks.py

修改1:from ultralytics.nn.modules import ()中加入Concat_BiFPN,具體如下圖所示:

修改2:找到parse_model函數(829行左右),在下圖中所示位置添加如下代碼。

 # ------------start--------------elif m is Concat_BiFPN:c2 = sum(ch[x] for x in f)# ------------ end---------------

具體添加位置如下圖所示:

🍀🍀步驟4:創建自定義yaml文件

在源碼ultralytics/cfg/models/v10目錄下創建yaml文件,并命名為:yolov10n_BiFPN.yaml具體如下圖所示:

備注:其他版本yaml文件同理。

關于yolov10n_BiFPN.yaml文件的完整代碼如下所示:👇

# By CSDN 小哥談
# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'# [depth, width, max_channels]n: [0.33, 0.25, 1024] # YOLOv8.0n backbone
backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4- [-1, 3, C2f, [128, True]]- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8- [-1, 6, C2f, [256, True]]- [-1, 1, SCDown, [512, 3, 2]] # 5-P4/16- [-1, 6, C2f, [512, True]]- [-1, 1, SCDown, [1024, 3, 2]] # 7-P5/32- [-1, 3, C2f, [1024, True]]- [-1, 1, SPPF, [1024, 5]] # 9- [-1, 1, PSA, [1024]] # 10# YOLOv8.0n head
head:- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 3, C2f, [512]] # 13- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 3, C2f, [256]] # 16 (P3/8-small)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 13], 1, Concat, [1]] # cat head P4- [-1, 3, C2f, [512]] # 19 (P4/16-medium)- [-1, 1, SCDown, [512, 3, 2]]- [[-1, 10], 1, Concat, [1]] # cat head P5- [-1, 3, C2fCIB, [1024, True, True]] # 22 (P5/32-large)- [[16, 19, 22], 1, v10Detect, [nc]] # Detect(P3, P4, P5)
🍀🍀步驟5:新建train.py文件

在所下載的YOLOv10源碼根目錄下新建train.py文件,文件完整代碼如下所示:

# coding:utf-8
# By CSDN 小哥談
from ultralytics import YOLOv10
# 模型配置文件
model_yaml_path = "ultralytics/cfg/models/v10/yolov10n_BiFPN.yaml"
# 數據集配置文件
data_yaml_path = 'ultralytics/cfg/datasets/helmet.yaml'
# 預訓練模型
pre_model_name = 'weights/yolov10n.pt'if __name__ == '__main__':# 加載預訓練模型model = YOLOv10("ultralytics/cfg/models/v10/yolov10n_BiFPN.yaml").load('weights/yolov10n.pt')# 訓練模型results = model.train(data=data_yaml_path,epochs=100,batch=8,name='train_v10')
🍀🍀步驟6:模型訓練測試

train.py文件,點擊“運行”,在作者自制的安全帽佩戴檢測數據集上,模型可以正常訓練。

參數量對比:🌈

YOLOv10n.yaml?385 layers2707820 parameters2707804 gradients8.4 GFLOPs
YOLOv10n_BiFPN.yaml385 layers2707829 parameters2707813 gradients8.4 GFLOPs

?說明:關于測試數據集,小伙伴們可根據個人情況進行更換!~🍉 🍓 🍑 🍈 🍌 🍐???

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

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

相關文章

解鎖Postman的API參數化:動態請求的秘訣

🔑 解鎖Postman的API參數化:動態請求的秘訣 在API測試的世界里,參數化是構建靈活、可重用請求的關鍵。Postman作為API開發和測試的領軍工具,提供了強大的參數化功能,允許用戶創建動態、個性化的API請求。本文將深入探…

計算機網絡--tcpdump和iptable設置、內核參數優化策略

tcpdump工具 tcpdump命令: 選項字段: 過濾表達式: 實用命令: TCP三次握手抓包命令: #客戶端執行tcpdump 抓取數據包 tcpdump -i etho tcp and host 192.168.12.36 and port 80 -W timeout.pcapnetstat命令 netst…

7.10飛書一面面經

問題描述 Redis為什么快? 這個問題我遇到過,但是沒有好好總結,導致答得很亂。 答:Redis基于內存操作: 傳統的磁盤文件操作相比減少了IO,提高了操作的速度。 Redis高效的數據結構:Redis專門設計…

java算法day11

二叉樹的遞歸遍歷二叉樹的非遞歸遍歷寫法層序遍歷 遞歸怎么寫? 按照三要素可以保證寫出正確的遞歸算法: 1.確定遞歸函數的參數和返回值: 確定哪些參數是遞歸的過程中需要處理的,那么就在遞歸函數里加上這個參數, 并且…

第二證券:銷量暴跌95%,這一巨頭市值蒸發超3000億元!

在多重要素刺激下,PCB工作站上風口。 波音銷量墮入停滯 6月僅售出3架客機 據央視財經,在一系列丑聞的影響下,波音公司本年出售遭到明顯沖擊。當地時間9日,波音發布的數據閃現,在以前一個月,該公司僅賣出…

關于Java面向對象的一些問題(2024.7.10)

package question20240710;public class Question {/*1. 什么叫做多態,條件是什么?2. 使用多態特性,帶來了什么樣的好處?3. 使用多態特性,注意什么樣的弊端?4. 關于多態的弊端我們如何解決?5. 在…

excel有條件提取單元格特定文本(篩選純文字的單元格或含有數字的單元格、單元格提取不同的文本長度)

實際工作背景 需要對導出的銀行流水中的數十個村以及對應的村小組進行分組統計,但是初始的表格中村和小組是混在一起的,如下圖所示: 目的:將大樹村和大樹村小組名稱分別篩選出來 1.觀察發現,大樹村小組的單元格第4…

代碼隨想錄算法訓練營第四十九天| 647. 回文子串、 516.最長回文子序列

647. 回文子串 題目鏈接:647. 回文子串 文檔講解:代碼隨想錄 狀態:不會 思路: dp[i][j] 表示字符串 s 從索引 i 到索引 j 這一段子串是否為回文子串。 當s[i]與s[j]不相等,那沒啥好說的了,dp[i][j]一定是fa…

構建與操作共享棧

歸納編程學習的感悟, 記錄奮斗路上的點滴, 希望能幫到一樣刻苦的你! 如有不足歡迎指正! 共同學習交流! ??歡迎各位→點贊 ??+ 收藏? + 留言???既然選擇了遠方,當不負青春,砥礪前行! 共享棧是一種優化的棧實現方式,它允許兩個或多個棧共享同一段連續的內存空間…

Tkinter 部件使用教程

tkinter學習教程 C語言中文網Tkinter教程 菜鳥編程-Python GUI編程(Tkinter) tkinter基本組件 messagebox 【tkinter標準對話框】messagebox:信息傳遞,消息對話框! bind bind事件信息 listbox Tkinter 組件詳解之Listbox radiobutton Tkinter…

數據結構——Trie

題目: 維護一個字符串集合,支持兩種操作: I x 向集合中插入一個字符串 x𝑥;Q x 詢問一個字符串在集合中出現了多少次。 共有 N𝑁 個操作,所有輸入的字符串總長度不超過 10^5,字符串僅…

【分布式系統】Ceph對象存儲系統之RGW接口

目錄 一.對象存儲概述 二.創建RGW接口 1.在管理節點創建一個 RGW 守護進程 2.創建成功后默認情況下會自動創建一系列用于 RGW 的存儲池 3.默認情況下 RGW 監聽 7480 號端口 4.開啟 httphttps ,更改監聽端口 5.在 rgw 節點上查看端口 6.在客戶端訪問驗證 7.…

Mybatis study

一、Mybatis Plus mybatis-plus指定實體類字段不查詢 加標簽 TableField(exist false) Spring Data Jpa學習 干我們這行,啥時候懈怠,就意味著長進的停止,長進的停止就意味著被淘汰,只能往前沖,直到鳳凰涅槃的一天&am…

【onnx】onnxruntime-gpu無法使用問題

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 onnxruntime-gpu無法使用 1. 正文 CUDA版本:12.1 nvcc -VCUDNN的版本 cat /usr/include/cudnn_version.h |grep CUDNN_MAJOR -A 2說明: 可…

C#中的Dictionary

Dictionary<TKey, TValue> 是一個泛型集合&#xff0c;它存儲鍵值對&#xff08;key-value pairs&#xff09;&#xff0c;其中每個鍵&#xff08;key&#xff09;都是唯一的。這個集合類提供了快速的數據插入和檢索功能&#xff0c;因為它是基于哈希表實現的。 注意 ke…

拉曼操作維護使用手冊(中英文對照)

1 INTRODUCTION 介紹 This document contains information needed to install and operate the Laser Gas Analyzer (LGA). The information contained herein is believed to be accurate and reliable, however, inaccuracies and omissions of pertinent information are po…

Vue 3 組件通信全解:從基礎到高級技巧

引言 Vue 3 引入了 Composition API&#xff0c;這為組件通信帶來了新的靈活性和強大的功能。 組件通信基礎 組件的定義和作用 在前端開發中&#xff0c;組件可以被看作是構建用戶界面的獨立單元。它封裝了特定的功能和樣式&#xff0c;可以被重復使用&#xff0c;并且可以…

【數據結構——鏈表的深度探索】從實現到應用,保姆級攻略

【數據結構——鏈表深度探索】從實現到應用&#xff0c;保姆級攻略 &#x1f341;1. 鏈表的介紹&#x1f341;2. 鏈表的實現&#x1f341;2.1 單向鏈表&#x1f341;2.1.1 size()&#x1f341;2.1.2 display()&#x1f341;2.1.3 contains(int key)&#x1f341;2.1.4 addFirst…

墨西哥:海外新聞稿媒體分發-海外pr發稿干貨分享-大舍傳媒

大舍傳媒&#xff1a;海外新聞稿媒體分發平臺 墨西哥觀查者 (mexicoviewer) 墨西哥觀查者是墨西哥一家知名的新聞媒體平臺&#xff0c;該平臺專注于報道墨西哥國內外的時事新聞、政治、經濟、文化等多個領域的內容。其更新速度快&#xff0c;報道對象廣泛&#xff0c;深受墨西…

微信小程序---模板語法

一、聲明和綁定數據 小程序頁面中使用的數據均需要在 Page() 方法的 data 對象中進行聲明定義 在將數據聲明好以后&#xff0c;需要在 WXML 中綁定數據&#xff0c;數據綁定最簡單的方式是使用 Mustache 語法&#xff08;雙大括號&#xff09;將變量包起來。 在 {{ }} 內部可…