目标检测之RCNN,SPP-NET,Fast-RCNN,Faster-RCNN
轉(zhuǎn)載自http://lanbing510.info/2017/08/24/RCNN-FastRCNN-FasterRCNN.html
寫(xiě)在前面
在深度學(xué)習(xí)出現(xiàn)之前,傳統(tǒng)的目標(biāo)檢測(cè)方法大概分為區(qū)域選擇(滑窗)、特征提取(SIFT、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,Fast-RCNN,Faster-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è)類別無(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í),占用磁盤(pán)空間大: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是什么得到的了。
2 感受野上的坐標(biāo)映射
① 計(jì)算公式
pi=si?pi+1+[(ki?1)/2?padding]p_i = s_i*p_{i+1} + [(k_i - 1) / 2 - padding]pi?=si??pi+1?+[(ki??1)/2?padding]
對(duì)于Neuronlayer(ReLU/Sigmoid/…):
pi=pi+1p_i = p_i + 1pi?=pi?+1
其中pip_ipi?為第i 層感受野上的坐標(biāo),sis_isi?為Stride的大小,kik_iki?為感受野的大小。
② 例子
上面是計(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)化為:pi=si?pi+1p_i = s_i * p_{i+1}pi?=si??pi+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′=?x/S?+1,y′=?y/S?+1x'=\lfloor x/S \rfloor+1, y'= \lfloor y/S \rfloor+1x′=?x/S?+1,y′=?y/S?+1;右下角的點(diǎn)取x′=?x/S?+1,y′=?y/S?+1x'=\lceil x/S \rceil+1, y'=\lceil y/S \rceil+1x′=?x/S?+1,y′=?y/S?+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)有用很常見(jiàn)的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=(p0,p1,p2,…,pk)p = (p_0, p_1, p_2, \ldots, p_k)p=(p0?,p1?,p2?,…,pk?);第二個(gè)則是針對(duì)每個(gè)ROI區(qū)域坐標(biāo)的偏移優(yōu)化,tk=(txk,tyk,twk,thk),0<k<Kt^k=(t^k_x,t^k_y,t^k_w,t^k_h), 0<k<Ktk=(txk?,tyk?,twk?,thk?),0<k<K是多類檢測(cè)的類別序號(hào)。每個(gè)訓(xùn)練ROI都對(duì)應(yīng)著真實(shí)類別uuu和邊框回歸目標(biāo)v=(vx,vy,vw,vh)v=(v_x,v_y,v_w,v_h)v=(vx?,vy?,vw?,vh?),對(duì)于類別uuu預(yù)測(cè)邊框?yàn)?span id="ozvdkddzhkzd" class="katex--inline">tu=(txu,tyu,twu,thu)t^u=(t^u_x,t^u_y,t^u_w,t^u_h)tu=(txu?,tyu?,twu?,thu?),使用多任務(wù)損失LLL來(lái)定義ROI上分類和邊框回歸的損失:
L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)L(p,u,t^u,v)=L_{cls}(p,u)+λ[u≥1]L_{loc}(t^u,v)L(p,u,tu,v)=Lcls?(p,u)+λ[u≥1]Lloc?(tu,v)
其中Lcls(p,u)=?log?puL_{cls}(p,u)=?\log{p_u}Lcls?(p,u)=?logpu?表示真實(shí)類別的log?\loglog損失,當(dāng)u≥1u≥1u≥1時(shí),[u≥1][u≥1][u≥1]的值為1,否則為0。下面將重點(diǎn)介紹多任務(wù)損失中的邊框回歸部分(對(duì)應(yīng)坐標(biāo)偏移優(yōu)化部分)。
二、邊框回歸
假設(shè)對(duì)于類別uuu,在圖片中標(biāo)注的真實(shí)坐標(biāo)和對(duì)應(yīng)的預(yù)測(cè)值理論上兩者越接近越好,相應(yīng)的損失函數(shù)為:
Lloc(tu,v)=∑i∈x,y,w,hsmoothL1(tiu?vi)L_{loc}(t^u, v)=∑_{i∈x,y,w,h}smooth_{L1}(t^u_i?v_i)Lloc?(tu,v)=∑i∈x,y,w,h?smoothL1?(tiu??vi?)
其中
smoothL1(x)={∣x∣?0.5otherwise0.5?x2∣x∣≤1smooth_{L1}(x)=\lbrace{^{0.5*x^2 |x|≤1} _{|x|?0.5 otherwise}}smoothL1?(x)={∣x∣?0.5otherwise0.5?x2∣x∣≤1?
Fast-RCNN在上面用到的魯棒$L_1< math $之間為二次函數(shù),其他區(qū)域?yàn)榫€性函數(shù),函數(shù)直觀圖如下圖所示。
存在問(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如何得到的可參見(jiàn)前文);多尺度采用了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 $
其中iii表示一次Mini-Batch中Anchor的索引,pip _ipi?是Anchor?iii是否是一個(gè)物體,LregL_{reg}Lreg?即為上面提到的smoothL1(x)smoothL_1(x)smoothL1?(x)函數(shù),NclsN_{cls}Ncls?和NregN_{reg}Nreg?是兩個(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)重,Faster-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)練,Fine 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è)的功能。
上述步驟圖示如下。
小結(jié)
至此,介紹完了以RCNN為代表的基于Region Proposal的深度學(xué)習(xí)目標(biāo)檢測(cè)算法(RCNN,SPP-NET,Fast-RCNN,Faster-RCNN),主要介紹了算法的核心思想和要點(diǎn)難點(diǎn),代碼可以從GitHub得到,更多實(shí)現(xiàn)細(xì)節(jié)可以閱讀原論文和代碼。接下來(lái)會(huì)寫(xiě)另一篇文章來(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)展
總結(jié)
以上是生活随笔為你收集整理的目标检测之RCNN,SPP-NET,Fast-RCNN,Faster-RCNN的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 偷源代码!还和前东家一起投标……最终被判
- 下一篇: [RCNN]-[YOLO]-[SSD]目