---
# System prepended metadata

title: Object Detection - YOLO v1
tags: [paper]

---

# Object Detection - YOLO v1
> [name=謝朋諺(Adam Hsieh)]
> [time=Tue, Apr 9, 2019 4:01 PM]
###### tags: `paper`
---
## Reference
> [目标检测|YOLO原理与实现](https://zhuanlan.zhihu.com/p/32525231)
> [YOLO算法的原理与实现](https://blog.csdn.net/jyy555555/article/details/80411149)
> [图解YOLO](https://zhuanlan.zhihu.com/p/24916786)
> [CNN经典神经网络模型 | 目标检测(续)](http://www.laphiler.com/2018/01/15/cnn-classic-model-objectdetection2/)
> [目标检测系列（六）：YOLO v1](https://blog.csdn.net/weixin_43854922/article/details/86509975)
---
## You Only Look Once: Unified, Real-Time Object Detection
[論文連結](https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Redmon_You_Only_Look_CVPR_2016_paper.pdf)
{%pdf https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Redmon_You_Only_Look_CVPR_2016_paper.pdf %}

### 與 R-CNN 比較
1. R-CNN 先在影像中生成潛在的 Bounding Box 並在這些框上執行分類器。在分類之後再運用後處理細化 Bounding Box 消除重複的檢測，並根據場景中的其他目標重新定位 Bounding Box
==缺點：流程很慢，很難優化，因為每個元件都必須單獨訓練。==
2. YOLO 將檢測問題作為一個回歸問題，直接從影像到 Bounding Box 和分類的機率
==優點：只要看影像一次就能預測出現的目標跟位置。==

### YOLO 優點們
1. YOLO 在 Titan X GPU 沒有批次處理可達到 45 FPS，若是快速版本可到 150 FPS，而且在即時偵測的準確度還比其他系統高兩倍以上。
:::success
:+1: 因為 YOLO 只用一個 CNN 來實現檢測跟分類
:::
2. YOLO 與 Fast R-CNN 相比背景誤檢測數量少了一半。
:::success
:+1: YOLO 會看整張圖片而不是 Sliding Window 或 Region proposal-based 的方法，所以可以說他隱晦地 encode 類別的上下文關係和他們的外觀。
:::
3. YOLO 學習目標的 Generalizable 能力大幅優於 DPM 跟 R-CNN 等頂級方法。
4. 所有訓練很測試程式都是開源的。連模型都可以下載。

### YOLO 缺點
1. 在偵測的準確度上仍然落後最先進的檢測系統。
2. 對於小物體表現不如人意。
3. 對於物體的寬高比的 Generalization 較弱，無法定位不尋常比例的物體。

### Method
1. 將輸入影像分成 $S \times S$ 的網格。==如果物件的中心在某個網格的單元中，該網格就負責檢測該物件==。
2. 每格網格預測 $B$ 個 Bounding Box 和對這些 Bounding Box 的信心指數。這分數反映了該模型對 Box 是否包含物件的信心以及他預測 Box 的準確程度。
    * Bounding Box 信心指數的公式設為：==$Pr(Object)*IOU^{truth}_{pred}$==
    * 如果該網格沒有任合物件，$Pr(Object)=0$ 則信心指數就為 0。否則 $Pr(Object)=1$ 信心指數就等於預測框跟真實框的 IOU。
3. 每個 Bounding Box 包含五個預測值：==$x, y, w, h, confidence$==
    * $x, y$ 表示 Bounding Box 中心座標，相對於網格邊界框左上角座標點的偏移量，單位是幾個單元格，ex:（0.8, 0.2）格
    * $w, h$ 表示相對於整張圖像的寬度和高度的比例
    * $confidence$ 表示預測框與實際框之間的 IOU
    * $x,y,w,h$ 數值皆在 0~1 之間
![grid cell](https://i.imgur.com/3UtX64v.jpg)

4. 每個網格還預測 $C$ 個分類的條件機率： $Pr(Class_{i}|Object)$ 
    * 每個網格只預測一組類別機率，而不管 Bounding Box 的數量 $B$ 是多少。
:::danger 
:fire: 雖然看起來是由該網格負責預測 Bounding Box 其物件屬於各個類別的機率，但這些機率值其實是在各個 Bounding Box 信心指數下的條件機率。
:::
5. 在**測試**時本文乘以分類的條件機率和單個 Box 預測出的信心指數：
==$Pr(Class_{i}|Object)*Pr(Object)*IOU^{truth}_{pred}=Pr(Class_{i})*IOU^{truth}_{pred}$==
這個公式為我們提供了每個框特定的類別信心分數，這些分數編碼了==類別出現在此框中的機率==以及==預測框與目標的擬合程度==。
:::danger 
:fire: Bounding Box 類別信心值表徵是該 Bounding Box 中物件屬於各個類別的可能性大小以及 Bounding Box 匹配物件的好壞。
:::
6. 本文在 PASCAL VOC 上做驗證，$S=7$, $B=2$，因為 PASCAL VOC 有 20 個類別，因此 $C=20$。總共會有 ==$S\times S\times (B*5+C)$== => $7 \times 7 \times 30$ 的 tensor

![Figure2](https://i.imgur.com/2e2BtLF.jpg)

### Network Design

![Figure3](https://i.imgur.com/5oXBljY.png)

網路的一開始的 CNN Layer 負責提取特徵，而全連接層則輸出預測的機率跟座標。
* 24 CNN Layer (受到 GoogLeNet 啟發)
* 2 Fully Connected Layer
* 只使用 $1 \times 1$ 的降維層以及後面的 $3 \times 3$ 卷積層
* 有先在 ImageNet 上預訓練模型 (影像大小是 224*224)
* 最後預測結果都是 $7 \times 7 \times 30$ 的 tensor

![predict tensor](https://i.imgur.com/YcYZHZc.png)
* 前面 20 個是類別機率值，後 2 個元素是 Bounding Box 信心指數，兩者相乘可得類別的信心分數。
* 後 8 個元素為框框的 $(x,y,w,h)$

這邊解釋一下網路的預測值是一個二維 tensor $Ｐ$
* Shape 為 $[batch,7 \times 7 \times 30]$
* $P_{[:,0:7*7*20]}$ 就是類別機率部分
* $P_{[:,7*7*20:7*7*(20+2)]}$ 就是類別信心分數的部分
* $P_{[:,7*7*(20+2):]}$ 就是 Bounding Box 預設的結果


另外還有一個版本是快速版本的 YOLO 主要是為了能夠達到快速目標檢測的界線。
* 24 層改為只有 9 層的 CNN Layer
* 使用較少的濾波器
* 其他訓練和測試的參數都是相同的

### Training
* 在 ImageNet 1000-class 數據集中預訓練本文的 CNN Layer，但只使用圖三中的前 20 個 CNN Layer 接著加上 average-pooling layer 跟 fully connected layer。
* 訓練了一週的時間並在 ImageNet 2012 驗證集中獲得像 top-5 的準確率高達 88%。
* 將後面的 average-pooling layer 跟 fully connected layer 拔掉加入四個卷積層與兩個全連接層並且隨機初始化權重。
* 由於檢測通常需要看到較細微的資訊，因此將網路的輸入解析度從 $224 \times 224$ 改為 $448 \times 448$
* 除了最後一層使用線性 activation function 其餘層都是使用以下的公式激活（Leaky ReLU）：

    $\phi (x) = \begin{cases} x,\ if\ x>0 \\0.1x,\ otherwise \end{cases}$
    
* 由於 YOLO 是將物件檢測看成回歸問題，所以採用得是 ==Sum-squared error== 因為他比較好優化但並不理想，原因是若網格中未包含物件他的信心指數往往都是 0，會壓倒有包含物件的網格的梯度，這可能導致模型不穩定，進而導致訓練早期就發散。
* 為了彌補上述這點，本文==增加了 Bounding Box 座標預測的 loss== 並==減少了不包含物件 Bounding Box 信心水準的 loss==，多使用了兩個參數 $\lambda _{coord} =5$、$\lambda _{noobj}=0.5$
* Sum-squared error 也可以在 Large Box 跟 Small Box 做權重改變。==Large Box 的小偏差重要性比起 Small Box 的小偏差重要性來得低==。為了解決這問題本文直接預測 Bounding Box 的==平方根==而不是寬度和高度。
* YOLO 的每個網格單元都會預測多個 Bounding Box，但對應類別只有一個。因此在訓練階段對每個物件，我們希望只有一個 Bounding Box 預測器負責。我們指定一個 Bounding Box 最高 IOU 的預測器“負責”來預測物件，而其他 Bounding Box 則判定為沒有物件。
:::danger
:ghost: 缺點是一旦網格出現多個不同物件還是只能輸出一個類別。
:::
* 以下是 Loss Function：
![Loss](https://i.imgur.com/HKIZb1C.png)

    * $\mathbb{1}^{obj}_{i}$ 表示假設物件出現在網格單元 $i$ 中，$\mathbb{1}^{obj}_{ij}$ 代表網格單元 $i$ 中第 $j$ 個 Bounding Box 預測器負責該預測。
    * 第一項是 Bounding Box 中心座標的誤差值
    * 第二項是 Bounding Box 高與寬的誤差值
    * 第三項是包含物件 Bounding Box 信心指數的誤差值
    * 第四項是不包含物件的 Bounding Box 信心指數的誤差值
    * 最後一項是包含物件的網格的分類誤差值
    * 信心指數的 target 值 $C_i$，如果是不存在物件此時由於 $Pr(object)=0$，那麼 $C_{i}=0$。如果存在物件 $Pr(object)=1$，此時就需要確定 $IOU^{truth}_{pred}$
:::warning
:bulb: 最好的情況是希望將 IOU 取 1，這樣就可得到 $C_i=1$，但是在 YOLO 實現中，使用了一個控制 rescore (默認為 1)，當其為 1 時，IOU 不是設置為 1，而是計算真實的 IOU 不過很多復現 YOLO 的作者還是取 $C_i=1$ 這個差異可能不會太影響結果吧
:::
* 如果物件出現在該網格中（前面討論的條件類別機率），則 Loss Function 只懲罰分類錯誤。如果預測器負責實際框框的邊界（即該網格單元中具有最高 IOU 的預測器），則他也只懲罰邊界框座標的錯誤。

![](https://i.imgur.com/efqlqwU.png)


### Inference
每張影像在網路上皆會預測 $7 \times 7 \times 2 = 98$ 個 Bounding Box 和類別

YOLO 作法先使用 NMS 才確定各個 Box 的類別。
:::info
:book: NMS(Non maximum suppression) 演算法，主要是為了解決同個物件被多次檢測的問題，首先從所有檢測框中找到信心值最大的框，然後一個一個計算其與剩餘框的 IOU，如果其值大於 Threshold，那麼就將該框剔除，然後將剩餘的檢測框重複上述過程，直到處理完所有的檢測框。
:::
 
![NMS](https://i.imgur.com/GjLnno5.png)

1. 對於 98 個 box 將小於信心指數閾質的值歸 0
2. 然後分類別地對信心指數使用 NMS，被合併的信心指數也設為 0
3. 最後才確認不為 0 的 Bounding Box 的各個類別
4. ＮＭＳ方法大概可以提昇 mAP 2-3％

![](https://i.imgur.com/tVnnyoD.png)

每個網格跟 tensor 代表的意義匹配:

![](https://i.imgur.com/oNPbdW1.png)
![](https://i.imgur.com/BC8fOlM.png)

整體流程如下圖：

![](https://i.imgur.com/JQbnebw.png)
![](https://i.imgur.com/j7WzTI7.png)
![](https://i.imgur.com/558tSoJ.png)

最後就可利用前面所述的閾值與 NMS 處理得到最終檢測結果

![](https://i.imgur.com/R0w3ydM.png)

### YOLO 限制總整理
1. YOLO 中每個網格只能預測兩個 Bounding Box，且只能有一個類別，這使得模型不太能預測鄰近目標的數量，比如鳥群
2. 測試的圖像中，若同類物體出現不常見的長寬比和其他情況時 Generalized 能力較弱
3. 由於 Loss Function 的問題，定位誤差是影響檢測效果最主要原因，尤其是小物體處理上還要加強

### 與其他系統的比較
資料集是 PASCAL VOC 2007 以及 2012，比較的系統有 DPM、R-CNN 以及 Faster R-CNN

![](https://i.imgur.com/eNg5UeT.png)

### 錯誤分析
為了進一步分析，本文將預測結果按照分類與定位準確性分成以下 5 類：
* Correct: 正確的類別且 $IOU > 0.5$（準確度）
* Localization: 正確的類別，$0.1 < IOU < 0.5$ (定位不準)
* Smiliar: 類別相似，$IOU > 0.1$
* Other: 類別錯誤，$IOU > 0.1$
* Background: 任何 $IOU < 0.1$（誤把背景當物體）

![Figure4](https://i.imgur.com/EMaYjMh.png)

YOLO 主要錯誤在定位部分，Fast R-CNN 定位錯誤少很多但背景錯誤多很多。

YOLO 還有在真實環境跟藝術品中的行人做檢測來驗證它的效能
![](https://i.imgur.com/tNIU1Cg.jpg)
