# Object Detection - YOLO v3
> [name=謝朋諺(Adam Hsieh)]
> [time=Thu, May 22, 2019 10:53 AM]
###### tags: `paper`
---
## Reference
> [物体检测之YOLOv3](https://zhuanlan.zhihu.com/p/42865896)
> [YOLO v3算法笔记](https://blog.csdn.net/u014380165/article/details/80202337)
> [论文 \- YOLO v3](https://xmfbit.github.io/2018/04/01/paper-yolov3/)
> [目标检测YOLO:YoloV3和之前版本的对比](https://blog.csdn.net/wfei101/article/details/79749704)
---
## YOLOv3: An Incremental Improvement
[論文連結](https://pjreddie.com/media/files/papers/YOLOv3.pdf)
{%pdf https://pjreddie.com/media/files/papers/YOLOv3.pdf %}
### 摘要重點
1. 比 YOLO v2 的 model 更大但更準確。
2. 在 320X320 可跑 22.2 ms、28.2 mAP,像 SSD 一樣準確但速度快三倍。
3. 在 Titan X 上,51 ms 內實現了 57.9 的 AP50,與 RetinaNet 在 198 ms 的 57.5 AP50相當,但速度快 3.8 倍。
### Bounding Box Prediction
本文沿用了 YOLO9000 系統。如下圖:
![](https://i.imgur.com/wHzWrhH.png)
* 使用維度聚類作為 anchor boxes 的長寬($p_w, p_h$)來預測 Bounding Box。
* 網格預測四個值:$t_x, t_y, t_w, t_h$。
* YOLO 網格最後輸出是一個 MXM 的 feature map,對應於 MXM 個 cell。
* 如果某個 cell 距離 image 的左上角距離為 ($c_x, c_y$),那個該 cell 內的 Bounding Box 距離和位置形狀參數就會如上圖。
:::warning
:baby_chick: 不管是 Faster RCNN 還是 YOLO 都不是直接回歸求出 Bounding Box 的長寬(像這樣:$b_w = p_wt'_w$)而是要做個對數變換,實際預測的是 log(.)。
\===============================================================
:baby_chick: 這是因為若直接預測相對形變的 $t'_w$,那麼就必須要求 $t'_w>0$,**因為框框不可能是負數**。這樣會有不等式約束的問題,就無法直接用 SGD 來解,所以先取一個對數變換就可以了!
:::
==訓練期間使用平方誤差計算 loss。==
YOLO 會對每個 Bounding Box 給出是否是物件的信心預測以用來區分背景跟物件。
* 如果 Bounding Box 與 Ground Truth 的 IoU 大於其他所有 Bounding Box 時 **target = 1**。
* 如果他的 IoU 大於 0.5 但 IoU 不是最大的話我們就忽略他(不懲罰也不獎勵)。
* 如果某個 Bounding Box 沒有被分配到任何一個 ground truth 的物件,那麼他在計算 loss 上對於邊界框位置、大小、類別的預測都沒有貢獻,我們就只懲罰他的 objectness,試圖減小信心指數。
### 分類預測
* 不再使用 softmax 並使用各個獨立的 logistic 做二分類以用多標籤的分類法。
![](https://i.imgur.com/4syNg6E.jpg)
* YOLO v3 多標籤模型的提出對於解決覆蓋率高的影像有十分顯著的效果,如上圖是 YOLO v2 跟 YOLO v3 的結果,可以看到不僅檢測的更精準最重要得是在後排被覆蓋的物體也能很好的在 YOLO v3 中檢測出來。
* ==將 N 路 softmax 分類器替換成 N 個 Logistic 分類器==。
* 這樣每個類別的輸出總合將不再是 1,而每個類別的分數也都會介在 0~1 之間。
### Prediction Across Scales
* 之前 YOLO 的一個弱點就是缺少多 scale 的預測,YOLO v3 借用了 FPN 想法在 3 個不同 scale 上做預測。
* YOLOv2 只在最後兩層提取特徵,YOLOv3 直接將 scale 擴增到三層,如下圖:
![](https://i.imgur.com/03tdFWV.jpg)
* 在 COCO 上每個 scale 預測 3 個框框,一個框框會有 4 個偏移量,1 個物件信心指數預測跟 80 個類別預測,輸出的 feature map 張量大小便是 $N \times N \times [3 \times (4+1+80)]$。
:::success
:bookmark_tabs: 在 YOLOv2 中每個 grid cell 預測 5 個 Bounding Box,所以共有 $13*13*5$ 的 Bounding Box,但在 YOLOv3 因為採用了多個 scale 的特徵融合,因此 Bounding Box 共有 $(13*13+26*26+52*52)*3$ 遠比之前數量多上很多。
:::
* 我們仍然使用 K-means 去聚類出邊界框的先驗,YOLOv2 選了 5 種,YOLOv3 則選了 9 種聚類,並 將 9 種聚類分給不同的 feature map scale。
* feature map 13X13 分配到的為:$(116 \times 90),(156 \times 198),(373 \times 326)$
* feature map 26X26 分配到的為:$(30 \times 61),(62 \times 45),(59 \times 119)$
* feature map 52X52 分配到的為:$(10 \times 13),(16 \times 30),(33 \times 23)$
==這麼做的原因是深度學習中層數越深,Feature Map 對小尺寸物體的響應能力越弱。==
### Feature Extrator
本文使用新的網路來實現特徵提取,新網路是透過 YOLOv2 的 Darknet-19 和其他最新穎網路的混合方法,我們的網路使用連續的 $3\times3$ 和 $1\times1$ 的 CNN,也有一些 shotcut 的連接,總共有 53 個 CNN 因此稱為 Darknet-53。
![](https://i.imgur.com/6YWk5r0.png)
這個新網路 比 Darknet 強太多,而且比 ResNet-101 ResNet-152 還要有效,下表是跑 ImageNet 得結果:
![](https://i.imgur.com/DtFPTdd.png)
每個網路都使用相同的設置進行訓練,並以 256X256 的精度測試,運行時間是跑在 Titan X 上。第三欄的 Billions of Operations(浮點運算數)也較少,速度甚至比 ResNet-101 快上 1.5 倍,精度跟 ResNet-152 差不多但速度快上 2 倍。
### How We Do
* 就 COCO 的 mAP 指標而言,它與 SSD 相當,但速度提高 3 倍。
* YOLOv3 仍然比 RetinaNet 落後許多,但速度是他的 3.8 倍。
* 當我們在 $IoU=0.5$ 或圖表中 $AP_{50}$ 這種舊式檢測標準來看,YOLOv3 幾乎與 RetinaNet 差不多並且遠高於 SSD 的變形。
* 但隨著 IoU 閾值上升,YOLOv3 表現下降地明顯,這也說明 YOLOv3 在檢測框完美貼合物體上還是有困難的。
* 過去 YOLO 對付小物體有困難,但是現在情勢相反,在新的多尺度下 YOLOv3 有相當好的表現,但他相對地在中尺度和大尺度表現更差。
![](https://i.imgur.com/jGBI7LY.png)
* 當我們把準確度和速度畫在圖表上時,可以看到 YOLOv3 明顯超越其他的檢測系統。
![](https://i.imgur.com/Ct8wbq8.png)
![](https://i.imgur.com/QqbxnHd.png)
### Things We Tried That Didn't Work
1. **Anchor box $x,y$ offset prediction.**
* 我們嘗試使用一般的 anchor box 預測方法,這裡使用線性激活函數來預測 $x,y$ 的偏移量,以及用 anchor box 的寬度和高度的倍數去預測檢測框的 $w,h$,我們發現這方法降低了模型的穩定性且效果不佳。
2. **Linear $x,y$ predictions instead of logistic.**
* 使用線性激活函數代替 sigmoid 預測 $x,y$ 的偏移量,這導致 mAP 下降了。
3. **Focal Loss**
* 讓我們掉了 2 個 mAP。但還不清楚問題還必續再釐清。
4. **Dual IOU thresholds and truth assignment.**
* Faster R-CNN 在訓練期間使用了兩個 IoU 閾值,如果一個預測與 Ground Truth 重疊到 0.7,他就像一個正樣本,如果達到 0.3~0.7 他就被忽略,小於 0.3 就是負樣本,但仍然沒得到好結果。
### What This All Means
* YOLOv3 是一個很好的檢測器,速度很快,很準確。COCO 平均 AP 介於 0.5~0.95 IoU 指標之間表現卻不太好,但是在 $IoU = 0.5$ 時效果又很棒。
### 小總結
1. 邏輯回歸代替 softmax 作為分類器
2. Darknet-53
3. YOLOv2 引進 RPN 的錨點機制,YOLOv3 引進了 FPN (feature pyramid networks)。
4. 速度快了,但 mAP 沒有明顯提升,特別是 IoU>0.5