SPPnet出來之后,RBG大神迅速回懟,拋出了更快更好的Fast-RCNN。新的思路是, 將之前的多階段訓練合並成了單階段訓練,面對靈活尺寸問題,大神借鑒了空間金字塔的思路,使用了一層的空間金字塔。
摘要
本文提出了一個快速的基於區域推薦的卷積網絡方法(Fast R-CNN)用於對象檢測。Fast R-CNN在前人工作的基礎上使用深度卷積網絡,可以更有效地分類物體推薦。相比之前的工作,Fast R-CNN進行了多項創新,在提高了檢測精度的同時,也提高了訓練和測試速度。Fast R-CNN訓練了一個超深VGG16網絡,訓練時間比R-CNN快9倍,測試時間快213倍,在PASCAL VOC2012上達到了更高的mAP。相比SPPnet,Fast R-CNN訓練快3倍,測試快10倍,並且更加准確。
介紹
近來,深度卷積網絡在圖像分類和物體檢測精度上進展顯著。相比物體分類,物體定位更具挑戰,需要更加復雜的方法。由於其復雜性,當前的方法都是多階段流水線模型訓練,緩慢而粗放。復雜度源於檢測需要物體的精准位置信息,帶來了兩個基本挑戰。【提出了檢測問題的兩個基本挑戰】
一、大量候選位置需要處理(“推薦”proposals)。
二、候選框的位置比較粗糙,必須進一步細化才能精准定位。對這些問題的解決包括速度、精度或簡易性。
本文將梳理現代卷積網絡物體檢測器的訓練流程[9][11]。提出一個單階段訓練算法,既能學習“對推薦框進行分類”,也能“精細空間位置”。
最終得到的方法可以訓練一個深度檢測網絡(VGG16[20]),比R-CNN快9倍,比SPPnet快3倍。運行時,該檢測網絡每0.3s處理一張圖片(不包括物體推薦的時間),而且在PASCAL VOC2012上的准確度達到新的高度,mAP66%(而R-CNN為62%)。
R-CNN和SPPnet
基於區域的深度卷積網絡RCNN[9]通過使用“深度卷積網絡“來分類,在物體proposal上達到了出色的物體檢測成績。但其缺點十分明顯:
- 需要多階段流水線訓練。 R-CNN需要先使用log損失在物體的proposal上調優卷積網絡,然后,還要讓SVMs去適應卷機網絡的特征。這些SVMs取代了通過調優學到的softmax分類器,成為物體檢測器。在第三階段,還要進行約束框回歸。
- 訓練費時費空間。 對於SVM和約束框回歸的訓練,特征是從每張圖片的每個物體proposal中抽取出來再寫到硬盤的。對於非常深的網絡,比如VGG16,對VOC07訓練驗證集這個過程需要消耗2.5GPU天。這些特征需要數百G的存儲空間。
- 物體檢測非常慢。 測試階段,每張測試圖像的每個物體proposal都要進行特征抽取。VGG16檢測每張圖像需要在GPU上耗費47s。
R-CNN如此之慢,就是因為在每個proposal上都是用卷積網絡,沒有共享計算。空間金字塔池化網絡(SPPnets)則通過共享計算加速了R-CNN。SPPnet方法對整張輸入圖像只計算一次卷積特征圖,然后對每個對象proposal,使用從共享特征圖中抽取出來的特征向量,進行分類。對於每一個推薦,通過最大池化推薦框內的部分特征圖,到一個固定尺寸(比如6×6)的輸出,來抽取特征。多個輸出尺寸被池化,然后再使用空間金字塔池化進行連接。SPPnet在測試階段加速了R-CNN大概10到100倍。訓練時間也縮減了3倍,因為特征的抽取快了很多。
SPPnet也有明顯的缺點。像R-CNN一樣,它也訓練一個多階段流水線涉及到特征抽取、使用log loss調優網絡,訓練SVMs,最后再進行約束框回歸。特征還要寫到硬盤。但不同於R-CNN的是,調優算法沒法更新空間金字塔池化層前面的卷積層。不出所料,這個限制(固定的卷積層)限制了非常深的網絡的精度。
貢獻
我們提出一個全新的訓練算法,可以解決R-CNN和SPPnet的這些缺點,還能提高速度和精度。因為其在訓練和測試階段都明顯地快,所以我們稱之為Fast R-CNN。Fast R-CNN方法有多個優點:
- 更高的檢測精度(mAP)
- 使用多任務loss進行單階段訓練
- 訓練可以更新所有層
- 不需要硬盤存儲特征緩存
Fast R-CNN架構和訓練
下圖展示了Fast R-CNN的架構。一個Fast R-CNN網絡將整張圖片和一組對象proposal作為輸入。網絡首先使用卷積網絡和最大池化處理整張圖像產生卷積特征圖。然后對每個對象proposal,一個RoI(Region of Interest)池化層從特征圖中抽取出一個固定尺寸的特征向量。每個特征向量傳遞給后續一系列的全連接層(fc),這些全連接層,最終分裂成兩個並行的輸出層,一個用於產生K+1(1代表背景)類的softmax概率,一個針對每個對象類別輸出四個實數值,每組實數值編碼了對應類別的約束框bbx的位置。
訓練細節
- 輸入是224×224的固定大小圖片;
- 經過5個卷積層+2個降采樣層(分別跟在第一和第二個卷積層后面);
- 進入ROIPooling層(其輸入是conv5層的輸出和region proposal,region proposal個數大約為2000個);
- 再經過兩個output都為4096維的全連接層;
- 分別經過output各為21和84維的全連接層(並列的,前者是分類輸出,后者是回歸輸出);
- 最后接上兩個損失層(分類是softmax,回歸是smoothL1);
【進一步提升速度和無法優化網絡的問題】大神提出了端到端訓練的Fast R-CNN網絡 。該網絡用ROI(Region Of Interest)池化,可以看作空間金字塔池化的簡化版本,即使用了一種池化尺度。此外,該網絡將候選框回歸任務也通過CNN實現,在卷積層后面的全連接層分為兩支,一支用於識別目標類別,一支用於預測回歸框所在位置及長寬。值得注意的是,為了實現端到端的訓練,Fast R-CNN放棄了SVM分類器,而是選擇微調后網絡自身的softmax分類器。這樣一來,特征提取,目標分類、候選框回歸三部分可以同時進行端到端(end-to-end)訓練。 (基於VGG16的Fast RCNN算法在訓練速度上比RCNN快了將近9倍,比SPPnet快大概3倍;測試速度比RCNN快了213倍,比SPPnet快了10倍。在VOC2012上的mAP在66%左右)
ROI Pooling
由於region proposal的尺度各不相同,而期望提取出來的特征向量維度相同,因此需要某種特殊的技術來做保證。ROIPooling的提出便是為了解決這一問題的。
Roi pooling層也是pooling層的一種,只是針對於ROI們的pooling操作而已
Roi pooling層的過程就是為了將proposal摳出來的過程,然后resize到統一的大小。
Roi pooling層的操作如下:
• 1、根據輸入的image,將Roi映射到feature map對應的位置;
• 2、將映射后的區域划分為相同大小的sections(H×W大小的網格sections數量和輸出的維度相同);
• 3、對每個section進行max pooling操作;即每一個網格對應一個輸出值)
• 4、將所有輸出值組合起來便形成固定大小的feature map
【經后面研究,ROIpooling對非常深的網絡很重要,也是增加了更深的可能性】
放上一張大佬的博客截圖解釋ROI來鎮樓
訓練樣本
【從預訓練網絡中初始化】
我們實驗了三個預訓練ImageNet[4]網絡,每個都有5個最大池化層,5-13個卷積層(見4.1節)。當用一個預訓練的網絡初始化一個Fast R-CNN網絡需要經歷三個轉換。
一、最后的最大池化層要替換成RoI池化層,配置的參數H和W要與網絡的第一個全連接層相適應(eg,對於VGG16來說,就是H=W=7)。
二、網絡的最后一個卷積層和softmax(1000路ImageNet分類)層要替換成兩個並行的層。一個是全連接層並輸出K+1路的softmax,一個是類別相關的約束框回歸器。
三、網絡修改為接受兩個數據輸入:一組圖像和一組這些圖像的RoI。
【訓練過程】
訓練過程中每個mini-batch包含2張圖像和128個region proposal(即ROI,64個ROI/張),其中大約25%的ROI和ground truth的IOU值大於0.5(即正樣本),且只通過隨機水平翻轉進行數據增強。
Fast R-CNN在訓練時通過共享訓練使效率更高,比如每個mini-batch的訓練樣本來自N=2張輸入圖片,為了獲取R=128個學習樣本,需要從每張圖片中采樣R/N=64個ROI.由於對於同一張圖片的不同ROI之間在前向傳播和反向傳播時是共享計算、共享內存的,因此相比於128個來自128個圖片的ROI,網絡有64倍的速度提升。
損失函數
我們知道Fast RCNN有兩個輸出,將多損失融合(分類損失和回歸損失融合),【分類采用log loss(即對真實分類的概率取負log,分類輸出K+1維),回歸的loss和R-CNN基本一樣。】
它是L1Loss,比較魯棒,沒有R-CNN和SPPnet中使用的L2 Loss對異常值那么敏感。當回歸目標不受控時,使用L2 Loss訓練需要更加細心的learning rate調整以避免梯度爆炸。等式3消除了這個敏感性。
等式中的超參數λ用於調整兩個loss的平衡。我們歸一化回歸目標v_i到期望0和單位方差。所有的實驗都是用λ = 1。
我們注意到[6]是用了一個相關的loss用於訓練未知類物體推薦網絡。不同於我們方法的是,[6]主張是用兩個網絡以分開定位和分類。Overfeat[19],R-CNN[9]和SPPnet[11]也分開訓練分類器和約束框定位器,但這些方法都得分階段進行訓練,對來Fast R-CNN不是最佳選擇(5.1節)。
多任務Loss:在此之前,不同的任務還是要訓練不同的網絡,從這里開始意識到卷積網絡的特征提取的特性,從而用不同的損失函數來訓練同一個網絡的不同分支
如何定義不同的任務也是很大的問題,不僅是分類、回歸不同,差別很大的分類也是。
訓練整體架構總結
一旦一個Fast R-CNN調優好,檢測就是運行一次前向傳播(假設物體推薦已經事先計算好了!)。網絡對輸入的圖像(或者一個圖像金字塔,編碼成一系列圖像)和R個對象推薦的列表進行打分。盡管我們一直分析更大的類別數量(≈ 45k),但測試階段R一般都是2000左右。使用圖像金字塔時,每個RoI都賦值給一個能讓RoI接近2242像素的尺度[11]。
對於每個測試RoI r,前向傳播輸出類的后驗概率分布p和一個預測的約束框相對r的偏移值(對於每個類別K都有一個偏移量預測)。我們針對每個類別k對r賦予一個檢測置信值,預估概率Pr(class=k|r)= p_k,然后使用對每個類別,分別應用R-CNN[9]中使用的非最大值抑制算法。
改進
• 對於整張圖像先提取了泛化特征,這樣減少了大量的計算量
• ROIPooling的提出,巧妙的解決了尺度放縮的問題
• 回歸一同放進網絡訓練,用softmax代替SVM分類器,更加簡單高效
不足
region proposal的提取仍然采用selective search,整個檢測流程時間大多消耗在這上面(生成region proposal大約2~3s,而特征提取+分類只需要0.32s),之后的Faster RCNN的改進之一便是此點。
多任務訓練有幫助嗎?
多任務訓練很方便,因為它避免了管理順序訓練的任務的管道。但它也有可能改善結果,因為任務通過共享表示(ConvNet)相互影響[2]。多任務訓練是否可以提高fast R-CNN中的物體檢測精度
尺度不變性:
在任何一種情況下,我們都將圖像的比例s定義為其最短邊的長度。所有單尺度實驗都使用s = 600像素;對於某些圖像,s可能小於600,因為我們將最長的圖像側限制為1000像素並保持圖像的縱橫比。選擇這些值使得VGG16在微調期間適合GPU內存。較小的模型不受內存限制,可以從較大的s值中受益;但是,為每個模型優化s不是我們主要關注的問題。
我們注意到PASCAL圖像平均為384×473像素,因此單尺度設置通常將圖像上采樣1.6倍。因此,RoI匯集層的平均有效步幅≈10個像素。
在多尺度設置中,我們使用[11]中指定的相同的五個尺度(s 2 f480; 576; 688; 864; 1200g)以便於與SPPnet進行比較。但是,我們將最長邊設為2000像素,以避免超過GPU內存。
我們需要更多的培訓數據嗎?
【此時觀點,越多的訓練數據越好】
當提供更多訓練數據時,良好的物體探測器應該得到改善。Zhu等人 [24]發現DPM [8]的 mAP僅在幾百到幾千個訓練樣例后到達飽和。在這里,我們使用VOC12 train-val set增加VOC07 train-val set,圖像數量增加3倍至16.5k,以評估Fast R-CNN。訓練集將VOC07測試的mAP從66.9%提高到70.0%(表1)。對此數據集進行培訓時,我們使用60k小批量迭代而不是40k。
我們對VOC10和2012進行了類似的實驗,為此我們從VOC07 train-val,test和VOC12 train-val的聯合構建了21.5k圖像的數據集。在對該數據集進行訓練時,我們使用100k SGD迭代並將學習率降低0:1×每40k次迭代(而不是每次30k)。對於VOC10和2012,mAP分別從66.1%提高到68.8%,從65.7%提高到68.4%。
SVM的表現優於softmax嗎
Fast R-CNN使用在微調期間學習的softmax分類器,而不是像在R-CNN和SPPnet中那樣訓練一對多線性SVM。為了理解這一選擇的影響,我們在Fast R-CNN中采用難負例挖掘實現了SVM訓練。我們使用R-CNN中相同的訓練算法和超參數。
表8顯示,對於所有三個網絡,softmax略微優於SVM,+ 0.1至+0.8 mAP點。這種影響很小,但它表明,與以前的多階段訓練方法相比,“一次性”微調就足夠了。我們注意到softmax與一對多SVM不同,在對RoI進行評分時引入了類之間的競爭。