Fast RCNN是對RCNN的性能優化版本,在VGG16上,Fast R-CNN訓練速度是RCNN的9倍, 測試速度是RCNN213倍;訓練速度是SPP-net的3倍,測試速度是SPP-net的3倍,而且達到了更高的準確率,本文爲您解讀Fast RCNN。性能優化
Fast rcnn直接從單張圖的feature map中提取RoI對應的feature map,用卷積神經網絡作分類,作bounding box regressor,不須要額外磁盤空間,避免重複計算,速度更快,準確率也更高。網絡
須要先預訓練卷積層,而後作region proposal, 而後用SVM對卷積層抽取的特徵作分類,最後訓練bounding-box迴歸器。性能
訓練時間和空間代價很大
訓練過程當中須要把CNN提取的特徵寫到磁盤,佔用百G級的磁盤空間,GPU訓練時間爲2.5GPU*天(用的是K40,壕,友乎?)學習
目標檢測很慢
Region proposal很慢,VGG16每張圖須要花47秒的時間測試
總結:RCNN就是慢!最主要的緣由在於不一樣的Region Proposal有着大量的重複區域,致使大量的feature map重複計算。優化
SPP-net中則提出只過一遍圖,從最後的feature map裁剪出須要的特徵,而後由Spatial pyramid pooling層將其轉爲固定尺寸特徵,因爲沒有重複計算feature map,訓練速度提高3倍,測試速度提高了10-100倍。3d
可是SPP-net也有缺點,SPP-net的fine-tune不能越過SPP層,由於pyramid BP開銷太大了,只能fine-tune全鏈接層,tune不到卷積層,因此在一些較深的網絡上準確率上不去。blog
其餘都是一目瞭然的,接下來主要講RoI pooling圖片
咱們能夠根據卷積運算的規則,推算出原圖的region對應feature map中的哪一部分。可是由於原圖region的大小不一,這些region對應的feature map尺寸是不固定的,RoI pooling就是爲了獲得固定大小的feature map。input
因爲多個RoI會有重複區域,因此max pooling時,feature map裏同一個值可能對應pooling output的多個值。因此BP算梯度的時候,從RoI pooling層output y到input x的梯度是這樣求的
其中
舉例:
也就是說,將Loss對輸出的梯度,傳回到max pooling對應的那個feature unit上,再往回傳
其實這是SPPnet的一個特例,是Spatial pooling,沒有pyramid,也所以計算量大大減小,可以實現FC到CNN的梯度反向傳播,而且,實驗發現其實feature pyramid對準確率提高不大。卻是原圖層面的Pyramid做用大些:
可是這種Pyramid方法計算代價比較大,因此Fast RCNN中只在小模型上有這樣作
定義真實的bounding box爲(vx, vy, vw, vh),預測的bounding box位置(由第二個fc層輸出,有K個類,每一個類分別有4個值,分別爲)txk,tyk,twk, thk
LIoc(tk, v) = ∑i∈{x,y,w,h} smoothL1(tik - vi)
即預測位置和真實位置四個值的差值求和,其中
smoothL1(x) = 0.5x2 if |x|<1 otherwise |x|-0.5
是一個軟化的L1(畫一下圖像能夠看出來,在(-1,1)的範圍內是拋物線,沒L1那麼尖銳),若是採用L2 loss,須要仔細調節學習率防止梯度爆炸。
整個模型的Loss就是:
L(p, k, tk, v) = Lcls(p, k) + λ|k ≥ 1| LIoc(tu, v)
這就比較厲害了,誰不喜歡end to end,以前RCNN是須要分開微調SVM分類層和bounding box regressor的
前面講了RoI pooling使得梯度反向傳播到卷積層成爲可能,可是這種BP訓練仍然很耗顯存和時間,尤爲是在輸入的ROI屬於不一樣圖片時,由於單張圖的feature map是不存到磁盤的,當一張圖的幾個RoI和其餘圖的幾個RoI混在一塊兒交替輸入時,須要反覆前向傳播計算feature map,再pooling,實際上也就反覆計算了feature map。
在Fast RCNN的訓練中,每次輸入兩張圖(這麼小的batch size),每張圖取64個ROI,單張圖的多個ROI在前向計算和後向傳播過程當中是共享feature map的的,這樣就加快了訓練速度。
然而,這犯了訓練中的一個忌諱,實際上,至關於訓練數據(ROI)沒有充分shuffle,但在Fast RCNN的實驗中效果還行,就先這樣搞了。
W ≈ U∑tVT
將u×v大小的矩陣W分解爲三個矩陣相乘,其中,U是一個u×t的矩陣,包含W的前t個左奇異向量,∑t是一個t×t的對角矩陣,包含W的前t個上奇異向量,VT是一個v×t的矩陣,包含W的錢t個右奇異向量,參數數量從uv變成t(u+v),當t遠小於min(u,v)時,參數數量就顯著少於W。
具體實現上,將一個權重爲W的全鏈接層拆成兩個,第一層的權重矩陣爲∑tVT(而且沒有bias),第二層的權重矩陣爲U(帶上W原來的bias)。
在Fast RCNN中,Truncated SVD減小了30%的訓練時間。
在VOC07上,end2end + bb regressor > stage-wise+ bb regressor > end2end
Image Pyramid是否必須?
實際上,使用Pyramid在Fast RCNN上只提高了1%左右,因此這個也沒被列爲正式的創新點
若是用SVM來分類會不會更好?
S M L是由淺到深的三個網絡,能夠看到,只用Softmax分類也能達到不錯的效果,在網絡比較深的狀況下,也有超越SVM的可能。
注意,在訓練更大的數據的時候,須要更多的iteration,更慢的learning rate decay。
圖中紅色線表示Average Recall,一般人們用Average Recall來評價Region Proposal的效果,然而,proposals越多,AR這個指標一直往上漲,但實際上的mAP並無上升,因此使用AR這個指標比較各類方法的時候要當心,控制proposal的數量這個變量不變。
圖中藍色線表示mAP(= AVG(AP for each object class)),能夠看到,