---
# System prepended metadata

title: YOLOv1
tags: [Paper Notes]

---

###### tags: `Paper Notes`
# YOLOv1
* 原文：You Only Look Once: Unified Real-Time Object Detection
* 機構：University of Washington, Allen Institute for AI, Facebook AI Research
* 時間：2016 年

### Model Architecture
* R-CNN 需要先用 region proposal methods 先偵測出可能的 bounding box 位置，用一個 classifier 在上面判斷各類別的機率，最後再用一些  post-processing 方法來找出更精準的 bounding box 位置、大小。
* 而 YOLO (You Only Look Once) 不需要這麼麻煩，YOLO 直接用一個 convolutional network 就可以同時預測  bounding boxes 與 class probabilities。
* 每張圖片都先分成 $S \times S$ 個 gird。
  * 若某物件的中心點在該 grid 中，則由該 grid 負責預測該物件。
* 每個 grid 都有 $B$ 個 bounding boxes 與相應的 confidence scores。
  * confidence score 表示該 bounding box 對於「該 grid 有物件的信心度」與「該 bounding box 的位置準確度」，具體公式如下：
    $$
    Pr(Object) \times IOU_{pred}^{truth}
    $$
  * $IOU_{pred}^{truth}$：intersection over union (IOU) between ground truth and predicted box
  * 在訓練的過程中僅指定一個與 ground truth 的 IOU 最大的 bounding box 負責預測該類別的物件。
* 每個 bounding box 都包含 5 個值：$x$、$y$、$w$、$h$、$confidence$。
  * $(x, y)$：bounding box 中心點在 grid 裡的相對位置。
  * $(w, h)$：bounding box 相對於 grid 的寬、高。
  * $confidence$：$Pr(Object) \times IOU_{pred}^{truth}$
* 對於每個 grid，無論 $B$ 設多少，都只會預測 $C$ 個 class probabilities，$Pr(Class_i | Object)$。因此，每個 bounding box 的 class-specific confidence scores 如下：
  $$
  Pr(Class_i | Object) * Pr(Object) * IOU_{pred}^{truth} = Pr(Class_i) *  IOU_{pred}^{truth}
  $$
* 模型的輸出為 $S \times S \times (B * 5 + C)$ 維的向量。
  * 一張圖片共有 $S \times S$ 個 grid。
  * 每個 grid 都要預測 $B$ 個 bounding box 與 $C$ 個 class probabilities。
  * 每個 bounding box 都有 5 種數值 $x$、$y$、$w$、$h$、$confidence$。
  * 範例：
    For evaluating YOLO on PASCAL VOC, we use $S = 7, B = 2$. PASCAL VOC has 20 labelled classes so $C = 20$. Our final prediction is a $7 × 7 × 30$ tensor.
* 如圖三所示，整個 YOLO 就是擁有 24 層 convolutional layers 與 2 層 fully connected layers 的網路。
  * 比較特別的是，作者將 1 × 1 的 reduction layers  接在 3 × 3 的 convolutional layers 後面，用於減少計算量（受 GoogLeNet 啟發 [34]）。
  * 除了最後一層的 activation function 使用  linear activation 外，其他層都是使用 leaky ReLU。leaky ReLU 公式如下：
    $$
    \phi(x) =  \left\{  \begin{array}{}
    	x, & if\ x > 0 \\
    	0.1x, & otherwise
    \end{array} \right.
    $$

<img src="https://i.imgur.com/yYvcRWN.png" style="zoom: 67%;" />
<center>圖三：YOLO 架構圖</center>

* YOLO 的 loss function 如下（共可分成 5 個部分）：
  $$
  \lambda_{coord} \sum_{i=0}^{S^2} \sum_{j=0}^{B} 1_{ij}^{obj} [(x_i - \hat{x_i})^2 + (y_i - \hat{y_i})^2] \\ + \lambda_{coord} \sum_{i=0}^{S^2} \sum_{j=0}^{B} 1_{ij}^{obj} [(\sqrt{w_i} - \sqrt{\hat{w_i}})^2 + (\sqrt{h_i} - \sqrt{\hat{h_i}})^2] \\ + \sum_{i=0}^{S^2} \sum_{j=0}^{B} 1_{ij}^{obj} (C_i - \hat{C_i})^2 \\ + \lambda_{noobj} \sum_{i=0}^{S^2} \sum_{j=0}^{B} 1_{ij}^{noobj} (C_i - \hat{C_i})^2 \\ + \sum_{i=0}^{S^2} 1_{i}^{obj} \sum_{c \in classes} (p_i(c) - \hat{p_i}(c))^2
  $$
  * $1_{i}^{obj}$：grid $i$ 中有無物件
  * $1_{ij}^{obj}$：grid $i$ 中的第 $j$ 個 bounding box 是否有負責預測某類別。
  * $\lambda_{coord} (=5)$、$\lambda_{noobj} (=0.5)$：提升含有物件的 grid 的 bounding box coordinate predictions loss，降低沒有物件的 grid 的 confidence predictions loss。（因為大部分的 grid 都是沒有物件的，因此要降低他們的權重，避免模型一直預測「沒物件」）
  * 由於物件有大有小，大物件的誤差值通常較大，因此對 $w$、$h$ 開根號以緩解這個問題。
    * 範例：大物件長度 100、小物件為 10，令兩者都誤差 10%，則大物件的誤差值為 10、小物件為 1。先開根號在做運算的結果為：大物件：$\sqrt{110} - \sqrt{100} = 0.48$、小物件：$\sqrt{11} - \sqrt{10} = 0.15$。

### Experiments & Results
* 先用 ImageNet 1000-class competition dataset 對前 20 層做預訓練。在預訓練的過程中，還額外增加了一層 average-pooling layer 跟一層 fully connected layer。
* 預訓練時使用 $224 × 224$ 的圖片，但真正在訓練時是用 $448 × 448$ 的圖片。
* YOLO 使用  PASCAL VOC 資料集做評估，實驗結果如表三所示。

<img src="https://i.imgur.com/E7YQvwN.png" style="zoom: 60%;" />
<center>表三：YOLO 與其他模型的比較。</center>

* YOLO 的偵測速度為 45 fps。

### References
[34] C. Szegedy, W. Liu, Y. Jia, P. Sermanet, S. Reed, D. Anguelov, D. Erhan, V. Vanhoucke, and A. Rabinovich. Going deeper with convolutions. CoRR, abs/1409.4842, 2014. 2