目標檢測(三) Fast R-CNN


引言

之前學習了 R-CNN 和 SPPNet,這里做一下回顧和補充。

問題

R-CNN 需要對輸入進行resize變換,在對大量 ROI 進行特征提取時,需要進行卷積計算,而且由於 ROI 存在重復區域,所以特征提取存在大量的重復計算;

SPPNet 針對 R-CNN 進行了改進,其利用空間金字塔池化來解決形變問題,並且只計算一次卷積得到特征圖,ROI 的特征從該特征圖的對應區域提取;

但是兩者采用相同的計算框架,非常繁瑣,特別是需要訓練SVM分類器,擬合檢測框回歸,這兩步不僅需要分步進行,使得模型變得復雜,而且需要緩存大量的訓練樣本,占用巨大的存儲空間。

補充

ROI:region proposal,給定一張image找出objects可能存在的所有位置。輸出大量objects可能位置的 bounding box,這些bbox稱之為 region proposal 或者 regions of interest (ROI)。

mAP:mean Average Precision, 即各類別AP的平均值,AP表示PR曲線下面積

 

fast r-cnn 借鑒了 SPPNet 的思路,對 R-CNN 算法做了進一步的優化。

本文不僅闡述了 fast r-cnn 的原理,也對這三種算法進行比較分析。

 

Fast R-CNN詳解

同樣訓練和測試分開講解。

訓練過程

1. 有監督預訓練

基本同R-CNN

樣本 來源
正樣本 ILSVRC 20XX
負樣本 ILSVRC 20XX

 

 

 

 

作者實驗了3個網絡:

第一個是 CaffeNet,實質上是 AlexNet,稱之為S,即小模型;

第二個是 VGG_CNN_M_1024,其深度和AlexNet一樣,但是更寬,稱之為M,即中等模型;

第三個是 VGG16,稱之為L,即大模型。

 

2. 特定樣本下的微調

樣本 比例 來源
正樣本 25% 與某類Ground Truth相交IoU∈[0.5,1]的候選框
負樣本 75% 與20類Ground Truth相交IoU中最大值∈[0.1,0.5)的候選框

 

 

 

 

在實際訓練中,每個mini-batch包含2張圖片和128個ROI,從正樣本中挑選約25%,然后采用隨機水平翻轉進行數據增強;

從負樣本中挑選約75%  【正負樣本定義見上表】

 

與R-CNN的區別

a. 使用了數據增強:50%概率水平翻轉

b. R-CNN 使用與第一步相同的網絡;Fast R-CNN 需要對第一步的網絡做如下修改:

以VGG16為例

1. 將最后的 maxpooling 替換成 ROI池化層,目的是接受不同尺寸的輸入;

2. 將最后一個全連接層和softmax層替換成兩個並行層,第一個並行層是全連接層和softmax層,softmax有1000變為21,第二個並行層是全連接層和候選區域邊框回歸層;

3. 輸入由 一系列圖像 變成 一系列圖像和這些圖像的候選區域

圖示如下

 

================ 擴展 ================

ROI Pooling

由於ROI的尺寸不一,無法直接輸入全連接層,ROI pooling 就是把ROI的特征池化成一個固定大小的feature map。

具體操作為:假設ROI需要池化成 H x W 的feature map,H W 是個超參數,根據選用網絡確定,假設ROI特征圖尺寸為 h x w,那么池化野的大小約為 h/H x w/W,即把RIO特征圖分成 H x W 份,然后對每一份進行maxpooling。

ROI 特征圖有四個參數(r,c,h,w),r、c代表左上角坐標,h、w代表高和寬。

 

vs SPPNet

ROI的作用類似於SPPNet的SPP層

 SPPNet進行多尺度學習,其mAP會高一點,不過計算量成倍增加,主要是全連接參數增多;

單尺度訓練的效果更好。

 

哪些參數需要微調

SPPNet 論文中采用 ZFnet【AlexNet的改進版】這樣的小網絡,微調階段僅對全連接層進行了微調,就足以保證較高的精度;

在 Fast R-CNN 中,作者試驗了VGG16這樣的大網絡,若僅做全連接的微調,其mAP會從66.9%下降到61.4%,所以作者也對ROI池化層之前的卷積層進行了微調:

所有的卷積層都需要微調嗎?作者進行了實驗

對於VGG16,僅需要對conv3_1及以后的卷積進行微調,才使得 mAP、訓練速度、訓練時GPU占用顯存三者得以權衡;

對於AlexNet、VGG_CNN_M_1024,需要從conv2往后微調。

 

為什么SPPNet 只能更新SPP之后的全連接層,而無法更新前面的卷積層

注意上面講到SPPNet僅僅更新了全連接層,需要注意的是它只能更新全連接層,無法更新卷積層,為什么呢?

兩種解釋:

1. SPPNet 的微調階段卷積計算是離線的,網絡訓練就像普通的神經網絡一樣,只是接受了計算好的特征,反向傳播而已

2. SPP層求導幾乎無法實現,參照下面的 ROI pooling 求導

 

SGD訓練方式的優化

在R-CNN和SPPNet中采用 RoI-centric sampling,網絡輸入整張圖像,然后從每張圖像中獲取一個ROI,這樣在SGD的mini-batch中包含了不同圖像的ROI,不同圖像之間來回切換,無法共享卷積計算和內存,運算開銷很大;

Fast R-CNN采用 image-centric sampling,mini-batch采用層次采樣,首先選取N張圖片,然后在每張圖片選取R/N個ROIS,來自同一張圖片的ROI在前向計算和反向傳播中共享計算和內存,大大提高了效率。

據作者實驗,當N=2,R=128時,這種方法能快64倍。

 

這種策略可能會減緩訓練的收斂,因為同一張圖像的ROI可能存在相關性,但實踐中這種擔憂並未發生。

 

SGD超參數

除了修改增加的層,原有的層參數已經通過預訓練方式初始化;

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

針對PASCAL VOC 2007和2012訓練集,前30k次迭代全局 learning rate為0.001,每層權重學習率為1倍,偏置學習率為2倍,后10k次迭代全局學習率更新為0.0001;

動量momentum設置為0.9,權重衰減weight_decay設置為0.0005。

 

多任務損失

一個網絡包含兩個並行的全連接  

兩個輸出層

cls_score:圖像識別層,輸出為 每個ROI 在每個類別上的概率,長度為 k+1 的向量,p=(p0,,pk)

bbox_predict:邊框回歸層,用來調整候選區域的標記位置,輸出為 tu=(tx,ty,tw,th),x、y表示相對於object proposal 的平移,w、h表示log空間中相對於object proposal 的寬高。

k個類別,每個類別都有這樣一個輸出,故輸出shape為 kx4。

 

假設u為ROI的真實類別,v為ROI的真實標記 ground truth,則

loss_cls 層評估分類代價,損失函數用 log 損失,即 Lcls(p,u)=-log(pu)  【R-CNN和SPPNet也采用這個損失函數】

loss_bbox 層評價回歸損失代價,比較真實類別u對應的預測bbox標記  tu=(tx,ty,tw,th) 與 ground truth v=(vx,vy,vw,vh)之間的差距

smoothL1曲線如圖所示,相對於L2,其對異常值不敏感,可控制梯度的量級使得訓練時不易跑飛,梯度爆炸

 

總的損失為

當u>1時為1

當u=0時為0,上式為 Lcls(p,u),表示只有分類誤差,u=0是表示ROI為背景,此時只需識別為背景,無需進行bbox

λ控制分類損失和回歸損失的權重,作者所用 λ=1

 

ROI pooling 的反向傳播

先看看普通 max pooling 如何求導

設xi為輸入層節點,yj為輸出層節點,損失函數為L,則L對xi的梯度為

判定函數 δ(i,j) 表示輸入節點i是否被輸出節點j選為最大值輸出。

若被選中,則δ(i,j)=ture,其導數為

若沒選中,則δ(i,j)=false,有兩種可能,一是池化野沒有掃描到該節點,二是掃描到了但非最大值,彼此沒關系,導數為0

 

圖示如下

 

ROI pooling 求導

與maxpooling不同的是,ROI有重合區域,設xi為輸入層節點,yrj為輸出層節點,表示第r個候選區域的第j個輸出節點,一個輸入層節點對應多個輸出層節點。

如圖,輸入節點7為重合部分,對應兩個候選區域

 

此時節點7的梯度為分別求梯度,相加

 

公式為

 

 

判定函數 [i=i*(r,j)] 表示 輸入層節點i是否被第r個候選區域第j個輸出層節點選為最大值輸出。

 

測試過程

1. 輸入任意size的圖片,卷積池化,得到特征圖

2. 在圖片上采用 Selective Search 得到2000個建議框

3. 根據建議框在圖片中的位置找到對應的特征圖中的特征框,並將該特征框 通過 ROI pooling 得到固定大小的特征

4. 將第3步中的特征經過第一個全連接,得到新特征

5. 將第4步中的特征經由各自的全連接層,由SVD實現,得到兩個輸出:softmax分類得分,bbox邊框回歸

6. 利用邊框得分分別對每一類物體進行非極大值抑制剔除重復建議框,最終得到每個類別中得分最高的邊框

 

================ 擴展 ================

為什么要用SVD

圖像分類任務中,卷積的時間要大於全連接的時間,而Fast RCNN 中,卷積的時間小於全連接,因為只卷積一次,全連接2000次。

假設全連接的輸入為x,權重矩陣為W,尺寸為u x v,那全連接就是 y=Wx,

若將W進行SVD分解,取前t個特征值,即

實驗表明,SVD使得mAP下降0.3%,速度卻提升30%

 

 

 

 總結

 一幅圖概況Fast RCNN

 

 

之前講到的RCNN、SPPNet、Fast RCNN 都是目標檢測算法的過去時,都或多或少有問題,基本已經沒人用了,所以不必過分探究所有細節,接下來要講的方法是目標檢測比較主流的方法,如 Faster RCNN, yolo等

 

 

 

參考資料:

https://blog.csdn.net/WoPawn/article/details/52463853

https://blog.csdn.net/ibunny/article/details/79397486

https://alvinzhu.xyz/2017/10/10/fast-r-cnn  論文翻譯

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

https://github.com/rbgirshick/fast-rcnn


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM