YOLOv5改進 | Neck | 添加雙向特征金字塔BiFPN【小白輕松上手 | 論文必備】

🚀🚀🚀本專欄所有的改進均可成功執行🚀🚀🚀

盡管Ultralytics 推出了最新版本的 YOLOv8 模型。但YOLOv5作為一個anchor base的目標檢測的算法,YOLOv5可能比YOLOv8的效果更好。但是針對不同的數據集仍然有提升改進的空間,本文給大家帶來的教程是修改BiFPN到Neck中。文章在簡單介紹原理后,將手把手教學如何進行模塊的代碼添加和修改,并將修改后的完整代碼放在文章的最后,方便大家一鍵運行,小白也可輕松上手實踐。以幫助您更好地學習深度學習目標檢測YOLO系列的挑戰。


專欄地址YOLOv5改進+入門——持續更新各種有效漲點方法?

目錄

1.原理

2.BiFPN代碼

2.1 添加BiFPN代碼

2.2 新增yaml文件

2.3 注冊模塊

2.4 執行程序

3.總結


?1.原理

論文地址:EfficientDet: Scalable and Efficient Object Detection點擊即可跳轉?

官方代碼:官方代碼倉庫點擊即可跳轉

BiFPN,即Bilateral Feature Pyramid Network,是一種用于目標檢測任務的神經網絡結構。它是對FPN(Feature Pyramid Network)的改進,旨在提高特征金字塔網絡的性能,特別是在處理高分辨率圖像時。

BiFPN最初是在EfficientDet模型中提出的,EfficientDet是一種高效的目標檢測模型,結合了BiFPN、EfficientNet和其他一些技巧。BiFPN的主要目標是處理FPN中存在的信息損失和模糊性的問題。

BiFPN引入了兩個關鍵的概念來改善FPN:

1. 雙向連接(Bilateral Connections):BiFPN不僅在不同層級之間進行自上而下的特征傳遞,還引入了自下而上的特征傳遞,這樣可以更好地利用不同層級的特征信息。

2. 雙線性匯聚(Bilinear Pooling):BiFPN使用雙線性匯聚來融合不同分辨率的特征圖,從而提高了特征的表征能力。

通過這些改進,BiFPN在目標檢測任務中取得了很好的效果,尤其是在處理大分辨率圖像和小目標時,相比于傳統的FPN結構,BiFPN能夠提供更加準確和穩定的特征表征,從而提高了目標檢測的性能。

2.BiFPN代碼

2.1 添加BiFPN代碼

關鍵步驟一:在\yolov5-6.1\models\common.py中添加下面代碼

# 結合BiFPN 設置可學習參數 學習不同分支的權重
# 兩個分支concat操作
class BiFPN_Concat2(nn.Module):def __init__(self, dimension=1):super(BiFPN_Concat2, self).__init__()self.d = dimensionself.w = nn.Parameter(torch.ones(2, 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)# 三個分支concat操作
class BiFPN_Concat3(nn.Module):def __init__(self, dimension=1):super(BiFPN_Concat3, self).__init__()self.d = dimension# 設置可學習參數 nn.Parameter的作用是:將一個不可訓練的類型Tensor轉換成可以訓練的類型parameter# 并且會向宿主模型注冊該參數 成為其一部分 即model.parameters()會包含這個parameter# 從而在參數優化的時候可以自動一起優化self.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], weight[2] * x[2]]return torch.cat(x, self.d)

BiFPN的主要流程可以分為以下幾個步驟:

1. 特征提取:首先,輸入圖像經過卷積神經網絡(如EfficientNet等)進行特征提取,得到一系列特征圖,這些特征圖包含了不同層級的語義信息。

2. 自下而上特征傳遞:BiFPN從底層開始,利用雙線性池化將低分辨率特征圖上采樣到高分辨率,然后使用雙向連接,將上一層的特征圖與下一層的上采樣特征圖進行融合。這種自下而上的特征傳遞可以幫助從更低層級獲取更豐富的信息。

3. 自上而下特征傳遞:接著,BiFPN沿著特征金字塔網絡的自上而下路徑進行特征傳遞。在這個過程中,BiFPN利用雙向連接,將上一層的特征圖與下一層的上采樣特征圖進行融合,以獲得更加豐富和準確的特征表征。

4. 多尺度特征融合:BiFPN在每個層級上都進行多尺度特征融合,將不同分辨率的特征圖通過雙線性池化進行融合,從而提高特征的表征能力和魯棒性。

5. 最終特征輸出:最后,BiFPN輸出的特征圖經過一系列后續處理,如分類器和回歸器等,用于目標檢測任務中的目標分類和邊界框回歸等。

通過這樣的流程,BiFPN能夠充分利用不同層級的特征信息,并通過雙向連接和雙線性池化等技巧,提高了特征的表征能力和目標檢測的性能。

2.2 新增yaml文件

關鍵步驟二:在 /yolov5/models/ 下新建文件 yolov5_bifpn.yaml并將下面代碼復制進去

# 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]],  # 10]# YOLOv5 v6.0 BiFPN head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, BiFPN_Concat2, [1]],  # cat backbone P4 <--- BiFPN change[-1, 3, C3, [512, False]],  # 13[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, BiFPN_Concat2, [1]],  # cat backbone P3 <--- BiFPN change[-1, 3, C3, [256, False]],  # 17 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 14, 6], 1, BiFPN_Concat3, [1]],  # cat P4 <--- BiFPN change[-1, 3, C3, [512, False]],  # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, BiFPN_Concat2, [1]],  # cat head P5 <--- BiFPN change[-1, 3, C3, [1024, False]],  # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]

溫馨提示:因為本文只是對yolov5n基礎上添加swin模塊,如果要對yolov5n/l/m/x進行添加則只需要修改對應的depth_multiple 和 width_multiple。


yolov5n/l/m/x對應的depth_multiple 和 width_multiple如下:

# YOLOv5n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple# YOLOv5s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple# YOLOv5l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple# YOLOv5m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple# YOLOv5x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple
2.3 注冊模塊

關鍵步驟三:在yolov5/models/yolo.py中注冊,大概在270行左右添加下面內容

# 添加bifpn_concat結構
elif m is BiFPN_Concat2:c2 = sum(ch[x] for x in f)
# 添加bifpn_concat結構
elif m is BiFPN_Concat3:c2 = sum(ch[x] for x in f)

關鍵步驟四:在yolov5/train.py中注冊,大概在160行左右添加下面內容?

# 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)
2.4 執行程序

在train.py中,將cfg的參數路徑設置為yolov5_bifpn.yaml的路徑,如下圖所示

建議大家寫絕對路徑,確保一定能找到

?🚀運行程序,如果出現下面的內容則說明添加成功🚀

我修改后的代碼:鏈接: https://pan.baidu.com/s/1g1FREXzvRT4PpyYi9XYkzg?pwd=9m3b 提取碼: 9m3b

3.總結

BiFPN是一種用于目標檢測任務的改進型特征金字塔網絡,旨在解決傳統FPN在處理高分辨率圖像和小目標時存在的信息損失和模糊性問題。其主要流程包括特征提取、自下而上特征傳遞、自上而下特征傳遞、多尺度特征融合和最終特征輸出。BiFPN通過引入雙向連接和雙線性池化等關鍵技術,有效地提高了特征的表征能力和目標檢測的性能,特別是在處理大分辨率圖像和小目標時具有顯著優勢。?

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

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

相關文章

CDN都有哪些優勢?

內容分發網絡是一個經策略性部署的整體系統&#xff0c;其中包含了分布式存儲、負載均衡、網絡請求的重定向和內容管理四個要求&#xff0c;CDN的主要核心則是內容管理和全局的網絡流量管理&#xff0c;CDN可以確保內容會以一種非常高效的方式為用戶的請求提供服務。 接下來就讓…

Linux 第三十五章

&#x1f436;博主主頁&#xff1a;??. 一懷明月? ???&#x1f525;專欄系列&#xff1a;線性代數&#xff0c;C初學者入門訓練&#xff0c;題解C&#xff0c;C的使用文章&#xff0c;「初學」C&#xff0c;linux &#x1f525;座右銘&#xff1a;“不要等到什么都沒有了…

Kubernetes安裝calico網絡插件失敗

今天啥也沒干成&#xff0c;不想排版了。 接著昨天搭建k8s集群&#xff0c;安裝calico插件&#xff0c;虛擬機一直卡。 # 在 master 節點上執行 # 下載 calico 配置文件&#xff0c;可能會網絡超時 curl https://docs.tigera.io/archive/v3.25/manifests/calico.yaml -O # 修…

[svelte] 怎么引入fortawesome的icon樣式

首先在項目的終端下執行以下命令 npm install fortawesome/fontawesome-free # 或者 yarn add fortawesome/fontawesome-free這樣子可以把fontawsome的圖標給下載到項目的對應文件中 一般都是在node_modules中 在fontawsome/fontawesome-free中就可以看到很多文件夾了 …

unapp寫微信小程序封裝水印相機組件怎么實現?

<template><view><!-- <cu-custom bgColor"bg-gradual-blue" :isBack"true"><block slot"backText">返回</block><block slot"content">編輯資料</block></cu-custom> --><…

Docker學習(10)搭建kubernetes集群

搭建kubernetes集群 1、官方部署方式&#xff1a; Minikube工具安裝 Minikube是一種能夠在計算機或者虛擬機(VM)內輕松運行單節點Kubernetes 集群的工具&#xff0c;可實現一鍵部署。這種方式安裝的系統在企業中大多被當作測試系統使用。 使用yum安裝 通過直接使用 epel-r…

三步在 vite 中配置 tailwindcss

前言 tailwindcss 是一個原子化的 css 工具&#xff0c;可以讓你免于寫 css&#xff0c;只寫 html 即可原理&#xff1a;利用你寫的 html 的 class 名稱來生成 css 樣式&#xff0c;理解為一個 postcss 插件或 loader 第一步&#xff1a;安裝 tailwindcss npm i -D tailwind…

圖片恢復的實用指南,為你拯救遺失的記憶!

隨著科技的日新月異&#xff0c;我們的生活已被照片填滿。它們記錄著我們的喜怒哀樂&#xff0c;見證著每一個重要的時刻。但我們往往會因為各種原因將手機圖片遺失&#xff0c;有什么方法可以恢復呢&#xff1f;本文將提供一份實用的圖片恢復指南&#xff0c;幫助你找回那些遺…

山西大學化學化工學院朱鳳祥教授簡介

男&#xff0c;1989年出生&#xff0c;河南安陽人&#xff0c;2019年1月于山西大學化學化工學院任特聘教授&#xff0c;主要研究方向為有機催化&#xff0c;曾獲國家自然科學基金資助&#xff08;2020-2023&#xff09;&#xff0c;迄今在國際高級雜志發表SCI論文20余篇。 200…

llama使用tutorial微調(windows版本)

Llama3-Tutorial/docs/assistant.md at main SmartFlowAI/Llama3-Tutorial GitHub 有一些命令需要修改 前期的安裝還是要按照教程搞的 streamlit run ~/Llama3-Tutorial/tools/internstudio_web_demo.py \ ~/model/Meta-Llama-3-8B-Instruct 改為了 streamlit run .\Ll…

ArrayList和LinkedList的使用

ArrayList List<> list new ArrayList<>(); LinkedList

SQL注入漏洞常用繞過方法

SQL注入漏洞 漏洞描述 Web 程序代碼中對于用戶提交的參數未做過濾就直接放到 SQL 語句中執行&#xff0c;導致參數中的特殊字符打破了原有的SQL 語句邏輯&#xff0c;黑客可以利用該漏洞執行任意 SQL 語句&#xff0c;如查詢數據、下載數據、寫入webshell 、執行系統命令以及…

WPF使用ItemsControl顯示Object的所有屬性值

對于上位機開發&#xff0c;我們有時候有這樣的需求&#xff1a;如何顯示所有的IO點位&#xff1f;比如有10個IO點位&#xff0c;那我們要寫10個TextBlock去綁定這10個點位的屬性&#xff08;本文暫時不考慮顯示的樣式&#xff0c;當然也可以考慮&#xff09;&#xff0c;當點位…

springboot整合swagger,jpa遇到的問題

1.整合jpa&#xff0c;版本問題導致Archive for required library: ‘C:/Users/Administrator/.m2/repository/org/aspectj/aspectjweaver/1.8.13/aspectjweaver-1.8.13.jar’ in project ‘money-server’ cannot be read or is not a valid ZIP file money-server Build path…

Leetcode 257:二叉樹的所有路徑

給你一個二叉樹的根節點 root &#xff0c;按 任意順序 &#xff0c;返回所有從根節點到葉子節點的路徑。 葉子節點 是指沒有子節點的節點。 思路&#xff1a; 先編輯所有節點&#xff0c;記錄每一個節點的路徑&#xff1b; 判斷當前節點是否為葉子節點&#xff0c;如果是&…

霍庭格TruPlasma MF 7100 7050電源現貨50KW

霍庭格TruPlasma MF 7100 7050電源現貨50KW

mysql json 數組怎么搜索

在MySQL中&#xff0c;可以使用JSON_CONTAINS函數來搜索JSON數組中的元素。這里有一個簡單的例子&#xff1a; 假設有一個名為items的表&#xff0c;其中有一個名為attributes的列&#xff0c;包含JSON數組。 CREATE TABLE items (id INT AUTO_INCREMENT PRIMARY KEY,attribu…

SQLSERVER 怎樣使查詢不占鎖

對一些相對不怎么敏感的數據&#xff0c;不需要太及時性的數據&#xff0c;不需要占鎖。 要在SQL Server中執行查詢而不占用鎖&#xff0c;可以采取以下幾個策略&#xff1a; 1、使用NOLOCK提示&#xff1a; 最直接但風險較高的方法是在查詢中使用WITH (NOLOCK)提示。這樣&am…

練習題(2024/5/16)

1輪轉數組 給定一個整數數組 nums&#xff0c;將數組中的元素向右輪轉 k 個位置&#xff0c;其中 k 是非負數。 示例 1: 輸入: nums [1,2,3,4,5,6,7], k 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右輪轉 1 步: [7,1,2,3,4,5,6] 向右輪轉 2 步: [6,7,1,2,3,4,5] 向右輪轉 3 步: [5,…

【C語言深度解剖】:(11)函數指針、函數指針數組、指向函數指針數組的指針、回調函數

&#x1f921;博客主頁&#xff1a;醉竺 &#x1f970;本文專欄&#xff1a;《C語言深度解剖》《精通C指針》 &#x1f63b;歡迎關注&#xff1a;感謝大家的點贊評論關注&#xff0c;祝您學有所成&#xff01; ??&#x1f49c;&#x1f49b;想要學習更多C語言深度解剖點擊專欄…