系列博客鏈接:
(一)目標檢測概述 https://www.cnblogs.com/kongweisi/p/10894415.html
(二)目標檢測算法之R-CNN https://www.cnblogs.com/kongweisi/p/10895055.html
(三)目標檢測算法之SPPNet https://www.cnblogs.com/kongweisi/p/10899771.html
本文概述:
1、Fast R-CNN
1.1 RoI pooling
1.2 End-to-End model
2、多任務損失-Multi-task loss
3、R-CNN、SPPNet、Fast R-CNN效果對比
4、Fast R-CNN總結
引言:
SPPNet的性能已經得到很大的改善,但是由於網絡之間不統一訓練,造成很大的麻煩,所以接下來的Fast R-CNN就是為了解決這樣的問題。
1、Fast R-CNN
改進的地方:
- 提出一個RoI pooling(region of interest即候選區),然后整合整個模型,把CNN、SPP變換層、分類器、bbox回歸幾個模塊一起訓練。
步驟
- 首先將整個圖片輸入到一個基礎卷積網絡,得到整張圖的feature map
- 將region proposal(RoI)映射到feature map中
- RoI pooling layer提取一個固定長度的特征向量,每個特征會輸入到一系列全連接層,得到一個RoI特征向量(此步驟是對每一個候選區域都會進行同樣的操作)
- 其中一個是傳統softmax層進行分類,輸出類別有K個類別加上”背景”類(最終得到是N+1類)
- 另一個是bounding box regressor(邊框回歸)
1.1 RoI pooling
首先RoI pooling只是一個簡單版本的SPP層,目的是為了減少計算時間並且得出固定長度的向量。
- RoI池層使用最大池化將任何有效的RoI區域內的特征轉換成具有H×W的固定空間范圍的小feature map,其中H和W是超參數 它們獨立於任何特定的RoI。
例如:VGG16 的第一個 FC 層的輸入是 7 x 7 x 512,其中 512 表示 feature map 的層數。在經過 pooling 操作后,其特征輸出維度滿足 H x W。
假設輸出的結果與FC層要求大小不一致,對原本 max pooling 的單位網格進行調整,使得 pooling 的每個網格大小動態調整為 h/H,w/W,
最終得到的特征維度都是 HxWxD。
它要求 Pooling 后的特征為 7 x 7 x512(即要求輸入到 FC 層的特征維度是7 x 7),如果碰巧 ROI 區域只有 6 x 6 大小怎么辦?每個網格的大小取 6/7=0.85 , 6/7=0.85,以長寬為例,
按照這樣的間隔取網格:[0, 0.85, 1.7, 2.55, 3.4, 4.25, 5.1, 5.95],取整后,每個網格對應的起始坐標為:[0, 1, 2, 3, 4, 5, 6]
下面是一整套RoI pooling流程圖:
- 首先經過卷積層得到的特征圖:
- 得到候選區:
因為每個候選區大小不固定,需要提取一個固定長度的特征向量:
- 這里是用4 x 4的RoI池層(相當於之前說的SPP層的一部分):
- 最后進行池化:
為什么要設計單個尺度呢?這要涉及到single scale與multi scale兩者的優缺點
- single scale,直接將image定為某種scale,直接輸入網絡來訓練即可。(Fast R-CNN)
- multi scale,也就是要生成一個金字塔,然后對於object,在金字塔上找到一個大小比較接近227x227的投影版本
后者比前者更加准確些,不過沒有突出很多。但是第一種時間要省很多,所以實際采用的是第一個策略,因此Fast R-CNN要比SPPNet快很多也是因為這里的原因。
1.2 End-to-End model ( 端對端模型 )
從輸入端到輸出端直接用一個神經網絡相連,整體優化目標函數。
接着我們來看為什么后面的整個網絡能進行統一訓練?
特征提取CNN的訓練和SVM分類器的訓練在時間上是先后順序,兩者的訓練方式獨立,因此SVMs的訓練Loss無法更新SPP-Layer之前的卷積層參數,去掉了SVM分類這一過程,所有特征都存儲在內存中,不占用硬盤空間,形成了End-to-End模型(生成Region proposal除外,end-to-end在Faster-RCNN中得以完善)
- 使用了softmax分類
- RoI pooling能進行反向傳播,SPP層不適合(這里的原因本人也不是很清楚,可以百度感受野相關的知識進一步了解)
2、 多任務損失-Multi-task loss
兩個loss,分別是:
- 對於分類loss,是一個N+1維的softmax輸出,其中的N是類別個數,1是背景,使用交叉熵損失
之所以要N+1類,是因為region proposal 會被標記為0,什么都沒有,會什么類別都不是,因此最后一層神經元要 N+1 個。
- 對於回歸loss,是一個4xN維輸出的regressor,也就是說對於每個類別都會訓練一個單獨的regressor,使用平均絕對誤差(MAE)損失即L1損失
這里訓練的就是邊框對應的4個坐標,左上角一對坐標,右下角一對坐標
3、R-CNN、SPPNet、Fast R-CNN效果對比
參數 | R-CNN | SPPNet | Fast R-CNN |
---|---|---|---|
訓練時間(h) | 84 | 25 | 9.5 |
測試時間/圖片 | 47.0s | 2.3s | 0.32s |
mAP | 66.0 | 63.1 | 66.9 |
其中有一項指標為mAP,這是一個對算法評估准確率的指標,mAP衡量的是學出的模型在所有類別上的好壞。
4、Fast R-CNN總結
缺點:
- 使用Selective Search提取Region Proposals,沒有實現真正意義上的端對端,操作也十分耗時(下一節Faster R-CNN會改善)