YOLO演進 — 1

李謦伊
謦伊的閱讀筆記
16 min readAug 21, 2020

在上篇文章: YOLOv4 訓練教學 有提到過 YOLO 的作法以及如何訓練,在這篇再更詳細的說明 YOLO 的演進。

YOLOv1

📝 Paper: https://arxiv.org/pdf/1506.02640.pdf

YOLOv1 的模型架構參考 GoogleNet,有24個卷積層,2個全連接層,激活函數採用 Leaky ReLU,而最後一層則是採用 Linear activation。

Detect Flow

YOLO 的整體流程如下:

  • 將圖片resize成 448x448,並分割成 7x7 的網格
  • 輸入整張圖片至 CNN model,提取其特徵並預測 (參考 Model Detect)
  • 通過 NMS (Non-Maximum Suppression) 過濾 confidence 低的 bndBox

Model Detect

YOLOv1 的偵測作法如下:

  • 首先將輸入的影像切割成 7x7 的網格 (grid cell),每個網格會負責偵測 2 個 bounding boxes (bndBox) 以及輸出屬於各別類別的機率。論文採用的是 PASCAL VOC 資料集,總共有 20 個類別 (參考圖一)
  • 每個 bndBox 的輸出有 5 個預測值: x, y, w, h 以及 confidence,分別表示為偵測的物體中心點 (x, y)、長寬 (w, h)、信心程度 (confidence)

→ x, y, w, h 值為 bndBox 中心點的 x座標, y座標, bndBox 的寬度, 高度,並且皆是歸一化後的結果

→ confidence 則是 bndBox 與 Ground Truth 的 IOU 值,藉由該值能夠來判斷這個 bndBox 框出的是物體還是背景

📚 一個 grid cell vs 總輸出

一個 grid cell 輸出: 2x5+20

→ 2個 (B=2) bndBox 坐標和 confidence 以及該 grid cell 的預測類別

總輸出: 7x7x(2x5+20)= 7x7x30

→ 7x7 grid cell

圖一

YOLOv1 還有一個重要概念:

  • 若被偵測物體的中心落入某個網格內,這個網格就要負責去偵測該物體

如圖二,偵測到貓咪的 bndBox 中心點位於粉紅框的網格內,則該網格會負責偵測這隻貓咪

圖二

由上述可知一個影像會偵測出 7x7x2=98 個 bndBox,這些 bndBox 有的可能被偵測為背景 (沒有框出任何物體),那該 confidence 會是0,在進行 NMS 時就會被刪除了;若 bndBox 有框出物體,他輸出的 x, y 值就是被偵測為可能是該物體的中心點,這邊會說 “可能” 是因為該預測物體框不一定就是實際答案。由於偵測的物體框可能會有很多個,最後會經過 NMS 來消除那些重疊、信心程度較小的框,剩下的框就是選出來的物件框。

圖三為整體 model detect 的過程: 劃分 grid cell → 偵測 bndBox 及 class → bndBox 進行 NMS → 篩選後的 bndBox 與 class 結合輸出結果

圖三

NMS (Non-Maximum Suppression)

用來挑選最佳的 object detection 預測框的演算法,若不使用 NMS,就會有多個候選框出現。

🔸 流程

  • 設定一個閾值(threshold)
  • 將所有預測框根據confidence進行排序
  • 選擇 confidence 最高的 bndBox 為最終輸出預測框,並與其他預測框計算 IOU,若是大於Threshold,代表兩者框住同一個物體,則將 confidence較小的 bndBox 設為 0,即刪除此預測框;若是小於Threshold,代表兩者框的是不同物體,則留下該預測框
  • 重複此動作,直到剩下一個該類別的預測框,然後再計算下一個類別,直到全部類別都計算完畢

Loss Function

先來介紹一下個別參數代表的意思~~

下圖是計算公式

另外,值得注意的是在 bndBox 寬高的 loss 計算會先進行開根號後再相減,這是因為對於小尺寸的預測 bndBox 的偏移容忍程度較小。由下圖可得知在小尺寸的預測 bndBox 上發生偏移會產生比大尺寸的預測 bndBox 有更大的影響,因此先開根號再相減能夠盡可能的消除大小尺寸間的差異。

工具

YOLOv2

YOLOv2 在 YOLOv1的基礎上做了不少改進,其中在 VOC2007 資料集上的mAP 由 63.4 提升到 78.6,並且保持檢測速度。從預測更準確(Better),速度更快(Faster),識別對象更多(Stronger)這三個方面進行了改進。其中識別更多對像也就是擴展到能夠檢測9000種不同對象,稱之為YOLO9000。

論文連接在這

接下來就來介紹 YOLOv2 在 YOLOv1 的改進有哪些吧~~~

Batch Normalization

作者在每層卷積層的後面都加入 batch normalization 層,不再使用dropout,在 mAP 上提升了2.4%

💟 batch normalization可以提升 model 收斂速度,降低 overfitting 的狀況

High Resolution Classifier

大部分的檢測模型是使用 ImageNet 分類資料集上預訓練的模型,YOLOv1 採用 224x224 的圖片分類器,但因為解析度較低,不利於檢測模型,因此YOLO2 提高解析度至 448x448 並在檢測資料集上 fine-tuning。

但若直接切換解析度,模型可能難以快速適應高解析度, 所以 YOLOv2 的 pre-training 分為兩步驟:

  • 先採用 224x224 的 ImageNet 資料集圖像進行大概160個 epoch的訓練,然後再將輸入圖像更改為 448x448 訓練10個 epoch
  • 訓練完的這個 pre-train model 可以適用高解析度的輸入,最後再拿這個model 在檢測資料集上 fine-tuning,mAP提升了3.7%

Convolutionlal With Anchor Boxes

因為 YOLOv1 在訓練過程中學習適應不同物體的形狀比較困難,導致在精確定位方面表現較差。借鑒 Faster R-CNN 的方法: 用卷積層與 Region Proposal Network 來預測Anchor Box 的偏移值與置信度,作者發現通過預測偏移量而不是 bndBox 坐標值能夠簡化問題,讓神經網絡學習起來更容易,因此 YOLOv2 也嘗試採用使用不同形狀的矩形來作為錨框 (Anchor Box)。

YOLOv2首先移除掉 YOLOv1 網路的全連接層 (FC層),改用 Anchor Box 來預測邊界框。跟 YOLOv1 不一樣的是 Anchor Box 不是直接預測 bndBox 的座標值,而是預測 Anchor Box的 offset (座標的偏移值) 與 confidence scores (置信度)。

為了使最後的卷積層可以有更高解析度的特徵,YOLOv2 將其中一個Pooling層去掉,並且用 416x416 大小的輸入代替原來的 448x448,目的是為了使網路輸出的特徵圖 (feature map) 有奇數大小的寬和高,進而使每個特徵圖在劃分網格 (grid) 的時候只有一個中心單元格 (Center Cell)。

❓ 為什麼是採用416x416大小的輸入代替原來的448x448呢?

💬 YOLOv2 的卷積層採用32 步長 (Stride) 來下採樣 (down sampling) 圖片,所以通過選擇 416x416 用作輸入尺寸最終能輸出一個 13x13 的 feature map (之所以是13,是因為 416/32=13)

❓ 為什麼要使每個feature map在劃分 grid 的時候只有一個中心單元格呢?

💬 因為物體傾向出現在照片中央,物體中心點往往落入圖片中心位置,因此使用這個中心單元格去預測這些物體的邊界框相對容易

雖然使用Anchor Boxes,使得 mAP 從 69.5 略微降低到 69.2,但是召回率 (Recall) 從81% 提高到 88%。也就是說,即使精度略有下降,但它增加了檢測所有ground truth 物體的機會

Dimension Clusters

在 Faster R-CNN 和 SSD 中,Anchor Box 的尺寸是手動選擇的,有一定的主觀性。若能選取合適的 Anchor Box,可以使模型更容易學習並預測出準確的 bndBox,因此 YOLOv2 採用 k-means 聚類方法對 training set 中物體的bndBox 做了聚類分析。

聚類目的為提高選取的 Anchor Box 和同一個聚類下的 ground truth 之間的 IOU,採用的距離公式如下:

下圖為在 VOC 和 COCO 資料集上的聚類分析結果,綜合考慮模型複雜度和召回率 (Recall),作者最終選擇5個聚類數 (K=5),也就是選了5個不同大小的 Anchor Box 來進行定位預測

來看一下結果分析~~作者採用5個不同大小的 Anchor Box (Cluster IOU 5),Avg IOU 是61,比不使用聚類方法的9種 Anchor Box 的 Avg IOU高一些。若選擇 Cluster IOU 9,Avg IOU更顯著提高

Direct Location Prediction

在早期訓練時,因為引入 Anchor Box 來預測 offset 導致模型不穩定,這是因為位置預測的公式沒有做任何約束,因此預測出 bndBox 的中心點可能出現在任何位置

YOLOv2 調整了預測公式,使用 sigmoid 處理,使其範圍在 (0, 1) 之間,將預測的 bndBox 中心點約束在該網格內

其中,bx, by, bw, bh 是預測的 bndBox 中心點座標和寬高, Pr(𝑜𝑏𝑗𝑒𝑐𝑡)∗𝐼𝑂𝑈(𝑏, 𝑜𝑏𝑗𝑒𝑐𝑡) 是預測的 bndBox 的 confidence

💟 YOLOv1 是直接預測 confidence 的值,YOLOv2 則是對 to進行 σ 轉換後作為 confidence 的值

  • cx, cy 是當前網格左上角到圖像左上角的距離 (要先將網格大小歸一化,即令 grid 的寬高都為1)
  • pw, ph 是 Anchor Box 的寬和高
  • tx, ty, tw, th, to 是預測 Anchor Box 的 offset 及 confidence

💟ž 前面有提到說 YOLOv2 改用 Anchor Box 來預測 offset (座標的偏移值) 與confidence scores (置信度),因此每個 bndBox 輸出會有5個預測值 tx, ty, tw, th, to

藍框為預測的 bndBox,虛線矩形為 Anchor Box

📚 ž YOLOv1 vs YOLOv2 輸出

  • YOLOv1 在 feature map (7x7) 的每一個 grid 中預測出 2個 bndBox 及分類概率值,每個 bndBox 預測出5個值
  • 總輸出: 7x7x(5x2+20)
  • YOLOv2 在 feature map (13x13) 的每一個 grid 中預測出 5個 bndBox (對應5個 Anchor Box),每個 bndBox 預測出5個值及分類概率值
  • 總輸出: 13x13x5x(5+20)

結合 Dimension Clusters 得到 Anchor Box 與這種預測方法,YOLOv2 的 mAP 值提升了 4.8%

New Network:Darknet-19

YOLOv2 採用了一個新的基礎模型 (特徵提取器) Darknet-19,包括19個卷積層, 5個 maxpooling 層

  • 原型設計與 VGG16 一致,主要採用3x3卷積, 2x2 maxpooling層 (feature map維度降低兩倍, channles增加兩倍)
  • 與NIN (Network in Network) 類似,Darknet-19最終採用global avgpooling做預測
  • 在3x3卷積層之間使用1x1卷積層來壓縮 feature map channles 以降低模型計算量和參數 (parameters)
  • 每個卷積層後面同樣使用了 batch normalization 層以加快收斂速度,降低模型過擬合

在 ImageNet 分類資料集上,Darknet-19 的 top-1 準確度為72.9%,top-5 準確度為91.2%,mAP 值沒有顯著提升,但是模型參數相對小,計算量可以減少約33%

Darknet-19 模型架構

Fine-Grained Features

YOLOv2 圖片輸入大小為416x416,經過5次 maxpooling 後得到13x13 的feature map,並以此 feature map 採用卷積做預測,足夠偵測大物體,但若要偵測小物體還需要更精細的 feature map,因此 YOLOv2 提出了一種 passthrough 層以利用更精細的 feature map

  • passthrough 層與 ResNet 網絡的 shortcut 類似,使用前一層更高解析度的 feature map 作為輸入,然後將其連接到後面一層的低解析度的 feature map上
  • YOLOv2 利用最後一層 maxpooling的輸入 (也就是 26x26x512 的 feature map) 經過 passthrough 處理,變成 13x13x3072 的 feature map,以此feature map採用卷積做預測,YOLOv2 的 mAP 值提升了 1%

💟 之所以是26x26是因為最後一層 maxpooling 輸入的 feature map 維度是輸出的 feature map 的2倍

📚 passthrough layer 處理過程: 將特徵重排 (不涉及到參數的學習),26x26x512的 feature map 使用按行列隔行採樣的方法,抽取 2x2 的局部區域,然後將其轉化為 channel 維度,變成13x13x2048的新feature map,再連接下一層 13x13x1024 的 feature map,形成13x13x3072大小的 feature map,相當於做了一次特徵融合,有利於檢測小目標。

Multi-Scale Training

由於 YOLOv2 的模型只有卷積層與 maxpooling,所以輸入可以不限制於416x416大小的圖片。為了增強模型的魯棒性,YOLOv2 採用了多尺度輸入訓練策略,就是在訓練的過程中每間隔一定的 iterations 後改變輸入的圖片大小

  • YOLOv2 下採樣步長為32,因此輸入圖片大小要選擇32的倍數 (最小尺寸為320x320, 最大尺寸為608x608)。在訓練過程,每隔10個 iterations 隨機選擇一種輸入圖片大小,然後只需要修改對最後檢測層的處理就可以重新訓練

採用 Multi-Scale Training 策略使 YOLOv2 模型可以更好的預測不同大小的圖片,由下圖 VOC 2007 數據集上的結果可以看到: 採用較低解析度的圖片mAP 值略低,但速度更快;採用較高解析度的圖片mAP 值較高,但速度較慢。對於 554X554 的圖片 mAP 高達78.6%!

YOLO9000

YOLO9000 是在 YOLOv2 的基礎上提出的一種可以檢測超過9000個類別的模型,其主要貢獻點在於提出了一種分類和檢測的聯合訓練策略。

物體檢測 label 的成本比分類數據集高很多(物體類別、框出物體在圖片中的位置),因此分類數據集比檢測數據集的數量多很多,並且 YOLO 邊界框的預測並不依賴於物體類別預測,因此 YOLO 可以實現在分類和檢測數據集上的聯合訓練。

📚 聯合訓練策略方式: 對於檢測數據集,用來學習預測物體的邊界框 (bndBox)、置信度 (confidence) 以及物體分類,而對於分類數據集僅用來學習分類,但可以大大擴充模型所能檢測的物體種類。

📚 訓練方式: 首先在檢測數據集上訓練一定的epoch,待預測框的 loss 基本穩定後,再聯合分類數據集、檢測數據集進行交替訓練。同時為了分類、檢測數據量平衡,作者對 COCO 數據集進行了上採樣,使得 COCO、ImageNet 數據總數的比例為 4:1。

📚 計算 loss 方式: 若是檢測樣本,按照 YOLOv2 的 loss 計算誤差;若是分類樣本,只計算分類誤差。

📚 聯合數據集訓練遇到的問題: 類別之間不一定是互斥關係,例如人與女生。所以作者提出了一種層級分類方法 (Hierarchical classification),根據類別之間的從屬關係建立一種樹結構 WordTree。

结合 COCO 和 ImageNet 建立的 WordTree

WordTree 的根節點為 physical object,每個節點的子節點都是屬於同一個子類,在進行 softmax 時,不對所有類別進行,而是對同一層級的類別進行操作。如下圖,對同一個顏色 (同一層級) 的類別進行 softmax。

在進行預測時,會從根結點向下遍歷,每一層級選取機率最高的子節點,並計算該節點至根節點的所有條件機率之積。當該條件機率之積小於某個閾值時停止,以當前節點表示預測的類別。

預測輸出為 confidence: Pr(physical object)、bndBox 位置、一個樹狀機率圖。

藉由聯合訓練策略,YOLO9000 可以快速的檢測出超過 9000個類別的物體,總值 mAP 為19.7%。

--

--