一文搞懂目標檢測

一、計算機視覺四大任務

  • 分類任務(Classification):需要解決圖片內容“是什麼”的問題,即判斷圖片包含什麼類別。
  • 定位(Location):需要解決圖片內的目標“在哪裏”的問題,即定位出圖片內的目標的位置。
  • 檢測(Detection):需要解決圖片內容“是什麼,在哪裏”的問題,即定位出目標的的位置以及判斷目標的類別。
  • 分割(Segmentation):分爲實例的分割和場景分割,解決“每一個像素屬於哪個目標物或場景”的問題。

二、目標檢測

**目標檢測: **是找出圖像中所有感興趣的目標(物體),確定它們的位置和大小。

過去的十多年來看,自然圖像的目標檢測算法都是基於傳統手工特徵的時期,自2013年起至今,爲基於深度學習的目標檢測時期。下圖爲目標檢測基於深度學習技術的發展歷程,下面將分別對這些算法和其中採用的技術進行介紹。

1.相關概念

(1)交併比IOU

如下圖綠色框是人工標註的ground truth,紅色框是目標檢測算法最終給出的結果bounding box,顯然綠色框對於飛機這個物體檢測的更加準確,IOU正是表達這種bounding box和ground truth的差異的指標。

IOU定義了兩個目標檢測面積的重疊度,當算法給出的框和人工標註的框差異很小時,或者說重疊度(IOU)很大時,可以說算法產生的bounding box(簡寫bbox)就很準確。如下圖所示,矩形框A、B的一個重合度IOU計算公式爲:IOU=(A∩B)/(A∪B)

:如果以下概念看不懂,可以直接看RCNN部分,然後再返回查看。

(2)非極大值抑制NMS

目標檢測算法一般會給出目標很多的粗略結果,我們需要通過非極大值抑制方法,把其他冗餘的結果經進行排除,消除多餘的框,找到最佳的bbox。如下圖所示,紅色框表示含有多個目標區域,通過非極大值抑制,將其他冗餘目標區域刪除,得到綠色的目標區域。

具體過程如下:
假設根據分類器的得到的分類概率大小爲: A<B<C<D<E<F

  • 從最大概率矩形框F開始,分別判斷A~E與F的重疊度IOU是否大於某個設定的閾值;
  • 假設B、D與F的重疊度超過閾值,即說明B、D、F目標區域都很相似,A、C、E是其他的目標區域,那麼就扔掉B、D;並標記第一個矩形框F,即僅僅留下概率最大的。
  • 從剩下的矩形框A、C、E中(其他目標區域),選擇概率最大的E,然後判斷E與A、C的重疊度,重疊度大於一定的閾值,那麼就扔掉;並標記E是我們保留下來的第二個矩形框。
    就這樣一直重複,找到所有被保留下來的矩形框,由於我們設置了交併比,每個保存的矩形框僅僅代表一個目標,即如果圖片裏面有兩個目標,則最後僅僅保存兩個bbox

(3)邊界迴歸(Bounding-box regression )

根據前面的概念可知,每個目標最後會有一個Bounding-box,如下圖紅色框目標所示,綠色框爲人工標註的最佳目標區域。但是由前面介紹的IOU指標可知,這裏算法給出的紅色框可以認爲是檢測失敗的,因爲它和綠色的ground truth的 IOU值小於了0.5(目測……),也就是說重疊度不夠,目標檢測不準確。此時就需要對這個紅色框進行微調。使得經過微調後的窗口跟Ground Truth 更接近 ,即邊界框迴歸。

如下圖所示,紅色的框 P 代表原始的目標區域,綠色的框 G代表人工標註的最佳區域,邊界框迴歸的目標是:尋找一種關係使得輸入原始的窗口 P 經過映射得到一個跟真實窗口 G 更接近的迴歸窗口G^,由於這個過程涉及很多公式推導,所以此處不詳細闡述。

2.R-CNN

RCNN(Regions with CNN features)是將CNN卷積神經網絡應用到目標檢測問題上的一個里程碑,藉助CNN良好的特徵提取和分類性能,通過Region Proposal方法實現目標檢測問題的轉化。
算法可以分爲4個步驟:

(1)候選區域選擇

Region Proposal是一類傳統的區域提取方法,可以看作不同寬高的滑動窗口,通過窗口滑動獲得潛在的目標圖像,一般候選區爲爲2千個即可。

(2)CNN特徵提取

將候選區域的目標圖像進行歸一化,作爲CNN的標準輸入。通過CNN卷積和池化等操作,得到固定維度的輸出特徵向量。原始論文中的CNN採用在 ImageNet 上已經訓練好的模型,然後在 PASCAL VOC 數據集上進行遷移學習fine-tune(遷移學習的一種方法)。因爲 ImageNet 的圖像高達幾百萬張,利用卷積神經網絡充分學習淺層的特徵,然後在小規模數據集做規模化訓練,從而可以達到好的效果。
R-CNN 抽取了一個 4096 維的特徵向量,採用的是 Alexnet,需要注意的是 Alextnet 的輸入圖像大小是 227x227。而產生的候選區域大小不一,爲了與 Alexnet 兼容,R-CNN 採用了非常暴力的手段,那就是無視候選區域的大小和形狀,統一變換到 227*227 的尺寸,邊界區域需要進行填充(padding)。

(3)分類與邊界迴歸

該過程包括兩個步驟:

  • 一是對CNN模型的輸出特徵向量進行分類,如利用 SVM 分類器進行類別的識別,產生分類分數(候選區域的概率值)。候選區域有 2000 個,所以很多會進行重疊。所以需要針對每個類,通過計算 IoU 指標,採取非極大值抑制,以最高分的區域爲基礎,剔除掉那些重疊位置的區域。
  • 二是通過邊界迴歸(bounding-box regression) 得到精確的目標區域,如上述概念邊界迴歸,由於實際目標產生的區域並不準確,所以通過一個線性的迴歸模型,對完成分類的目標進行精確的定位。

如下圖爲R-CNN總的流程圖:

R-CNN存在三個明顯的問題:

  • 多個候選區域對應的圖像需要預先提取,佔用較大的磁盤空間;

  • 針對傳統CNN需要固定尺寸的輸入圖像,歸一化產生物體截斷或拉伸,會導致輸入CNN的信息丟失;

  • 每一個ProposalRegion都需要進入CNN網絡計算,上千個Region存在大量的範圍重疊,重複的特徵提取帶來巨大的計算浪費。

3.SPP-Net

如上R-CNN存在三個明顯的缺點,因此會產生這樣的疑問:爲什麼要對每一個候選區域獨立計算,而不是提取整體特徵,僅在分類之前做一次區域截取呢?SPP-Net就解決了這個問題。如下圖爲SPP-Net總的流程圖:

(1)候選區域處理

在候選區域的處理過程中,首先用CNN提取整體圖片的特徵,僅在分類之前做一次候選區域截取。

(2)特徵圖提取

在上述得到整體的特徵之後,如何得到候選區域的特徵圖呢,對卷積層可視化發現:輸入圖片的某個位置的特徵反應在特徵圖上也是在相同位置。基於這一事實,對候選區域的特徵提取只需要在特徵圖上的相應位置提取就可以了。

(3)提取特徵向量

在通過上述方法得到候選區域的特徵圖之後,爲了適應不同尺寸的特徵圖,定義一種可伸縮的池化層SPP:空間金字塔池化SPP(SpatialPyramid Pooling ),在最後的卷積層和全連接層之間加入SPP層,不管輸入分辨率是多大,都可以劃分爲固定維數的特徵向量。
SPP原理:
在conv5層得到的特徵圖是256層,每層都做一次spatial pyramid pooling。先把每個特徵圖分割成多個不同尺寸的網格,比如網格分別爲4x4、2x2、1x1,即長寬劃分爲4x4=16、2x2=4、1x1=1的網格。然後每個網格做max pooling,這樣256層特徵圖就形成了16x256,4x256,1x256維特徵,他們連起來就形成了一個固定長度的特徵向量,再將這個向量輸入到後面的全連接層。如下圖所示。

(4)分類與邊界迴歸

在檢測的後面模塊,仍然和R-CNN一樣,利用 SVM 分類器進行類別的識別,產生分類分數(候選區域的概率值),採取非極大值抑制,以最高分的區域爲基礎,剔除掉那些重疊位置的區域。再通過邊界迴歸得到精確的目標區域。

綜上:
在SPP-Net中,圖片只需要經過一次CNN,候選區域特徵直接從整張圖片特徵圖上提取。其中SPP層並不是關鍵,在後面的Fast-RCNN改進中該特徵已經被捨棄。而最關鍵的是SPP的位置,它放在所有的卷積層之後,有效解決了卷積層的重複計算問題,這是論文的核心貢獻。
SPP-Net在R-CNN的基礎上做了實質性的改進:

  • 取消了圖像歸一化過程,解決圖像變形導致的信息丟失以及存儲問題;
  • 採用空間金字塔池化SPP(SpatialPyramid Pooling )替換了全連接層之前的最後一個池化層(pool5)

儘管SPP-Net貢獻很大,仍然存在很多問題:

1)和R-CNN一樣,訓練過程仍然是隔離的,提取候選框——>計算CNN特徵——> SVM分類——> Bounding Box迴歸獨立訓練,大量的中間結果需要轉存,無法整體訓練參數;
2)在整個過程中,Proposal Region仍然很耗時。

SPP-Net與R-CNN對比圖:

3.Fast-RCNN

Fast-RCNN的主要亮點有:Fast RCNN將藉助多任務損失函數,將物體識別和位置修正合成到一個網絡中,不再對網絡進行分步訓練,不需要大量內存來存儲訓練過程中特徵的數據;用RoI層代替SPP層,可以使用BP算法更高效的訓練更新整個網絡,整體流程如下圖:

上圖中,原始圖片經過多層卷積與池化後,得到整圖的feature map。而由selective search產生的大量RoI(regions of interest,上圖僅顯示一個)經過**映射(projection)**可以得到其在feature map上的映射區域(ROIs,灰色部分),這些ROIs被池化層ROI Pooling爲一個固定大小的feature map,feature map被全連接層拉伸成一個特徵向量。對於每一個RoIs,經過FC層後得到的特徵向量feature vector,然後一個進行全連接之後用來做softmax迴歸,用來對RoI區域做物體識別,另一個經過全連接之後用來做b-box regression做區域修正定位。
RoI池化層原理:
RoI池化層使用最大池化將任何有效的RoI內的特徵轉換成具有H×W(例如,7×7)的固定空間範圍的小特徵圖(即轉化爲7×7=49個小特徵圖),然後對每個小特徵圖執行最大池化,並將輸出合併到相應的輸出網格單元中。假設要均勻分成2x2的網格時,但是feture map的座標值均爲整數值,不可避免存在一個就近取整的量化,如下圖所示,導致有時無法實現均勻分割。其中H和W是層的超參數。每個RoI由指定其左上角(r,c)及其高度和寬度(h,w)的四元組(r,c,h,w)定義(該池化層是有超參數)。RoI層相對於SPP池化層, 其只有一個金字塔層。
在這裏插入圖片描述

Fast-RCNN主要貢獻在於對R-CNN進行加速,在以下方面得到改進:

1)借鑑SPP思路,提出簡化版的ROI池化層(注意,沒用金字塔),同時加入了候選框映射功能,使得網絡能夠反向傳播,解決了SPP的整體網絡訓練問題;

2)多任務Loss層

  • Softmax Loss代替了SVM,證明了softmax比SVM更好的效果;

  • Smooth L1 Loss取代Bouding box迴歸。

將分類和邊框迴歸進行合併(又一個開創性的思路),通過多任務Loss層進一步整合深度網絡,統一了訓練過程,從而提高了算法準確度。

3)全連接層通過SVD加速

4)結合上面的改進,模型訓練時可對所有層進行更新,除了速度提升外(訓練速度是SPP的3倍,測試速度10倍),得到了更好的檢測效果。

接下來分別展開1)和2):

前面已經瞭解過可伸縮的池化層,那麼在訓練中參數如何通過ROI Pooling層傳導的?根據鏈式求導法則,對於yiy_i = max(xix_i) 傳統的max pooling的映射公式:

其中δ\delta爲判別函數,爲1時表示選中爲最大值,0表示被丟棄,誤差不需要回傳,即對應權值不需要更新。如下圖所示,對於輸入 xix_i 的擴展公式表示爲如下公式:

(i,r,j) 表示 xix_i 在第 r 個框的第 j 個節點是否被選中爲最大值(對應下圖 y0,8 和 y1,0),xix_i 參數在前向傳導時受後面梯度誤差之和的影響。(下圖爲ROI池化大小爲3x3)

多任務Loss層(全連接層)是第二個核心思路,如上圖所示,其中cls_score用於判斷分類,bbox_reg計算邊框迴歸,label爲訓練樣本標記。

其中LclsL_{cls}爲分類誤差:

pxp_x 爲對應Softmax分類概率,plp_l 即爲label所對應概率(正確分類的概率),plp_l = 1時,計算結果Loss爲0, 越小,Loss值越大(0.01對應Loss爲2)。

LregL_{reg}爲邊框迴歸誤差:

即在正確分類的情況下,迴歸框與Label框之間的誤差(Smooth L1), 對應描述邊框的4個參數(上下左右or平移縮放),g對應單個參數的差異,|x|>1 時,變換爲線性以降低離羣噪聲:

LtotalL_{total}爲加權目標函數(背景不考慮迴歸Loss):

(注:機器視覺中“前景”和“後景”,簡單理解:前景是你感興趣的對象。背景卻不是。)

4.Faster-RCNN

因爲在Fast R-CNN論文中的測試時間是不包括search selective時間的,而在測試時很大的一部分時間要耗費在候選區域的提取上。Faster R-CNN正是爲解決這個問題而提出來的。對於提取候選框最常用的SelectiveSearch方法,提取一副圖像大概需要2s的時間,改進的EdgeBoxes算法將效率提高到了0.2s,但是這還不夠。

候選框提取不一定要在原圖上做,特徵圖上同樣可以,低分辨率特徵圖意味着更少的計算量,基於這個假設,MSRA的任少卿等人提出RPN(RegionProposal Network),完美解決了這個問題,我們先來看一下網絡拓撲。

通過添加額外的RPN分支網絡,將候選框提取合併到深度網絡中,這正是Faster-RCNN里程碑式的貢獻。RPN網絡用於推薦候選區域,這個網絡是用來代替之前的search selective的。

RPN網絡的特點在於通過滑動窗口的方式實現候選框的提取,每個滑動窗口位置生成9個候選窗口(不同尺度、不同寬高),提取對應9個候選窗口(anchor)的特徵,用於目標分類和邊框迴歸,與FastRCNN類似。

目標分類只需要區分候選框內特徵爲前景或者背景。

邊框迴歸確定更精確的目標位置,基本網絡結構如下圖所示:

訓練過程中,涉及到的候選框選取,選取依據:

1)丟棄跨越邊界的anchor;

2)與樣本重疊區域大於0.7的anchor標記爲前景,重疊區域小於0.3的標定爲背景;
0
對於每一個位置,通過兩個全連接層(目標分類+邊框迴歸)對每個候選框(anchor)進行判斷,並且結合概率值進行捨棄(僅保留約300個anchor),沒有顯式地提取任何候選窗口,完全使用網絡自身完成判斷和修正。
從模型訓練的角度來看,通過使用共享特徵交替訓練的方式,達到接近實時的性能,交替訓練方式描述爲:

1)根據現有網絡初始化權值w,訓練RPN;

2)用RPN提取訓練集上的候選區域,用候選區域訓練FastRCNN,更新權值w;

3)重複1、2,直到收斂。

因爲Faster-RCNN,這種基於CNN的real-time 的目標檢測方法看到了希望,在這個方向上有了進一步的研究思路。至此,我們來看一下RCNN網絡的演進,如下圖所示:

Faster RCNN的網絡結構(基於VGG16):

Faster實現了端到端的檢測,並且幾乎達到了效果上的最優,速度方向的改進仍有餘地,於是YOLO誕生了。

5.YOLO

YOLO來自於“YouOnly Look Once”,你只需要看一次,不需要類似RPN的候選框提取,直接進行整圖迴歸就可以了,簡單吧?

算法描述爲:

1)將圖像劃分爲固定的網格(比如7*7),如果某個樣本Object中心落在對應網格,該網格負責這個Object位置的迴歸;

2)每個網格預測包含Object位置與置信度信息,這些信息編碼爲一個向量;

3)網絡輸出層即爲每個Grid的對應結果,由此實現端到端的訓練。

YOLO算法的問題有以下幾點:

1)7*7的網格迴歸特徵丟失比較嚴重,缺乏多尺度迴歸依據;

2)Loss計算方式無法有效平衡(不管是加權或者均差),Loss收斂變差,導致模型不穩定。

Object(目標分類+迴歸)<=等價於=>背景(目標分類)

導致Loss對目標分類+迴歸的影響,與背景影響一致,部分殘差無法有效回傳;

整體上YOLO方法定位不夠精確,貢獻在於提出給目標檢測一個新的思路,讓我們看到了目標檢測在實際應用中真正的可能性。

這裏備註一下,直接回歸可以認爲最後一層即是對應7*7個網格的特徵結果,每一個網格的對應向量代表了要回歸的參數(比如pred、cls、xmin、ymin、xmax、ymax),參數的含義在於Loss函數的設計。

6.SSD

由於YOLO本身採用的SingleShot基於最後一個卷積層實現,對目標定位有一定偏差,也容易造成小目標的漏檢。

借鑑Faster-RCNN的Anchor機制,SSD(Single Shot MultiBox Detector)在一定程度上解決了這個問題,我們先來看下SSD的結構對比圖。

基於多尺度特徵的Proposal,SSD達到了效率與效果的平衡,從運算速度上來看,能達到接近實時的表現,從效果上看,要比YOLO更好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章