目标检测之RCNN,SPP-NET,Fast-RCNN,Faster-RCNN
轉載自http://lanbing510.info/2017/08/24/RCNN-FastRCNN-FasterRCNN.html
寫在前面
在深度學習出現之前,傳統的目標檢測方法大概分為區域選擇(滑窗)、特征提取(SIFT、HOG等)、分類器(SVM、Adaboost等)三個部分,其主要問題有兩方面:一方面滑窗選擇策略沒有針對性、時間復雜度高,窗口冗余;另一方面手工設計的特征魯棒性較差。自深度學習出現之后,目標檢測取得了巨大的突破,最矚目的兩個方向有:1 以RCNN為代表的基于Region Proposal的深度學習目標檢測算法(RCNN,SPP-NET,Fast-RCNN,Faster-RCNN等);2 以YOLO為代表的基于回歸方法的深度學習目標檢測算法(YOLO,SSD等)。本篇對基于Region Proposal的深度學習目標檢測算法進行介紹,后續再對基于回歸方法的深度學習目標檢測方法進行介紹。
RCNN
流程框圖
算法特點
1 使用Selective Search提取Proposes,然后利用CNN等識別技術進行分類。
2 使用識別庫進行預訓練,而后用檢測庫調優參數。
3 使用SVM代替了CNN網絡中最后的Softmax,同時用CNN輸出的4096維向量進行Bounding Box回歸。
4 流程前兩個步驟(候選區域提取+特征提取)與待檢測類別無關,可以在不同類之間共用;同時檢測多類時,需要倍增的只有后兩步驟(判別+精修),都是簡單的線性運算,速度很快。
存在問題
1 訓練分為多個階段,步驟繁瑣: 微調網絡+訓練SVM+訓練邊框回歸器。
2 訓練耗時,占用磁盤空間大:5000張圖像產生幾百G的特征文件。
3 速度慢: 使用GPU, VGG16模型處理一張圖像需要47s。
SPP-NET
流程框圖
算法特點
1 通過Spatial Pyramid Pooling解決了深度網絡固定輸入層尺寸的這個限制,使得網絡可以享受不限制輸入尺寸帶來的好處。
2 解決了RCNN速度慢的問題,不需要對每個Proposal(2000個左右)進行Wrap或Crop輸入CNN提取Feature Map,只需要對整圖提一次Feature Map,然后將Proposal區域映射到卷積特征層得到全鏈接層的輸入特征。
幾個要點
一、ROI的在特征圖上的對應的特征區域的維度不滿足全連接層的輸入要求怎么辦?
作者使用Spatial Pyramid Pooling解決了該問題。如下圖所示,假設原圖輸入是224x224,對于conv5出來后的輸出是13x13x256的,可以理解成有256個這樣的Filter,每個Filter對應一張13x13的Reponse Map。如果像上圖那樣將Reponse Map分成1x1(金字塔底座),2x2(金字塔中間),4x4(金字塔頂座)三張子圖,分別做Max Pooling后,出來的特征就是(16+4+1)x256 維度。如果原圖的輸入不是224x224,出來的特征依然是(16+4+1)x256維度。這樣就實現了不管圖像尺寸如何池化n的輸出永遠是 (16+4+1)x256 維度。
二、原始圖像的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計算卷積層輸出大小和感受野大小的Python代碼
運行結果如下。從運行結果可以看出論文中ZF-5網絡感受野大小為139是什么得到的了。
2 感受野上的坐標映射
① 計算公式
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]
對于Neuronlayer(ReLU/Sigmoid/…):
pi=pi+1p_i = p_i + 1pi?=pi?+1
其中pip_ipi?為第i 層感受野上的坐標,sis_isi?為Stride的大小,kik_iki?為感受野的大小。
② 例子
上面是計算任意一個Layer輸入輸出的坐標映射關系,如果是計算任意Feature Map之間的關系,只需要用簡單的組合就可以得到,下圖是一個簡單的例子:
③ 簡化版本
何凱明在SPP-NET中使用的是簡化版本,將2小節公式中的Padding都設為?ki/2?,公式可進一步簡化為:pi=si?pi+1p_i = s_i * p_{i+1}pi?=si??pi+1?
3 原始圖像的ROI如何映射
SPP-NET是把原始ROI的左上角和右下角 映射到Feature Map上的兩個對應點。 有了Feature Map上的兩隊角點就確定了對應的Feature Map 區域(下圖中橙色)。
左上角取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;右下角的點取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為坐標映射的簡化計算版本,即$ s_i = \prod_0^i{s_i}$。
Fast-RCNN
流程框圖
算法特點
1 Fast-RCNN直接使用Softmax替代了RCNN中SVM進行分類,同時在網絡中加入了多任務函數邊框回歸,實現了端到端的訓練(除SS Region Proposal階段)。
2 借鑒SPP-NET,提出了一個ROI層。ROI Pooling Layer實際上是SPP-NET的一個精簡版,SPP-NET對每個Proposal使用了不同大小的金字塔映射,而ROI Pooling Layer只需要下采樣到一個7x7的特征圖。對于VGG16網絡conv5_3有512個特征圖,這樣所有Region Proposal對應了一個77512維度的特征向量作為全連接層的輸入。
3 使用了不同于SPP-NET的訓練方式,訓練時,把同張圖片的Prososals作為一批進行學習,而Proposals的坐標直接映射到conv5層上,這樣相當于一張圖片的所有訓練樣本只卷積了一次。
4 論文在回歸問題上并沒有用很常見的2范數作為回歸,而是使用所謂的魯棒L1范數作為損失函數。
5 論文將比較大的全鏈接層用SVD分解了一下使得檢測的時候更加迅速。
幾個要點
一、聯合訓練
聯合訓練(Joint Training)指如何將分類和邊框回歸聯合到一起在CNN階段訓練,主要難點是損失函數的設計。Fast-RCNN中,有兩個輸出層:第一個是針對每個ROI區域的分類概率預測,p=(p0,p1,p2,…,pk)p = (p_0, p_1, p_2, \ldots, p_k)p=(p0?,p1?,p2?,…,pk?);第二個則是針對每個ROI區域坐標的偏移優化,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是多類檢測的類別序號。每個訓練ROI都對應著真實類別uuu和邊框回歸目標v=(vx,vy,vw,vh)v=(v_x,v_y,v_w,v_h)v=(vx?,vy?,vw?,vh?),對于類別uuu預測邊框為tu=(txu,tyu,twu,thu)t^u=(t^u_x,t^u_y,t^u_w,t^u_h)tu=(txu?,tyu?,twu?,thu?),使用多任務損失LLL來定義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?表示真實類別的log?\loglog損失,當u≥1u≥1u≥1時,[u≥1][u≥1][u≥1]的值為1,否則為0。下面將重點介紹多任務損失中的邊框回歸部分(對應坐標偏移優化部分)。
二、邊框回歸
假設對于類別uuu,在圖片中標注的真實坐標和對應的預測值理論上兩者越接近越好,相應的損失函數為:
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 $之間為二次函數,其他區域為線性函數,函數直觀圖如下圖所示。
存在問題
使用Selective Search提取Region Proposals,沒有實現真正意義上的端對端,操作也十分耗時。
Faster-RCNN
流程框圖
算法特點
1 提出了Region Proposal Network(RPN),將Proposal階段和CNN分類融到了一起,實現了一個完全的End-To-End的CNN目標檢測模型。RPN可以快速提取高質量的Proposal,不僅加快了目標檢測速度,還提高了目標檢測性能。
2 將Fast-RCNN和RPN放在同一個網絡結構中訓練,共享網絡參數。
幾個要點
一、Region Proposal Network
Region Proposal Network(RPN)的核心思想是使用卷積神經網絡直接產生Region Proposal,使用的方法本質上就是滑動窗口。RPN的設計比較巧妙,RPN只需在最后的卷積層上滑動一遍,借助Anchor機制和邊框回歸可以得到多尺度多長寬比的Region Proposal。下圖是RPN的網絡結構圖。
在ZF網絡模型下,給定輸入圖像(假設分辨率為6001000),經過卷積操作得到最后一層的卷積特征圖(大小約為4060)。在這個特征圖上使用33的卷積核(滑動窗口)與特征圖進行卷積,最后一層卷積層共有256個Feature Map,那么這個33的區域卷積后可以獲得一個256維的特征向量,后邊接Cls Layer和Reg Layer分別用于分類和邊框回歸(跟Fast RCNN類似,只不過這里的類別只有目標和背景兩個類別)。33滑窗對應的每個特征區域同時預測輸入圖像3種尺度(128,256,512),3種長寬比(1:1,1:2,2:1)的Region Proposal,這種映射的機制稱為Anchor。所以對于這個4060的Feature Map,總共有約20000(40609)個Anchor,也就是預測20000個Region Proposal。下圖是51*39個Anchor中心,以及9種Anchor示例。
這樣設計的好處是什么?雖然現在也是用的滑動窗口策略,但是,滑動窗口操作是在卷積層特征圖上進行的,維度較原始圖像降低了16*16倍(16如何得到的可參見前文);多尺度采用了9種Anchor,對應了三種尺度和三種長寬比,加上后邊接了邊框回歸,所以即便是這9種Anchor外的窗口也能得到一個跟目標比較接近的Region Proposal。
二、RPN的損失函數
損失函數定義為:
$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是否是一個物體,LregL_{reg}Lreg?即為上面提到的smoothL1(x)smoothL_1(x)smoothL1?(x)函數,NclsN_{cls}Ncls?和NregN_{reg}Nreg?是兩個歸一化項,分別表示Mini-Batch的大小和Anchor位置的數目。
三、網絡的訓練
如果是分別訓練兩種不同任務的網絡模型,即使它們的結構、參數完全一致,但各自的卷積層內的卷積核也會向著不同的方向改變,導致無法共享網絡權重,Faster-RCNN提出了三種可能的方式:
1 Alternating Training:此方法其實就是一個不斷迭代的訓練過程,既然分別訓練RPN和Fast-RCNN可能讓網絡朝不同的方向收斂,那么我們可以先獨立訓練RPN,然后用這個RPN的網絡權重對Fast-RCNN網絡進行初始化,并且用之前RPN輸出Proposal作為此時Fast-RCNN的輸入,之后不斷迭代這個過程,即循環訓練RPN、Fast-RCNN。
2 Approximate Joint Training:這里與前一種方法不同,不再是串行訓練RPN和Fast-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 Training把Proposal的坐標預測梯度直接舍棄,所以被稱作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網絡,但是把RPN、Fast-RCNN共享的那些卷積層的Learning Rate設置為0,也就是不更新,僅僅更新RPN特有的那些網絡層,重新訓練,此時,兩個網絡已經共享了所有公共的卷積層;
4 仍然固定共享的那些網絡層,把Fast-RCNN特有的網絡層也加入進來,形成一個Unified Network,繼續訓練,Fine Tune Fast-RCNN特有的網絡層,此時,該網絡已經實現我們設想的目標,即網絡內部預測Proposal并實現檢測的功能。
上述步驟圖示如下。
小結
至此,介紹完了以RCNN為代表的基于Region Proposal的深度學習目標檢測算法(RCNN,SPP-NET,Fast-RCNN,Faster-RCNN),主要介紹了算法的核心思想和要點難點,代碼可以從GitHub得到,更多實現細節可以閱讀原論文和代碼。接下來會寫另一篇文章來介紹以YOLO為代表的基于回歸方法的深度學習目標檢測算法(YOLO,SSD)。
參考文獻
[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]?基于深度學習的目標檢測研究進展
總結
以上是生活随笔為你收集整理的目标检测之RCNN,SPP-NET,Fast-RCNN,Faster-RCNN的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 偷源代码!还和前东家一起投标……最终被判
- 下一篇: 90后美女大学生,年薪30W的程序员,他