快速的區域卷積網絡方法(Fast R-CNN)
論文地址:https://arxiv.org/abs/1504.08083
摘要:
本文提出一種基於快速的區域卷積網絡方法(Fast R-CNN)用於物體檢測(object detection)。Fast R-CNN建立在先前的工作的基礎上,能夠有效的使用深度卷積網絡對物體候選區域(Region Proposals)進行分類。和之前的工作相比,Fast R-CNN采用了多種創新技術去提高訓練和測試速度,然而它也提高了物體的檢測精度。Fast R-CNN在很深的VGG16網絡上的訓練速度是R-CNN的9倍,測試速度是R-CNN的213倍,並且在PASCALVOC2012數據集上獲得很高的平均精度均值(Mean Average Precision),簡稱MAP。相比於SPP-Net,Fast R-CNN在VGG16網絡上的訓練速度是SPP-Net的3倍,測試速度是SPP-Net的10倍,並且更精確了。Fast R-CNN被實現通過Python 和C++(利用Caffe),而且以MIT License是開源的、可利用的。地址是:https://github.com/rbgirshick/fast-rcnn
1. 引言
最近,深度卷積網絡在圖像分類(image classification)和物體檢測(object detection)領域有了很明顯的提高。相比於圖像分類問題,物體檢測是一個更具挑戰性的任務,它需要使用更復雜的方法去解決。正是由於這種復雜性,當前很多訓練模型的方法都是采用多階段流水線的形式,不僅很慢而且很不優雅。
復雜性產生(Complexity arises)的原因是檢測需要獲得物體的精確位置,從而產生了兩個主要的挑戰(Challenges)。首先,許多的物體候選區域(經常被稱為“Proposals”)必須被處理。其次,這些所謂的候選區域僅僅能提供物體的一個粗略位置信息,因此必須對它進行細化(Refine)以實現更精確的定位。解決這些問題往往需要在速度、精度、簡易性上進行適當的妥協折中(Compromise)。
在這篇論文中,我們簡化了(streamline)基於最先進(state-of-the-art)的卷積網絡的物體檢測的訓練過程(R-CNN和SPP-Net)。我們提出了一種單階段(single-stage)的訓練算法(algorithm),該算法將候選區域物體分類和它們的空間(spatial)位置細化合並在一起去學習訓練(這里指的是圖像分類和邊界框回歸)。
由此產生的方法可以更快的訓練一個非常深的卷積網絡(VGG16,9倍於R-CNN,3倍於SPP-Net)。在測試時,檢測網絡處理一張圖片僅僅需要0.3s(不包括候選區域的產生的時間),而且在PASCAL VOC 2012上的MAP為66%(R-CNN僅僅62%)。
1.1. R-CNN和SPP-Net
基於區域的卷積網絡方法(R-CNN)通過使用深度卷積網絡完成了對物體候選區域的分類,並得到了很好的物體檢測精度。然而,R-CNN有着明顯地(notable)缺陷(drawbacks):
(1)訓練是多階段流水線(Pipeline):首先,R-CNN利用物體候選區域(Object Proposals)對卷積網絡(ConvNet)模型進行調優(fine-tunes),損失函數是采用log損失,其實就是softmax函數。然后,讓SVMs去適應了卷積特征(其實就是訓練了SVM分類器)。這些SVMs通過fine-tuning取代了softmax分類器作為物體檢測器。在第三個訓練階段,邊界框(Bounding-box)回歸器被訓練學習。
(2)訓練在空間和時間上都很昂貴(expensive):對於SVM分類器和邊界框回歸器的訓練來說,所輸入的特征需要每一張圖片的每一個候選區域中被提取(extract)並被寫入磁盤(disk)。對於非常深的網絡,比如VGG16,訓練VOC2017的大約5000張圖片的訓練集需要花費2.5個GPU-Days,這些特征需要數百GB的存儲空間(storage)。
(3)物體檢測速度很慢:在測試時,特征從每一張測試圖片的每一個物體候選區域被提取出來。對於VGG16網絡來說,檢測一張圖片花費47s(在GPU上)。
R-CNN是很慢的原因是對於圖片的每一個候選區域都執行一次前向傳播計算(提取特征的卷積層),沒有共享卷積計算(sharing computation)。SPP-Net提出了共享計算去加速R-CNN算法。SPP-Net方法對於一張完整的輸入圖片只計算一次卷積特征映射,然后從共享的特征映射提取每一個物體候選區域所對應的特征向量並做分類處理。對於每一個候選區域最大池化(max-pooling)它的特征映射提取它的特征向量,輸出是固定的大小。匯聚多種不同大小的池化輸出,然后在空間金字塔池化層連接它們。SPP-Net在測試上是R-CNN的10-100倍;在訓練時由於加快了候選區域的特征提取,訓練時間減少了3倍。(共享卷積計算)
SPP-Net也存在很明顯地缺點。像R-CNN一樣,訓練是多階段流水線,包含特征提取,利用log損失(softmax)fine-tuning網絡,訓練SVM分類器,最終擬合了邊界框回歸器。這些訓練所需提取的特征需要存入磁盤。但是和R-CNN不同的是,在SPP-Net中的fine-tuning不同更新空間金字塔之前的池化層之前的卷積層。不足為奇,這種限制(固定卷積層)限制了非常深的網絡(VGG16)的精度。
1.2. 貢獻(Contributions)
我們提出了一種新的訓練算法(algorithm),該算法在消除/修復(fix)R-CNN和SPPNet缺點(disadvantages)的同時,還提高了它們速度和精度。我們把這種方法叫做Fast R-CNN,因為該方法在訓練和測試的時候是比較快的。Fast R-CNN方法的優點如下:
(1)比R-CNN和SPPNet更高的檢測精度(mAP)
(2)訓練是單階段的,使用了多任務損失函數
(3)訓練可以更新所有的網絡層參數
(4)不需要磁盤去存儲大量提取的特征
Fast R-CNN算法是使用Python和C++(Caffe)來編寫實現的。它可以在開源的MIT Li-cense下獲得,地址是:https://github.com/rbgirshick/fast-rcnn
2. Fast R-CNN的架構和訓練(Architecture and Training)
圖片1說明(illustrates)了Fast R-CNN的架構。Fast R-CNN網絡將一個完整的圖像和一組目標推薦區域作為輸入。該網絡首先通過幾個(幾組)卷積層和最大池化層處理輸入的整個圖像產生一個卷積特征映射(feature map)。然后,對於每一個目標推薦區域,使用感興趣區域(RoI)池化層從特征映射圖上提取固定維度的特征向量。每一個特征向量被輸入(fed into)到一系列全連接層中,最終得到了兩個同級的輸出:第一個輸出產生的是一個(K + 1)類的softmax概率估計(probability estimates),它包括了k個目標類別和一個背景類;第二個層是對於K個目標類的每一個類別輸出4個實數值。K類目標的每一類的4個數字對邊界框的位置進行編碼,以獲得更精細(refine)的邊界框位置。
圖一. fast R-CNN架構。輸入圖像和多個感興趣區域RoI被輸入到完全卷積網絡(這里指卷積網絡的前面的所有卷積層)。每個感興趣區域RoI被池化為固定尺寸的特征映射,然后通過全連接層映射到特征向量。網絡中每個RoI有兩個輸出向量:softmax概率和每個類別的編輯框回歸偏移量。該架構使用多任務損失函數實現了端到端的訓練
2.1 感興趣區域池化層(RoI pooling layer)
RoI 池化層使用最大池化操作將任何有效的感興趣區域內的特征轉換為一個固定空間范圍H*W(例如,7*7)較小的特征映射,其中H和W是獨立於任何特定(particular)的RoI區域的超參數(hyper-parameters)。在本文中,每一個RoI是被轉換為在卷積特征映射上的一個矩形窗口。每個RoI通過4元組(r,c,h,w)來定義,矩形左上角頂點(r,c),矩形的高和寬是(h,w)。
感興趣區域最大池化的作用是通過尺寸大約(approximate)h/H * w/W 的子窗口將 h*w 的RoI窗口划分(dividing)為 H*W 的網格(grid cell),然后將每個子窗口中的值最大池化到相應的輸出網格單元。池化操作是標准的最大池化,它獨立的作用於特征映射的每一個通道(池化是不誇通道的)。RoI層是SPPNet網絡中的空間金字塔池化層的一個簡單的特例,它是只有一個尺度的金字塔層。我們使用文獻[11](這里就是何愷明的SPPNet)中給出的池化窗口進行計算。
2.2 從預訓練(pre-trained)的網絡初始化
我們的實驗采用了三種在ImageNet數據集上預訓練的網絡,每一個網絡擁有5個最大池化層和5-13個卷積層(可查看4.1節獲取詳細網絡結構)。當一個預訓練的網絡初始化Fast R-CNN網絡時,它經歷(undergoes)了三次轉換(transformations)。
首先,最后一個最大池化層被RoI池化層所取代,該RoI池化層通過設置合理H和W實現了與第一個全連接層兼容性配置(例如,H=W=7,對於VGG16)。
其次,網絡的最后的全連接層和softmax層(被訓練1000個類別在ImageNet分類數據集上)被兩個同級並列的層所取代(一個是K+1個類別的softmax分類層,另一個是指定類別的邊界框回歸偏移量)。
第三,網絡被修改為兩種數據輸入:一個是圖像列表,另一個是這些圖像的RoI列表。
2.3 微調網絡用於目標檢測(Fine-tuning for detection)
對於Fast R-CNN來說,使用反向傳播算法(back-propagation)訓練網絡的所有權重是一個很重要的功能。首先,讓我們闡述一下為什么SPPNet不能去更新空間金字塔池化層之下的卷積層權重。
根本的原因在於當每一個訓練樣本(即RoI)來自於不同的圖像時,通過SPP層的反向傳播的效率是很低的,這正是R-CNN和SPPNet網絡的訓練方式。這種效率低下源自於(stems from)每一個感興趣區域ROI可能有一個非常大的感受野(receptive field),通常跨越(spanning)整個輸入圖像。由於前向傳播過程必須處理整個感受野,因此訓練需要的輸入很大(通常是整幅圖像)。
我們提出了一種更加有效的訓練方法,它在訓練期間利用特征共享。在Fast R-CNN訓練時,隨機梯度下降(SGD)的小批量(mini-batches)采用分層抽樣,首先采樣N個圖像,然后對於每一張圖像采樣R/N個RoI區域。更重要的是,來自於同一張圖像的所有RoI區域在前向傳播和反向傳播過程中共享計算和內存。這樣使得較小的N會減少mini-batch的計算量。例如,當使用N=2,R=128,這個提出(propose)的訓練方案(scheme)比來自128張的一個RoI區域(即,R-CNN和SPP-Net的訓練策略strategy)快了大約(roughly)64倍。
對於這種策略(strategy)的一個擔憂是它可能導致訓練時的收斂(convergence)速度減緩,因為來自於同一張圖像的RoI區域是相關的(correlated)。這種擔憂在實際問題中並沒有出現,我們使用了比R-CNN更少的迭代步數,采用N=2,R=128這種策略反而取得了很好的結果。
除了分層抽樣之外,Fast R-CNN使用一個階段的微調同時優化softmax分類器和邊界框回歸器來簡化的訓練過程,而不是三個單獨的極端訓練softmax分類器、SVM、回歸器(像R-CNN和SPPNet中那樣)。該程序(procedure)的組成部分(損失、小批量采樣策略、RoI池化層的方向傳播、SGD超慘)如下所示。
多任務損失(Multi-task loss)
Fast R-CNN網絡有兩個同級(sibling)並列的輸出層,第一個輸出層是一個離散的概率分布(對於每一個RoI區域),p = (p0,...,pk),包含有 K+1 個類別。通常 p 由全連接層的 k+1 個輸出上的softmax計算得到的。第二個同級的輸出層是邊界框回歸偏移量(offsets),對於每個K對象類,有 tk = (tkx,tky,tkw,tkh),索引是K。我們使用了文獻[9](本文作者的另一篇文章)中給出的 tk 的參數化,其中 tk 指定相對於目標推薦區域的尺度不變的平移和對數空間的高度、寬度的偏移。
每個訓練的RoI區域都標注有完全真實的類(ground-truth class) u 和完全真實的邊界框(ground-truth bounding-box)回歸目標 v 。我們對於每一個標注的 RoI 區域使用多任務損失函數 L 來聯合訓練分類和邊界框回歸:
L(p,u,tu,v)= Lcls(p,u)+ λ * [u >= 1] * Lloc(tu,v) (1)
這里, Lcls(p,u) = -logpu,表示對真實類的對數損失(也就是交叉熵損失)。
第二個任務損失 Lloc 是針對類 u 和 v = (vx,vy,vw,vh)的真實邊界框回歸目標的元組定義的,並且預測的元組 tu = (tux,tuy,tuw,tuh),還是針對u類別。當u>1時,中括號的指示器函數 [u >= 1]的計算結果為1,否則為0。對於背景 ROI 區域沒有完全真實的邊界框的概念(notion)。因此(hence)Lloc 被忽略(ignored)。對於邊界框回歸,我們使用如下的損失函數:
Lloc(tu,v)= ∑ i=(x,y,w,h) smoothL1(tui,vi) (2)
這里,
smoothL1(x) = {0.5 * x^2,if |x| < 1;|x| - 0.5,if |x| >=1} (3)
它是一種強大(robust)的L1損失,對於異常值的敏感度要低於R-CNN和SPPNet中使用的 L2 損失。當回歸目標無限制時,L2 損失訓練可能需要仔細的調整學習率以防止梯度爆炸。式子3消除了這種敏感性。
在方程1中的超參λ控制兩個任務損失之間的平衡。我們將真實的回歸目標 vi 標准化為零均值和單位方差。所有實驗都使用λ=1。
我們注意到文獻[6]使用相關的損失來訓練一個與類無關的區域建議網絡。與我們的方法不同,它提出了一種雙網絡的系統,它將定位與分類分開。OverFeat、R-CNN和SPPNet也訓練分類器和邊界框定位器,但是這些方法使用階段式訓練,我們將在5.1節展示它們對於Fast R-CNN來說是次優的。
小批量抽樣(Mini-batch sampling)
在微調(fine-tuning)期間,每個SGD的mini-batch是由N=2個圖像構成(constuct),隨機選擇單一形式(通常的做法是,我們實際上只對數據集的排列進行了調整)。我們使用的min-batches的尺寸是R=128,每1個圖像采樣了64個RoI區域。與文獻[9]中一樣,我們從目標推薦區域中選擇25%的推薦區域和真正邊界框交並比(IOU)大於0.5的區域。這些RoI區域包括用前景對象類標記的示例(類別指示函數),例如: [ u >= 1] 。剩余的RoI區域從和真實邊界框交並比在[0.1,0.5)的推薦區域中采樣,參考文獻[11]。這些是背景示例,並標記 u = 0 。0.1的下限閾值似乎充當了困難實例挖掘的啟發式算法[8]。在訓練期間,圖像以0.5 的概率進行水平翻轉,沒有使用其它的數據增強方法。
通過RoI池化層的反向傳播(Back-propagration through RoI pooling layers)
通過RoI池化層的反向傳播的導出路徑。為了清楚起見(for clarity),我們假設每個mini-batch僅僅有一張圖片,即N=1,但是擴展到N>1是顯而易見的( straightforward),因為對於所有的圖片的前向傳播過程都是獨立的。
令為進入RoI池化層的第 i 個激活輸入,並讓
為 r 層RoI的第 j 個輸出。RoI池化層計算
,其中
。
是子窗口中輸入單
最大池化層的輸入索引集。單個
可以分配給幾個不同的輸出
。
RoI池化層的方向函數通過遵循argmax開關計算損失函數相對於每個輸入變量的偏導數:
(4)
換言之,對於每個小批量RoI r 和每個合並輸出單元 ,如果 i 是通過最大合並為
選擇的argmax,則偏導數
就會累計。再反向傳播中,偏導數
已經由頂部的RoI池化層的反向函數計算。
SGD超參數(SGD hyper-parameters)
全連接層被用來做softmax分類和bounding-box回歸,它們的權重初始化分別( respectively)采用具有標准差為0.01和0.001的零均值高斯分布,偏差(biases)被初始化為0。對於所有的層來說,每一層權重的學習率為1,偏差的學習率為2,全局學習率為0.001。在訓練集VOC07或者VOC12上訓練時,我們運行SGD進行30K次的小批量迭代,然后將學習率降低到0.0001並進行另外10K次迭代訓練。當我們在更大的數據集上訓練時,我們運行SGD以進行更多的迭代,如稍后所述。使用0.9的動量和0.0005的參數衰減(關於權重和偏差)。
2.4 尺度不變性(Scale invariance)
我們探索了在物體檢測中兩種實現尺度不變的方法:(1)通過“強力”學習。(2)通過使用圖像金字塔。這些策略遵循了文獻[11](SPPNet)中的兩個方法。對於蠻力方法,在訓練和測試期間以預定義的像素大小處理每個圖像。網絡必須從訓練數據中學習尺度不變的物體檢測。
相反,多尺度方法通過圖像金字塔為網絡提供近似的尺度不變性。在測試時,圖像金字塔用於近似地縮放規范化每個建議區域。在多尺度訓練期間,我們在每次采樣圖像時隨機采樣金字塔尺度[11],作為數據增強的一種形式。由於GPU內存限制,我們僅針對較小的網絡進行多尺度訓練。
3. 快速的R-CNN檢測(Fast R-CNN detection)