社群計算機視覺課程文件
YOLO
並獲得增強的文件體驗
開始使用
YOLO
目標檢測簡短介紹
卷積神經網路在解決影像分類問題上邁出了巨大的一步。但仍有一個重要任務需要解決:目標檢測。目標檢測不僅需要從影像中對物體進行分類,還需要準確預測其在影像中的位置(在本例中,即物體邊界框的座標)。YOLO的重大突破正是在此。在深入YOLO之前,讓我們先回顧一下使用CNN進行目標檢測演算法的歷史。
RCNN, Fast RCNN, Faster RCNN
R-CNN (基於區域的卷積神經網路)
RCNN是使用卷積神經網路進行目標檢測最簡單可行的方法之一。簡單來說,其基本思想是檢測一個“區域”,然後使用CNN對該區域進行分類。這是一個多步過程。基於此思想,RCNN論文於2012年發表[1]
RCNN採用以下步驟:
- 使用選擇性搜尋演算法選擇區域。
- 使用基於CNN的分類器從區域中分類目標。
為了訓練目的,論文提出了以下步驟:
- 從目標檢測資料集中檢測到的區域製作資料集。
- 在區域資料集上微調Alexnet模型。
- 然後將微調後的模型用於目標檢測資料集。
以下是RCNN的基本流程圖 
Fast RCNN
Fast RCNN致力於在原始RCNN的基礎上進行改進。他們增加了以下四項改進:
- 單階段訓練,而非像RCNN那樣的多階段訓練。使用多工損失。
- 無需磁碟儲存。
- 引入ROI池化層,只從感興趣區域獲取特徵。
- 訓練端到端模型,與多步驟RCNN/SPPnet模型不同,使用多工損失。

Faster RCNN
Faster R-CNN完全消除了選擇性搜尋演算法的需求!這些特性使得推理時間比Fast R-CNN提高了90%!
- 它引入了RPN(區域提議網路)。RPN是一個基於注意力的模型,它訓練模型“關注”影像中包含目標的區域。
- 它將RPN與Fast RCNN合併,使其成為一個端到端的目標檢測模型。

特徵金字塔網路(FPN)
- 特徵金字塔網路是一種用於目標檢測的Inception模型。
- 它首先將影像下采樣為低維嵌入。
- 然後再次上取樣。
- 從每個上取樣影像中,它試圖預測輸出(在本例中是類別)。
- 但相似維度特徵之間也存在跳躍連線!
請參考以下取自論文的圖片。[20]
YOLO架構
YOLO是當時一項開創性的創新。它是一個即時目標檢測器,可以端到端地透過單個網路進行訓練。
YOLO之前
之前的檢測系統包括在影像塊上使用影像分類器。像可變形部件模型(DPM)這樣的系統使用滑動視窗方法,分類器在整個影像上以均勻間隔的位置執行。
其他工作,如RCNN,使用兩步檢測。首先,它們透過區域提議網路生成邊界框,檢測許多可能的感興趣區域。然後,分類器透過所有提議區域進行最終預測。還需要進行後處理,例如最佳化邊界框,消除重複檢測,以及根據場景中其他物件重新評分邊界框。
這些複雜的流水線速度慢,難以最佳化,因為每個獨立元件都必須單獨訓練。
YOLO
YOLO是一個單步檢測器,邊界框和物件類別在同一次透過中同時預測。這使得系統超快 - 每秒45幀的速度。
目標檢測的重新定義
YOLO將目標檢測任務重新定義為一個單一的迴歸問題,預測邊界框座標和類別機率。
在這個設計中,我們將影像劃分為一個 $S \times S$ 的網格。如果物件的中心落入一個網格單元格中,那麼該網格單元格負責檢測該物件。我們可以定義 $B$ 為每個單元格中要檢測的最大物件數量。因此,每個網格單元格預測 $B$ 個邊界框,包括每個框的置信度得分。
置信度
邊界框的置信度得分應反映框預測的準確性。它應該接近真實框與預測框的IOU(Intersection over Union)。如果網格不應該預測框,則應為零。因此,這應該編碼框中心在網格中出現的機率以及邊界框的正確性。
正式地,
座標
邊界框的座標編碼為4個數字 $(x, y, w, h)$。 $(x, y)$ 座標表示框相對於網格單元邊界的中心。寬度和高度歸一化到影像尺寸。
類別
類別機率是一個長為C的向量,表示給定單元格中存在物件時每個類別的條件類別機率。每個網格單元格只預測一個向量,即每個網格單元格將分配一個單一類別,因此該網格單元格預測的所有B個邊界框都將具有相同的類別。
正式地,
在測試時,我們將條件類別機率和單個框置信度預測相乘,從而為每個框提供特定於類別的置信度得分。這些得分既編碼了該類別出現在框中的機率,也編碼了預測框與物件的匹配程度。
總結一下,我們有一個影像,被劃分為 $S \times S$ 的網格。每個網格單元包含 $B$ 個邊界框,由5個值組成——置信度+4個座標,以及一個長為 $C$ 的向量,包含每個類別的條件機率。因此,每個網格單元是一個長為 $B \times 5 + C$ 的向量。整個網格是 $S \times S \times (B \times 5 + C)$。
因此,如果我們有一個可學習的系統,能將影像轉換為 $S \times S \times (B \times 5 + C)$ 特徵圖,我們就離任務更近一步了。
網路架構
在原始YOLOv1設計中,輸入是一個大小為 $448 \times 448$ 的RGB影像。影像被劃分為 $S \times S = 7 \times 7$ 的網格,其中每個網格單元負責檢測 $B=2$ 個邊界框和 $C=20$ 個類別。
網路架構是一個簡單的卷積神經網路。輸入影像透過一系列卷積層,然後是一個全連線層。最終層輸出被重塑為 $7 \times 7 \times (2 \times 5 + 20) = 7 \times 7 \times 30$。
YOLOv1的設計從GoogLeNet中汲取靈感,GoogLeNet使用1x1卷積來減少特徵圖的深度。這樣做是為了減少網路中的引數數量和計算量。該網路有24個卷積層,然後是2個全連線層。它對最後一層使用線性啟用函式,所有其他層使用Leaky ReLU啟用函式。
YOLOv1的架構見下圖。

訓練
網路是端到端地在影像和真實邊界框上訓練的。損失函式是平方誤差損失之和。損失函式旨在懲罰網路對邊界框座標、置信度和類別機率的錯誤預測。我們將在下一節討論損失函式。
YOLO為每個網格單元預測多個邊界框。在訓練時,我們只希望一個邊界框預測器負責每個物件。我們根據哪個預測與真實值具有最高的當前IOU來指定一個預測器“負責”預測一個物件。這導致了邊界框預測器之間的專業化。每個預測器在預測特定大小、長寬比或類別的物件方面表現更好,從而提高了整體召回率。我們將在損失函式中編碼此資訊,對於網格單元 $i$ 和邊界框 $b$,使用 $\mathbb{1}{ib}^{\text{obj}}$。 $\mathbb{1}{ib}^{\text{noobj}}$ 與 $\mathbb{1}_{ib}^{\text{obj}}$ 相反。
損失函式
既然我們有一個可學習的系統,可以將影像轉換為 $S \times S \times (B\times5 + C)$ 的特徵圖,我們就需要對其進行訓練。
訓練這樣一個系統的簡單方法是使用平方誤差損失之和。我們可以使用預測值和真實值之間的平方誤差,即用於邊界框座標、置信度和類別機率。
每個網格單元 $(i)$ 的損失可以如下所示:
其中
- 如果第 $i$ 個網格單元格中的第 $b$ 個邊界框負責檢測目標,則 $\mathbb{1}_{ib}^{\text{obj}}$ 為 1,否則為 0。
- 如果第 $i$ 個網格單元格包含一個物件,則 $\mathbb{1}_i^\text{obj}$ 為 1,否則為 0。
但這個損失函式不一定與目標檢測任務很好地對齊。兩個任務(分類和定位)的損失簡單相加,使得損失權重相等。
為了糾正這個問題,YOLOv1使用加權平方誤差損失之和。首先,我們為定位誤差分配一個單獨的權重,稱為 $\lambda_{\text{coord}}$。它通常設定為5。
因此,每個網格單元 $(i)$ 的損失可以如下所示:
此外,許多網格單元不包含物件。置信度接近於零,因此包含物件的網格單元通常會壓倒梯度。這使得網路在訓練期間不穩定。
為了糾正這個問題,我們還將不包含物件的網格單元中的置信度預測損失的權重設定為低於包含物件的網格單元。我們為置信度損失使用一個單獨的權重,稱為 $\lambda_{\text{noobj}}$,通常設定為 0.5。
因此,每個網格單元 $(i)$ 的置信度損失可以如下所示:
邊界框座標的平方誤差和可能存在問題。它對大框和小框中的誤差權重相同。大框中的小偏差不應像小框中的小偏差那樣受到嚴厲懲罰。
為了修正,YOLOv1 對邊界框寬度和高度的**平方根**使用平方誤差損失。這使得損失函式具有尺度不變性。
因此,每個網格單元 (i) 的定位損失可以表示為:
推理
推理很簡單。我們把影像透過網路,得到 $S \times S \times (B \times 5 + C)$ 的特徵圖。然後我們過濾掉置信度分數低於閾值的邊界框。
非極大值抑制
在極少數情況下,對於大型物體,網路會從多個網格單元預測多個邊界框。為了消除重複檢測,我們使用一種稱為非極大值抑制(NMS)的技術。NMS 的工作原理是選擇置信度分數最高的邊界框,並消除所有 IoU 大於某個閾值的其他邊界框。這個過程是迭代進行的,直到沒有重疊的邊界框為止。
端到端流程如下所示:
YOLO 的演變
到目前為止,我們已經看到了 YOLO 的基本特性,以及它如何實現高精度和快速預測。這實際上是 YOLO 的第一個版本,稱為 YOLOv1。YOLOv1 於 2015 年釋出,自那以後,已經發布了多個版本。它在精度和速度方面都具有開創性,因為它引入了使用單個卷積神經網路 (CNN) 一次性處理整個影像,並將其劃分為 S × S 網格的概念。每個網格單元直接預測邊界框和類別機率。然而,它在小影像區域的定位和多目標檢測方面表現不佳。在接下來的幾年裡,不同的團隊釋出了許多新版本,以逐步提高精度、速度和魯棒性。
YOLOv2 (2016)
在第一個版本釋出一年後,YOLOv2[5]問世了。改進的重點在於精度和速度,同時也解決了定位問題。首先,YOLOv2 用 Darknet-19 替代了 YOLOv1 的骨幹網路架構,Darknet-19 是 Darknet 架構的一個變體。Darknet-19 比之前版本的骨幹網路更輕量,它由 19 個卷積層和隨後的最大池化層組成。這使得 YOLOv2 能夠捕獲更多資訊。此外,它對所有卷積層應用了批次歸一化,從而移除了 Dropout 層,解決了過擬合問題並提高了 mAP。它還引入了錨框(anchor boxes)的概念,為檢測到的邊界框的寬度和高度添加了先驗知識(具體來說,它們使用了錨框)。此外,為了解決定位不佳的問題,YOLOv2 為每個錨框和網格單元(現在是 13x13)預測類別和物體。因此,我們最多有 13x13x5 = 845 個邊界框(對於 5 個錨框)。
YOLOv3 (2018)
YOLOv3[6]透過用更復雜但高效的 Darknet-53 替換 Darknet-19 架構,再次顯著提高了檢測速度和準確性。此外,它透過使用三種不同尺度的物件檢測(13x13、26x26 和 52x52 網格)更好地解決了定位問題。這有助於在同一區域找到不同大小的物件。它將邊界框數量增加到:13 x 13 x 3 + 26 x 26 x 3 + 52 x 52 x 3 = 10,647。非極大值抑制(NMS)仍然用於過濾掉冗餘的重疊框。
YOLOv4 (2020)
早在 2020 年,YOLOv4[7] 就成為了速度和精度方面最好的檢測模型之一,在目標檢測基準上取得了最先進的成果。作者再次改變了骨幹網路架構,選擇了更快更準確的 CSPDarknet53[8]。該版本的一個重要改進是優化了資源利用效率,使其適用於在各種硬體平臺(包括邊緣裝置)上部署。此外,它在訓練前還包含了一些增強功能,進一步提高了模型的泛化能力。作者將這些改進歸納為一套稱為“免費贈品包”(bag-of-freebies)的方法。免費贈品包是指在訓練過程中會產生開銷,但旨在提高模型在即時檢測中的準確性而不增加推理時間的最佳化方法。
YOLOv5 (2020)
YOLOv5[9] 將 Darknet 框架(用 C 語言編寫)轉換為更靈活易用的 PyTorch 框架。此版本自動化了之前的錨點檢測機制,引入了自動錨點(auto-anchors)。自動錨點會自動訓練模型錨點以匹配您的資料。在訓練期間,YOLO 會自動首先使用 k-means,然後使用遺傳演算法來演化出新的、更好匹配的錨點,並將其放回 YOLO 模型中。此外,它還提供不同型別的模型,這些模型取決於硬體限制,其名稱類似於今天的 YOLOv8 模型:YOLOv5s、YOLOv5m、YOLOv5l 和 YOLOv5x。
YOLOv6 (2022)
下一個版本 YOLOv6[10][11] 由美團視覺 AI 部門釋出,文章標題為:“YOLOv6: A Single-Stage Object Detection Framework for Industry”(YOLOv6:一個面向工業的單階段目標檢測框架)。該團隊透過關注五個方面,在速度和準確性方面取得了進一步的改進:1) 使用 RepVGG 技術進行重引數化,RepVGG 是帶有跳躍連線的 VGG 的修改版本。在推理過程中,這些連線被融合以提高速度。2) 基於重引數化的檢測器的量化。這增加了名為 Rep-PAN 的模組。3) 認識到考慮不同硬體成本和模型部署能力的重要性。具體來說,作者測試了低功耗 GPU(如 Tesla T4)與之前大多使用高成本機器(如 V100)相比的延遲。4) 引入了新的損失函式型別,如用於分類的 Varifocal Loss、用於邊界框迴歸的 IoU Series Loss 和 Distribution Focal Loss。5) 使用知識蒸餾在訓練期間提高準確性。2023 年,YOLOv6 v3[12] 釋出,標題為“YOLOv6 v3.0: A Full-Scale Reload”,該版本對網路架構和訓練方案進行了增強,與之前釋出的版本相比,再次提高了速度和準確性(在 COCO 資料集上評估)。
YOLOv7 (2022)
YOLOv7 隨論文《YOLOv7:可訓練的免費贈品集即時目標檢測器的新 SOTA》[13][14] 釋出,該論文由 YOLOv4 的作者撰寫。具體來說,此版本的“免費贈品包”包括一種新的標籤分配方法,稱為從粗到精的引導式標籤分配(coarse-to-fine lead-guided label assignment),並使用梯度流傳播路徑來分析如何將重引數化卷積與不同的網路結合起來。他們還提出了針對即時目標檢測的“擴充套件”(extend)和“複合縮放”(compound scaling)方法,可以有效利用引數和計算。所有這些改進再次將即時目標檢測推向了新的最先進水平,超越了之前的版本。
YOLOv8 (2023)
YOLOv8[15] 由 Ultralytics 於 2023 年開發,再次成為了新的 SOTA。它在骨幹網路和頸部結構上進行了改進,並採用了無錨點方法,消除了對預定義錨框的需求。取而代之的是直接進行預測。此版本支援廣泛的視覺任務,包括分類、分割和姿態估計。此外,YOLOv8 具有可伸縮性,提供各種尺寸的預訓練模型:nano、small、medium、large 和 extra-large,並且可以輕鬆地在自定義資料集上進行微調。
YOLOv9 (2024)
YOLOv9 隨論文《YOLOv9:使用可程式設計梯度資訊學習您想學習的內容》[16][17] 釋出,該論文由 YOLOv7 和 YOLOv4 的同一批作者撰寫。這篇論文強調了現有方法和架構在逐層特徵提取和空間變換過程中存在資訊丟失的問題。為了解決這個問題,作者提出了:
- 可程式設計梯度資訊(PGI)的概念,以應對深度網路實現多目標所需的各種變化。
- 廣義高效層聚合網路(GELAN),一種新的輕量級網路架構,在不犧牲計算效率的情況下,實現了比現有方法更好的引數利用率。
透過這些改變,YOLOv9 在 MS COCO 挑戰賽中創造了新的基準。
考慮到時間線和模型的不同許可,我們可以建立下圖:
關於不同版本的說明
本簡短章節以線性的方式介紹了 YOLO 的歷史/演變。然而,實際情況並非如此——許多其他版本的 YOLO 是並行釋出的。請注意 YOLOv4 和 YOLOv5 在同一年釋出。我們未涵蓋的其他版本包括 YOLOvX (2021),它基於 YOLOv3 (2018),以及 YOLOR (2021),它基於 YOLOv4 (2020),等等。此外,重要的是要理解,選擇“最佳”模型版本取決於使用者需求,例如速度、準確性、硬體限制和使用者友好性。例如,YOLOv2 在速度方面表現出色。YOLOv3 在準確性和速度之間取得了平衡。YOLOv4 具有在不同硬體上適應或相容的最佳能力。
參考
[1][用於精確目標檢測和語義分割的豐富特徵層次結構](https://arxiv.org/abs/1311.2524v5)
[2][快速 R-CNN](https://arxiv.org/abs/1504.08083)
[3][更快 R-CNN](https://arxiv.org/pdf/1506.01497.pdf)
[4][特徵金字塔網路](https://arxiv.org/pdf/1612.03144.pdf)
[5][YOLO9000: 更好、更快、更強](https://arxiv.org/abs/1612.08242)
[6][YOLOv3: 增量改進](https://arxiv.org/abs/1804.02767)
[7][YOLOv4: 目標檢測的最佳速度和精度](https://arxiv.org/abs/2004.10934)
[8][YOLOv4 GitHub 倉庫](https://github.com/AlexeyAB/darknet)
[9][Ultralytics YOLOv5](https://docs.ultralytics.com/models/yolov5/)
[10][YOLOv6: 用於工業應用的單階段目標檢測框架](https://arxiv.org/abs/2209.02976)
[11][YOLOv6 GitHub 倉庫](https://github.com/meituan/YOLOv6)
[12][YOLOv6 v3.0: 全面過載](https://arxiv.org/abs/2301.05586)
[13][YOLOv7: 可訓練的免費贈品集即時目標檢測器的新 SOTA](https://arxiv.org/abs/2207.02696)
[14][YOLOv7 GitHub 倉庫](https://github.com/WongKinYiu/yolov7)
[15][Ultralytics YOLOv8](https://github.com/ultralytics/ultralytics)
[16][YOLOv9: 使用可程式設計梯度資訊學習你想要學習的東西](https://arxiv.org/abs/2402.13616)
[17][YOLOv9 GitHub 倉庫](https://github.com/WongKinYiu/yolov9)
[18][YOLOvX](https://yolovx.com/)
[19][你只學習一種表示:用於多工的統一網路](https://arxiv.org/abs/2105.04206) [20][特徵金字塔網路論文](https://arxiv.org/abs/1612.03144)