yolov8與yolov5網絡對比

回顧一下YOLOv5,不然沒機會了

這里粗略回顧一下,這里直接提供YOLOv5的整理的結構圖吧:

  1. Backbone:CSPDarkNet結構,主要結構思想的體現在C3模塊,這里也是梯度分流的主要思想所在的地方;
  2. PAN-FPN:雙流的FPN,必須香,也必須快,但是量化還是有些需要圖優化才可以達到最優的性能,比如cat前后的scale優化等等,這里除了上采樣、CBS卷積模塊,最為主要的還有C3模塊(記住這個C3模塊哦);
  3. Head:Coupled Head+Anchor-base,毫無疑問,YOLOv3、YOLOv4、YOLOv5、YOLOv7都是Anchor-Base的,后面會變嗎?
  4. Loss:分類用BEC Loss,回歸用CIoU Loss。

YOLOv5

話不多說,直接YOLOv8吧!

直接上YOLOv8的結構圖吧,小伙伴們可以直接和YOLOv5進行對比,看看能找到或者猜到有什么不同的地方?

在這里插入圖片描述

下面就直接揭曉答案吧,具體改進如下:

  1. Backbone:使用的依舊是CSP的思想,不過YOLOv5中的C3模塊被替換成了C2f模塊,實現了進一步的輕量化,同時YOLOv8依舊使用了YOLOv5等架構中使用的SPPF模塊;
  2. PAN-FPN:毫無疑問YOLOv8依舊使用了PAN的思想,不過通過對比YOLOv5與YOLOv8的結構圖可以看到,YOLOv8將YOLOv5中PAN-FPN上采樣階段中的卷積結構刪除了,同時也將C3模塊替換為了C2f模塊;
  3. Decoupled-Head:是不是嗅到了不一樣的味道?是的YOLOv8走向了Decoupled-Head;
  4. YOLOv8拋棄了以往的Anchor-Base,使用了Anchor-Free的思想;
  5. 損失函數:YOLOv8使用VFL Loss作為分類損失,使用DFL Loss+CIOU Loss作為分類損失;
  6. 樣本匹配:YOLOv8拋棄了以往的IOU匹配或者單邊比例的分配方式,而是使用了Task-Aligned Assigner匹配方式。

1、C2f模塊是什么?與C3有什么區別?

我們不著急,先看一下C3模塊的結構圖,然后再對比與C2f的具體的區別。針對C3模塊,其主要是借助CSPNet提取分流的思想,同時結合殘差結構的思想,設計了所謂的C3 Block,這里的CSP主分支梯度模塊為BottleNeck模塊,也就是所謂的殘差模塊。同時堆疊的個數由參數n來進行控制,也就是說不同規模的模型,n的值是有變化的。

C3

其實這里的梯度流主分支,可以是任何之前你學習過的模塊,比如,美團提出的YOLOv6中就是用來重參模塊RepVGGBlock來替換BottleNeck Block來作為主要的梯度流分支,而百度提出的PP-YOLOE則是使用了RepResNet-Block來替換BottleNeck Block來作為主要的梯度流分支。而YOLOv7則是使用了ELAN Block來替換BottleNeck Block來作為主要的梯度流分支。

C3模塊的Pytorch的實現如下:

class C3(nn.Module):# CSP Bottleneck with 3 convolutionsdef __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansionsuper().__init__()c_ = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c1, c_, 1, 1)self.cv3 = Conv(2 * c_, c2, 1)  # optional act=FReLU(c2)self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))def forward(self, x):return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))

下面就簡單說一下C2f模塊,通過C3模塊的代碼以及結構圖可以看到,C3模塊和名字思路一致,在模塊中使用了3個卷積模塊(Conv+BN+SiLU),以及n個BottleNeck。

通過C3代碼可以看出,對于cv1卷積和cv2卷積的通道數是一致的,而cv3的輸入通道數是前者的2倍,因為cv3的輸入是由主梯度流分支(BottleNeck分支)依舊次梯度流分支(CBS,cv2分支)cat得到的,因此是2倍的通道數,而輸出則是一樣的。

不妨我們再看一下YOLOv7中的模塊:

YOLOv7通過并行更多的梯度流分支,放ELAN模塊可以獲得更豐富的梯度信息,進而或者更高的精度和更合理的延遲。

C2f模塊的結構圖如下:

我們可以很容易的看出,C2f模塊就是參考了C3模塊以及ELAN的思想進行的設計,讓YOLOv8可以在保證輕量化的同時獲得更加豐富的梯度流信息。

C2f模塊對應的Pytorch實現如下:

class C2f(nn.Module):# CSP Bottleneck with 2 convolutionsdef __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansionsuper().__init__()self.c = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, 2 * self.c, 1, 1)self.cv2 = Conv((2 + n) * self.c, c2, 1)  # optional act=FReLU(c2)self.m = nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n))def forward(self, x):y = list(self.cv1(x).split((self.c, self.c), 1))y.extend(m(y[-1]) for m in self.m)return self.cv2(torch.cat(y, 1))

SPPF改進了什么?

這里講解的文章就很多了,這里也就不具體描述了,直接給出對比圖了

上圖中,左邊是SPP,右邊是SPPF。

PAN-FPN改進了什么?

我們先看一下YOLOv5以及YOLOv6的PAN-FPN部分的結構圖:

YOLOv5的Neck部分的結構圖如下:

YOLOv6的Neck部分的結構圖如下:

我們再看YOLOv8的結構圖:

可以看到,相對于YOLOv5或者YOLOv6,YOLOv8將C3模塊以及RepBlock替換為了C2f,同時細心可以發現,相對于YOLOv5和YOLOv6,YOLOv8選擇將上采樣之前的1×1卷積去除了,將Backbone不同階段輸出的特征直接送入了上采樣操作。

Head部分都變了什么呢?

先看一下YOLOv5本身的Head(Coupled-Head):

而YOLOv8則是使用了Decoupled-Head,同時由于使用了DFL 的思想,因此回歸頭的通道數也變成了4*reg_max的形式:

對比一下YOLOv5與YOLOv8的YAML

損失函數

對于YOLOv8,其分類損失為VFL Loss,其回歸損失為CIOU Loss+DFL的形式,這里Reg_max默認為16。

VFL主要改進是提出了非對稱的加權操作,FL和QFL都是對稱的。而非對稱加權的思想來源于論文PISA,該論文指出首先正負樣本有不平衡問題,即使在正樣本中也存在不等權問題,因為mAP的計算是主正樣本。

q是label,正樣本時候q為bbox和gt的IoU,負樣本時候q=0,當為正樣本時候其實沒有采用FL,而是普通的BCE,只不過多了一個自適應IoU加權,用于突出主樣本。而為負樣本時候就是標準的FL了。可以明顯發現VFL比QFL更加簡單,主要特點是正負樣本非對稱加權、突出正樣本為主樣本。

針對這里的DFL(Distribution Focal Loss),其主要是將框的位置建模成一個 general distribution,讓網絡快速的聚焦于和目標位置距離近的位置的分布。

DFL 能夠讓網絡更快地聚焦于目標 y 附近的值,增大它們的概率;

DFL的含義是以交叉熵的形式去優化與標簽y最接近的一左一右2個位置的概率,從而讓網絡更快的聚焦到目標位置的鄰近區域的分布;也就是說學出來的分布理論上是在真實浮點坐標的附近,并且以線性插值的模式得到距離左右整數坐標的權重。

樣本的匹配

標簽分配是目標檢測非常重要的一環,在YOLOv5的早期版本中使用了MaxIOU作為標簽分配方法。然而,在實踐中發現直接使用邊長比也可以達到一阿姨給你的效果。而YOLOv8則是拋棄了Anchor-Base方法使用Anchor-Free方法,找到了一個替代邊長比例的匹配方法,TaskAligned。

為與NMS搭配,訓練樣例的Anchor分配需要滿足以下兩個規則:

  1. 正常對齊的Anchor應當可以預測高分類得分,同時具有精確定位;
  2. 不對齊的Anchor應當具有低分類得分,并在NMS階段被抑制。
    基于上述兩個目標,TaskAligned設計了一個新的Anchor alignment metric 來在Anchor level 衡量Task-Alignment的水平。并且,Alignment metric 被集成在了 sample 分配和 loss function里來動態的優化每個 Anchor 的預測。
Anchor alignment metric:

分類得分和 IoU表示了這兩個任務的預測效果,所以,TaskAligned使用分類得分和IoU的高階組合來衡量Task-Alignment的程度。使用下列的方式來對每個實例計算Anchor-level 的對齊程度:

s 和 u 分別為分類得分和 IoU 值,α 和 β 為權重超參。
從上邊的公式可以看出來,t 可以同時控制分類得分和IoU 的優化來實現 Task-Alignment,可以引導網絡動態的關注于高質量的Anchor。

Training sample Assignment:

為提升兩個任務的對齊性,TOOD聚焦于Task-Alignment Anchor,采用一種簡單的分配規則選擇訓練樣本:對每個實例,選擇m個具有最大t值的Anchor作為正樣本,選擇其余的Anchor作為負樣本。然后,通過損失函數(針對分類與定位的對齊而設計的損失函數)進行訓練。

參考

[1].https://github.com/uyolo1314/ultralytics.

[2].https://github.com/meituan/YOLOv6.

[3].https://arxiv.org/abs/2209.02976.

[4].https://github.com/PaddlePaddle/PaddleDetection.

[5].https://github.com/PaddlePaddle/PaddleYOLO.

[6].https://github.com/open-mmlab/mmyolo.

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

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

相關文章

OFDM模糊函數仿真

文章目錄 前言一、OFDM 信號及模糊函數1、OFDM 信號表達式2、模糊函數表達式 二、MATLAB 仿真1、MATLAB 核心源碼2、仿真結果①、OFDM 模糊函數②、OFDM 距離模糊函數③、OFDM 速度模糊函數 前言 本文進行 OFDM 的仿真,首先看一下 OFDM 的模糊函數仿真效果&#xf…

【vim】常用操作

用的時候看看,記太多也沒用,下面都是最常用的,更多去查文檔vim指令集。 以下均為正常模式下面操作,正在編輯的,先etc一下. 1/拷貝當前行 yy,5yy為拷貝包含當前行往下五行 2/p將拷貝的東西粘貼到當前行下…

Nmap腳本的應用場景

網絡安全檢測和漏洞掃描 Nmap腳本是一種強大的工具,可以用于網絡安全檢測和漏洞掃描。在滲透測試工程師的角度下,本文將詳細闡述Nmap腳本的應用場景,以及如何使用Nmap腳本進行網絡安全檢測和漏洞掃描。 一、Nmap腳本的應用場景 Nmap腳本在滲…

Java、JDK、JRE、JVM

Java、JDK、JRE、JVM 一、 Java 廣義上看,Kotlin、JRuby等運行于Java虛擬機上的編程語言以及相關的程序都屬于Java體系的一員。從傳統意義上看,Java社區規定的Java技術體系包括以下幾個部分: Java程序設計語言各種硬件平臺上的Java虛擬機實…

vue的知識點

Vue.js是一個漸進式JavaScript框架,用于簡化Web應用程序開發和管理。下面是Vue.js的一些核心知識點: 1. 數據綁定:Vue.js通過指令和模板語法實現了雙向數據綁定,可以實時更新視圖和模型之間的數據。 2. 組件化開發:V…

【力扣】移除鏈表元素203

目錄 1.前言2. 題目描述3. 題目分析3.1 不帶哨兵位3.2 帶哨兵位 4. 附代碼4.1 不帶哨兵位4.2 帶哨兵位 1.前言 這里開始介紹從網上一些刷題網站上的題目,在這里做一些分享,和學習記錄。 先來介紹一些力扣的OJ題目。 這里的OJ就是我們不需要寫主函數&…

數據表記錄的操作

一、數據添加 1、打開SSMS,附加數據庫(數據庫文件在自己的文件夾下面),并進行下面的設置: (1)設置“部門信息”表中的“編號”為主鍵(SSMS) 首先建立好所需的數據庫庫…

華為OD機試 - 生成哈夫曼樹(Java JS Python C)

題目描述 給定長度為 n 的無序的數字數組,每個數字代表二叉樹的葉子節點的權值,數字數組的值均大于等于1。 請完成一個函數,根據輸入的數字數組,生成哈夫曼樹,并將哈夫曼樹按照中序遍歷輸出。 為了保證輸出的二叉樹中序遍歷結果統一,增加以下限制: 二叉樹節點中,左節…

java中什么是線程池?

線程池(Thread Pool)是一種線程管理的機制,它主要解決了線程生命周期的開銷和資源消耗問題。線程池在程序中創建一些預先定義數量的線程,將任務分配給這些線程,從而提高了線程的重用性和性能。線程池的核心思想是將創建…

為 Compose MultiPlatform 添加 C/C++ 支持(3):實戰 Desktop、Android、iOS 調用同一個 C/C++ 代碼

theme: serene-rose 前言 在本系列的前兩篇文章中我們已經學會了如何在 kotlin native 平臺(iOS)使用 cinterop 調用 C/C 代碼。以及在 jvm 平臺(Android、Desktop)使用 jni 調用 C/C 代碼,并且知道了如何自動編譯 A…

Git 五分鐘教程速度入門

Git 五分鐘教程速度入門 分類 編程技術 許多人認為 Git 太混亂,或認為它是一種復雜的版本控制系統,其實不然,這篇文章有助于大家快速上手使用 Git。 入門 使用Git前,需要先建立一個倉庫(repository)。您可以使用一個已經存在的…

Win10操作系統安裝Python

1 Python解釋器下載 1.1 安裝環境 Windows 10 專業工作站版22H2 python-3.9.6-amd64.exe 1.2 下載地址 Python官網:Welcome to Python.org Python鏡像:CNPM Binaries Mirror 2 Python解釋器安裝 2.1 Install Python 3.9.6 (64-bit)界面 雙擊運行下…

鴻蒙開發組件之list

1、鴻蒙中的list作為可滑動列表功能,初始化方式是 List({space: 10}){ForEach(arr, item > {ListItem() {//列表單個Item組件}})} 其中,List中的space可以設置兩個ListItem組件的間距 List中是一個ForEach,需要注意的是item要返回的是L…

【數據結構】面試OJ題———棧|隊列|互相實現|循環隊列|括號匹配

目錄 1. 有效的括號 思路: 2.用隊列實現棧 思路: 3.用棧實現隊列 思路: 4.設計循環隊列 思路: 1. 有效的括號 20. 有效的括號 - 力扣(LeetCode) 給定一個只包括 (,),{&…

Hive SQL間隔連續問題

問題引入 下面是某游戲公司記錄的用戶每日登錄數據, 計算每個用戶最大的連續登錄天數,定義連續登錄時可以間隔一天。舉例:如果一個用戶在 1,3,5,6,9 登錄了游戲,則視為連續 6 天登錄。 id dt1001 2021-12-121002 2021-12-12…

visual studio code 好用的插件

vscode-icons Better comments 該插件對不同類型的注釋會附加了不同的顏色,更加方便區分,幫助我們在代碼中創建更人性化的注釋。 Error Lens Error Lens插件是一款可以檢測你編寫的代碼的語法錯誤,并且會顯示出對語法錯誤的診斷信息…

USB的高速速率是如何確定的?

從全局說起。先說host對dev的插入檢測。由于dev插入到host,導致為0的D和D-線突然有了電平變化,有且只有一根線的電平會變。在高速和全速模式下,D線會被拉高;在低速模式下D-線會被拉高。同時,host會對插入的dev進行消抖…

RCNN 學習

RCNN算法流程 RCNN算法流程可分為4個步驟 一張圖像生成1K~2K個候選區域(使用Selective Search方法)對每個候選區域,使用深度網絡圖特征特征送入每一類的SVM分類器,判別是否屬于該類使用回歸期器細修正候選框位置 1.候選區域的生…

【星海隨筆】Prometheus(一)

注:Pagerduty作為報警系統,出鏡率很高。 雖然收費,但對于企業來說很便宜。 一個月幾十美金 不太支持中文,主要是語音方面。 Prometheus 查詢語句 , 基于數學運算模式的監控查詢 我們計算一下一天多少秒 1 * 24 * 60 *…

ChatGPT是科學還是藝術?

OpenAI最近談到GPT4變懶的問題,說“它更像是多人共同參與的藝術創作”,那到底大模型是科學還是藝術?