YOLO演進 — 2

李謦伊
謦伊的閱讀筆記
9 min readSep 1, 2020

--

上一篇文介紹過 YOLOv1 及 YOLOv2,本文要來接續介紹 YOLOv3

YOLOv3

論文連接在這

YOLOv3 在 YOLOv2 的基礎上,改良了網路 backbone、利用多尺度特徵圖 (feature map) 進行檢測、改用多個獨立的 Logistic regression 分類器取代softmax 來預測類別分類

New Network:Darknet-53

YOLOv3 提出新的 backbone: Darknet-53,從第0層到74層,一共有53層convolutional layer,其餘為 Resnet 層

跟 Darknet-19 相比,Darknet-53 去除了所有的 maxpooling 層、增加了更多的1x1和3x3的卷積層,但因為加深網路層數容易導致梯度消失或爆炸,所以Darknet-53 加入了 Resnet 網路 (Residual Network) 來解決梯度的問題。由下圖的 Darknet-53 架構可以看到共加入了23個 Residual block

由於加深網路層數,Darknet-53 比 Darknet-19 慢的許多,但 Darknet-53 處理速度每秒78張圖,還是比同精度的 ResNet 快很多,YOLOv3 依然保持了高性能

Predictions Across Scales

YOLOv3 借鑒了 Feature Pyramid Network (FPN) 的方法,採用多尺度的 feature map 對不同大小的物體進行檢測,提升小物體預測能力

Feature Pyramid Network

YOLOv3 通過下採樣32倍、16倍、8倍得到3個不同尺度的 feature map,例如輸入416x416的圖片,則會得到13x13 (416/32)、26x26 (416/16)、52x52 (416/8),這3個尺度的 feature map

feature map

每個尺度的 feature map 會預測出3個 Anchor prior,而 Anchor prior 的大小則採用K-means進行聚類分析 (YOLOv3 延續了 YOLOv2 的作法)。在COCO資料集上,按照輸入圖片的尺寸為416x416,得到9種聚類結果 (Anchor prior的wxh):(10x13), (16x30), (33x23), (30x61), (62x45), (59x119), (116x90), (156x198), (373x326)

📚 feature map 對應 Anchor prior

  • 13x13 feature map (有最大的感受野) 用於偵測大物體,所以用較大的Anchor prior (116x90), (156x198), (373x326)
  • 26x26 feature map (中等的感受野) 用於偵測中等大小的物體,所以用中等的Anchor prior (30x61), (62x45), (59x119)
  • 52x52eature map (較小的感受野) 用於檢測小物體,所以用較小的Anchor prior (10x13), (16x30), (33x23)

Detect Flow

先來看網路偵測的流程圖

  • 若輸入416x416的圖片,在79層卷積層後,會先經過32倍的下採樣,再通過3x3, 1x1的卷積層後,得到13x13的feature map (第82層)
  • 為了實現能夠偵測小物體,借鑑了 FPN 的方法,將第79層13x13的 feature map 進行上採樣,與第61層26x26的 feature map 合併 (Concat) 後,再經過16倍的下採樣及3x3, 1x1的卷積層後,得到26x26的feature map (第94層)
  • 接著第91層26x26的 feature map 再次上採樣,並與第36層26x26的 feature map 合併 (Concat) 後,再經過8倍下採樣及3x3, 1x1的卷積層後,得到52x52的 feature map (第106層)

📚 YOLOv2 vs YOLOv3

  • YOLOv2 採用 passthrough 結構來檢測小物體特徵,而 YOLOv3 採用3個不同尺度的feature map來進行檢測
  • YOLOv2 預測輸出的 bndBox 有13 x 13 x 5 = 845個,而 YOLOv3 有13x13x3 + 26x26x3 + 52x52x3 = 10647個

📚 YOLOv1 vs YOLOv2 vs YOLOv3 輸出

  • 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)

  • YOLOv3 在3個 feature map的每一個 grid 中預測出 3個 bndBox (對應3個 Anchor prior),每個 bndBox 預測出5個值及分類概率值 ( YOLOv3 是使用 COCO 資料集有80類)

➔ 總輸出: 13x13x3x(5+80) + 26x26x3x(5+80) + 52x52x3x(5+80)

Bounding Box Prediction

YOLOv3 使用 Logistic regression 來預測每個 bndBox 的 confidence,以 bndBox 與 ground truth 的 IOU 為判定標準,對每個 ground truth 只分配一個最好的bndBox。利用這個方式,在做 Detect 之前可以減少不必要的 Anchor 並減少計算量。

  • 正例: 將 IOU最高的bndBox ,confidence score 設為1
  • 忽略樣例: 其他不是最高 IOU 的 bndBox 並且 IOU 大於閾值 (threshold,預測為0.5) ,則忽略這些 bndBox,不計算 loss
  • 負例: 若 bndBox 沒有與任一 ground truth 對應,則減少其 confidence score

❓ 為什麼 YOLOv3 要將confidence score 設為1?

💬 因為confidence score 是指該 bndBox 是否預測出一個物體的信心程度,是一個二分類。並且在學習小像素物體時,有很大程度會影響 IOU,若像 YOLOv1 使用 bndBox 與 ground truth 的 IOU 作為 confidence,那 confidence score 始終很小,無法有效學習,導致檢測 Recall不高

❓ 為什麼要有忽略樣例?

💬 由於 YOLOv3 使用了多尺度的 feature map 進行檢測,而不同尺度的feature map之間會有重合檢測的部分。例如檢測一個物體,在訓練時他被分配到的檢測框是第一個 feature map 的第三個 bndBox,IOU 達0.98,此時恰好第二個 feature map 的第一個 bndBox 與該 ground truth 的 IOU 達0.95,也檢測到了該 ground truth,如果此時給其 confidence score 強行打0的標籤,網絡學習效果會不理想

Class Prediction

YOLO 之前都是使用 softmax 去分類每個 bndBox,但 softmax 只適用於單標籤多分類 (基於類別是互斥的假設),而預測目標裡可能有重疊的標籤 (屬於多個類並且類別間有相互關係),比如 Person和Women

因此 YOLOv3 改採用多個獨立的 Logistic regression 分類器 (可以對多標籤進行多分類預測) 替代,使用 binary cross-entropy 作為 loss function,並且準確率不會下降

binary cross-entropy

Loss Function

先來看一下參數定義

📚 YOLOv2 vs YOLOv3

Evaluate

由下圖表可以看到: 若採用COCO AP 做評估標準,YOLOv3 在處理608x608 圖像速度可以達到 20FPS;若採用COCO mAP50 做評估標準 (不介意 bndBox 預測的準確性),YOLOv3 的表現達到57.9%,與 RetinaNet 的結果相近,並且速度快4 倍,在實現相同準確度下 YOLOv3 要顯著地比其它檢測方法快

AP
mAP50
Evaluation

AP值在之前的文章有提到過,就是指當我們取不同的閾值 (threshold),可以劃出一條Precision vs Recall 的曲線,而這個曲線下的面積就是 AP值

Evaluation

📚 AP 與 AP50 的差別就是 threshold 設定的不同

  • AP: threshold 設定為0.5:0.05:0.95的十個離散點
  • AP50: threshold 設定為固定的值為 0.5

--

--