文章目錄
1. 寫在前面
在深度學習出現之前,傳統的目標檢測方法大概分爲區域選擇(滑窗)、特徵提取(SIFT
、HOG
等)、分類器(SVM
、Adaboost
等)三個部分,其主要問題有兩方面:一方面滑窗選擇策略沒有針對性、時間複雜度高,窗口冗餘;另一方面手工設計的特徵魯棒性較差。自深度學習出現之後,目標檢測取得了巨大的突破,最矚目的兩個方向有:1. 以RCNN
爲代表的基於Region Proposal
的深度學習目標檢測算法(RCNN
,SPP-NET
,Fast-RCNN
,Faster-RCNN
等);2 以YOLO
爲代表的基於迴歸方法的深度學習目標檢測算法(YOLO
,SSD
等)。本篇對基於Region Proposal
的深度學習目標檢測算法進行介紹,後續再對基於迴歸方法的深度學習目標檢測方法進行介紹。
2. RCNN
流程框圖
算法特點
-
使用
Selective Search
提取Proposel
,然後利用CNN
等識別技術進行分類。 -
使用識別庫進行預訓練,而後用檢測庫調優參數。
-
使用
SVM
代替了CNN
網絡中最後的Softmax
,同時用CNN
輸出的4096維向量進行Bounding Box
迴歸。 -
流程前兩個步驟(候選區域提取+特徵提取)與待檢測類別無關,可以在不同類之間共用;同時檢測多類時,需要倍增的只有後兩步驟(判別+精修),都是簡單的線性運算,速度很快。
存在問題
1 訓練分爲多個階段,步驟繁瑣: 微調網絡+訓練SVM
+訓練邊框迴歸器。
2 訓練耗時,佔用磁盤空間大:5000張圖像產生幾百G的特徵文件。
3 速度慢: 使用GPU
,VGG16
模型處理一張圖像需要47s。
3. SPP-NET
流程框圖
算法特點
-
通過
Spatial Pyramid Pooling
解決了深度網絡固定輸入層尺寸的這個限制,使得網絡可以享受不限制輸入尺寸帶來的好處。 -
解決了
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
維度。這樣就實現了不管輸入圖像尺寸如何,輸出永遠是 (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
運行結果如下。從運行結果可以看出論文中ZF-5
網絡感受野大小爲139是什麼得到的了。
2.感受野上的座標映射
① 計算公式
對於Convolution/Pooling Layer
:
對於Neuronlayer(ReLU/Sigmoid/...)
:
其中爲第層感受野上的座標,爲Stride
的大小,爲感受野的大小。
② 例子
上面是計算任意一個Layer
輸入輸出的座標映射關係,如果是計算任意Feature Map
之間的關係,只需要用簡單的組合就可以得到,下圖是一個簡單的例子:
③ 簡化版本
何凱明在SPP-NET
中使用的是簡化版本,將2小節公式中的Padding
都設爲,公式可進一步簡化爲:
3.原始圖像的ROI如何映射
SPP-NET
是把原始ROI
的左上角和右下角映射到Feature Map
上的兩個對應點。 有了Feature Map
上的兩對角點就確定了對應的Feature Map
區域(下圖中橙色)。
左上角取;右下角的點取。其中爲座標映射的簡化計算版本,即。
4. Fast-RCNN
流程框圖
算法特點
-
Fast-RCNN
直接使用Softmax
替代了RCNN
中SVM
進行分類,同時在網絡中加入了多任務函數邊框迴歸,實現了廣義的端到端的訓練。 -
借鑑
SPP-NET
,提出了一個ROI
層。ROI Pooling Layer
實際上是SPP-NET
的一個精簡版,SPP-NET
對每個Proposal
使用了不同大小的金字塔映射,而ROI Pooling Layer
只需要下采樣到一個7x7
的特徵圖。對於VGG16
網絡conv5_3
有512個特徵圖,這樣所有Region Proposal
對應了一個7*7*512
維度的特徵向量作爲全連接層的輸入。 -
使用了不同於
SPP-NET
的訓練方式,訓練時,把同張圖片的Prososals
作爲一批進行學習,而Proposals
的座標直接映射到conv5
層上,這樣相當於一張圖片的所有訓練樣本只卷積了一次。 -
論文在迴歸問題上並沒有用很常見的
2範數
作爲迴歸,而是使用所謂的魯棒L1
範數作爲損失函數。 -
論文將比較大的全鏈接層用
SVD
分解了一下,使得檢測的時候更加迅速。
幾個要點
一、聯合訓練
聯合訓練(Joint Training
)指如何將分類和邊框迴歸聯合到一起在CNN
階段訓練,主要難點是損失函數的設計。Fast-RCNN
中,有兩個輸出層:第一個是針對每個ROI
區域的分類概率預測,;第二個則是針對每個ROI
區域座標的偏移優化,是多類檢測的類別序號。每個訓練ROI
都對應着真實類別和邊框迴歸目標,對於類別預測邊框爲,使用多任務損失來定義ROI
上分類和邊框迴歸的損失:
其中表示真實類別的損失,當時,的值爲1,否則爲0。下面將重點介紹多任務損失中的邊框迴歸部分(對應座標偏移優化部分)。
二、邊框迴歸
假設對於類別,在圖片中標註的真實座標和對應的預測值理論上兩者越接近越好,相應的損失函數爲:
其中
Fast-RCNN
在上面用到的魯棒函數對外點比RCNN
和SPP-NET
中用的函數更爲魯棒,該函數在(−1,1)之間爲二次函數,其他區域爲線性函數,函數直觀圖如下圖所示。
存在問題
使用Selective Search
提取Region Proposals
,沒有實現真正意義上的端對端,操作也十分耗時。
5. Faster-RCNN
流程框圖
算法特點
-
提出了
Region Proposal Network(RPN)
,將Proposal
階段和CNN
分類融到了一起,實現了一個完全的End-To-End
的CNN
目標檢測模型。RPN
可以快速提取高質量的Proposal
,不僅加快了目標檢測速度,還提高了目標檢測性能。 -
將
Fast-RCNN
和RPN
放在同一個網絡結構中訓練,共享網絡參數。
幾個要點
一、Region Proposal Network
Region Proposal Network(RPN)
的核心思想是使用卷積神經網絡直接產生Region Proposal
,使用的方法本質上就是滑動窗口。RPN
的設計比較巧妙,RPN
只需在最後的卷積層上滑動一遍,藉助Anchor
機制和邊框迴歸可以得到多尺度多長寬比的Region Proposal
。下圖是RPN
的網絡結構圖。
在ZF
網絡模型下,給定輸入圖像(假設分辨率爲600*1000
),經過卷積操作得到最後一層的卷積特徵圖(大小約爲40*60
)。在這個特徵圖上使用3*3
的卷積核(滑動窗口)與特徵圖進行卷積,最後一層卷積層共有256個Feature Map
,那麼這個3*3
的區域卷積後可以獲得一個256維的特徵向量,後邊接Cls Layer
和Reg Layer
分別用於分類和邊框迴歸(跟Fast-RCNN
類似,只不過這裏的類別只有目標和背景兩個類別)。3*3滑窗對應的每個特徵區域同時預測輸入圖像3種尺度(128,256,512
),3種長寬比(1:1
,1:2
,2:1
)的Region Proposal
,這種映射的機制稱爲Anchor
。 所以對於這個40*60
的Feature Map
,總共有約20000(40*60*9)
個Anchor
,也就是預測20000個Region Proposal
。下圖是51*39
個Anchor
中心,以及9種Anchor
示例。
這樣設計的好處是什麼?
雖然現在也是用的滑動窗口策略,但是,滑動窗口操作是在卷積層特徵圖上進行的,維度較原始圖像降低了16*16
倍(16如何得到的可參見前文);多尺度採用了9種Anchor
,對應了三種尺度和三種長寬比,加上後邊接了邊框迴歸,所以即便是這9種Anchor
外的窗口也能得到一個跟目標比較接近的Region Proposal
。
二、RPN
的損失函數
損失函數定義爲:
其中表示一次Mini-Batch
中Anchor
的索引,是Anchor
,是否是一個物體,即爲上面提到的函數,和是兩個歸一化項,分別表示Mini-Batch
的大小和Anchor
位置的數目。
三、網絡的訓練
如果是分別訓練兩種不同任務的網絡模型,即使它們的結構、參數完全一致,但各自的卷積層內的卷積核也會向着不同的方向改變,導致無法共享網絡權重,Faster-RCNN
提出了三種可能的方式:
-
Alternating Training
:此方法其實就是一個不斷迭代的訓練過程,既然分別訓練RPN
和Fast-RCNN
可能讓網絡朝不同的方向收斂,那麼我們可以先獨立訓練RPN
,然後用這個RPN
的網絡權重對Fast-RCNN
網絡進行初始化,並且用之前RPN
輸出Proposal
作爲此時Fast-RCNN
的輸入,之後不斷迭代這個過程,即循環訓練RPN
、Fast-RCNN
。 -
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%的訓練時間。 -
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
,具體步驟如下。
-
用
ImageNet
模型初始化,獨立訓練一個RPN
網絡; -
仍然用
ImageNet
模型初始化,但是使用上一步RPN
網絡產生的Proposal
作爲輸入,訓練一個Fast-RCNN
網絡,至此,兩個網絡每一層的參數完全不共享; -
使用第二步的
Fast-RCNN
網絡參數初始化一個新的RPN
網絡,但是把RPN
、Fast-RCNN
共享的那些卷積層的Learning Rate
設置爲0,也就是不更新,僅僅更新RPN
特有的那些網絡層,重新訓練,此時,兩個網絡已經共享了所有公共的卷積層; -
仍然固定共享的那些網絡層,把
Fast-RCNN
特有的網絡層也加入進來,形成一個Unified Network
,繼續訓練,Fine Tune Fast-RCNN
特有的網絡層,此時,該網絡已經實現我們設想的目標,即網絡內部預測Proposal
並實現檢測的功能。
上述步驟圖示如下。
6. 小結
至此,介紹完了以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的一些事
[7] 原始圖片中的ROI如何映射到到Feature Map
[8] Fast R-CNN
[10] Faster R-CNN
[11] 基於深度學習的目標檢測研究進展