Fast R-CNN 簡單梳理
作者:xg123321123
出處:http://blog.csdn.net/xg123321123/article/details/53067518
聲明:版權所有,轉載請聯繫作者並註明出處
Fast R-CNN是R-CNN的改進版。
1 亮點
Fast R-CNN將整張整張圖片歸一化之後直接送入深度網絡,鄰接時才加入候選框信息,只有末尾的少數幾層才處理每個候選框;相比之下,R-CNN框架中,一張圖像內候選框之間大量重疊,需要重複地提取特徵,耗時間。
Fast R-CNN把類別判斷和位置精修統一到一個深度網絡中,不需要額外存儲;相比之下,RCNN中獨立的分類器和迴歸器需要大量特徵作爲訓練樣本,耗空間。
2 大致流程
- Selective Search在一張圖片中得到約2k個候選框(這裏稱爲RoI);
- 使用卷積網絡提取圖片特徵;
- 在conv5出來的feature map上,根據之前RoI框crop出對應的patch(也就是所謂的映射回了原圖),再用Rol pooling layer(好像也就是一個單層的SPP layer)來統一到一樣的尺度;
- 繼續經過兩個全連接層得到特徵,然後分別經過一個新的全連接層,最後連接上各自的損失函數:
- 一個是分類,使用softmax函數;
- 一個是迴歸,使用smooth的L1-loss範式。
3 RoI Pooling操作
做圖片分類時,一般都是先將圖片crop和resize到固定尺寸,然後輸入網絡,提取特徵,最後進行分類。
對於檢測來說,這個方法不太適合,因爲原始圖像如果縮小到224這種分辨率,那麼感興趣對象可能都會變的太小無法辨認。
而Fast R-CNN的數據輸入並不對圖片大小進行限制,實現這一點的關鍵所在,就是ROI Pooling層,它可以在任意大小的圖片feature map上針對輸入的每一個ROI區域提取出固定維度的特徵表示,保證後續對每個區域的後續分類能夠正常進行。
作用
- 將原圖中的RoI定位到feature map中對應的patch;
- 將這個feature map中的patch下采樣爲大小固定的feature,方便傳入後面的全連接層。
RoI Pooling層的測試(forward)
RoI Pooling層將每個候選區域均勻分成M×N塊,對每塊進行max pooling,這樣一來將feature map上大小不一的候選區域轉變爲了大小統一的特徵向量,然後送入下一層。
儘管ROI Pooling可以看做是針對ROI區域的feature map的Pooling操作,但因爲不是固定尺寸的輸入,因此每次的pooling網格大小得手動計算。
舉例來說,某個ROI區域座標爲 (x1,y1,x2,y2) ,那麼輸入size爲 (y2−y1)∗(x2−x1) ;如果pooling後輸出的size爲
RoI Pooling層的訓練(backward)
考慮普通max pooling層:設
其中判決函數
不被選中有兩種可能:
對於RoI max Pooling,一個輸入節點可能和多個輸出節點相連。
設
判決函數
也就是說,代價對於
另外,實際實現時採用的是Max Pooling,具體每個網格中哪個點的值最大,在Forward過程中就已經記錄,存儲在了argmax_data變量裏。
4 Regression操作
ROI Pooling層的橫空出世,已經可以完成比較簡陋的檢測了。
先用Selective Search等proposal提取算法得到一批候選框座標,然後輸入網絡對每個候選框包含的對象進行預測。
以上,神經網絡仍然僅僅是圖片分類的工具,只不過不是整圖分類,而是ROI區域的分類。
如果能讓神經網絡完成迴歸的操作,那樣不僅顯得優雅,同時可能也會提升效果。
所以經過大神們的努力,有了迴歸層:輸出爲4*K維數組
假設對於類別
而預測值爲
這二者理論上越接近越好,這裏定義損失函數:
其中
這裏
該函數在 (−1,1) 之間爲二次函數,而其他區域爲線性函數,據說這種形式可以增強模型對異常數據的魯棒性,函數曲線如下。
注意
這裏的迴歸操作和R-CNN裏一樣,也是隻對特定的候選框(即和Ground Truth的IoU大於特定thresh)進行。
5 classification操作
不再像R-CNN需要通過SVM等分類器來分類,Fast R-CNN使用神經網絡來進行分類操作:輸出K+1維數組
分類代價由真實分類
本篇博客主要參考自
《Fast RCNN算法詳解 》
《RCNN,Fast-RCNN,Faster-RCNN》
《RCNN, Fast-RCNN, Faster-RCNN的一些事》