1. 程式人生 > >YOLOv1目標檢測演算法詳細總結分析(one-stage)(深度學習)(CVPR 2016)

YOLOv1目標檢測演算法詳細總結分析(one-stage)(深度學習)(CVPR 2016)

論文名稱: 《 You Only Look Once: Unified, Real-Time Object Detection 》

論文連線:https://github.com/pjreddie/darknet 

程式碼連線:http://arxiv.org/abs/1506.02640


一、目標檢測概述:

近幾年來,目標檢測演算法取得了很大的突破。

早期的目標檢測方法通常是通過提取影象的一些魯棒性好的、的特徵(如Haar、SIFT、HOG 等),使用 DPM(Deformable Parts Model)模型,用滑動視窗(Silding Window)的方式來預測具有較高得分(Score)的邊界框(Bounding Box)。

後來出現了候選區域(Region Proposal)方法(其中選擇性搜尋(Selective Search)為這類方法的典型代表),相比於滑動視窗這種窮舉的方式,減少了大量的計算,同時在效能上也有很大的提高。利用選擇性搜尋的結果,結合卷積神經網路的R-CNN出現後,目標檢測的效能有了一個質的飛越。基於R-CNN發展出來的SPPnet、Fast R-CNN、Faster R-CNN 等方法,證明了“候選區域+分類” 的方法在目標檢測上的有效性。

圖1-1 經典目標檢測演算法的特點題

大體來說,目前比較流行的演算法可以分為兩類:

一類是基於候選區域的R-CNN系演算法(R-CNN,Fast R-CNN, Faster R-CNN),它們是兩階段(Two-Stage)的,需要先使用啟發式方法(如選擇性搜尋)或者CNN網路(RPN)產生候選區域,然後再在候選區域上做分類與迴歸。

另一類是YOlO,SSD這類一階段(One-Stage)演算法,其僅僅使用一個CNN網路直接預測不同目標的類別與位置。第一類方法是準確度高一些,但是速度慢,但是第二類演算法是速度快,但是準確性要低一些。這可以在圖2中看到。

YOlO演算法,其全稱是You Only Look Once: Unified, Real-Time Object Detection,Once指的是隻需要一次CNN運算,Unified指的是這是一個統一的框架,提供end-to-end的預測,而實時性(Real-Time)的體現是YOlO演算法速度快。

YOLO演算法將目標檢測的問題轉化成一個迴歸(Regression)問題。給定輸入影象,直接在影象的多個位置上回歸出目標的邊界框以及其分類類別。

圖1-2 經典目標檢測演算法的檢測效能對比

二、YOLOv1演算法原理:

YOLO是一個可以一次性預測多個邊界框位置和類別的卷積神經網路,能夠實現端到端的目標檢測和識別,其最大的優勢就是速度快。事實上,目標檢測的本質就是迴歸,因此一個實現迴歸功能的CNN並不需要複雜的設計過程。YOLO沒有選擇滑動視窗(Silding Window)或提取候選框的方式訓練網路,而是直接選用整圖訓練模型。這樣做的好處在於可以更好的區分目標和背景區域,相比之下,採用候選區域訓練方式的Fast-R-CNN常常把背景區域誤檢為特定目標。

下圖所示是YOLOv1檢測系統流程:

圖2-1 YOLOv1檢測流程

檢測流程大體分為三步:

1、將影象Resize到448*448,輸入網路;

2、執行CNN,提取影象特徵,輸出特徵張量;

3、對特徵張量進行非極大抑制優化(NMS),得到檢測結果。

YOLO是基於Pascal VOC2012資料集的目標檢測系統,能夠檢測到20種Pascal的目標類別,包括1+6+6+7:人,鳥、貓、牛、狗、馬、羊,飛機、自行車、船、巴士、汽車、摩托車、火車,瓶子、椅子、桌子、盆栽植物、沙發、電視/顯示器。

檢測方面:

YOLO的設計理念遵循端到端訓練和實時檢測,它將輸入影象劃分為S*S個網格,若一個目標的中心落在某單元格(Cell)內,則此單元格負責檢測該目標。如圖2-2所示,狗這個目標(GroundTruth)的中心落在左下角一個單元格內,那麼該單元格負責預測這個狗。

圖2-2 單元格負責預測中心落在本格內的目標

邊界框的大小與位置可以用4個值來表徵:(x,y,w,h),其中(x,y)是邊界框的中心座標,而w和h是邊界框的寬與高。要注意的是,中心座標的預測值(x,y)是相對於每個單元格左上角座標點的偏移值,並且單位是相對於單元格大小的,單元格的座標定義如圖2-2所示。而邊界框的w和h預測值是相對於整個圖片的寬與高的比例,這樣理論上4個元素的大小應該在[0,1]範圍。這樣,每個邊界框的預測值實際上包含5個元素(x,y,w,h,c),其中前4個表徵邊界框的大小與位置,而最後一個值是該邊界框的邊界框置信度。

在訓練和測試時,每個單元格預測B個邊界框,每個邊界框對應5個預測引數:邊界框的中心點相對座標(x,y),邊界框相對寬高w,h)邊界框置信度Confidence:

                                         

式( 2-1

邊界框的置信度(Confidence)綜合反映了:

1、當前邊界框中含有目標的置信度Pr(Object)

2、當前邊界框預測目標位置的準確性IOU(pred|truth) ,其計算原理如圖2-3

3、如果邊界框內不存在物體,則Pr(Object)=0。如果存在物體,則Pr(Object)=1,接著根據預測的邊界框和GroundTruth計算交併比(IOU)。

圖2-3 交併比的計算原理

 分類方面:

對於每一個單元格,網路模型預測出C個概率值,其表徵的是由該單元格預測的邊界框中的目標屬於各個類別的概率,這些概率值其實是在各個邊界框置信度下的條件類別概率(conditional class probabilities),即Pr(class_i|object) i=1,2,...,C;

值得注意的是,不管一個單元格預測多少個邊界框,其只預測一組條件類別概率值,即每一個單元格預測的B個邊界框共享所屬單元格的一套條件類概率。這是YOlO演算法的一個缺點,在後來的改進版本中,YOLO演算法是把類別概率預測值與邊界框是繫結在一起的,一個邊界框框對應一組類別概率值。  

圖2-4 YOLOv1預測結果資料結構

此時可計算出每個框的20個邊界框類別置信度(Class-Specific Confidence Scores):

式( 2-2

 

邊界框類別置信度表徵的是該邊界框中目標屬於各個類別的可能性大小以及邊界框匹配目標的好壞,一般會根據邊界框類別置信度來過濾網路的預測框。

總之,每個單元格需要預測(B∗5+C)個值,如圖2-4所示,網格劃分為S×S時,最終預測值為S×S×(B∗5+C)大小的張量。對於PASCAL VOC資料(有20個類,即C=20),當S=7,B=2時,預測結果就是7×7×30的張量。

三、YOLOv1檢測原理:

先介紹一下非極大值抑制演算法(Non Maximum Suppression, NMS),這個演算法不單單是針對YOlO演算法的,而是所有的檢測演算法中都會用到。NMS演算法主要解決的是一個目標被多次檢測的問題,如圖3-1中的人臉檢測,可以看到人臉被多次檢測,但是其實我們希望最後僅僅輸出其中一個最好的預測框,對於美女,只想要紅色那個檢測結果。那麼可以採用NMS演算法來實現這樣的效果:首先從所有的檢測框中找到置信度最大的那個框,然後挨個計算其與剩餘框的IOU,如果其值大於一定閾值(重合度過高),那麼就將該框剔除(YOLO中為將要剔除的邊界框置信度置0);然後對剩餘的檢測框重複上述過程,直到處理完所有的檢測框。

YOlO預測過程也需要用到NMS演算法。

圖3-1 NMS示意圖(一)

將圖片通過訓練好的網路,輸出得到特徵圖(7×7×30大小的張量),而後如下處理:

1、求邊界框類別置信度(Score)矩陣(為所有邊界框和20個類別分別建立聯絡):

每個邊界框的邊界框置信度(Confidence)和所屬單元格的條件類別概率向量(1×20)相乘,得到每個邊界框屬於哪一類的邊界框類別置信度(1×20)。也就是說最後會得到20×(7×7×2)=20×98的Score矩陣(20×98),98是邊界框的數量,20代表類別。

2、對每類中邊界框進行“閾值篩選”和“NMS篩選”(本步操作對20個類別輪流進行):

在某個類別中(即矩陣的某一行),將Score小於閾值(0.2)的設定為0,然後再按得分從高到低排序。

然再用NMS演算法將重複率較大的邊界框的Score置0(針對某一類別,選擇Score最大的邊界框,然後計算它和其它邊界框的IOU值,如果IOU大於0.5,說明重複率較大,後者Score設為0,否則不改)。NMS的作用見圖3-2。

圖3-2 NMS示意圖(二)

3、對每一個邊界框做“Score篩選”,只留一個Score(針對本框的Score向量(1×20)):

對一個邊界框,在它的20個Score(其中有些是0)中取最大的Score,其餘置0,如果這個最大的Score大於0,那麼這個邊界框就是這個Score對應的類別,即檢測出目標,否則說明這個邊界框裡面沒有目標,跳過此框即可。

四、YOLOv1網路結構:

網路結構參考GooLeNet模型,包含24個卷積層和2個全連線層,卷積層主要用來提取特徵,全連線層主要用來預測類別概率和座標。大體結構如圖4-1所示。

圖4-1 YOLOv1模型概覽(一)(中間有所省略)

對於卷積層,主要使用1×1卷積來做通道縮減(channle reduction),然後緊跟3×3卷積。對於卷積層和全連線層,採用Leaky ReLU啟用函式:max(x,0.1x)(即當x<0時,啟用值是0.1×x,而不是傳統的0),最後一層採用線性啟用函式。

注意網路的輸出是7×7×30大小的張量(對於每個單元格,前20個元素是類別概率值,然後2個元素是邊界框置信度,最後8個元素是邊界框的(x,y,w,h)),中間實現的細節可能不同工程師有所不同,比如對GoogLeNET網路的Inception結構的改動以及最後幾層的全連線層(FC)的改動等等,但是重點在於最後一層的輸出的資料結構是不變的,參考圖4-2。(PS: Inception結構是提出於GoogLeNet的一種高效表達特徵的稀疏性網路結構。)

圖4-2 YOLOv1模型(二)

除了這個結構,文章還提出了一個輕量級(Tiny)版本Fast Yolo,其僅使用9個卷積層,並且卷積層中使用更少的卷積核。

五、YOLOv1網路訓練:

在訓練之前,先在ImageNet上進行預訓練,輸入是224×224大小的影象,預訓練分類模型採用圖4-1中前20個卷積層,然後新增一個平均池化(Average-Pool)層和全連線(FC)層。預訓練之後,在預訓練得到的20層卷積層之上加上隨機初始化的4個卷積層和2個全連線層,進行fine-tuning來訓練檢測模型。由於檢測任務一般需要高清的圖片,所以將網路的輸入從224×224增加到了448×448。整個網路的訓練流程如圖5-1所示:       

圖5-1 YOLOv1網路訓練流程

1、訓練的實現流程如下:

(1):通過網路得到過渡特徵圖:

輸入N個影象,每個訓練影象包含M個目標(以GroundTruth框的形式表示),每個目標(GroundTruth框)包含標註好的4個座標(x,y,w,h)和1個標籤(label)。輸入訓練樣本後,網路就知道對於這張圖,每個單元格是否負責目標,負責哪個目標以及對應目標的座標資訊,然後通過網路得到7×7×30大小的張量。每個1×30的向量前5個元素表示第一個邊界框的4個座標和1個邊界框置信度,第6到10元素表示第二個邊界框的4個座標和1個邊界框置信度。最後20個元素表示這個單元格的條件類別概率。這30個元素都是預測出的結果。

(2):計算損失函式(Loss)值並反饋回網路進行迭代:

根據公式計算損失函式的第一、二 、五行。至於第二、三行,邊界框的Confidence按照定義可以根據GroundTruth和邊界框座標計算出的IOU和框內含有目標的置信度Pr(Object)(取值0或1)相乘得到。

(3),用測試集進行測試:

輸入一張測試影象,跑到網路的末端得到7×7×30的張量,訓練好的權重已經計算出了邊界框的Confidence,然後再跟預測的所屬單元格的條件類別概率(1×20)相乘就得到每個邊界框屬於哪一類(共20類)的概率。

2、損失函式Loss計算組成如下:

採用平方和(Sum-Squared Error)把邊界框的座標誤差(Localization Error)和單元格的分類誤差(Classificaton Error)整合在一起。若如果二者的權值一致,容易導致模型不穩定,訓練發散。因為很多單元格是不包含物體的,這樣的話很多單元格的Confidence為0。所以採用設定不同權重方式來解決,一方面提高座標誤差的權重,另一方面降低沒有目標的邊界框的置信度誤差項權值,二者損失函式(Loss)對應項權重分別是5和0.5。而對於包含目標的邊界框的置信度誤差項權值還是原來的1。(帶小帽子的參量的是訓練樣本的標註值)。

圖5-2 YOLOv1網路損失函式結構

詳細分析(輸入訓練樣本圖片,遍歷每個單元格及其各邊界框,得到一個Loss值):(1)第一、二行(分成單元格包含與不包含目標兩種情況):

此項表示座標誤差,第一行是邊界框中心座標(x,y)的預測,第二行為邊界框寬高(w,h)的預測。本單元格無目標時,忽略此項,否則根據 IOU值大小確定負責本單元格所包含目標的那個邊界框,用其資料計算此項。這裡用w和h的開根號代替原來的w和h,這樣做是因為相同的寬和高誤差對於小的目標精度影響比大的目標要大。(舉個例子,原來w=10,h=20,預測出來w=8,h=22,跟原來w=3,h=5,預測出來w1,h=7相比,其實前者的誤差要比後者小,但是如果不加開根號,那麼損失都是一樣:4+4=8,但是加上根號後,變成0.15和0.7。)

(2)第三、四行(分成單元格包含與不包含目標兩種情況):

此項表示邊界框的置信度損失,當本單元格包含目標時,根據 IOU值大小確定負責本單元格的目標的那個邊界框,對此IOU更大的邊界框計算第三行,另一框計算第四行;當本單元格不包含目標時,兩框均計算第四行。

(3)第五行(分成單元格包含與不包含目標兩種情況):

此項表示預測類別的誤差,本單元格無目標時,忽略此項,否則按照公式計算此項。

六、演算法效能分析:

以YOlO演算法在PASCAL VOC 2007資料集上的效能為例,將YOLO與其它檢測演算法做一對比,包括DPM,R-CNN,Fast R-CNN以及Faster R-CNN。其對比結果如表6-1所示。

與實時性檢測方法DPM對比,可以看到YOLO演算法可以在較高的mAP上達到較快的檢測速度,其中Fast YOlO演算法比快速DPM還快,而且mAP是遠高於DPM。但是相比Faster R-CNN,YOLO的mAP稍低,但是速度更快。

所以YOLO演算法算是在速度與準確度上做了折中。

表6-1 Yolo在PASCAL VOC 2007上與其他演算法的對比

文章進一步還做了誤差分析,將預測結果按照分類與定位準確性分成以下5類:

1、Correct:類別正確,IOU>0.5;(定位準確)

2、Localization:類別正確,0.1 < IOU<0.5(定位不準)

3、Similar:類別相似,IOU>0.1;

4、Other:類別錯誤,IOU>0.1;

5、Background:對任何目標其IOU<0.1。(誤把背景當物體)

YOLO與Fast R-CNN的誤差對比分析如下圖所示:

表6-1 Yolo在PASCAL VOC 2007上與其他演算法的對比

可以看到,YOLO的Correct的是低於Fast R-CNN。另外YOLO的Localization誤差偏高,即定位不是很準確。但是YOLO的Background誤差很低,說明其對背景的誤判率較低。

現在來總結一下YOLO的優缺點。首先是優點,YOLO採用一個CNN網路來實現檢測,其訓練與預測都是端到端(End-to-End),所以YOLO演算法比較簡潔且速度快。第二點由於YOLO是對整張圖片做卷積,所以其在檢測目標有更大的視野,它不容易對背景誤判。另外,Yolo的泛化能力強,在做遷移時,模型魯棒性高。

最後分析YOLO演算法的缺點:

  1. YOLO僅僅預測兩個邊界框,而且屬於一個類別,導致定位精確性差,對於小目標物體以及物體比較密集的檢測效果不好;
  2. YOLO對於在物體的寬高比方面泛化率低,就是無法定位不尋常比例的物體;
  3.  YOLO雖然可以降低將背景檢測為物體的概率,但同時導致召回率(Recall)較低。