1. 程式人生 > >目標檢測之YOLO,SSD

目標檢測之YOLO,SSD

在深度學習出現之前,傳統的目標檢測方法大概分為區域選擇(滑窗)、特徵提取(SIFT、HOG等)、分類器(SVM、Adaboost等)三個部分,其主要問題有兩方面:一方面滑窗選擇策略沒有針對性、時間複雜度高,視窗冗餘;另一方面手工設計的特徵魯棒性較差。自深度學習出現之後,目標檢測取得了巨大的突破,最矚目的兩個方向有:1 以RCNN為代表的基於Region Proposal的深度學習目標檢測演算法(RCNN,SPP-NET,Fast-RCNN,Faster-RCNN等);2 以YOLO為代表的基於迴歸方法的深度學習目標檢測演算法(YOLO,SSD等)。前篇文章介紹了基於Region Proposal的深度學習目標檢測演算法,本篇將對基於迴歸方法的深度學習目標檢測方法(YOLO,SSD)進行介紹,前者在速度上並不能滿足實時要求,後者利用迴歸的思想(既給定輸入影象,直接在影象的多個位置上回歸出這個位置的目標邊框以及目標類別),很大的加快了檢測的速度。

YOLO

演算法特點

1 將物體檢測作為迴歸問題求解。基於一個單獨的End-To-End網路,完成從原始影象的輸入到物體位置和類別的輸出,輸入影象經過一次Inference,便能得到影象中所有物體的位置和其所屬類別及相應的置信概率。

2 YOLO網路借鑑了GoogLeNet分類網路結構。不同的是,YOLO未使用Inception Module,而是使用1*1卷積層(此處1*1卷積層的存在是為了跨通道資訊整合)+3*3卷積層簡單替代。

3 Fast YOLO使用9個卷積層代替YOLO的24個,網路更輕快,速度從YOLO的45fps提升到155fps,但同時損失了檢測準確率。

4 使用全圖作為 Context 資訊,背景錯誤(把背景錯認為物體)比較少。

5 泛化能力強。在自然影象上訓練好的結果在藝術作品中的依然具有很好的效果。

網路結構

幾個要點

一、大致流程

1 給個一個輸入影象,首先將影象劃分成7*7的網格。

2 對於每個網格,我們都預測2個邊框(包括每個邊框是目標的置信度以及每個邊框區域在多個類別上的概率)。

3 根據上一步可以預測出7*7*2個目標視窗,然後根據閾值去除可能性比較低的目標視窗,最後NMS去除冗餘視窗即可。

二、訓練

1 預訓練分類網路:在 ImageNet 1000-class Competition Dataset上預訓練一個分類網路,這個網路是前文網路結構中的前20個卷機網路+Average-Pooling Layer+Fully Connected Layer(此時網路輸入是224*224)。

2 訓練檢測網路:文獻[6]提到在預訓練網路中增加捲積和全連結層可以改善效能。YOLO新增4個卷積層和2個全連結層,隨機初始化權重。檢測要求細粒度的視覺資訊,所以把網路輸入也從224*224變成448*448。

(1)一幅圖片分成7*7個網格,某個物體的中心落在這個網格中此網格就負責預測這個物體。每個網格預測兩個Bounding Box。網格負責類別資訊,Bounding Box負責座標資訊(4個座標資訊及一個置信度),所以最後一層輸出為7*7*(2*(4+1)+20)=7*7*30的維度。

(2)Bounding Box的座標使用影象的大小進行歸一化0-1。Confidence使用Pr(Object)IOUtruthpredPr(Object)∗IOUpredtruth計算,其中第一項表示是否有物體落在網格里,第二項表示預測的框和實際的框之間的IOU值。

3 損失函式的確定:損失函式的定義如下,損失函式的設計目標就是讓座標,置信度和類別這個三個方面達到很好的平衡。簡單的全部採用了Sum-Squared Error Loss來做這件事會有以下不足:① 8維的Localization Error和20維的Classification Error同等重要顯然是不合理的;② 如果一個網格中沒有Object(一幅圖中這種網格很多),那麼就會將這些網格中的Box的Confidence Push到0,相比於較少的有Object的網格,這種做法是Overpowering的,這會導致網路不穩定甚至發散。 解決方案如下。

(1)更重視8維的座標預測,給這些損失前面賦予更大的Loss Weight, 記為λcoordλcoord ,在Pascal VOC訓練中取5。(上圖藍色框)。

(2)對沒有Object的Bbox的Confidence Loss,賦予小的Loss Weight,記為 λnoobjλnoobj ,在Pascal VOC訓練中取0.5。(上圖橙色框)。

(3)有Object的Bbox的Confidence Loss(上圖紅色框)和類別的Loss (上圖紫色框)的Loss Weight正常取1。

(4)對不同大小的Bbox預測中,相比於大Bbox預測偏一點,小Bbox預測偏一點更不能忍受。而Sum-Square Error Loss中對同樣的偏移Loss是一樣。為了緩和這個問題,將Bbox的Width和Height取平方根代替原本的Height和Width。 如下圖:Small Bbox的橫軸值較小,發生偏移時,反應到y軸上的Loss(下圖綠色)比Big Bbox(下圖紅色)要大。

(5)一個網格預測多個Bbox,在訓練時我們希望每個Object(Ground True box)只有一個Bbox專門負責(一個Object 一個Bbox)。具體做法是與Ground True Box(Object)的IOU最大的Bbox 負責該Ground True Box(Object)的預測。這種做法稱作Bbox Predictor的Specialization(專職化)。每個預測器會對特定(Sizes,Aspect Ratio or Classed of Object)的Ground True Box預測的越來越好。

三、測試

1 計算每個Bbox的Class-Specific Confidence Score:每個網格預測的Class資訊( Pr(Classi|Object)Pr(Classi|Object))和Bbox預測的Confidence資訊( Pr(Object)IOUtruthpredPr(Object)∗IOUpredtruth) 相乘,就得到每個Bbox的Class-Specific Confidence Score。

Pr(Classi|Object)Pr(Object)IOUtruthpred=Pr(Classi)IOUtruthpredPr(Classi|Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruth

2 進行Non-Maximum Suppression(NMS):得到每個Bbox的Class-Specific Confidence Score以後,設定閾值,濾掉得分低的Bboxes,對保留的Bboxes進行NMS處理,就得到最終的檢測結果。更為直觀詳細的流程可參見[5]。

存在問題

1 YOLO對相互靠的很近的物體(挨在一起且中點都落在同一個格子上的情況),還有很小的群體檢測效果不好,這是因為一個網格中只預測了兩個框,並且只屬於一類。

2 測試影象中,當同一類物體出現的不常見的長寬比和其他情況時泛化能力偏弱。

3 由於損失函式的問題,定位誤差是影響檢測效果的主要原因,尤其是大小物體的處理上,還有待加強。

SSD

演算法特點

1 SSD結合了YOLO中的迴歸思想和Faster-RCNN中的Anchor機制,使用全圖各個位置的多尺度區域特徵進行迴歸,既保持了YOLO速度快的特性,也保證了視窗預測的跟Faster-RCNN一樣比較精準。

2 SSD的核心是在特徵圖上採用卷積核來預測一系列Default Bounding Boxes的類別、座標偏移。為了提高檢測準確率,SSD在不同尺度的特徵圖上進行預測。

網路結構

幾個要點

一、模型結構

1 多尺度特徵圖(Mult-scale Feature Map For Detection)

在影象Base Network基礎上,將Fc6,Fc7變為了Conv6,Conv7兩個卷積層,添加了一些卷積層(Conv8,Conv9,Conv10,Conv11),這些層的大小逐漸減小,可以進行多尺度預測。

2 卷積預測器(Convolutional Predictors For Detection)

每個新新增的卷積層和之前的部分卷積層,使用一系列的卷積核進行預測。對於一個大小為m*n大小,p通道的卷積層,使用3*3的p通道卷積核作為基礎預測元素進行預測,在某個位置上預測出一個值,該值可以是某一類別的得分,也可以是相對於Default Bounding Boxes的偏移量,並且在影象的每個位置都將產生一個值。

3 預設框和比例(Default Boxes And Aspect Ratio)

在特徵圖的每個位置預測K個Box。對於每個Box,預測C個類別得分,以及相對於Default Bounding Box的4個偏移值,這樣需要(C+4)*k個預測器,在m*n的特徵圖上將產生(C+4)*k*m*n個預測值。這裡,Default Bounding Box類似於Faster-RCNN中Anchors,如下圖所示。

二、模型訓練

1 監督學習的訓練關鍵是人工標註的label。對於包含Default Box(在Faster R-CNN中叫做Anchor)的網路模型(如:YOLO,Faster R-CNN, MultiBox)關鍵點就是如何把 標註資訊(Ground True Box,Ground True Category)對映到(Default Box上)。

2 給定輸入影象以及每個物體的Ground Truth,首先找到每個Ground True Box對應的Default Box中IOU最大的作為正樣本。然後,在剩下的Default Box中找到那些與任意一個Ground Truth Box的IOU大於0.5的Default Box作為正樣本。其他的作為負樣本(每個Default Box要麼是正樣本Box要麼是負樣本Box)。如上圖中,兩個Default Box與貓匹配,一個與狗匹配。在訓練過程中,採用Hard Negative Mining 的策略(根據Confidence Loss對所有的Box進行排序,使正負例的比例保持在1:3) 來平衡正負樣本的比率。

3 損失函式

與Faster-RCNN中的RPN是一樣的,不過RPN是預測Box裡面有Object或者沒有,沒有分類,SSD直接用的Softmax分類。Location的損失,還是一樣,都是用Predict box和Default Box/Anchor的差 與Ground Truth Box和Default Box/Anchor的差進行對比,求損失。

其中,xpij=1xijp=1表示 第ii個Default Box 與類別pp的第jj個Ground Truth Box相匹配,否則若不匹配的話,則xpij=0xijp=0

4 Default Box的生成

對每一張特徵圖,按照不同的大小(Scale) 和長寬比(Ratio)生成生成k個預設框(Default Boxes)。

(1)Scale:每一個Feature Map中Default Box的尺寸大小計算如下:

sk=smin+smaxsm