1.概述
- fast RCNN基于RCNN,對RCNN存在的問題進行了改進,同時借鑒了SPPnet的思想。
2.RCNN存在的問題
- RCNN的訓練過程是multi-stage。先預訓練,再finetune,還要訓練用于完成特征向量分類的若幹個SVM,也要單獨訓練邊框回歸
- 訓練時時間開銷和空間開銷都很大
- 目标檢測過程很慢(每張圖檔需要47秒)
3.SPPnet
- RCNN訓練效率低的原因是,對每張圖檔生成的每個proposal,都使用卷積神經網絡提取特征向量,在計算過程中,存在大量備援
- 相比于RCNN,SPPnet對每個輸入圖像,隻進行一次卷積計算,得到feature maps(最後一個卷積層的輸出)。對原輸入圖像應用selective search算法,得到若幹個proposal,每個proposal在得到的feature maps上都有個對應區域,将該對應區域送入後面的全連接配接層,最終得到該proposal的分類結果。這種過程實作了computation sharing,因而速度很快。
- SPPnet網絡中最重要的結構為空間金字塔池化(spatial pyramid pooling),通過這種結構,使得SPPnet對任意尺寸的輸入圖像,都能生成一個确定大小的一維向量。然而,這種結構的缺點是沒有利用feature map的空間資訊,因為它将feature map通過池化操作直接拉成了一個一維向量。
- SPPnet的訓練也是multi-stage的(①提取特征、fine tune網絡②訓練SVM③訓練邊界回歸器),也占用大量存儲空間。另外一個重要的缺點是,在訓練階段,SPPnet無法有效更新空間金字塔池化層之前的卷積層的參數,這意味着SPPnet的網絡不能太深
注1:對上述加黑處存在疑問,為什麼SPPnet在訓練時無法更新空間金字塔池化之前的卷積層的參數?
- proposal與feature maps上的對應關系可參見
http://keep.01ue.com/?pi=329213&_a=app&_c=index&_m=p
基于上述RCNN和SPPnet的優缺點,作者提出了fast RCNN網絡
4.fast RCNN
(1)貢獻
- 相比RCNN和SPPnet,更高的檢測準确率
- 通過使用multi-task loss,完成single-stage的訓練過程
- 相比SPPnet,訓練時可更新網絡的所有參數
- 占用存儲資源小
(2)網絡結構
- 網絡結構借鑒了SPPnet的思想,通過卷積神經網絡,得到輸入圖像對應的feature map,對proposal對應于feature map上的區域,應用RoI pooling layer,得到該proposal對應的feature map
- 将得到的feature map作為全連接配接層的輸入,經過兩層全連接配接層,得到對應的RoI feature vector,使用該vector同時訓練分類器和邊界回歸器
(3)RoI pooling layer
- 該層将proposal對應的feature map進行池化,生成特定尺寸的feature map
- 其池化方式非常簡單,對[CxWxH]尺寸的輸入feature map,在每一層上畫[AxB]個網格,在每個網格中取最大值,最終得到[CxAxB]的feature map
(4)網絡的預訓練
- 作者在三個不同規模的卷積神經網絡上進行實驗,這三個卷積神經網絡都經過ImageNet的預訓練
- 作者對這三個卷積神經網絡進行了如下的更改:①将第一層全連接配接層前的max pooling layer替換為RoI pooling layer,池化預先規定為适配于後面全連接配接層的尺寸(對VGG16,H=W=7)②去掉輸出層,新添加兩個分支,分别完成K+1的分類和邊界框的回歸③修改網絡輸入,可以輸入圖檔和對應的RoI清單(proposal清單)
(5)網絡的fine-tuning
- RCNN和SPPnet的fine tuning政策都是每個batch中的proposal(不論是positive proposal還是negative proposal)均來自不同的圖像,作者認為這種訓練政策效率非常低(個人了解:考慮線性回歸,當樣本資料已經近似服從線性變化時,參數的一點點改變都會讓loss立刻減小,若樣本資料分布雜亂時,參數的變化并不會讓loss立刻減小。對RCNN和SPPnet的訓練過程也是一樣,當每個batch的每個proposal都來自不同的image時,輸入資料非常雜亂,是以訓練時收斂很慢)
注2:作者在文章開始時說SPPnet在訓練時無法更新空間金字塔池化層之前的卷積神經網絡的參數,此處又說訓練SPPnet時參數更新效率很低。個人認為,作者想要表達的意思是:RCNN和SPPnet采用了相同fine tuning政策,這種政策帶來的影響是訓練效率極低,但是就這二者的訓練效率而言,SPPnet比RCNN低的多。
- 為了解決fine tuning時訓練效率非常低的問題,作者在fast RCNN中采取了下述訓練政策:每個batch中包含R個proposal,這R個proposal來自N個圖像(每個圖像産生R/N個proposal),來自同一圖像的proposal共享計算資源和存儲
注3:對上述加粗字型有疑問,要如何共享計算資源和存儲?作者又說,這種fine tuning的訓練政策,會導緻loss收斂變慢,但是實際中并未出現這樣的問題,令人費解……
- loss function如下: 其中,(1)式第一項為分類損失,第二項為邊框回歸損失;參數lamda表示權重,實驗時其值取為1,[u>=1]表示隻計算非背景的proposal
- 訓練時,每個batch包含分别從兩張圖檔中取得的128個proposal,這其中有25%的positive proposal(與ground truth的IoU大于0.5),剩下的75%為negative proposal(IoU大于0.1小于0.5),資料增強為proposal随機翻轉180度
- RoI layer的反向傳播 這裡,x_i代表池化前特征圖上的像素點;y_rj代表池化後的第r個候選區域的第j個點;i*(r,j)代表點yrj像素值的來源(最大池化的時候選出的最大像素值所在點的坐标)。由上式可以看出,隻有當池化後某一個點的像素值在池化過程中采用了目前點Xi的像素值(即滿足i=i*(r,j)),才在xi處回傳梯度。
注4:參考連接配接:https://www.jianshu.com/p/2a5ffca8b861
注5:至于上述公式裡為何對梯度進行累加操作,這是由網絡的訓練方式決定的,該網絡采用mini-batch訓練方式,每個batch訓練結束後才反向傳播并更新一次參數。反向傳播時,需要計算出池化前的特征圖上每個像素點處的梯度。若像素點x_i前向傳播時通過池化傳遞至y_rj,則反向傳播時将對應位置的梯度直接傳回。x_i可能傳遞至多個不同的y_rj,對其進行累加。對沒有傳遞至後面的像素點,其反向傳播時得到的梯度為零
神經網絡的不同訓練方式差別(batch,iteration,epoch)請參見:https://blog.csdn.net/qq_18668137/article/details/80883350
反向傳播算法講解(斯坦福大學cs231n課程):https://www.bilibili.com/video/av19161412?from=search&seid=6452011326295692786
5.實驗
- fast RCNN在不同資料集上與其他算法的對比
- fast RCNN與RCNN、SPPnet在訓練時間和測試時間上的對比
- fast RCNN在全連接配接層采用了奇異值分解,作者驗證了奇異值分解的有效性
- SPPnet作者認為,僅對SPPnet的全連接配接層進行fine tuning就已經可以取得很好的效果了,無需fine tuning卷積層,fast RCNN作者認為,對于較深的網絡,fine tuning卷積層依舊有效,并進行了驗證
- fast RCNN在訓練時采用了多任務學習的方式,作者驗證了該種學習方式的有效性
- 賦予網絡尺度不變性的方法有兩種,一種是将輸入圖像調整成相似的大小,一種是選用不同尺度的輸入圖像,作者分别對這兩種方法進行了實驗,結果表明,僅僅采用前者,就可以達到很好的效果
- 作者認可一個觀點:對于一個優秀的目标檢測器,随着樣本數量的增加,其性能也應該增加,作者針對這個問題,在fast RCNN上進行了相關實驗
- 常見分類器有SVM,softmax,作者對這兩個分類器分别進行了實驗,實驗顯示,softmax性能更好