目標檢測之RCNN,SPP-NET,Fast-RCNN,Faster-RCNN

1. 寫在前面

在深度學習出現之前,傳統的目標檢測方法大概分爲區域選擇(滑窗)、特徵提取(SIFTHOG等)、分類器(SVMAdaboost等)三個部分,其主要問題有兩方面:一方面滑窗選擇策略沒有針對性、時間複雜度高,窗口冗餘;另一方面手工設計的特徵魯棒性較差。自深度學習出現之後,目標檢測取得了巨大的突破,最矚目的兩個方向有:1. 以RCNN爲代表的基於Region Proposal的深度學習目標檢測算法(RCNNSPP-NETFast-RCNNFaster-RCNN等);2 以YOLO爲代表的基於迴歸方法的深度學習目標檢測算法(YOLOSSD等)。本篇對基於Region Proposal的深度學習目標檢測算法進行介紹,後續再對基於迴歸方法的深度學習目標檢測方法進行介紹。

2. RCNN

流程框圖

在這裏插入圖片描述

算法特點

  1. 使用Selective Search提取Proposel,然後利用CNN等識別技術進行分類。

  2. 使用識別庫進行預訓練,而後用檢測庫調優參數。

  3. 使用SVM代替了CNN網絡中最後的Softmax,同時用CNN輸出的4096維向量進行Bounding Box迴歸。

  4. 流程前兩個步驟(候選區域提取+特徵提取)與待檢測類別無關,可以在不同類之間共用;同時檢測多類時,需要倍增的只有後兩步驟(判別+精修),都是簡單的線性運算,速度很快。

存在問題

1 訓練分爲多個階段,步驟繁瑣: 微調網絡+訓練SVM+訓練邊框迴歸器。

2 訓練耗時,佔用磁盤空間大:5000張圖像產生幾百G的特徵文件。

3 速度慢: 使用GPU,VGG16模型處理一張圖像需要47s。

3. SPP-NET

流程框圖

在這裏插入圖片描述

算法特點

  1. 通過Spatial Pyramid Pooling解決了深度網絡固定輸入層尺寸的這個限制,使得網絡可以享受不限制輸入尺寸帶來的好處。

  2. 解決了RCNN速度慢的問題,不需要對每個Proposal(2000個左右)進行WrapCrop輸入CNN提取Feature Map,只需要對整圖提一次Feature Map,然後將Proposal區域映射到卷積特徵層得到全鏈接層的輸入特徵。

img

幾個要點

一、ROI在特徵圖上的對應的特徵區域的維度不滿足全連接層的輸入要求怎麼辦?

作者使用Spatial Pyramid Pooling解決了該問題。如下圖所示,假設原圖輸入是224x224,對於conv5出來後的輸出是13x13x256的,可以理解成有256個這樣的Filter,每個Filter對應一張13x13Reponse Map。如果像上圖那樣將Reponse Map分成1x1(金字塔底座),2x2(金字塔中間),4x4(金字塔頂座)三張子圖,分別做Max Pooling後,出來的特徵就是(16+4+1)x256維度。如果原圖的輸入不是224x224,出來的特徵依然是(16+4+1)x256維度。這樣就實現了不管輸入圖像尺寸如何,輸出永遠是 (16+4+1)x256 維度。

img

二、原始圖像的ROI如何映射到特徵圖(一系列卷積層的最後輸出)

要搞定這個問題,需要首先清楚感受野等概念和計算方法。下面從感受野、感受野上面的座標映射及原始圖像的ROI如何映射三方面闡述。

1. 感受野

① 概念

在卷積神經網絡中,感受野的定義是卷積神經網絡每一層輸出的特徵圖(Feature Map)上的像素點在原始圖像上映射的區域大小。

② 如何計算

output field size = ( input field size - kernel size + 2*padding ) / stride + 1

其中output field size是卷積層的輸出,input field size 是卷積層的輸入,反過來卷積層的輸入(也即前一層的感受野) = ?答案必然是:

input field size = (output field size - 1)* stride - 2*padding + kernel size
在這裏插入圖片描述
在這裏插入圖片描述
運行結果如下。從運行結果可以看出論文中ZF-5網絡感受野大小爲139是什麼得到的了。

img

2.感受野上的座標映射

① 計算公式

對於Convolution/Pooling Layer:

pi=sipi+1+[(ki1)/2padding]p_i=s_i⋅p_{i+1}+[(k_i−1)/2−padding]

對於Neuronlayer(ReLU/Sigmoid/...):

pi=pi+1p_i=p_{i+1}

其中pip_i爲第ii層感受野上的座標,sis_iStride的大小,kik_i爲感受野的大小。

② 例子

上面是計算任意一個Layer輸入輸出的座標映射關係,如果是計算任意Feature Map之間的關係,只需要用簡單的組合就可以得到,下圖是一個簡單的例子:

img

③ 簡化版本

何凱明在SPP-NET中使用的是簡化版本,將2小節公式中的Padding都設爲ki/2\lfloor k_i/2 \rfloor,公式可進一步簡化爲:pi=sipi+1p_i=s_i⋅p_{i+1}

3.原始圖像的ROI如何映射

SPP-NET是把原始ROI的左上角和右下角映射到Feature Map上的兩個對應點。 有了Feature Map上的兩對角點就確定了對應的Feature Map 區域(下圖中橙色)。

img

左上角取x=x/S+1,y=y/S+1x′=\lfloor x/S\rfloor+1,y′= \lfloor y/S\rfloor+1;右下角的點取x=x/S1,y=y/S1x′=\lceil x/S \rceil−1,y′=\lceil y/S \rceil−1。其中SS爲座標映射的簡化計算版本,即S=0isiS=∏^i_0s_i

4. Fast-RCNN

流程框圖

在這裏插入圖片描述

算法特點

  1. Fast-RCNN直接使用Softmax替代了RCNNSVM進行分類,同時在網絡中加入了多任務函數邊框迴歸,實現了廣義的端到端的訓練。

  2. 借鑑SPP-NET,提出了一個ROI層。ROI Pooling Layer實際上是SPP-NET的一個精簡版,SPP-NET對每個Proposal使用了不同大小的金字塔映射,而ROI Pooling Layer只需要下采樣到一個7x7的特徵圖。對於VGG16網絡conv5_3有512個特徵圖,這樣所有Region Proposal對應了一個7*7*512維度的特徵向量作爲全連接層的輸入。

  3. 使用了不同於SPP-NET的訓練方式,訓練時,把同張圖片的Prososals作爲一批進行學習,而Proposals的座標直接映射到conv5層上,這樣相當於一張圖片的所有訓練樣本只卷積了一次。

  4. 論文在迴歸問題上並沒有用很常見的2範數作爲迴歸,而是使用所謂的魯棒L1範數作爲損失函數。

  5. 論文將比較大的全鏈接層用SVD分解了一下,使得檢測的時候更加迅速。

幾個要點

一、聯合訓練

聯合訓練(Joint Training)指如何將分類和邊框迴歸聯合到一起在CNN階段訓練,主要難點是損失函數的設計。Fast-RCNN中,有兩個輸出層:第一個是針對每個ROI區域的分類概率預測,p=(p0,p1,,pK)p=(p_0,p_1,⋯,p_K);第二個則是針對每個ROI區域座標的偏移優化,tk=(txk,tyk,twk,thk)0kKt^k=(t^k_x,t^k_y,t^k_w,t^k_h),0≤k≤K是多類檢測的類別序號。每個訓練ROI都對應着真實類別uu和邊框迴歸目標v=(vx,vy,vw,vh)v=(v_x,v_y,v_w,v_h),對於類別uu預測邊框爲tu=(txu,tyu,twu,thu)t^u=(t^u_x,t^u_y,t^u_w,t^u_h),使用多任務損失LL來定義ROI上分類和邊框迴歸的損失:

L(p,u,tu,v)=Lcls(p,u)+λ[u1]Lloc(tu,v)L(p,u,t^u,v)=L_{cls}(p,u)+λ[u≥1]L_{loc}(t^u,v)

其中Lcls(p,u)=logpuL_{cls}(p,u)=−logp_u表示真實類別的loglog損失,當u1u≥1時,[u1][u≥1]的值爲1,否則爲0。下面將重點介紹多任務損失中的邊框迴歸部分(對應座標偏移優化部分)。

二、邊框迴歸

假設對於類別uu,在圖片中標註的真實座標和對應的預測值理論上兩者越接近越好,相應的損失函數爲:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-t77wESfo-1577689664664)(C:\Users\mi\AppData\Roaming\Typora\typora-user-images\image-20191230133827390.png)]

其中

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-EllK0nwb-1577689664666)(C:\Users\mi\AppData\Roaming\Typora\typora-user-images\image-20191230133839229.png)]

Fast-RCNN在上面用到的魯棒L1L1函數對外點比RCNNSPP-NET中用的L2L2函數更爲魯棒,該函數在(−1,1)之間爲二次函數,其他區域爲線性函數,函數直觀圖如下圖所示。

img

存在問題

使用Selective Search提取Region Proposals,沒有實現真正意義上的端對端,操作也十分耗時。

5. Faster-RCNN

流程框圖

在這裏插入圖片描述
img

算法特點

  1. 提出了Region Proposal Network(RPN),將Proposal階段和CNN分類融到了一起,實現了一個完全的End-To-EndCNN目標檢測模型。RPN可以快速提取高質量的Proposal,不僅加快了目標檢測速度,還提高了目標檢測性能。

  2. Fast-RCNNRPN放在同一個網絡結構中訓練,共享網絡參數。

幾個要點

一、Region Proposal Network

Region Proposal Network(RPN)的核心思想是使用卷積神經網絡直接產生Region Proposal,使用的方法本質上就是滑動窗口。RPN的設計比較巧妙,RPN只需在最後的卷積層上滑動一遍,藉助Anchor機制和邊框迴歸可以得到多尺度多長寬比的Region Proposal。下圖是RPN的網絡結構圖。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-E7DaJydW-1577689664675)(http://lanbing510.info/public/img/posts/rcnn/image08.png)]

ZF網絡模型下,給定輸入圖像(假設分辨率爲600*1000),經過卷積操作得到最後一層的卷積特徵圖(大小約爲40*60)。在這個特徵圖上使用3*3的卷積核(滑動窗口)與特徵圖進行卷積,最後一層卷積層共有256個Feature Map,那麼這個3*3的區域卷積後可以獲得一個256維的特徵向量,後邊接Cls LayerReg Layer分別用於分類和邊框迴歸(跟Fast-RCNN類似,只不過這裏的類別只有目標和背景兩個類別)。3*3滑窗對應的每個特徵區域同時預測輸入圖像3種尺度(128,256,512),3種長寬比(1:1,1:2,2:1)的Region Proposal,這種映射的機制稱爲Anchor 所以對於這個40*60Feature Map,總共有約20000(40*60*9)Anchor,也就是預測20000個Region Proposal。下圖是51*39Anchor中心,以及9種Anchor示例。

img

這樣設計的好處是什麼?

雖然現在也是用的滑動窗口策略,但是,滑動窗口操作是在卷積層特徵圖上進行的,維度較原始圖像降低了16*16倍(16如何得到的可參見前文);多尺度採用了9種Anchor,對應了三種尺度和三種長寬比,加上後邊接了邊框迴歸,所以即便是這9種Anchor外的窗口也能得到一個跟目標比較接近的Region Proposal

二、RPN的損失函數

損失函數定義爲:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wLduXmwr-1577689664678)(C:\Users\mi\AppData\Roaming\Typora\typora-user-images\image-20191230145510870.png)]

其中ii表示一次Mini-BatchAnchor的索引,pip_iAnchor,ii是否是一個物體,LregL_{reg}即爲上面提到的smoothL1(x)smooth_{L1}(x)函數,NclsN_{cls}NregN_{reg}是兩個歸一化項,分別表示Mini-Batch的大小和Anchor位置的數目。

三、網絡的訓練

如果是分別訓練兩種不同任務的網絡模型,即使它們的結構、參數完全一致,但各自的卷積層內的卷積核也會向着不同的方向改變,導致無法共享網絡權重,Faster-RCNN提出了三種可能的方式:

  1. Alternating Training:此方法其實就是一個不斷迭代的訓練過程,既然分別訓練RPNFast-RCNN可能讓網絡朝不同的方向收斂,那麼我們可以先獨立訓練RPN,然後用這個RPN的網絡權重對Fast-RCNN網絡進行初始化,並且用之前RPN輸出Proposal作爲此時Fast-RCNN的輸入,之後不斷迭代這個過程,即循環訓練RPNFast-RCNN

  2. Approximate Joint Training:這裏與前一種方法不同,不再是串行訓練RPNFast-RCNN,而是嘗試把二者融入到一個網絡內,具體融合的網絡結構如下圖所示,可以看到,Proposals是由中間的RPN層輸出的,而不是從網絡外部得到。需要注意的一點,名字中的"Approximate"是因爲“This solution ignores the derivative w.r.t. the proposal boxes' coordinates that are also network responses”,也就是說,反向傳播階段RPN產生的Cls Score能夠獲得梯度用以更新參數,但是Proposal的座標預測則直接把梯度捨棄了,這個設置可以使Backward時該網絡層能得到一個解析解(Closed Results),並且相對於Alternating Traing減少了25-50%的訓練時間。

  3. Non-approximate Training:上面的Approximate Joint TrainingProposal的座標預測梯度直接捨棄,所以被稱作Approximate,那麼理論上如果不捨棄是不是能更好的提升RPN部分網絡的性能呢?作者把這種訓練方式稱爲“ Non-approximate Joint Training”,但是此方法只是一筆帶過,表示“This is a nontrivial problem and a solution can be given by an “RoI warping” layer as developed in [15], which is beyond the scope of this paper”

作者沒有用上面提到的三種可能方法,而是使用了4-Step Alternating Training,具體步驟如下。

  1. ImageNet模型初始化,獨立訓練一個RPN網絡;

  2. 仍然用ImageNet模型初始化,但是使用上一步RPN網絡產生的Proposal作爲輸入,訓練一個Fast-RCNN網絡,至此,兩個網絡每一層的參數完全不共享;

  3. 使用第二步的Fast-RCNN網絡參數初始化一個新的RPN網絡,但是把RPNFast-RCNN共享的那些卷積層的Learning Rate設置爲0,也就是不更新,僅僅更新RPN特有的那些網絡層,重新訓練,此時,兩個網絡已經共享了所有公共的卷積層;

  4. 仍然固定共享的那些網絡層,把Fast-RCNN特有的網絡層也加入進來,形成一個Unified Network,繼續訓練,Fine Tune Fast-RCNN特有的網絡層,此時,該網絡已經實現我們設想的目標,即網絡內部預測Proposal並實現檢測的功能。

上述步驟圖示如下。
在這裏插入圖片描述

6. 小結

至此,介紹完了以RCNN爲代表的基於Region Proposal的深度學習目標檢測算法(RCNNSPP-NETFast-RCNNFaster-RCNN),主要介紹了算法的核心思想和要點難點,代碼可以從GitHub得到,更多實現細節可以閱讀原論文和代碼。接下來會寫另一篇文章來介紹以YOLO爲代表的基於迴歸方法的深度學習目標檢測算法(YOLOSSD)。

參考文獻

[1] RCNN:“Rich feature hierarchies for accurate object detection and semantic segmentation”

[2] SPP-NET:“Spatial pyramid pooling in deep convolutional networks for visual recognition”

[3] Fast-RCNN:“Fast R-CNN”

[4] Faster-RCNN:“Faster R-CNN: Towards real-time object detection with region proposal networks”

[5] RCNN, Fast-RCNN, Faster-RCNN的一些事

[6] 卷積神經網絡物體檢測之感受野大小計算

[7] 原始圖片中的ROI如何映射到到Feature Map

[8] Fast R-CNN

[9] 通過代碼理解Faster-RCNN中的RPN

[10] Faster R-CNN

[11] 基於深度學習的目標檢測研究進展

發佈了111 篇原創文章 · 獲贊 51 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章