先回歸一下: R-CNN
, SPP-net
R-CNN
和SPP-net
在訓練時pipeline
是隔離的:提取proposal
,CNN
提取特徵,SVM
分類,bbox regression
。
Fast R-CNN
兩大主要貢獻點 :
-
實現大部分
end-to-end
訓練(提proposal
階段除外): 所有的特徵都暫存在顯存中,就不需要額外的磁盤空間。joint training
(SVM
分類,bbox
迴歸聯合起來在CNN
階段訓練)把最後一層的Softmax
換成兩個,一個是對區域的分類Softmax
(包括背景),另一個是對bounding box
的微調。這個網絡有兩個輸入,一個是整張圖片,另一個是候選proposals
算法產生的可能proposals
的座標。(對於SVM
和Softmax
,論文在SVM
和Softmax
的對比實驗中說明,SVM
的優勢並不明顯,故直接用Softmax
將整個網絡整合訓練更好。對於聯合訓練: 同時利用了分類的監督信息和迴歸的監督信息,使得網絡訓練的更加魯棒,效果更好。這兩種信息是可以有效聯合的。) -
提出了一個
RoI
層,算是SPP
的變種,SPP
是pooling
成多個固定尺度,RoI
只pooling
到單個固定的尺度 (論文通過實驗得到的結論是多尺度學習能提高一點點mAP
,不過計算量成倍的增加,故單尺度訓練的效果更好。)
其它貢獻點:
- 指出
SPP-net
訓練時的不足之處,並提出新的訓練方式,就是把同張圖片的prososals
作爲一批進行學習,而proposals
的座標直接映射到conv5
層上,這樣相當於一個batch
一張圖片的所以訓練樣本只卷積了一次。文章提出他們通過這樣的訓練方式或許存在不收斂的情況,不過實驗發現,這種情況並沒有發生。這樣加快了訓練速度。 (實際訓練時,一個batch
訓練兩張圖片,每張圖片訓練64個RoIs(Region of Interest
))
注意點:
- 論文在迴歸問題上並沒有用很常見的2範數作爲迴歸,而是使用所謂的魯棒L1範數作爲損失函數。
- 論文將比較大的全鏈接層用
SVD
分解了一下使得檢測的時候更加迅速。雖然是別人的工作,但是引過來恰到好處(矩陣相關的知識是不是可以在檢測中發揮更大的作用呢?)。
ROI Pooling
與SPP
的目的相同:如何把不同尺寸的ROI
映射爲固定大小的特徵。ROI
就是特殊的SPP
,只不過它沒有考慮多個空間尺度,只用單個尺度(下圖只是大致示意圖)。
ROI Pooling
的具體實現可以看做是針對ROI
區域的普通整個圖像feature map
的Pooling
,只不過因爲不是固定尺寸的輸入,因此每次的pooling
網格大小得手動計算,比如某個ROI
區域座標爲,那麼輸入size
爲,如果pooling
的輸出size
爲 那麼每個網格的size
爲。
Bounding-box Regression
有了ROI Pooling
層其實就可以完成最簡單粗暴的深度對象檢測了,也就是先用selective search
等proposal
提取算法得到一批box
座標,然後輸入網絡對每個box
包含一個對象進行預測,此時,神經網絡依然僅僅是一個圖片分類的工具而已,只不過不是整圖分類,而是ROI
區域的分類,顯然大家不會就此滿足,那麼,能不能把輸入的box
座標也放到深度神經網絡裏然後進行一些優化呢?rbg
大神於是又說了"yes"。在Fast-RCNN
中,有兩個輸出層:第一個是針對每個ROI
區域的分類概率預測,第二個則是針對每個ROI
區域座標的偏移優化 是多類檢測的類別序號。這裏我們着重介紹第二部分,即座標偏移優化。
假設對於類別,在圖片中標註了一個groundtruth
座標:,而預測值爲
,二者理論上越接近越好,這裏定義損失函數:
這裏, 中的x即爲
即對應座標的差距。該函數在 (−1,1) 之間爲二次函數,而其他區域爲線性函數,作者表示這種形式可以增強模型對異常數據的魯棒性,整個函數在matplotlib
中畫出來是這樣的
對應的代碼在smooth_L1_loss_layer.cu
中。