---
# System prepended metadata

title: YOLOv1 (2015)
tags: [Object detection]

---

# YOLOv1 (2015)
1. 將影像縮放至 448×448，並輸入模型
2. 透過 end to end 的 CNN 網路，輸出 7×7×30 的 feature map 
3. 對 feature map 進行 Non-Maximum Suppression (NMS)，得到偵測結果。
![](https://i.imgur.com/csPO0tu.png)

---
## 1. 將影像縮放至 448×448，並輸入模型
![](https://i.imgur.com/xtXrRxf.png)

## 2. 透過 end to end 的 CNN 網路，輸出 7×7×30 的 feature map 
YOLO 的偵測網路包含 24 個卷積層 (Conv. Layer) 和 2 個 全連接層 (Conn. Layer)
![](https://i.imgur.com/lHtp1Vy.png)


### Grid cell
YOLOv1 將輸入影像劃分成 S×S=7×7 個 grid cells，若一個目標的中心落在某個 cell 內，則此 cell 負責偵測該目標。
![](https://i.imgur.com/pwJckm2.png)

### Bounding box (Bbox)
每個 cell 預測出 B=2 個 Bounding box (Bbox)，每個 Bbox 包含 5 個值 – (x, y, w, h, confidence)
- (x, y) 代表中心座標
- (w, h) 代表寬度與高度

x, y, w, h 都是正規化後的值，因此介於 0~1 之間
![](https://i.imgur.com/vy5j8Oo.png)

### Confidence
confidence 反應了兩件事情
1. 該 cell 是否包含物體
2. (x, y, w, h) 預測的有多準

公式定義如下：
confidence $= Pr⁡(𝑜𝑏𝑗𝑒𝑐𝑡)∗IoU_{𝑝𝑟𝑒𝑑}^{𝑡𝑟𝑢𝑡ℎ}$
- $Pr⁡(𝑜𝑏𝑗𝑒𝑐𝑡)$ 代表 Bbox 是否包含物體，若有包含物體則為 1，沒有包含物體則為 0 
- $IoU_{𝑝𝑟𝑒𝑑}^{𝑡𝑟𝑢𝑡ℎ}$ 代表 Bbox 與 ground truth 的 IoU

### Classification
除了位置資訊外，還需得知框住的目標是哪個類別，因此每個 cell 還會預測 C 個條件類別機率：$Pr⁡(Class_𝑖 | 𝑂𝑏𝑗𝑒𝑐𝑡)$
- $Pr⁡(Class_𝑖 | 𝑂𝑏𝑗𝑒𝑐𝑡)$ 代表在這個 cell 包含物體的情況下，它屬於某個類別的機率，這個機率與 B 個 Bbox 共享。

在預測階段時會將 $Pr⁡(Class_𝑖 | 𝑂𝑏𝑗𝑒𝑐𝑡)$ 與 confidence 相乘得到 confidence score，這 score 代表了所屬類別資訊與座標準確度：

$Pr⁡(𝐶𝑙𝑎𝑠𝑠_𝑖│𝑂𝑏𝑗𝑒𝑐𝑡) \times Pr⁡(𝑜𝑏𝑗𝑒𝑐𝑡) \times IoU_{𝑝𝑟𝑒𝑑}^{𝑡𝑟𝑢𝑡ℎ}=Pr⁡(𝐶𝑙𝑎𝑠𝑠_𝑖) \times IoU_{𝑝𝑟𝑒𝑑}^{𝑡𝑟𝑢𝑡ℎ}$

論文中使用 PASCAL VOC dataset 去訓練，而類別總共有 20 種，因此每個 cell 還需預測是什麼類別，2 個 Bbox 共享這個資訊。
因此最後的 feature map 為 7×7×30 (S×S×(B×5+C))

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

## 3. 對 feature map 進行 NMS，得到偵測結果。

一張影像最後得到這 98 (7×7×2) 個 Bbox 後，需要經過以下步驟來去除重複的 Bbox
1. 設定一個 score 的閾值，若小於它則代表這個 Bbox 沒有包含這個類別的物體，這個步驟可以減少後面 NMS 的計算量。
2. 由於可能會重複框到同一個物體，因此使用 NMS 將最大的 IoU 保留下來，即可將一些重疊的 Bbox 消除，重複執行，直到每個類別都完成，剩下來的 Bbox 即為我們最後的結果

### Non-Maximum Suppression (NMS)
1. 根據 confidence scores 對預測進行排序
2. 從最高分開始，如果我們發現任何以前的預測與當前預測具有相同的類別，而且IoU > 0.5，則忽略任何當前的預測
3. 重複步驟 2，直到檢查完所有預測

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

---

## How to train YOLOv1 ?
1. 在 ImageNet 1000-class 分類資料集上使用 224×224 的圖片訓練分類器用以提取特徵，這邊是使用前 20 層的卷積層加上一個 average-pooling layer 和一個全連接層，Top-5 的精度達到 88%

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

2. 將之前訓練好的前 20 層的卷積層再加入剩下的 4 層卷積層與 2 層全連接層用來訓練物件偵測任務，資料集使用了 PASCAL VOC ，為了有更精細的結果，將圖片的解析度從 224×224 提高到 448×448

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



## Loss function
loss function 分為三個部分
* the localization loss 
* the confidence loss 
* the classification loss 

### the localization loss
如果在 cell 中偵測到物體，則定位損失計算了預測的 Bbox 與 ground truth 之間的誤差
1. 我們不希望大 box 和小 box 與真實的 box 誤差一樣
例如大 box 的寬為 120、小 box 的寬為 80、真實的 box 寬為 100，我們使用寬度去計算 loss 會發現兩個誤差會相等：$(120-100)^2=(80-100)^2$，為了解決這個問題，我們使用寬度的平方根去計算：$(\sqrt{120}-\sqrt{100})^2 \neq (\sqrt{80}-\sqrt{100})^2$，因此我們選用寬度和高度的平方根去計算。
2. 為了更強調 Bbox 的準確性，我們將 loss 乘以 $\lambda_{coord}$ (預設值為 5)

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

### the confidence loss
如果在box中檢測到一個物體，則 confidence 損失 (box 的 objectness) 為:
![](https://i.imgur.com/3zqUk3z.png)

如果在box中沒有檢測到物體，則 confidence 損失 (box 的 objectness) 為:
![](https://i.imgur.com/qTr9EMD.png)



由於大多數 boxes 不包含任何物體。這導致了不平衡的問題，為了彌補這一點，我們用 $\lambda_{noobj}$ (預設值為 0.5) 降低這一損失的權重。

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


### the classification loss
如果在 cell 中偵測到物體，則分類損失是所有類別的平方差的和

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

## Performance
![](https://i.imgur.com/bYFLiPT.png)

---
###### tags: `Object detection`