引言
之前學習了 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