目標檢測算法RCNN,Fast RCNN,Faster RCNN,YOLO和SSD

 

object detection,目標檢測,就是在給定圖片中精確找到物體所在位置,並標註出物體的類別。所以,object detection 要解決的問題就是物體在哪裏以及是什麼的整個流程問題。目前最常聽到的目標檢測算法就是RCNN系列(RCNN-->Fast RCNN-->Faster RCNN),YOLO和SSD,正好參加的比賽中需要用到目標檢測知識,所以就趁此機會整理一下。

此篇博客的目的僅僅是記錄一下這幾種算法,通過這篇博客,也只能瞭解到這幾種算法是怎樣的,具體細節見論文,附有各種鏈接。

在介紹各算法之前,先科普一下一些基礎知識:

交併比(IoU)和非極大值機制(NMS)

AlexNet,VGG網絡,GoogleNet網絡

fine-tuning(微調):在實踐中,由於數據集不夠大,很少有人能夠從頭開始訓練數據,常見的做法是使用預訓練的網絡來重新fine-tuning,或者當作特徵提取器。例如,使用卷積網絡當作特徵提取器,使用在ImageSet上預訓練的網絡,去掉最後的連接層,剩下的部分當作特徵提取器,這樣提取的特徵叫做CNN codes,得到這樣的特徵後,使用線性分類器來分類圖像。或者fine-tuning卷積網絡,一般可以選擇fine-tuning全部層或者部分層。通常,前面的層提取的是圖像的通用特徵,這些特徵對很多任務都很有用,後面的層提取的特徵與特定類別有關的特徵,因此fine-tuning時常常只需要fine-tuning後面的層。與重新訓練相比,fine-tuning要使用更小的學習率。因爲訓練好的網絡模型權重已經平滑,我們不希望太快扭曲它們。

crop和warp: crop就是從一個大圖中摳出網絡輸入大小的patch,比如AlexNet網絡的輸入大小227*227;wrap就是將一個邊界框bounding box的內容resize成227*227,如下圖所示,可以看到crop/warp這種預處理會使得物體要麼殘缺要麼扭曲,很明顯會影響識別精確度

圖1:crop/warp圖例展示

Region of interest(RoI) pooling layer: RoI被廣泛地應用在目標檢測中,它主要是將不規則大小的輸入通過最大池化(max pooling)轉換成固定大小的特徵圖,例如H*W。在fast RCNN中,每個RoI是卷積特徵圖中的一個矩形框,被定義成一個四元組(r,c,w,h),其中(r,c)表示矩形左上角的座標,h和w則表示矩形的高度和寬度。RoI max pooling的工作流程爲:首先dividing the h*w RoI window into an H*W grid of sub-windows of approximate size h/H * w/W,然後在每一個子window中取最大值並輸出。例如下面的動圖,對一個8*8的特徵圖,裏面存在一個四元組表示爲(0,3,5,7)的RoI(黑色實線圈起來的區域),要求輸出爲2*2大小,則把候選框拆分成2*2大小的網格,然後在每一個網格中取其最大值,最後得到2*2大小的輸出特徵

Region of interest pooling (animation)
圖2:RoI的計算示例

RCNN

2014年,Ross Girshick使用候選區域+CNN代替傳統目標檢測使用的滑動窗口+手工設計特徵,設計了R-CNN框架,使得目標檢測取得了巨大突破,並開啓了基於深度學習目標檢測的熱潮。在此,祭出RCNN的算法簡要流程:

  • 輸入一張圖像,利用Selective Search算法在圖像中從下到上定位出大約2000左右包含物體的候選框(region proposals)
  • 將每個候選框縮放(wrap)至相同大小227*227,並輸入到CNN(AlexNet)內進行特徵提取,將CNN的fc7層的輸出作爲特徵
  • 對候選框中提取出的特徵,使用支持向量機SVM進行分類
  • 使用Bounding-box regression進行修正候選框位置:對於每一個類,訓練一個線性迴歸模型去判定這個框是否完美
圖3:RCNN架構總覽

當使用Selective Search算法搜索候選框時,由於目標物體形態各異,大小不同,使得搜出的候選框矩形大小不同。如果要將這些矩形候選區域直接喂入CNN網絡進行特徵提取,是不可行的,因爲CNN要求輸入的圖像的大小是固定的,所以要對候選框進行處理,使其大小符合CNN對輸入圖像的尺寸要求,RCNN中選擇的是wrap,得到指定大小之後,提取並分類。

圖4:RCNN流程圖

RCNN對原始圖片通過Selective Search提取候選框多達2000個左右,而這2000個候選框中每個框又都需要進行CNN提取特徵+SVM進行分類,計算量看着就不小呵,導致RCNN的檢測速度很慢。 由於提取到2000個候選框都在一張圖片中,所以爲何不可對圖像提一次卷積層特徵,然後只需要將候選框在圖像中的位置映射到卷積層的特徵圖上,這樣我們就可以對一張圖像提取一次特徵,然後將每個候選框的卷積層特徵輸入到全連接層做後續操作。

SPP

 上面想法很不錯,但是由於每個候選框的尺寸不一樣,而且全連接層的輸入要求必須固定尺度,爲了解決這個問題,空間金字塔池化SPP(Spatial Pyramid Pooling)應運而生。SPP厲害之處在於對任意尺寸的圖片都能夠得到固定長度的輸出

在RCNN中,因爲得到的候選框大小各異,因此需要將每個候選框wrap成滿足CNN要求的輸入大小,而且crop/wrap這種處理,多多少少都會使得圖片失真,限制了識別精度。很顯然的是,CNN一般包含卷積層和全連接層,其中,卷積層連接層輸入的是不需要固定尺寸大小的,而全連接層則需要固定大小的輸入,那麼就可以在卷積層和全連接層之間加入某種結構,使得卷積層的輸出特徵經過這種結構之後轉換成固定長度的特徵,這種結構就是SPP,下圖是RCNN和SPP Net的檢測流程比較:

圖5:普通CNN和SPP網絡比較

可以從圖5中看到,SPP是處於卷積層和全連接層之間,目的是要將卷積層生成的特徵轉換成滿足全連接輸入的固定長度,從而避免了將圖片進行crop或者warp。

SPP Net的特點有兩個,一是結合空間金字塔方法實現CNN的多尺度輸入。 SPP Net在普通CNN結構中加入RoI池化層,使得網絡的輸入圖像可以是任意尺寸的,輸出則是一個固定維數的向量二是對原圖提取一次卷積特徵,RCNN中是先提取候選區域,然後將候選區域resize統一大小後作爲CNN的輸入提取特徵,這種做法很是繁瑣,SPP Net簡化了特徵提取的步驟,只對原圖進行一次卷積運算,就能夠得到整張圖的卷積特徵圖,然後在特徵圖上找到每個候選框的映射patch,將此patch作爲每個候選框的卷積特徵輸入SPP layer和之後的層,完成特徵提取。

圖6:SPP

對於不同的圖像要想得到相同大小的池化結果,就需要根據圖像的大小動態地計算池化層窗口的大小和步長,假設第五層卷積conv_{5}的特徵圖大小爲a*a,需要得到n*n大小的池化結果,則池化層的滑動窗口的大小和步長分別爲:win=ceil\left ( a/n \right )(向上取整),str=floor\left ( a/n \right )(向下取整),如果金字塔有l-level,那麼就實行池化操作l次,下一層的全連接層則連接這l個輸出作爲輸入。圖6中,256是指conv_{5}的過濾器的數目,池化輸出結果分別是4*4,2*2和1*1,假設conv_{5}的特徵圖大小爲13*13,那麼相對應的滑動窗口的大小和步長分別爲:

                                                  \\ win_{4}=\left \lceil 13/4 \right \rceil =4 ; str_{4} = \left \lfloor 13/4 \right \rfloor = 3 \\ win_{2}=\left \lceil 13/2 \right \rceil =7 ; str_{2} = \left \lfloor 13/2 \right \rfloor =6 \\ win_{1}=\left \lceil 13/1 \right \rceil =13 ; str_{1} = \left \lfloor 13/1 \right \rfloor = 13

假設的特徵圖大小爲10*10,那麼相應的滑動窗口的大小和步conv_{5}長分別爲:

                                                  \\ win_{4}=\left \lceil 10/4 \right \rceil =3 ; str_{4} = \left \lfloor 10/4 \right \rfloor = 2 \\ win_{2}=\left \lceil 10/2 \right \rceil =5 ; str_{2} = \left \lfloor 10/2 \right \rfloor = 5 \\ win_{1}=\left \lceil 10/1 \right \rceil =10 ; str_{1} = \left \lfloor 13/1 \right \rfloor = 10

Fast RCNN

如上所述,RCNN存在很多問題,一是訓練過程是multi-stage pipeline(包括特徵提取,fine-tuning網絡,訓練SVM分類器,以及最後的bounding-box迴歸),二是在空間和時間上耗費過大,三是檢測速度過慢。雖然使用SPP可以使得任意尺寸的輸入在經過SPP池化層後轉換成固定尺寸的輸出,使得不是每一個候選框都經過CNN提取特徵後再用SVM進行分類,而是在整張圖片經過卷積運算輸出特徵圖,特徵圖經過SPP結構得到固定尺寸的大小,但是即使這樣,SPP結構也像RCNN是multi-stage pipeline,而且除此之外,在fine-tuning步驟,並不能更新卷積層,這也會限制了檢測精度。因此,Fast RCNN在RCNN的基礎上採納了SPP方法,對R_CNN進行改進,使得性能更好。 那麼與R-CNN框架進行比較,Fast RCNN有哪些特點呢?一是fast RCNN在最後一個卷積層後加了ROI pooling layer,二是fast RCNN 損失函數使用了多任務損失函數,將邊框迴歸(Bounding Box Regression)直接加入到CNN網絡中訓練,如下圖所示:

圖7:Fast RCNN

如圖7所示,Fast RCNN的簡要流程爲:

  •  Fast RCNN以整張圖片和一系列的object proposals作爲輸入,經過一個卷積網絡輸出卷積特徵圖
  • 接下來特徵圖中的候選框經過RoI池化層提取輸出固定大小的特徵向量
  • 然後得到的特徵向量作爲一系列全連接層的輸入,在全連接層後接上兩個輸出層,一輸出層是K個物體類加一個背景類的softmax概率,另一姊妹輸出層是K個物體類的四元組

Faster RCNN

在Fast RCNN中,仍然使用Selective Search方法進行找出所有的候選框,這個也是很耗時的操作,所以能不能使用一個更高效的方法提取候選框呢。在Faster RCNN中,引進Region Proposal Networks(RPNs)替代Selective Search提取候選框,同時引入anchor box。

Faster RCNN中包含兩個模塊,一個是RPN候選框提取模塊,一個是Fast RCNN檢測模塊。Faster RCNN的簡要流程:

  • 將整張圖片作爲CNN的輸入,提取image的特徵圖,該特徵圖被共享用於後續RPN層和全連接層
  • 卷積特徵圖作爲RPN網絡的輸入,生成候選區域。
  • 以RPN提取的候選區域和卷積網絡生成的特徵圖作爲RoI池化層的輸入,送到後續全連接層中進行判定目標
圖8:Faster RCNN

RPN網絡是以任意尺寸的圖像作爲輸入,然後輸出目標候選矩陣框及其得分。(A Region Proposal Network(RPN) takes an image (of any size) as input and outputs a set of rectangular object proposals, each with an objectness score)。RPN的核心思想是使用CNN卷積神經網絡直接產生候選框。具體操作是在CNN卷積層後增加滑動窗口操作以及兩個卷積層完成候選區域提取:第一個卷積層將特徵圖每個滑窗位置編碼成一個特徵向量,使用一個小網絡在最後卷積層得到的特徵圖中進行滑動掃描,這個小網絡以特徵圖的n*n窗口爲輸入,然後映射到一個低維向量(256-d for ZF和512-d for VGG,後隨ReLU); 第二個卷積層對應兩個全連接層-- a box regression layer(reg layer)和a box-classification layer(cls layer),對每個滑窗位置,輸出k個候選區域的概率和候選框座標信息。即在每個卷積映射位置輸出這個位置上多種尺寸(3種)和長寬比(3種)的k個(3*3=9)區域的物體得分和迴歸邊界。

圖9:RPN

Anchors是一組大小固定的參考窗口:三種box areas\left \{ 128^{2}, 256^{2},512^{2} \right \}\times三種aspect ratio\left \{ 1:1, 1:2, 2:1 \right \},下圖表示RPN網絡中每個滑窗位置所對應的原圖區域中9種可能的大小,相當於模板,對任意圖像任意滑窗位置都是這9種模板。 根據圖像大小計算滑窗中心點對應原圖區域的中心點,通過中心點和size就可以得到滑窗位置和原圖位置的映射關係,由此原圖位置並根據Ground Truth重複率貼上正負標籤,讓RPN學習該Anchors是否有物體即可。對於每個滑窗位置,產生k=9個anchor對於一個大小爲W*H的卷積特徵圖,總共產生W*H*k個anchor

圖10:anchors

YOLO

YOLO算法的思想不同於上述RCNN系列的思想,它將目標算法看做一個迴歸問題。YOLO是一個end-to-end的網絡,完成從原始圖像的輸入到物體位置和類別的輸出。如下圖所示,輸入圖片,經過一個卷積網絡後,輸出目標位置和其置信度,看似很簡單的樣子。YOLO的設計速度很快但是同時又能夠保持較高的準確率。

圖11:YOLO

 YOLO算法是將輸入圖片劃分爲S*S的網格,如果有一個物體的中心是在一個grid cell中,那麼這個cell就負責檢測這個物體。每一個grid cell 預測B個bounding boxes及其它們的confidence score和C個類別條件概率Pr\left ( Class_{i}|Object \right )。其中confidence score反映的是一個box包含物體的confidence和模型認爲這個box預測正確的概率,定義confidence爲Pr\left ( Object \right )*IOU_{pred}^{truth},如果一個cell中沒有包含任何物體,那麼confidence score是爲0。在測試階段,讓類別條件概率和box confidence相乘就能得到每一個box的class-specific confidence scores,Pr\left ( Class_{i}|Object \right ) * Pr\left ( Object \right ) * IOU_{pred}^{truth} = Pr\left ( Class_{i} \right ) * IOU_{pred}^{truth},這些score則表明出現在box裏的類別的概率和這個預測的box匹配這個物體的程度估量。

每一個bounding boxes包含五個值,x,y,w,h和confidence。其中(x,y)是指當前格子預測得到的物體的bounding box的中心位置的座標。w和h表示box相對於整張圖片的比例。最後,YOLO網絡最後的輸出維度爲S*S*(B*5+C)。

圖12:grid Model

 雖然每個格子可以預測B個bounding box,但是訓練的時候,我們僅僅只想要每類物體的一個bounding box,所以就選擇與ground truth的IOU值最高的bounding box作爲物體檢測輸出,即每個格子最多隻能預測一個物體,所以就使得如果格子中包含多個物體時,只能檢測出來一個。 這也是YOLO的一個缺點。

YOLO使用均方和誤差作爲損失函數,即使用網絡的輸出的S*S*(B*5+C)維向量與真實圖像的對應的S*S*(B*5+C)維向量的均方和誤差。損失函數定義如下:包括五部分,前兩部分是座標誤差,中間兩部分是IOU誤差,最後一部分是分類誤差

在這個損失函數中,只有當某個grid cell中有object時纔對classification error進行懲罰,它也只有當對某個box predictor對某個ground truth box負責時,纔會對box的coordinate error進行懲罰,而對哪個ground truth box負責則就看起預測值和ground truth box的IoU值是否在那個cell中的所有box中最大。

 YOLO的網絡架構是基於GoogleNet進行改進的,但是卻沒有借鑑GoogleNet網絡中的Inception結構,而是使用1*1卷積層+3*3卷積層,網絡總共包括24個卷積層和2個全連接層,網絡的卷積層用來提取圖像中的特徵,全連接層用來預測目標輸出概率和座標。

圖13:YOLO網絡架構

SSD

Faster RCNN擁有較高的準確率,YOLO速度較快,而SSD算法的運行速度要比YOLO要快,同時準確率卻能和Faster RCNN相媲美。SSD算法的核心是在特徵圖上使用小卷積核來預測固定尺寸default bounding boxes的類別分數和偏移量;爲了提高準確率,SSD在不同大小的特徵圖上進行預測,通過縱橫比分開預測。這些改進設計,實現了end-to-end訓練並且保證較高的準確率,即是在低分辨率的圖片上也能夠保持高精度,further imporving the speed vs accuracy trade-off。

SSD基於前饋卷積網絡,對於boxes裏面的目標物體實例,產生一個固定尺寸的bounding boxes的集合和分數,緊接着跟隨一個非極大值抑制NMS去做最後的檢測。前期的網絡是一個由高質量圖片分類的標準網絡,被稱爲base  network。在base network之後添加額外的網絡結構,如下圖所示:

  • Multi-scale feature maps for detection:在base network後增加捲積層,這些卷積層按照大小遞減的次序連接,能夠進行多尺寸預測
  • Convolutional predictiors for detection: 在每一個添加的卷積層(或者在base network中已經存在的卷積層),可以使用一系列的卷積核產生一系列固定大小的detection predictions。對於一個大小爲m*n,具有p個通道的特徵層,使用3*3*p大小的小kernel,要麼生成一個類別的score,要麼是相對於default box座標的shape offsets。
  • Default boxes and aspect ratios: 每一個box相對於與其對應的feature map cell的位置是固定的。在每一個feature map cell中, 我們預測box與cell中default box之間的offset,以及每一個box中包含物體的score。因此,對於一個位置上的k個boxes中的每一個box,預測C個類別得分score,以及相對於default bounding box的4個偏移量,這樣就需要(c+4)*k個filters,在m*n的特徵圖上將產生(c+4)*k*m*n個輸出結果。
圖14:SSD

feature map cell 就是將feature map劃分成8*8或者4*4大小的格子,如下圖(b)中的8*8和(c)中的4*4。default box類似於faster RCNN中anchors,是每一個格子上一些列固定大小的box,如下圖中虛框所示,對每一個默認的方框,預測形狀的偏移和所有物體分類的置信度。

至此,已經能大略知道各個算法基本思想,下圖是對各個算法的簡要總結。

參考文獻:

[1]. Rich feature hierarchies for accurate object detection and semantic segmentation tech report (R-CNN)

[2]. Fast R-CNN (Fast R-CNN)

[3]. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks (Faster R-CNN)

[4]. You Only Look Once: Unified, Real-Time Object Detection (YOLO)

[5]. SSD: Single Shot MultiBox Detector (SSD)

[6]. 一文讀懂目標檢測:R-CNN,Fast R-CNN,Faster R-CNN,YOLO,SSD

[7]. RCNN,Fast RCNN, Faster RCNN總結

[8]. Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition(SPP)

[9]. https://deepsense.ai/region-of-interest-pooling-explained/ (RoI)

[10]. Faster R-CNN論文筆記-FR

[11]. 論文閱讀筆記:You Only Look Once:Unified,Real-Time Object Detection

[12]. 論文閱讀:SSD:Single Shot MultiBox Detector

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