目標檢測 YOLO v1-v5 全版本差異
YOLO (You Only Look Once)是目前輕量化目標檢測網路效果最好的結構之一,經過不同的更新與改進,現在已經到了第五個版本 (v5)。在面試時,如果你提及了自己正在使用 YOLO 進行一些工作,那麼面試官不免俗地大概會問你 YOLO 的原理是什麼?這個版本與上一版本的差異是什麼?
這篇文章把 YOLO 的原理與 v1 到 v5 的各版本差異與關鍵設計做了個統整性的整理,方便大家查詢。
YOLO 簡介
YOLO 是一種 Anchor-based 的 One-Stage Object Detection 方法。輸入是一張圖,輸出會是 N 個 Bounding Box (x, y, w, h) +Label。(如上圖)
Object Detection 模型概述
對於固定大小的圖片輸入,Object Detection 方法輸出的 bounding box (以下簡稱為 bbox) 數量是固定的。圖片越大,輸出 bbox 數量就越多,但是模型裡面的 Weights 仍可以保持不變。雖然輸出的 bbox 數量很多,但是通常網路的輸出都會再經過 confidence 與 NMS (Non-Maximum Suppression) 做過濾/融合,因此只會最終顯示有意義的 bbox。
Anchor-based Detector
所有的 bbox 都是由少數幾個基準框 (稱為 Anchor) ,滑過圖片的每個區域,並且在每個區域對 Anchor 稍做縮放與拉伸所形成的。Anchor Box 在某些文章裡也被稱為 Prior Box,是同一件事情。
One-Stage Detector
對比於 Two-Stage Detector。在 Two-Stage 的網路結構中,feature map 會經過 RPN (Region Proposal Network) 單獨預測 bbox 的座標跟長寬,再連接原本的 feature map 做分類。
相反的,One-Stage Detector 省略了 RPN,直接從 feature map 回歸 bbox 與 label。與 Two-Stage 相比 ,One-Stage 減少了計算量,提升了速度,但是精度也會有一定程度的降低。
YOLO v1
YOLO 的結構設計如上圖所示,是純粹經由 Conv+Maxpool+FC 的結構組成的。這種做法比較簡單,最後輸出 Feature map 的 Shape=[w, h, (b*5+c)],其中 w, h是 Feature Map 的長寬 (在上圖的例子中 w=b=7),b 是 bbox 的數量,5 代表 bbox 的編碼後的位置 (x, y)、長寬 (w, h)、信心度 (confidence),c 代表 bbox 的 Label 數量。
常見問題:YOLO 與 SSD 的差異?
SSD (Single Shot MultiBox Detector) 是另一種輕量化 Object Detection 結構,常常被拿來與 YOLO 做比較。最關鍵的差異如下圖所示,下面簡化兩具重點:
- SSD: 各層 down-sampling 之前的特徵都會到透傳到最後的 FC 層,參與 bbox 檢測迴歸。這個設計提升了小物體的 Recall,因為淺層的網路具有更小的 Receptive Field。
- YOLO: 淺層的網路特徵不會傳到最後。這犧牲了小物體的檢測能力,但是速度會相比 SSD 較快。
YOLO v2
YOLO v2 與 v1 的網路結構大致相同,但是加入了一些改進。整體的改進點與效果對比如下表。下面逐條說明改進點。
- Batch Normalization (BN):每層之間加入了 BN 層,降低了 gradient 傳遞的難度。
- High Resolution Classifier:v2 把 ImageNet 先做過一次 pretrain,然後再遷移到 Object Detection 的 dataset 裡面做訓練。
- Convolutional With Anchor Boxes:雖說 v1 與 v2 都是 anchor-based 的方法,但是 v1 直接進入 FC 的設計相當於只有一個 1x1 的 anchor。v2 使用加入了其他長寬比的 anchor,提升了 7% 的 recall。
- Dimension Clusters:使用 k-means 來自動計算應有的 anchor 數量與長寬比。
- Direct location prediction:v2 設計了新的 bbox 座標編碼方式 (encoding)。相對於 v1 直接預測 bbox 座標與大小,v2 的做法更穩定。
- Fine-Grained Features:具體可參考下圖,將淺層的特徵合併到深層做預測。與 SSD 的設計類似,這種做法可以增加小物體的recall。
- Multi-Scale Training:v2 在訓練過程中會不斷地更換輸入圖片的大小,讓網路能夠學到各種尺度的特徵。
- Darknet-19:參考 VGG 的設計,提出新的 backbone 結構。
YOLO v3
v3 對比 v2 的改進點如下:
- Bounding Box Prediction:在 bbox encoding 的過程上是一致的,但是在計算 bbox confidence 的 loss 公式稍有不同:v2 考慮了 IoU,但 v3 直接使用 logistic regression 預測 bbox 的信心度。
- Class Prediction:v3 改用 Sigmoid 取代 Softmax 來做分類的輸出。這讓單個 bbox 可以對應多個 label,可以支援更複雜的 dataset。
- Predictions Across Scales:v3 在 3 個不同大小的 Feature Map 上都加上了 prediction head。這提升 v3 對小物體的檢測 recall。
- Anchor Boxes:v3 仍然使用 k-means 的方式產生 anchors,但 v3 對 3 個 prediction head 各自生成了 3 個 anchors,總共 9 個 anchors。
- Darknet-53:加入了 ResNet 的 residual 設計,提出新的 backbone 結構。
v3 與其他方法的效果對比可參考下圖:
YOLO v4
v4 與以往的 YOLO 差異較大,因為 v4 將 Object Detector 拆解成了不同的部分 (參考上圖),並做了一系列的對比實驗與修改,包括:backbone、數據擴增、activation 函數、loss 函數等等。
因此與其說 v4 與 v3 有甚麼差異,倒不如說 v4 與 v3 有甚麼相同的地方。
YOLO v4 與 v3 的相同點
- Prediction head 的設計與 v3 相同。
- Backbone 使用的是 CSPDarknet53,是 Darknet53 加入 CSP(Cross-Stage Paitial) 的變形系列。
YOLO v4 與 v3 的效果對比
YOLO v4 的改進
改動的地方真的太多了,我在這裡只列舉幾個:
Neck:YOLO v4 使用了 「PANet 的路徑聚合模塊 (path-aggregation)」 與 SPPNet 作為 Neck 的設計;在 v3 裡面並沒有 neck 這個部分。這裡簡單只用圖例大概說明這兩個設計的結構,細節大家可以參考論文。
- Data/Label:增加了馬賽克拼貼、CutMix的數據擴增方法,並使用 Smooth Label作為訓練輸入。
- Activation:使用 Mish Activation 取代 Relu 作為 activation function。
- Normalization:改進 CBN(Cross-Iteration Batch Normalization) 並應用到 YOLO v4 的結構中。CBN 是 BN 的改進型,用來解決小 batch 時估計 feature map 的 mean/variance 不準確的問題。
YOLO v5
YOLO v5 目前沒有正式的論文出來,最原始的發布消息包括 Roboflow 與 Github。有趣的是作者一直在 GitHub 裡面說他要發 paper,但不知道是一直沒中還是怎麼樣,YOLO v5 成為 Yolo 系列中可能是唯一一篇沒有 paper 的工作。
在開發工具上,YOLO v5 使用了現在最流行的 pyTorch 來實作。從一些測試資料來看,v5 的優勢在於比 v4 更輕量化,並保持與 v4 相似的準確率。
結語
YOLO 除了上述的五個版本之外,其實還有很多延伸的小版本 (ex: YOLO9000) 。如果花時間深入研究整個 YOLO 系列,可以學到很多的深度學習知識。
這篇文章的定位是協助大家準備面試,相當於重點筆記整理,因此就不深挖了。