YOLO (You Only Look Once)是由 Joseph Redmon等人於2015年推出YOLOv1,因其的即時性和準確性獲得了廣泛的關注,YOLOv8與YOLOv5為同一個作者,且YOLOv8是由YOLOv5改進的,因此我們先來回顧一下YOLOv5
1. YOLOv5
1.1 YOLOv5網路
- Backbone : YOLOv5的backbone使用的是New CSP-Darknet53
- Neck:使用的是PAN結構
- Head:Coupled-Head
- Loss:
。分類損失:使用BCE loss,只計算正樣本的loss
。目標損失:使用BCE loss,目標指的是network預測的BBOX與Ground truth 的 BBOX的CIOU,為所有樣本的目標損失
。定位損失:使用CIOU loss,只計算正樣本的定位損失
1.2 YOLOv5結構圖
2. YOLOv8
ultralytics沒有直接將open source命名為YOLOv8而是使用ultralytics原因是ultralytics把它定義為一個框架,而非特定一個算法,他最大的特點就是可擴展性,讓使用者可以輕易的去更換自己想要的Backbone,Neck等等
2.1 YOLOv8概述
YOLOv8相比於YOLOv5最大的改動有幾點:
1. Backbone和Neck參考了YOLOv7的設計,將原本YOLOv5的C3更換成了C2f,並對於不同尺度的模型調整了不同的通道數,大幅提升了模型的效能
2. Head的部分改成了Decoupled-Head,接分類與檢測頭分離,並解將Anchor-Based 換成了Anchor-Free
3. Loss 計算方面採用了 TaskAlignedAssigner 正樣本分配,並引入了 Distribution Focal Loss策略
從上述可看出YOLOv8並沒有明顯的創新,而是結合了不同演算法的優點
2.2 YOLOv8結構圖
YOLOv8的網路結構主要由以下部分組成:
Backbone:使用卷積和反卷積層來提取特徵並使用了殘差連接和瓶頸結構來減少網路的大小。使用 C2f 作為 basic unit ,與 YOLOv5 的 C3 相比,C2f 具有更少的參數和更好的特徵提取
Neck:使用多尺度特徵融合,將 backbone 不同階段的特徵圖融合增強特徵表現能力。YOLOv8 的 Neck包括 SPFF,一個 PAA module和兩個 PAN module
Head:負責最後的目標檢測和分類任務,包含了一個檢測頭和分類頭。檢測頭包含了卷積層和反卷積層,用於生成檢測結果。分類頭使用全局平均池化層對每個特徵圖分類
3. 差異比較
3.1 參數比較
左側為yolov5,右側為yolov8,因為yolov8採用了Anchor free的概念,因此移除了anchor的參數,並且yolov8將不同版本的模型寫在一起,還在深度因子和寬度因子之外新增了最大通道數的參數
3.2 BackBone
YOLOv8 的backbone由5個Conv,4個C2f和一個SPPF組合而成,接著對每一個module來說明
3.2.1 ConvModule
主要結構為一個2D conv和一個 batchNorm2d和 SiLU激活函數,整個 conv的作用為:
- 降采樣:每個ConvModule中的 conv layer都採用了步長為2的卷積核進行降採樣以減小特徵圖的尺寸並增加通道數
- 非線性表示:每個卷積核後都接了 Batch Normalization和 SiLU激活函數,增強模型的非線性表示能力
3.2.2 C2f module
與YOLOv5的 C3 相比,C2f 具有更少的參數和更好的特徵提取能力
在 C2f 中,輸入首先經過一個 k = 1,s = 1,p = 0,c = cout 的 Conv,然後會經過 split 經過數量為n的Bottleneck後將殘差和backbone的結果進行 Concat拼接後經過一個Conv輸出
殘差連接(residual connections)是一種深層神經網路的技術。是通過跳過層級連接來傳遞殘差或誤差。
在傳統神經網路中,會通過一層層網路層傳遞資訊,每一層都會通過非線性激活函數進行轉換和提取特徵。但隨著網路的加深,可能會出現"梯度消失"或是"梯度爆炸"導致網路收斂或是性能下降。而殘差連接通過跨層級的連接將輸入的原始資訊直接傳遞到後續層級以解決梯度消失或梯度爆炸的問題。總體來說,它將網路的輸入與中間層的輸出增加,形成了捷徑讓梯度更容易地傳達。
3.3 Neck
YOLOv8的Neck在特徵提取和融合方面有著相當重要的工作。YOLOv8的Neck採用了PAN-FAN,如下圖所示:
首先將特徵提取網路(Backbone)的輸出P3, P4, P5 輸入近PAN-FAN,使得多個尺度的特徵圖進行融合,將P5經過上采樣與P4融合得到F1,F1經過C2f和一次上采樣與P3融合得到T1,T1經過一次conv與F1融合得到F2,F2經過一次C2f得到T2,T2經過一次conv與P5融合得到F3,將F3經過一次C2f得到T3,最後T1, T2, T3就是Neck的結果
Neck的詳細功能:
- Neck在YOLOv8中負責處理來自Backbone的特徵進行處理,提高目標檢測的準確性和強健性。通過引入不同的技術,將多尺度的特徵圖融合,以便捕捉不同尺度的資訊
- YOLOv8的Neck通常採用特徵金字塔(FPN),用於處理來自Backbone的多尺度特徵圖。FPN通過在不同層級上建立FPN讓模型能夠在不同尺度上進行物件辨識。通過上采樣和下采樣將低層級的細節與高層級的語義特徵進行融合
PAN-FPN 是CV中物件辨識的神經網路架構,它將特徵金字塔網路(FPN)與路徑聚合網路(PAN)結合,以提高物件辨識的準確性和效率
FPN用於不同比例的影像特徵提取,PAN用於跨網路的不同層聚合特徵。這允許網路檢測不同大小和分辨率的對象,並能處理具有更多對象的複雜場景
3.4 Head
Neck的輸出T1, T2, T3分別代表不同層級的特徵圖,Head則是對這三個特徵圖進行處理已產生模型的輸出結果的過程
YOLOv8最重要的改動就是Decoupled-Head。在Head的三個Decoupled-Head分別對應著Neck的輸出T1, T2, T3
Decoupled-Head
將特徵圖T1, T2, T3分別輸入Decoupled-Head進行預測,結構如下圖,當中包含了4個 3*3 的 Conv和 2個 1*1 的 Conv2d。回歸頭需要計算預測bbox與真實bbox之間的偏移量,然後將偏移量傳給回歸頭進行損失計算,並輸出四維向量,分別代表BBOX的左上角座標x1 , y1和右下角座標x2 , y2。分類頭對於每個Anchor -Free提取的候選框對其進行ROI Pooling和卷積得到一個分類器輸出張量每個位置上的值表示該候選框屬於各類別的概率,最後再透過極大值抑制篩選出最終的檢測結果
可以看到Head的輸出層為15, 18, 21 分別對應著Neck 的三個輸出特徵圖