Fast R-CNN 學習筆記

Lung-Ying Ling
12 min readJun 17, 2021

--

1. 大綱

Fast R-CNN的想法很簡單,在R-CNN中,2000多個區域都要個別去運算 CNN,這些區域很多都是重疊的,也就是說這些重疊區域的CNN很多都是重複算的。所以Fast R-CNN的原則就是全部只算一次CNN就好,CNN擷取出來的特徵可以讓這2000多個區域共用!

2. 架構圖

Fast R-CNN的網絡結構如下圖所示

1. 任意size圖片輸入CNN網絡,經過若干卷積層與池化層,得到特徵圖

2. 在任意size圖片上採用selective search算法提取約2k個建議框

3. 根據原圖中建議框到特徵圖映射關係,在特徵圖中找到每個建議框對應的特徵框【深度和特徵圖一致】,並在RoI池化層中將每個特徵框池化到H×W【VGG-16網絡是7×7】的size

4. 固定H×W【VGG-16網絡是7×7】大小的特徵框經過全連接層得到固定大小的特徵向量

5. 第4步所得特徵向量經由各自的全連接層【由SVD分解實現】,分別得到兩個輸出向量:一個是softmax的分類得分,一個是Bounding-box窗口回歸

6. 利用窗口得分分別對每一類物體進行非極大值抑制剔除重疊建議框,最終得到每個類別中回歸修正後的得分最高的窗口

Training結構

Testing結構

3. The RoI pooling layer

ROI Pooling的作用是對不同大小的region proposal,從最後卷積層輸出的feature map提取大小固定的feature map。因為全連接層的輸入需要尺寸大小一樣,所以不能直接將不同大小的region proposal映射到feature map作為輸出,需要做尺寸變換。在文章中,VGG16網絡使用H=W=7的參數,即將一個h*w的region proposal分割成H*W大小的網格,然後將這個region proposal映射到最後一個卷積層輸出的feature map,最後計算每個網格裡的最大值作為該網格的輸出,所以不管ROI pooling之前的feature map大小是多少,ROI pooling後得到的feature map大小都是H*W。

對於RoI max pooling層,設Xi為輸入層的節點, Yrj為第r個候選區域的第j個輸出節點,一個輸入節點可能和多個輸出節點相關連,如下圖所示,輸入節點7和兩個候選區域輸出節點相關連。

該輸入節點7的反向傳播如下圖所示

對於不同候選區域節點7都存在梯度,所以反向傳播中損失函數L對輸入層節點 的梯度為損失函數L對各個有可能的候選區域r【Xi被候選區域r的第j個輸出節點選為最大值】輸出Yrj梯度的累加,具體如下公式所示

判決函數[i = i * (r,j)]表示i節點是否被候選區域r的第j個輸出節點選為最大值輸出,若是,則由鍊式規則可知損失函數L相對Yrj的梯度等於損失函數L相對 的梯度×(Yrj對Xi的梯度->恆等於1),上圖已然解釋該輸入節點可能會和不同的Yrj有關係,故損失函數L相對Xi的梯度為求和形式。

4. Initializing from pre-trained networks

作者預訓練了3個網絡CaffeNet,VGG_CNN_M_1024,VGG-16,以用來初始化fast R-CNN 網絡參數。當初始化的時候需要經歷3個過程:

1. 使用ROI pooling layer 代替最後一個maxpooling層。

2. 網絡最後的全連接和softmax需要使用FC + softmax over categories 和FC + categor-specific bounding-box regressors這兩個相鄰的層來代替。

3. 網絡輸入修改為:以組圖片以及這些圖片上得到的RoIs(Region of Interests)。

5. Fine-tuning for detection

R-CNN和SPPnet中採用RoI-centric sampling:從所有圖片的所有候選區域中均勻取樣,這樣每個SGD的mini-batch中包含了不同圖像的樣本,不同圖像之間不能共享卷積計算和內存,運算開銷大; Fast R-CNN中採用image-centric sampling:mini-batch採用層次採樣,即先對圖像採樣【N個】,再在採樣到的圖像中對候選區域採樣【每個圖像中採樣R/N個,一個mini-batch共計R個候選區域樣本】,同一圖像的候選區域卷積共享計算和內存,降低了運算開銷; image-centric sampling方式採樣的候選區域來自於同一圖像,相互之間存在相關性,可能會減慢訓練收斂的速度,但是作者在實際實驗中並沒有出現這樣的擔憂,反而使用N=2,R=128的RoI-centric sampling方式比R-CNN收斂更快。這裡解釋一下為什麼SPPnet不能更新spatial pyramid pooling層前面的捲積層,而只能更新後面的全連接層?有網友解釋說卷積特徵是線下計算的,從而無法在微調階段反向傳播誤差;另一種解釋是,反向傳播需要計算每一個RoI感受野的捲積層梯度,通常所有RoI會覆蓋整個圖像,如果用RoI-centric sampling方式會由於計算too much整幅圖像梯度而變得又慢又耗內存。

6. SVD分解實現Fast R-CNN網路中最後的全連接層

圖像分類任務中,用於卷積層計算的時間比用於全連接層計算的時間多,而在目標檢測任務中,selective search算法提取的建議框比較多【約2k】,幾乎有一半的前向計算時間被花費於全連接層,就Fast R-CNN而言,RoI池化層後的全連接層需要進行約2k次【每個建議框都要計算】,因此在Fast R-CNN中可以採用SVD分解加速全連接層計算。

  1. 物體分類和窗口回歸都是通過全連接層實現的,假設全連接層輸入數據為x,輸出數據為y,全連接層參數為W,尺寸為u×v,那麼該層全連接計算為:
計算複雜度為u*v

2. 若將W進行SVD分解,並用前t個特徵值近似代替,即:

那麼原來的前向傳播分解成兩步:

計算複雜度為u x T + v xT,若t<min(u,v) ,則這種分解會大大減少計算量; 在實現時,相當於把一個全連接層拆分為兩個全連接層,第一個全連接層不含偏置,第二個全連接層含偏置;實驗表明,SVD分解全連接層能使mAP只下降0.3%的情況下提升30%的速度,同時該方法也不必再執行額外的微調操作。

7. Multi-task loss

cls_score層:用於分類,輸出K+1維數組p,表示屬於K類和背景的概率。 bbox_prdict層:用於調整候選區域位置,輸出4*K維數組t,表示分別屬於K類時,應該平移縮放的參數。

Loss Function

loss_cls層評估分類代價。由真實分類u對應的概率決定:

loss_bbox評估檢測框定位代價。比較真實分類對應的預測參數tu和真實平移縮放參數為v的差別:

g為Smooth L1誤差,對outlier不敏感:

總代價為兩者加權和,如果分類為背景則不考慮定位代價:

8. Mini-batch sampling

ILSVRC 20XX樣本只有類別標籤,有1000種物體; 文中採用AlexNet【S for small】、VGG_CNN_M_1024【M for medium】、VGG-16【L for large】這三種網絡分別進行訓練測試,下面僅以VGG-16舉例。

PASCAL VOC數據集中既有物體類別標籤,也有物體位置標籤,有20種物體; 正樣本僅表示前景,負樣本僅表示背景; 回歸操作僅針對正樣本進行; 該階段訓練集擴充方式:50%概率水平翻轉; 微調前,需要對有監督預訓練後的模型進行3步轉化:

1. RoI池化層取代有監督預訓練後的VGG-16網絡最後一層池化層

2. 兩個並行層取代上述VGG -16網絡的最後一層全連接層和softmax層,並行層之一是新全連接層1+原softmax層1000個分類輸出修改為21個分類輸出【20種類+背景】,並行層之二是新全連接層2+候選區域窗口回歸層,如下圖所示

3. 上述網絡由原來單輸入:一系列圖像修改為雙輸入:一系列圖像和這些圖像中的一系列候選區域

9. SGD hyper-parameter

用於分類的全連接層以均值為0、標準差為0.01的高斯分佈初始化

用於回歸的全連接層以均值為0、標準差為0.001的高斯分佈初始化,偏置都初始化為0

針對PASCAL VOC 2007和2012訓練集,前30k次迭代全局學習率為0.001,每層權重學習率為1倍,偏置學習率為2倍,後10k次迭代全局學習率更新為0.0001; 動量設置為0.9,權重衰減設置為0.0005。

10. Scale invariance

文中提及兩種方式處理:brute-force(單一尺度)和image pyramids(多尺度)。單一尺度直接在訓練和測試階段將image定死為某種scale,直接輸入網絡訓練就好,然後期望網絡自己能夠學習到scale-invariance的表達;多尺度在訓練階段隨機從圖像金字塔【縮放圖片的scale得到,相當於擴充數據集】中採樣訓練,測試階段將圖像縮放為金字塔中最為相似的尺寸進行測試; 可以看出,多尺度應該比單一尺度效果好。作者在5.2節對單一尺度和多尺度分別進行了實驗,不管哪種方式下都定義圖像短邊像素為s,單一尺度下s=600【維持長寬比進行縮放】,長邊限制為1000像素;多尺度s={480,576,688,864,1200}【維持長寬比進行縮放】,長邊限制為2000像素,生成圖像金字塔進行訓練測試;實驗結果表明AlexNet【S for small】、VGG_CNN_M_1024【M for medium】下單一尺度比多尺度mAP差1.2%~1.5%,但測試時間上卻快不少,VGG-16【L for large】下僅單一尺度就達到了66.9%的mAP【由於GPU顯存限制多尺度無法實現】,該實驗證明了深度神經網絡善於直接學習尺度不變形,對目標的scale不敏感。

11. 總結創新點

1. 規避R-CNN中冗餘的特徵提取操作,只對整張圖像全區域進行一次特徵提取;

2. 用RoI pooling層取代最後一層max pooling層,同時引入建議框信息,提取相應建議框特徵;

3. Fast R-CNN網絡末尾採用並行的不同的全連接層,可同時輸出分類結果和窗口回歸結果,實現了end-to-end的多任務訓練【建議框提取除外】,也不需要額外的特徵存儲空間【R-CNN中這部分特徵是供SVM和Bounding-box regression進行訓練的 】;

4. 採用SVD對Fast R-CNN網絡末尾並行的全連接層進行分解,減少計算複雜度,加快檢測速度。

1. Reference

1. Fast R-CNN論文詳解https://blog.csdn.net/WoPawn/article/details/52463853

2. fast-rcnn 詳解

https://blog.csdn.net/yzf0011/article/details/76758337

3. 【目標檢測】Fast RCNN算法詳解

https://blog.csdn.net/shenxiaolu1984/article/details/51036677

4. [深度學習]RCNNs系列(3)Fast RCNN介绍

https://blog.csdn.net/lhanchao/article/details/73870716

5. Fast RCNN算法詳解

https://blog.csdn.net/u014380165/article/details/72851319

6. Fast R-CNN

https://zhuanlan.zhihu.com/p/24780395

--

--