YOLOv1-darknet 內容解析

YOLOv1-darknet 內容解析

1. 核心思想

目標檢測分爲二階段和一階段的方法,二階段方法主要有Fast R-CNN系列,Mask R-CNN等,主要方法是用算法生成一些列做爲樣本的候選框,而後再使用卷積神經網絡進行樣本的分類;網絡

img

一階段方法(End to End方法)主要有SSD系列,YOLO系列,這種方法是將目標邊框的定位問題轉化爲迴歸問題處理。ide

img

因爲思想的不一樣,二階段檢測方法在檢測準確率和定位精度有優點,一階段檢測方法在速度上佔有優點。函數

因此YOLO的核心思想是,直接在輸出層迴歸bounding box的位置和bounding box所屬的類別(整張圖做爲網絡的輸入,把 Object Detection 的問題轉化成一個 Regression 問題)。oop

2. 特色

  1. 速度快,由於沒有複雜的檢測流程,只須要將圖像輸入到神經網絡就能夠獲得檢測結果,YOLO能夠很是快的完成物體檢測任務。
  2. YOLO在訓練和測試時都可以看到一整張圖像的信息,所以YOLO在檢測物體時能很好的利用上下文信息,從而不容易在背景上預測出錯誤的物體信息。
  3. YOLO能夠學到物體的泛化特徵:當YOLO在天然圖像上作訓練,在藝術做品上作測試時,YOLO表現的性能比DPM、R-CNN等以前的物體檢測系統要好不少。由於YOLO能夠學習到高度泛化的特徵,從而遷移到其餘領域。

3. 缺點

  1. YOLO的物體檢測精度低於其餘state-of-the-art的物體檢測系統。性能

  2. YOLO容易產生物體的定位錯誤。
  3. YOLO對小物體的檢測效果很差(尤爲是密集的小物體,由於一個柵格只能預測2個物體)。學習

4. 算法流程

img

  1. Resize成448 \(\times\) 448,圖片分割獲得7 \(\times\) 7 網格(cell)測試

  2. CNN提取特徵和預測:卷積部分負責提特徵。全連接部分負責預測:
    1. 7 \(\times\) 7 \(\times\) 2 = 98個bounding box的座標(x,y,w,h,confidence)
    2. 7 \(\times\) 7 = 49個cell所屬20個物體的機率
  3. 過濾獲得的bbox, 使用nms算法google

5. 詳細內容

網絡示意圖:es5

img

img

最後reshape層的計算:(5 = x,y,w,h,confidence)
\[ filter = (BboxNum\times5+Class) \]
這裏BboxNum = 2, Class = 20,因此filter是30。

網絡結構借鑑了 GoogLeNet 。24個卷積層,2個全連接層。(用1×1 reduction layers 緊跟 3×3 convolutional layers 取代Goolenet的 inception modules )

img

每一個1 \(\times\) 1 \(\times\) 30 對應其中一個cell, 每一個cell須要預測兩個bounding box的中心座標(\(x_c\),\(y_c\),\(w\),\(h\)),其中\(x_c,y_c\)被歸一化到0~1之間,w,h經過圖像的width和height歸一化到0~1之間。 每一個bounding box除了要回歸自身的位置以外,還要附帶預測一個confidence值。 這個confidence表明了所預測的box中含有object的置信度和這個box預測的有多準兩重信息:
\[ confidence=Pr(Object)\times IOU^{truth}_{pred} \]
第一項:\[Pr(Object)\]: 表明的是若是人工標註的框(ground truth box)落在一個gird cell中,則取1,不然取0。

第二項: \[IOU^{truth}_{pred}\]: 預測的bounding box和實際的ground truth box之間的IOU值。

img

這樣前10個框來源就清楚了,即:\(BboxNum \times 5\).

剩餘的20維度是用來對20個類進行預測,因此總共須要輸出是 \[7 \times 7 \times (5 \times 2 + 20)\]

關鍵內容:損失函數的設計

img

說明:每行是一個cell對應的兩個bounding Box的相關信息,一共有\(7\times7\)這麼多的行

1544779555983

對應類別計算方法,須要與confidence相乘,獲得如下矩陣:

按照下圖所示步驟進行操做,這只是示意其中一個類,每一行都要進行以下操做:

1544780579024

在全部作完nms以後選擇對應的框畫出來

1544780708391

獲得如下效果:

1544780790178

總圖:

img

損失函數由三個方面組成,一個是定位損失(localization error),一個是置信度損失,一個是分類損失(classification error)。簡單的所有采用了sum-squared error loss來作這件事會有如下不足

  1. 8維的localization error和20維的classification error同等重要是不合理的;(真實框的中心x座標減去yolo實際預測框的中心x尖 )
  2. 若是一個網格中沒有object(一幅圖中這種網格不少),那麼就會將這些網格中的box的confidence逼近到0,相比於較少的有object的網格,這種作法是overpowering的,這會致使網絡不穩定甚至發散。

如何解決,從新設計新的loss計算方案:

  1. 更重視8維的座標預測,給這些損失前面賦予更大的loss weight, 記爲\(\lambda_{coord}\),即座標預測部份內容。(上圖藍色框)
  2. 對沒有object的bbox的confidence loss,賦予小的loss weight,記爲 \(\lambda_{coord}\),在pascal VOC訓練中取0.5。(上圖橙色框)
  3. 有object的bbox的confidence loss (上圖紅色框) 和類別的loss (上圖紫色框)的loss weight正常取1。
  4. 對不一樣大小的bbox預測中,相比於大bbox預測偏一點,小box預測偏一點更不能忍受。而sum-square error loss中對一樣的偏移loss是同樣。 爲了緩和這個問題,做者用了一個比較取巧的辦法,就是將box的width和height取平方根代替本來的height和width。 以下圖:small bbox的橫軸值較小,發生偏移時,反應到y軸上的loss(下圖綠色)比big box(下圖紅色)要大。
  5. img
  6. 一個網格預測多個bounding box,在訓練時咱們但願每一個object(ground true box)只有一個bounding box專門負責(一個object 一個bbox)。具體作法是與ground true box(object)的IOU最大的bounding box 負責該ground true box(object)的預測。這種作法稱做bounding box predictor的specialization(專職化)。每一個預測器會對特定(sizes,aspect ratio or classed of object)的ground true box預測的愈來愈好。(我的理解:IOU最大者偏移會更少一些,能夠更快速的學習到正確位置)

  7. 測試階段,使用nms的時候,按照如下方式進行衡量是否保留改框:
    \[ Pr(Class_i|Object)\times Pr(Object)\times IOU^{truth}_{pred}=Pr(Class_i)\times IOU^{truth}_{pred} \]

6. 主要參考

https://zhuanlan.zhihu.com/p/24916786

https://docs.google.com/presentation/d/1aeRvtKG21KHdD5lg6Hgyhx5rPq_ZOsGjG5rJ1HP7BbA/pub?start=false&loop=false&delayms=3000&slide=id.g137784ab86_4_1738

相關文章
相關標籤/搜索