YOLOv1-darknet 內容解析
1. 核心思想
目標檢測分為二階段和一階段的方法,二階段方法主要有Fast R-CNN系列,Mask R-CNN等,主要方法是用算法生成一些列作為樣本的候選框,然后再使用卷積神經網絡進行樣本的分類;
一階段方法(End to End方法)主要有SSD系列,YOLO系列,這種方法是將目標邊框的定位問題轉化為回歸問題處理。
由於思想的不同,二階段檢測方法在檢測准確率和定位精度有優勢,一階段檢測方法在速度上占有優勢。
所以YOLO的核心思想是,直接在輸出層回歸bounding box的位置和bounding box所屬的類別(整張圖作為網絡的輸入,把 Object Detection 的問題轉化成一個 Regression 問題)。
2. 特點
- 速度快,因為沒有復雜的檢測流程,只需要將圖像輸入到神經網絡就可以得到檢測結果,YOLO可以非常快的完成物體檢測任務。
- YOLO在訓練和測試時都能夠看到一整張圖像的信息,因此YOLO在檢測物體時能很好的利用上下文信息,從而不容易在背景上預測出錯誤的物體信息。
- YOLO可以學到物體的泛化特征:當YOLO在自然圖像上做訓練,在藝術作品上做測試時,YOLO表現的性能比DPM、R-CNN等之前的物體檢測系統要好很多。因為YOLO可以學習到高度泛化的特征,從而遷移到其他領域。
3. 缺點
-
YOLO的物體檢測精度低於其他state-of-the-art的物體檢測系統。
-
YOLO容易產生物體的定位錯誤。
-
YOLO對小物體的檢測效果不好(尤其是密集的小物體,因為一個柵格只能預測2個物體)。
4. 算法流程
-
Resize成448 \(\times\) 448,圖片分割得到7 \(\times\) 7 網格(cell)
-
CNN提取特征和預測:卷積部分負責提特征。全鏈接部分負責預測:
- 7 \(\times\) 7 \(\times\) 2 = 98個bounding box的坐標(x,y,w,h,confidence)
- 7 \(\times\) 7 = 49個cell所屬20個物體的概率
-
過濾得到的bbox, 使用nms算法
5. 詳細內容
網絡示意圖:
最后reshape層的計算:(5 = x,y,w,h,confidence)
這里BboxNum = 2, Class = 20,所以filter是30。
網絡結構借鑒了 GoogLeNet 。24個卷積層,2個全鏈接層。(用1×1 reduction layers 緊跟 3×3 convolutional layers 取代Goolenet的 inception modules )
每個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預測的有多准兩重信息:
第一項:$$Pr(Object)$$: 代表的是如果人工標注的框(ground truth box)落在一個gird cell中,則取1,否則取0。
第二項: $$IOU^{truth}_{pred}$$: 預測的bounding box和實際的ground truth box之間的IOU值。
這樣前10個框來源就清楚了,即:\(BboxNum \times 5\).
剩余的20維度是用來對20個類進行預測,所以總共需要輸出是 $$7 \times 7 \times (5 \times 2 + 20)$$。
關鍵內容:損失函數的設計
說明:每行是一個cell對應的兩個bounding Box的相關信息,一共有\(7\times7\)這么多的行
對應類別計算方法,需要與confidence相乘,得到以下矩陣:
按照下圖所示步驟進行操作,這只是示意其中一個類,每一行都要進行如下操作:
在所有做完nms之后選擇對應的框畫出來
得到以下效果:
總圖:
損失函數由三個方面組成,一個是定位損失(localization error),一個是置信度損失,一個是分類損失(classification error)。簡單的全部采用了sum-squared error loss來做這件事會有以下不足:
- 8維的localization error和20維的classification error同等重要是不合理的;(真實框的中心x坐標減去yolo實際預測框的中心x尖 )
- 如果一個網格中沒有object(一幅圖中這種網格很多),那么就會將這些網格中的box的confidence逼近到0,相比於較少的有object的網格,這種做法是overpowering的,這會導致網絡不穩定甚至發散。
如何解決,重新設計新的loss計算方案:
-
更重視8維的坐標預測,給這些損失前面賦予更大的loss weight, 記為\(\lambda_{coord}\),即坐標預測部分內容。(上圖藍色框)
-
對沒有object的bbox的confidence loss,賦予小的loss weight,記為 \(\lambda_{coord}\),在pascal VOC訓練中取0.5。(上圖橙色框)
-
有object的bbox的confidence loss (上圖紅色框) 和類別的loss (上圖紫色框)的loss weight正常取1。
-
對不同大小的bbox預測中,相比於大bbox預測偏一點,小box預測偏一點更不能忍受。而sum-square error loss中對同樣的偏移loss是一樣。 為了緩和這個問題,作者用了一個比較取巧的辦法,就是將box的width和height取平方根代替原本的height和width。 如下圖:small bbox的橫軸值較小,發生偏移時,反應到y軸上的loss(下圖綠色)比big box(下圖紅色)要大。
-
-
一個網格預測多個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最大者偏移會更少一些,可以更快速的學習到正確位置)
-
測試階段,使用nms的時候,按照以下方式進行衡量是否保留改框:
\[Pr(Class_i|Object)\times Pr(Object)\times IOU^{truth}_{pred}=Pr(Class_i)\times IOU^{truth}_{pred} \]