目標(biāo)檢測(cè)之RCNN,SPP-NET,F(xiàn)ast-RCNN,F(xiàn)aster-RCNN

轉(zhuǎn)載自http://lanbing510.info/2017/08/24/RCNN-FastRCNN-FasterRCNN.html

寫在前面


在深度學(xué)習(xí)出現(xiàn)之前,傳統(tǒng)的目標(biāo)檢測(cè)方法大概分為區(qū)域選擇(滑窗)、特征提?。⊿IFT、HOG等)、分類器(SVM、Adaboost等)三個(gè)部分,其主要問(wèn)題有兩方面:一方面滑窗選擇策略沒(méi)有針對(duì)性、時(shí)間復(fù)雜度高,窗口冗余;另一方面手工設(shè)計(jì)的特征魯棒性較差。自深度學(xué)習(xí)出現(xiàn)之后,目標(biāo)檢測(cè)取得了巨大的突破,最矚目的兩個(gè)方向有:1 以RCNN為代表的基于Region Proposal的深度學(xué)習(xí)目標(biāo)檢測(cè)算法(RCNN,SPP-NET,F(xiàn)ast-RCNN,F(xiàn)aster-RCNN等);2 以YOLO為代表的基于回歸方法的深度學(xué)習(xí)目標(biāo)檢測(cè)算法(YOLO,SSD等)。本篇對(duì)基于Region Proposal的深度學(xué)習(xí)目標(biāo)檢測(cè)算法進(jìn)行介紹,后續(xù)再對(duì)基于回歸方法的深度學(xué)習(xí)目標(biāo)檢測(cè)方法進(jìn)行介紹。

RCNN


流程框圖


算法特點(diǎn)


1 使用Selective Search提取Proposes,然后利用CNN等識(shí)別技術(shù)進(jìn)行分類。

2 使用識(shí)別庫(kù)進(jìn)行預(yù)訓(xùn)練,而后用檢測(cè)庫(kù)調(diào)優(yōu)參數(shù)。

3 使用SVM代替了CNN網(wǎng)絡(luò)中最后的Softmax,同時(shí)用CNN輸出的4096維向量進(jìn)行Bounding Box回歸。

4 流程前兩個(gè)步驟(候選區(qū)域提取+特征提?。┡c待檢測(cè)類別無(wú)關(guān),可以在不同類之間共用;同時(shí)檢測(cè)多類時(shí),需要倍增的只有后兩步驟(判別+精修),都是簡(jiǎn)單的線性運(yùn)算,速度很快。

存在問(wèn)題


1 訓(xùn)練分為多個(gè)階段,步驟繁瑣: 微調(diào)網(wǎng)絡(luò)+訓(xùn)練SVM+訓(xùn)練邊框回歸器。

2 訓(xùn)練耗時(shí),占用磁盤空間大:5000張圖像產(chǎn)生幾百G的特征文件。

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

SPP-NET


流程框圖


算法特點(diǎn)


1 通過(guò)Spatial Pyramid Pooling解決了深度網(wǎng)絡(luò)固定輸入層尺寸的這個(gè)限制,使得網(wǎng)絡(luò)可以享受不限制輸入尺寸帶來(lái)的好處。

2 解決了RCNN速度慢的問(wèn)題,不需要對(duì)每個(gè)Proposal(2000個(gè)左右)進(jìn)行Wrap或Crop輸入CNN提取Feature Map,只需要對(duì)整圖提一次Feature Map,然后將Proposal區(qū)域映射到卷積特征層得到全鏈接層的輸入特征。

幾個(gè)要點(diǎn)


一、ROI的在特征圖上的對(duì)應(yīng)的特征區(qū)域的維度不滿足全連接層的輸入要求怎么辦?

作者使用Spatial Pyramid Pooling解決了該問(wèn)題。如下圖所示,假設(shè)原圖輸入是224x224,對(duì)于conv5出來(lái)后的輸出是13x13x256的,可以理解成有256個(gè)這樣的Filter,每個(gè)Filter對(duì)應(yīng)一張13x13的Reponse Map。如果像上圖那樣將Reponse Map分成1x1(金字塔底座),2x2(金字塔中間),4x4(金字塔頂座)三張子圖,分別做Max Pooling后,出來(lái)的特征就是(16+4+1)x256 維度。如果原圖的輸入不是224x224,出來(lái)的特征依然是(16+4+1)x256維度。這樣就實(shí)現(xiàn)了不管圖像尺寸如何池化n的輸出永遠(yuǎn)是 (16+4+1)x256 維度。

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

要搞定這個(gè)問(wèn)題,需要首先清楚感受野等概念和計(jì)算方法。下面從感受野、感受野上面的坐標(biāo)映射及原始圖像的ROI如何映射三方面闡述。

1 感受野

① 概念

在卷積神經(jīng)網(wǎng)絡(luò)中,感受野的定義是卷積神經(jīng)網(wǎng)絡(luò)每一層輸出的特征圖(Feature Map)上的像素點(diǎn)在原始圖像上映射的區(qū)域大小。

② 如何計(jì)算

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

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

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

計(jì)算卷積層輸出大小和感受野大小的Python代碼

運(yùn)行結(jié)果如下。從運(yùn)行結(jié)果可以看出論文中ZF-5網(wǎng)絡(luò)感受野大小為139是什么得到的了。

image

2 感受野上的坐標(biāo)映射

① 計(jì)算公式
p_i = s_i*p_{i+1} + [(k_i - 1) / 2 - padding]

對(duì)于Neuronlayer(ReLU/Sigmoid/...):
p_i = p_i + 1

其中p_i為第i 層感受野上的坐標(biāo),s_i為Stride的大小,k_i為感受野的大小。

② 例子

上面是計(jì)算任意一個(gè)Layer輸入輸出的坐標(biāo)映射關(guān)系,如果是計(jì)算任意Feature Map之間的關(guān)系,只需要用簡(jiǎn)單的組合就可以得到,下圖是一個(gè)簡(jiǎn)單的例子:


③ 簡(jiǎn)化版本

何凱明在SPP-NET中使用的是簡(jiǎn)化版本,將2小節(jié)公式中的Padding都設(shè)為?ki/2?,公式可進(jìn)一步簡(jiǎn)化為:p_i = s_i * p_{i+1}

3 原始圖像的ROI如何映射

SPP-NET是把原始ROI的左上角和右下角 映射到Feature Map上的兩個(gè)對(duì)應(yīng)點(diǎn)。 有了Feature Map上的兩隊(duì)角點(diǎn)就確定了對(duì)應(yīng)的Feature Map 區(qū)域(下圖中橙色)。

左上角取x'=\lfloor x/S \rfloor+1, y'= \lfloor y/S \rfloor+1;右下角的點(diǎn)取x'=\lceil x/S \rceil+1, y'=\lceil y/S \rceil+1。其中S為坐標(biāo)映射的簡(jiǎn)化計(jì)算版本,即s_i = \prod_0^i{s_i}。

Fast-RCNN


流程框圖


算法特點(diǎn)


1 Fast-RCNN直接使用Softmax替代了RCNN中SVM進(jìn)行分類,同時(shí)在網(wǎng)絡(luò)中加入了多任務(wù)函數(shù)邊框回歸,實(shí)現(xiàn)了端到端的訓(xùn)練(除SS Region Proposal階段)。

2 借鑒SPP-NET,提出了一個(gè)ROI層。ROI Pooling Layer實(shí)際上是SPP-NET的一個(gè)精簡(jiǎn)版,SPP-NET對(duì)每個(gè)Proposal使用了不同大小的金字塔映射,而ROI Pooling Layer只需要下采樣到一個(gè)7x7的特征圖。對(duì)于VGG16網(wǎng)絡(luò)conv5_3有512個(gè)特征圖,這樣所有Region Proposal對(duì)應(yīng)了一個(gè)77512維度的特征向量作為全連接層的輸入。

3 使用了不同于SPP-NET的訓(xùn)練方式,訓(xùn)練時(shí),把同張圖片的Prososals作為一批進(jìn)行學(xué)習(xí),而Proposals的坐標(biāo)直接映射到conv5層上,這樣相當(dāng)于一張圖片的所有訓(xùn)練樣本只卷積了一次。

4 論文在回歸問(wèn)題上并沒(méi)有用很常見的2范數(shù)作為回歸,而是使用所謂的魯棒L1范數(shù)作為損失函數(shù)。

5 論文將比較大的全鏈接層用SVD分解了一下使得檢測(cè)的時(shí)候更加迅速。

幾個(gè)要點(diǎn)


一、聯(lián)合訓(xùn)練

聯(lián)合訓(xùn)練(Joint Training)指如何將分類和邊框回歸聯(lián)合到一起在CNN階段訓(xùn)練,主要難點(diǎn)是損失函數(shù)的設(shè)計(jì)。Fast-RCNN中,有兩個(gè)輸出層:第一個(gè)是針對(duì)每個(gè)ROI區(qū)域的分類概率預(yù)測(cè),p = (p_0, p_1, p_2, \ldots, p_k);第二個(gè)則是針對(duì)每個(gè)ROI區(qū)域坐標(biāo)的偏移優(yōu)化,t^k=(t^k_x,t^k_y,t^k_w,t^k_h), 0<k<K是多類檢測(cè)的類別序號(hào)。每個(gè)訓(xùn)練ROI都對(duì)應(yīng)著真實(shí)類別u和邊框回歸目標(biāo)v=(v_x,v_y,v_w,v_h),對(duì)于類別u預(yù)測(cè)邊框?yàn)?img class="math-inline" src="https://math.jianshu.com/math?formula=t%5Eu%3D(t%5Eu_x%2Ct%5Eu_y%2Ct%5Eu_w%2Ct%5Eu_h)" alt="t^u=(t^u_x,t^u_y,t^u_w,t^u_h)" mathimg="1">,使用多任務(wù)損失L來(lái)定義ROI上分類和邊框回歸的損失:

L(p,u,t^u,v)=L_{cls}(p,u)+λ[u≥1]L_{loc}(t^u,v)
其中L_{cls}(p,u)=?\log{p_u}表示真實(shí)類別的\log損失,當(dāng)u≥1時(shí),[u≥1]的值為1,否則為0。下面將重點(diǎn)介紹多任務(wù)損失中的邊框回歸部分(對(duì)應(yīng)坐標(biāo)偏移優(yōu)化部分)。

二、邊框回歸

假設(shè)對(duì)于類別u,在圖片中標(biāo)注的真實(shí)坐標(biāo)和對(duì)應(yīng)的預(yù)測(cè)值理論上兩者越接近越好,相應(yīng)的損失函數(shù)為:

L_{loc}(t^u, v)=∑_{i∈x,y,w,h}smooth_{L1}(t^u_i?v_i)

其中

smooth_{L1}(x)=\lbrace{^{0.5*x^2 |x|≤1} _{|x|?0.5 otherwise}}
Fast-RCNN在上面用到的魯棒L_1< math之間為二次函數(shù),其他區(qū)域?yàn)榫€性函數(shù),函數(shù)直觀圖如下圖所示。

image

存在問(wèn)題


使用Selective Search提取Region Proposals,沒(méi)有實(shí)現(xiàn)真正意義上的端對(duì)端,操作也十分耗時(shí)。

Faster-RCNN


流程框圖


算法特點(diǎn)


1 提出了Region Proposal Network(RPN),將Proposal階段和CNN分類融到了一起,實(shí)現(xiàn)了一個(gè)完全的End-To-End的CNN目標(biāo)檢測(cè)模型。RPN可以快速提取高質(zhì)量的Proposal,不僅加快了目標(biāo)檢測(cè)速度,還提高了目標(biāo)檢測(cè)性能。

2 將Fast-RCNN和RPN放在同一個(gè)網(wǎng)絡(luò)結(jié)構(gòu)中訓(xùn)練,共享網(wǎng)絡(luò)參數(shù)。

幾個(gè)要點(diǎn)


一、Region Proposal Network

Region Proposal Network(RPN)的核心思想是使用卷積神經(jīng)網(wǎng)絡(luò)直接產(chǎn)生Region Proposal,使用的方法本質(zhì)上就是滑動(dòng)窗口。RPN的設(shè)計(jì)比較巧妙,RPN只需在最后的卷積層上滑動(dòng)一遍,借助Anchor機(jī)制和邊框回歸可以得到多尺度多長(zhǎng)寬比的Region Proposal。下圖是RPN的網(wǎng)絡(luò)結(jié)構(gòu)圖。

在ZF網(wǎng)絡(luò)模型下,給定輸入圖像(假設(shè)分辨率為6001000),經(jīng)過(guò)卷積操作得到最后一層的卷積特征圖(大小約為4060)。在這個(gè)特征圖上使用33的卷積核(滑動(dòng)窗口)與特征圖進(jìn)行卷積,最后一層卷積層共有256個(gè)Feature Map,那么這個(gè)33的區(qū)域卷積后可以獲得一個(gè)256維的特征向量,后邊接Cls Layer和Reg Layer分別用于分類和邊框回歸(跟Fast RCNN類似,只不過(guò)這里的類別只有目標(biāo)和背景兩個(gè)類別)。33滑窗對(duì)應(yīng)的每個(gè)特征區(qū)域同時(shí)預(yù)測(cè)輸入圖像3種尺度(128,256,512),3種長(zhǎng)寬比(1:1,1:2,2:1)的Region Proposal,這種映射的機(jī)制稱為Anchor。所以對(duì)于這個(gè)4060的Feature Map,總共有約20000(40609)個(gè)Anchor,也就是預(yù)測(cè)20000個(gè)Region Proposal。下圖是51*39個(gè)Anchor中心,以及9種Anchor示例。

這樣設(shè)計(jì)的好處是什么?雖然現(xiàn)在也是用的滑動(dòng)窗口策略,但是,滑動(dòng)窗口操作是在卷積層特征圖上進(jìn)行的,維度較原始圖像降低了16*16倍(16如何得到的可參見前文);多尺度采用了9種Anchor,對(duì)應(yīng)了三種尺度和三種長(zhǎng)寬比,加上后邊接了邊框回歸,所以即便是這9種Anchor外的窗口也能得到一個(gè)跟目標(biāo)比較接近的Region Proposal。

二、RPN的損失函數(shù)

損失函數(shù)定義為:

L(p_it_i)=\frac{1}{N_{cls}}∑_i{L_{cls}(p_i,p^?_i)}+λ_1N_{reg}∑_ip^?_iL_{reg}(t_i,t^?_i) < math

其中i表示一次Mini-Batch中Anchor的索引,p _i是Anchor i是否是一個(gè)物體,L_{reg}即為上面提到的smoothL_1(x)函數(shù),N_{cls}N_{reg}是兩個(gè)歸一化項(xiàng),分別表示Mini-Batch的大小和Anchor位置的數(shù)目。

三、網(wǎng)絡(luò)的訓(xùn)練

如果是分別訓(xùn)練兩種不同任務(wù)的網(wǎng)絡(luò)模型,即使它們的結(jié)構(gòu)、參數(shù)完全一致,但各自的卷積層內(nèi)的卷積核也會(huì)向著不同的方向改變,導(dǎo)致無(wú)法共享網(wǎng)絡(luò)權(quán)重,F(xiàn)aster-RCNN提出了三種可能的方式:

1 Alternating Training:此方法其實(shí)就是一個(gè)不斷迭代的訓(xùn)練過(guò)程,既然分別訓(xùn)練RPN和Fast-RCNN可能讓網(wǎng)絡(luò)朝不同的方向收斂,那么我們可以先獨(dú)立訓(xùn)練RPN,然后用這個(gè)RPN的網(wǎng)絡(luò)權(quán)重對(duì)Fast-RCNN網(wǎng)絡(luò)進(jìn)行初始化,并且用之前RPN輸出Proposal作為此時(shí)Fast-RCNN的輸入,之后不斷迭代這個(gè)過(guò)程,即循環(huán)訓(xùn)練RPN、Fast-RCNN。

2 Approximate Joint Training:這里與前一種方法不同,不再是串行訓(xùn)練RPN和Fast-RCNN,而是嘗試把二者融入到一個(gè)網(wǎng)絡(luò)內(nèi),具體融合的網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示,可以看到,Proposals是由中間的RPN層輸出的,而不是從網(wǎng)絡(luò)外部得到。需要注意的一點(diǎn),名字中的"Approximate"是因?yàn)椤癟his solution ignores the derivative w.r.t. the proposal boxes' coordinates that are also network responses”,也就是說(shuō),反向傳播階段RPN產(chǎn)生的Cls Score能夠獲得梯度用以更新參數(shù),但是Proposal的坐標(biāo)預(yù)測(cè)則直接把梯度舍棄了,這個(gè)設(shè)置可以使Backward時(shí)該網(wǎng)絡(luò)層能得到一個(gè)解析解(Closed Results),并且相對(duì)于Alternating Traing減少了25-50%的訓(xùn)練時(shí)間。

3 Non-approximate Training:上面的Approximate Joint Training把Proposal的坐標(biāo)預(yù)測(cè)梯度直接舍棄,所以被稱作Approximate,那么理論上如果不舍棄是不是能更好的提升RPN部分網(wǎng)絡(luò)的性能呢?作者把這種訓(xùn)練方式稱為“ Non-approximate Joint Training”,但是此方法只是一筆帶過(guò),表示“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”。

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

1 用ImageNet模型初始化,獨(dú)立訓(xùn)練一個(gè)RPN網(wǎng)絡(luò);

2 仍然用ImageNet模型初始化,但是使用上一步RPN網(wǎng)絡(luò)產(chǎn)生的Proposal作為輸入,訓(xùn)練一個(gè)Fast-RCNN網(wǎng)絡(luò),至此,兩個(gè)網(wǎng)絡(luò)每一層的參數(shù)完全不共享;

3 使用第二步的Fast-RCNN網(wǎng)絡(luò)參數(shù)初始化一個(gè)新的RPN網(wǎng)絡(luò),但是把RPN、Fast-RCNN共享的那些卷積層的Learning Rate設(shè)置為0,也就是不更新,僅僅更新RPN特有的那些網(wǎng)絡(luò)層,重新訓(xùn)練,此時(shí),兩個(gè)網(wǎng)絡(luò)已經(jīng)共享了所有公共的卷積層;

4 仍然固定共享的那些網(wǎng)絡(luò)層,把Fast-RCNN特有的網(wǎng)絡(luò)層也加入進(jìn)來(lái),形成一個(gè)Unified Network,繼續(xù)訓(xùn)練,F(xiàn)ine Tune Fast-RCNN特有的網(wǎng)絡(luò)層,此時(shí),該網(wǎng)絡(luò)已經(jīng)實(shí)現(xiàn)我們?cè)O(shè)想的目標(biāo),即網(wǎng)絡(luò)內(nèi)部預(yù)測(cè)Proposal并實(shí)現(xiàn)檢測(cè)的功能。

上述步驟圖示如下。

image

小結(jié)


至此,介紹完了以RCNN為代表的基于Region Proposal的深度學(xué)習(xí)目標(biāo)檢測(cè)算法(RCNN,SPP-NET,F(xiàn)ast-RCNN,F(xiàn)aster-RCNN),主要介紹了算法的核心思想和要點(diǎn)難點(diǎn),代碼可以從GitHub得到,更多實(shí)現(xiàn)細(xì)節(jié)可以閱讀原論文和代碼。接下來(lái)會(huì)寫另一篇文章來(lái)介紹以YOLO為代表的基于回歸方法的深度學(xué)習(xí)目標(biāo)檢測(cè)算法(YOLO,SSD)。

參考文獻(xiàn)


[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] 卷積神經(jīng)網(wǎng)絡(luò)物體檢測(cè)之感受野大小計(jì)算

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

[8] Fast R-CNN

[9] 通過(guò)代碼理解Faster-RCNN中的RPN

[10] Faster R-CNN

[11] 基于深度學(xué)習(xí)的目標(biāo)檢測(cè)研究進(jìn)展

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容