CS231n第八課:目標檢測定位學習記錄

分類:IT技術 時間:2016-10-17

結合視頻第八集和筆記:http://chuansong.me/n/353443351445

本節課程從分類(Classification),定位(Localization)和檢測(Detection)三個方面入手。

這裏寫圖片描述
從上圖可以直觀的看到:
1.對於分類而言,就是對於給定的圖片把其劃分到給定的幾種類別中某一種。很顯然,圖像中只能存在一種給定類別中的對象。
2.而定位就是找到對應的對象的位置區域,把它框選出來(即Bounding Box),這個選框除了位置信息(x,y)外還要包含其大小信息(w,h)。同樣的,這裏的圖像只包含單個對象。
3.檢測就可以看作是定位的拓展,即給定一張圖像或者視頻幀,找出其中所有目標的位置,並給出每個目標的具體類別。與定位的不同就是圖像中包含的對象數不確定。
4.實例分割(Instance Segmentation),就是在檢測的基礎上,把每個對象的輪廓勾勒出來,隨之而來的就是語義分割(Semantic segmentation)

定位

一個簡單的定位網絡的訓練過程:

1.先訓練一個分類的模型,主要是其用於提取特征的卷積網絡部分
這裏寫圖片描述

2.在上面訓練好的卷積網絡後接上用於選框的全連接的回歸網絡(fully-connected “regression head”)
這裏寫圖片描述

3.然後訓練接上的回歸網絡部分,就像訓練分類神經網絡一樣。
這裏寫圖片描述

4.最後使用的時候,把卷積網絡後接上兩個全連接的頭,用於選框定位和分類
這裏寫圖片描述

那麽這裏就有一個問題了,是對於每一種分類進行一個選框呢還是對於整張圖片進行一層分類呢,只能說兩者現在都有。
方式如下:
一、分類部分:C 個類別
二、選框部分:
1.類型不明確:4 數字(1個選框)
2.類型明確的:C x 4 數字(每個類1個選框)

還有另外一種常用選框方式就是Sliding Window。
這裏還要補充一下關於對象選框的問題,object proposal(後面簡寫做OP)方法分成了兩類,一類叫grouping method,即先將圖片打碎,然後再聚合的一種方法,比如selective search;另一類叫window scoring method。是生成大量window並打分,然後過濾掉低分的一種方法,比如objectness。這裏的Sliding Window也是這類方法。(見下圖)
http://blog.csdn.net/zxdxyz/article/details/46119369

這裏寫圖片描述
每個滑動窗口作為CNN的輸入,會預測一個選框,並給予一個評分,最後結合評分然後把幾個選框進行融合。
這裏寫圖片描述
Sliding Window需要對圖像的所有位置進行評分,然後輸出Box regression outputs, 最終定位圖像。

這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
Boxes因為有(x,y,w,h),所以乘上4。

這篇文章要采用多尺度的方式。這裏要補充一下多尺度(multi-scale)的問題,傳統的檢測/定位算法是固定輸入圖像不變,采用不同大小的滑窗來支持不同尺度的物體。對於CNN來說,滑窗的大小就是訓練時輸入圖像的大小,是不可以改變的。那麽,CNN支持多尺度的辦法就是,固定滑窗的大小,改變輸入圖像的大小。具體來說,對於一幅給定的待處理的圖像,將圖像分別resize到對應的尺度上,然後,在每一個尺度上執行上述的密集采樣的算法,最後,將所有尺度上的結果結合起來,得到最終的結果。
給定一張框定的圖片,已知這張圖片有某種可分類物體,但是由於框給的不是很合適,或者和訓練的時候有差異,所以取不同scale圖片進行檢測,得到結果。對於CNN,使用不同scale需要放縮圖片,由於最後的FC層的輸入大小是固定的(比如5x5),所以不同scale輸入經過pool5之後的 ‘feature map’ 大小不一,此時取所有可能5x5作為輸入得到特征向量.

例如訓練階在(1414)下,訓練網絡;測試階段在多個較大的圖片上測試,由於每個1414的view區域產生一個分類預測分布,(1616)的圖片上測試,有4個不同的1414的view,所以最後產生一個4個分類預測分布;組成一個具有C個特征圖的22分類結果圖,然後按照11卷積方式計算全連接部分;這樣整個系統類似可以看做一個完整的卷積系統。
後面又在這個分類(識別)的基礎上,做了定位。
在訓練的CNN後面接兩個全連接層,組成regressor Network 。訓練時,只需要訓練後面的兩個全連接層。這個 regressor network 的輸出就是一個 bounding box,這個 regressor network 的最後一層是class specific的,也就是說,對於每一個class,都需要訓練單獨最後一層。這樣,假設類別數有1000,則這個 regressor network 輸出1000個 bounding box,每一個bounding box 對應一類。
對於定位問題,測試時,在每一個尺度上同時運行 classification network 和 regressor network 。這樣,對於每一個尺度來說, classification network 給出了圖像塊的類別的概率分布,regressor network 進一步為每一類給出了一個 bounding box,這樣,對於每一個 bounding box,就有一個置信度與之對應。最後,綜合這些信息,進行框選的融合,最終給出定位結果。

檢測

不能簡單對每一個不同尺度不同位置窗口進行分類,因為數據量實在太多,所以要盡量選取可能正確區域。這也正式現在的普遍做法,比較出名就是Region Proposals: Selective Search。

Selective Search只是Region Proposals(後面簡稱RP)中的一種方法,此外還有edge Boxes等方法。為什麽要使用region proposal呢?因為其利用了圖像中的紋理、邊緣、顏色等信息,可以保證在選取較少窗口(幾千個甚至幾百個)的情況下保持較高的召回率(這個名詞將在後面再次提到時與其他概念放在一起進行說明)。這大大降低了後續操作的時間復雜度,並且獲取的候選窗口要比滑動窗口的質量更高(滑動窗口固定長寬比)

Selective Search:
簡單的講就是:首先將圖片打散,然後按照超像素的原理(superpixel),根據人為定義的距離進行聚合。
這裏寫圖片描述

然後就進入最著名三大檢測算法,R-CNN,fast R-CNN,faster R-CNN:

R-CNN:
(1) 輸入測試圖像
(2) 利用selective search算法在圖像中提取2000個左右的region proposal。
(3) 將每個region proposal縮放(warp)成227x227的大小並輸入到CNN,將CNN的fc7層的輸出作為特征。
(4) 將每個region proposal提取到的CNN特征輸入到SVM進行分類。
(5) 對於SVM分好類的region proposal做邊框回歸(bounding-box regression),邊框回歸是對region proposal進行糾正的線性回歸算法。
這裏寫圖片描述
針對上面的框架給出幾點解釋:

  • 上面的框架圖是測試的流程圖,要進行測試我們首先要訓練好提取特征的CNN模型,以及用於分類的SVM:使用在ImageNet上預訓練的模型(AlexNet/VGG16)進行微調得到用於特征提取的CNN模型,然後利用CNN模型對訓練集提特征訓練SVM。
  • 對每個region proposal縮放到同一尺度是因為CNN全連接層輸入需要保證維度固定。
  • 上圖少畫了一個過程——對於SVM分好類的region proposal做邊框回歸(bounding-box regression),邊框回歸是對region proposal進行糾正的線性回歸算法,為了讓region proposal提取到的窗口跟目標真實窗口更吻合。因為region proposal提取到的窗口不可能跟人手工標記那麽準,如果region proposal跟目標位置偏移較大,即便是分類正確了,但是由於IoU(region proposal與Ground Truth的窗口的交集比並集的比值)低於0.5,那麽相當於目標還是沒有檢測到。

Fast R-CNN
為了解決R-CNN的問題:
1.運行速度慢
2.訓練分為多個階段,步驟繁瑣
3.支持向量機和回歸是事後訓練的:CNN特征沒有根據支持向量機和回歸來更新
在進入Fast R-CNN之前,必須提到另一個網絡,就是SPPNet:針對不同尺寸輸入圖片,在CNN之後的Feature Map上分割成同樣大小的特征圖並Pooling,轉化成相同尺度的向量。

這2000個region proposal不都是圖像的一部分嗎,那麽我們完全可以對圖像提一次卷積層特征,然後只需要將region proposal在原圖的位置映射到卷積層特征圖上,這樣對於一張圖像我們只需要提一次卷積層特征,然後將每個region proposal的卷積層特征輸入到全連接層做後續操作。(對於CNN來說,大部分運算都耗在卷積操作上,這樣做可以節省大量時間)。現在的問題是每個region proposal的尺度不一樣,直接這樣輸入全連接層肯定是不行的,因為全連接層輸入必須是固定的長度。SPP-NET恰好可以解決這個問題:
這裏寫圖片描述
這裏寫圖片描述
上圖對應的就是SPP-NET的網絡結構圖,任意給一張圖像輸入到CNN,經過卷積操作我們可以得到卷積特征(比如VGG16最後的卷積層為conv5_3,共產生512張特征圖)。圖中的window是就是原圖一個region proposal對應到特征圖的區域,只需要將這些不同大小window的特征映射到同樣的維度,將其作為全連接的輸入,就能保證只對圖像提取一次卷積層特征。SPP-NET使用了空間金字塔采樣(spatial pyramid pooling):將每個window劃分為4*4, 2*2, 1*1的塊,然後每個塊使用max-pooling下采樣,這樣對於每個window經過SPP層之後都得到了一個長度為(4*4+2*2+1)*512維度的特征向量,將這個作為全連接層的輸入進行後續操作。

Fast R-CNN的框架圖:
這裏寫圖片描述

(1) ROI pooling layer實際上是SPP-NET的一個精簡版,SPP-NET對每個proposal使用了不同大小的金字塔映射,而ROI pooling layer只需要下采樣到一個7x7的特征圖。對於VGG16網絡conv5_3有512個特征圖,這樣所有region proposal對應了一個7*7*512維度的特征向量作為全連接層的輸入。
(2) R-CNN訓練過程分為了三個階段,而Fast R-CNN直接使用softmax替代SVM分類,同時利用多任務損失函數邊框回歸也加入到了網絡中,這樣整個的訓練過程是端到端的(除去region proposal提取階段)。
(3) Fast R-CNN在網絡微調的過程中,將部分卷積層也進行了微調,取得了更好的檢測效果。

Faster R-CNN
在Region Proposal + CNN分類的這種目標檢測框架中,Region Proposal質量好壞直接影響到目標檢測任務的精度。如果找到一種方法只提取幾百個或者更少的高質量的假選窗口,而且召回率很高,這不但能加快目標檢測速度,還能提高目標檢測的性能(假陽例少)。RPN(Region Proposal Networks)網絡應運而生。

RPN的核心思想是使用卷積神經網絡直接產生region proposal,使用的方法本質上就是滑動窗口。RPN的設計比較巧妙,RPN只需在最後的卷積層上滑動一遍,因為anchor機制和邊框回歸可以得到多尺度多長寬比的region proposal。
這裏寫圖片描述
我們直接看上邊的RPN網絡結構圖(使用了ZF< Zeiler and Fergus model>模型),給定輸入圖像(假設分辨率為600*1000),經過卷積操作得到最後一層的卷積特征圖(大小約為40*60)。在這個特征圖上使用3*3的卷積核(滑動窗口)與特征圖進行卷積,最後一層卷積層共有256個feature map,那麽這個3*3的區域卷積後可以獲得一個256維的特征向量,後邊接cls layer(box-classification layer)和reg layer(box-regression layer)分別用於分類和邊框回歸(跟Fast R-CNN類似,只不過這裏的類別只有目標和背景兩個類別)。3*3滑窗對應的每個特征區域同時預測輸入圖像3種尺度(128,256,512),3種長寬比(1:1,1:2,2:1)的region proposal,這種映射的機制稱為anchor。所以對於這個40*60的feature map,總共有約20000(40*60*9)個anchor,也就是預測20000個region proposal。
這樣設計的好處是什麽呢?雖然現在也是用的滑動窗口策略,但是:滑動窗口操作是在卷積層特征圖上進行的,維度較原始圖像降低了16*16倍(中間經過了4次2*2的pooling操作);多尺度采用了9種anchor,對應了三種尺度和三種長寬比,加上後邊接了邊框回歸,所以即便是這9種anchor外的窗口也能得到一個跟目標比較接近的region proposal。

Faster R-CNN架構
這裏寫圖片描述

基於回歸方法的深度學習目標檢測算法

Faster R-CNN的方法目前是主流的目標檢測方法,但是速度上並不能滿足實時的要求。YOLO一類的方法慢慢顯現出其重要性,這類方法使用了回歸的思想,既給定輸入圖像,直接在圖像的多個位置上回歸出這個位置的目標邊框以及目標類別。
YOLO (CVPR2016, oral)
這裏寫圖片描述
我們直接看上面YOLO的目標檢測的流程圖:
(1) 給個一個輸入圖像,首先將圖像劃分成7*7的網格
(2) 對於每個網格,我們都預測2個邊框(包括每個邊框是目標的置信度以及每個邊框區域在多個類別上的概率)
(3) 根據上一步可以預測出7*7*2個目標窗口,然後根據閾值去除可能性比較低的目標窗口,最後NMS去除冗余窗口即可。
可以看到整個過程非常簡單,不需要中間的region proposal在找目標,直接回歸便完成了位置和類別的判定。
這裏寫圖片描述
那麽如何才能做到直接在不同位置的網格上回歸出目標的位置和類別信息呢?上面是YOLO的網絡結構圖,前邊的網絡結構跟GoogleNet的模型比較類似,主要的是最後兩層的結構,卷積層之後接了一個4096維的全連接層,然後後邊又全連接到一個7*7*30維的張量上。實際上這7*7就是劃分的網格數,現在要在每個網格上預測目標兩個可能的位置以及這個位置的目標置信度和類別,也就是每個網格預測兩個目標,每個目標的信息有4維坐標信息(中心點坐標+長寬),1個是目標的置信度,還有類別數20(VOC上20個類別),總共就是(4+1)*2+20 = 30維的向量。這樣可以利用前邊4096維的全圖特征直接在每個網格上回歸出目標檢測需要的信息(邊框信息加類別)。

小結:YOLO將目標檢測任務轉換成一個回歸問題,大大加快了檢測的速度,使得YOLO可以每秒處理45張圖像。而且由於每個網絡預測目標窗口時使用的是全圖信息,使得false positive比例大幅降低(充分的上下文信息)。但是YOLO也存在問題:沒有了region proposal機制,只使用7*7的網格回歸會使得目標不能非常精準的定位,這也導致了YOLO的檢測精度並不是很高。

SSD: Single Shot MultiBox Detector
上面分析了YOLO存在的問題,使用整圖特征在7*7的粗糙網格內回歸對目標的定位並不是很精準。那是不是可以結合region proposal的思想實現精準一些的定位?SSD結合YOLO的回歸思想以及Faster R-CNN的anchor機制做到了這點。
這裏寫圖片描述
上圖是SSD的一個框架圖,首先SSD獲取目標位置和類別的方法跟YOLO一樣,都是使用回歸,但是YOLO預測某個位置使用的是全圖的特征,SSD預測某個位置使用的是這個位置周圍的特征(感覺更合理一些)。那麽如何建立某個位置和其特征的對應關系呢?可能你已經想到了,使用Faster R-CNN的anchor機制。如SSD的框架圖所示,假如某一層特征圖(圖b)大小是8*8,那麽就使用3*3的滑窗提取每個位置的特征,然後這個特征回歸得到目標的坐標信息和類別信息(圖c)。
不同於Faster R-CNN,這個anchor是在多個feature map上,這樣可以利用多層的特征並且自然的達到多尺度(不同層的feature map 3*3滑窗感受野不同)。
**小結:**SSD結合了YOLO中的回歸思想和Faster R-CNN中的anchor機制,使用全圖各個位置的多尺度區域特征進行回歸,既保持了YOLO速度快的特性,也保證了窗口預測的跟Faster R-CNN一樣比較精準。SSD在VOC2007上mAP可以達到72.1%,速度在GPU上達到58幀每秒。
**總結:**YOLO的提出給目標檢測一個新的思路,SSD的性能則讓我們看到了目標檢測在實際應用中真正的可能性。


Tags: 圖片 記錄 檢測 課程 模型

文章來源:


ads
ads

相關文章
ads

相關文章

ad