【R-CNN目標檢測系列】五、Fast R-CNN論文解讀

前言

又有一週沒更新了,不知道進入研究生階段寫博客時間爲什麼這麼上。上週四接到自己第一本書的三審意見需要進行修改。本想着慢慢修改的,結果上週五晚上接到通知北京印刷廠爲迎國慶9月開始停業直至10月下旬。沒辦法必須爲新書修改讓路,像趕在8月末上式,雖然不知道能不能在8月末把書印出來。這也導致本應該週末整理完Fast R-CNN的筆記有拖了一週。


一、 Fast R-CNN總體概括

在2014年與人合作提出了效果驚人的R-CNN之後,Ross Girshick在2015年單槍匹馬將R-CNN升級爲Fast R-CNN,將分類與定位兩大任務融入一個網絡中來,獲得了比R-CNN快的訓練測試速度,將R-CNN的84小時的訓練時間降低至9.5小時,測試時間從47秒將降低至0.32秒。並且性能相差無幾,兩者的mAP性能都穩定在66%-67%


二、 Fast R-CNN詳解

接下來,我們對Fast R-CNN進行詳細解析,並與R-CNN進行對比。在這篇這篇筆記中,我們將從RoI池化層、多任務損失、小批量採樣等方面進行詳細講解。

2.1 R-CNN簡單回顧

首先回歸下R-CNN的整體框架:

  1. 利用選擇性搜索(SS)算法獲取約2000個推薦區域;
  2. 然後將所有推薦區域轉換尺寸後送入AlexNet進行提取特徵
  3. 接着將提取的特徵送入SVM二分類器進行判定是否屬於某特定類
  4. 利用非極大抑制算法去除IoU大於閾值的推薦區域;
  5. 最後利用邊界框迴歸對上述剩餘推薦區域進行精確定位。

顯然R-CNN存在如下幾個缺點:

  1. 1張圖片大約2000個推薦區域輸入到AlexNet中提取特徵造成了訓練與測試速度較慢,並且這其中還有大部分重複推薦區域
  2. AlexNet的輸入固定爲227*227,這導致R-CNN的輸入尺寸固定
  3. R-CNN的訓練時多階段的,這也導致R-CNN不能共享權重。R-CNN的訓練主要分成3塊:AlexNet、SVM與邊界框迴歸,這也就導致爲訓練R-CNN會爲保存權重造成佔用大量內存空間

那麼做爲R-CNN的改改進版本,Fast R-CNN吸取了SPPNet中的空間金字塔池化層對上述R-CNN的相關缺點進行改進。接下來我們對Fast R-CNN進行詳細介紹。

2.2 RoI池化層

其實RoI池化層並非Fast R-CNN首創,在Fast R-CNN提出之前,何愷明等人就在SPPNet這篇論文中提出了與RoI池化層類似的空間金字塔池化層,該層將任意大小的特徵圖首先分成16、4、1個塊,然後在每個塊上最大池化,池化後的特徵拼接得到一個固定維度的輸出。在Fast R-CNN中,將SPPNet中的空間金字塔池化層進行簡化,將任意尺寸的特徵圖視爲一整塊進行最大池化,輸出固定尺寸的推薦區域對應的特徵圖。

接下來我們來分析下RoI池化層反向傳播。我們假設每個批次只有一張圖像。假設 xiRx_{i} \in \mathbb{R}爲第ii個RoI池化層的激活輸入, yrjy_{r j}爲從第 rr個RoI在RoI池化層的第jj個輸出。那麼RoI池化層的計算公式如下:
yrj=xi(rj)(1) y_{r j}=x_{i^{\prime}\left(r_{j}\right)}\tag1

其中 , i(r,j)=argmaxiR(r,j)xii^{*}(r, j)=\underset{i^{\prime} \in \mathcal{R}(r, j)}{\arg \max } x_{i^{\prime}}R(r,j)\mathcal{R}(r, j)yrjy_{r j}在最大池化層中各個子窗口的輸入的下標集合。也就是說,一個xix_{i}可能映射出多個不同的yrjy_{r j}。那麼在反向傳播過程中通過遵循argmax開關,損失函數相對於每個RoI池化層輸入變量 xix_{i}的偏導數計算公式如下:
Lxi=rj1{i=i(r,j)}Lyrj(2) \frac{\partial L}{\partial x_{i}}=\sum_{r} \sum_{j} 1\left\{i=i^{*}(r, j)\right\} \frac{\partial L}{\partial y_{r j}}\tag2

其中, 1{}1\{\cdot\}爲指示函數。其函數表達是如下:
1{x}={1x is True 0x is False(3) 1\{x\}=\left\{\begin{array}{ll}{1} & {x \text { is True }} \\ {0} & {x\text{ is False}}\end{array}\right.\tag3

換句話說,對於每個小批量RoIrr和每個池化輸出單元yrjy_{r j} ,如果ii是通過最大池化爲yrjy_{r j}選擇出的最大的那個,那麼偏導數Lyrj\frac{\partial L}{\partial y_{r j}}就會被積累。

2.3 多任務損失

從前文表述中可以看出,Fast R-CNN網絡主要有兩個網絡分支,一個網絡分支負責輸出推薦區域的分類概率p=(p0,,pK)p=\left(p_{0}, \cdots, p_{K}\right)K+1K+1個類別,其中 p0p_{0}代表背景的分類概率。另一個網絡分支負責輸出每個推薦區域位置信息偏移量tk=(txk,tyk,twk,thk)t^{k}=\left(t_{x}^{k}, t_{y}^{k}, t_{w}^{k}, t_{h}^{k}\right) ,其中kk代表分類標籤下標。

在訓練過程中,每個訓練RoI(推薦區域)都與一個真實框(ground truth)相對應,假設真實框類別爲uu ,真實框位置信息爲vv。那麼Fast R-CNN的多任務損失函數定義如下:
L(p,u,tu,v)=Lcls(p,u)+1{u1}λLloc(tu,v)(4) L\left(p, u, t^{u}, v\right)=L_{c l s}(p, u)+1\{u \geq 1\} \cdot \lambda L_{l o c}\left(t^{u}, v\right)\tag4

其中,Lcls(p,u)=logpuL_{c l s}(p, u)=-\log p_{u} , 1{}\{\cdot\}是前文提到的指示函數,對於上述式中LlocL_{l o c}被定義成推薦區域預測位置其中偏移量與對應真實框的位置偏移量之間的損失。其定義式爲:
Lloc(tu,v)=i{x,y,w,h}smoothL1(tiu,vi) smooth L1(5x)={0.5x2x<1x0.5x1(5) \begin{aligned} L_{l o c}\left(t^{u}, v\right) &=\sum_{i \in\{x, y, w, h\}} \operatorname{smooth}_{L_{1}}\left(t_{i}^{u}, v_{i}\right) \\ \text { smooth }_{L_{1}}(5x) &=\left\{\begin{array}{cc}{0.5 x^{2}} & {|x|<1} \\ {|x|-0.5} & {|x| \geq 1}\end{array}\right.\end{aligned}\tag5

相比於R-CNN中和SPPNet中提到的L2損失函數,在上述式中的smoothL1(x)\operatorname{smooth}_{L_{1}}(x)是一種對異常值更不敏感的魯棒性的L1損失函數。當邊界框迴歸目標無界時,利用L2損失函數進行訓練必須謹慎微調學習率防止梯度爆炸。

也就是說L2損失函數對誤差較大的樣本懲罰較大,因此我們可以選用稍微緩和一點的L1損失函數進行替代,但是絕對值損失函數f(x)=xf(x)=|x|是隨着誤差線性增長,不是平方增長,同時該函數在x=0x=0處不可導,這顯然也不利於網絡的反向傳播計算的連貫性,影響網絡收斂。因此,常見的處理手段是使用分段函數進行平滑處理,使得在x=0x=0時能夠平滑,並且可導,這就是使用smoothL1(x)\operatorname{smooth}_{L_{1}}(x)的原因。

2.4 小批量樣本採樣

在Fast R-CNN的微調階段,每個小批量樣本隨機從訓練集中抽取兩張圖片,之後從每張圖片中抽取64個RoI即推薦區域,總共包含128個推薦區域。其中25%的推薦區域與真實框之間的IoU要大於等於0.5,這25%的樣本屬於前景。其餘的75%,與真實框之間的IoU必須在[0.1,0.5)[0.1,0.5)區間內,即這些樣本屬於背景。在訓練區間,訓練圖像會以0.5的概率水平翻轉。微調過程使用SGD優化Fast R-CNN的參數。

2.5 Fast R-CNN網絡架構

首先給出Fast R-CNN的模型架構圖,如下圖所示。
在這裏插入圖片描述從圖1可以看出,Fast R-CNN的主要流程是首先仍然是利用選擇性搜索獲取圖像中的推薦區域,之後將原始圖片利用VGG16網絡進行提取特徵,之後把圖像尺寸、推薦區域位置信息和特區得到的特徵圖送入RoI池化層,進而獲取每個推薦區域對應的特徵圖。接着網絡分成兩個並行分支,一個對推薦區域進行分類,一個對推薦區域的位置信息做預測。
首先,Fast R-CNN使用VGG16網絡作爲基礎特徵提取網絡,這是得益於VGG16網絡是當時ImageNet競賽亞軍,特徵提取能力比較強大。

接着,RoI池化層使得Fast R-CNN不需要像R-CNN在訓練出測試時將所有推薦區域送入CNN中提取特徵,而是利用CNN的尺度不變性,首先將原始圖像送入CNN提取特徵,然後將推薦區域尺寸及其位置信息、特徵圖及其尺寸與最終的固定的輸出尺寸送入RoI池化層得到所有推薦區域對應的特徵圖,這樣加快Fast R-CNN的訓練和測試速度,減少大量重複計算。同時引入RoI池化層也是的無論輸入特徵圖尺度如何,池化之後的特徵圖尺寸是固定的,這也使得Fast R-CNN的不受輸入圖像的限制。

最後,多任務損失幫助Fast R-CNN解決了R-CNN多階段訓練與權重無法共享的難題。Fast R-CNN採用多任務訓練損失,利用softmax層代替R-CNN中的SVM分類來完成分類任務,定位任務還是使用邊界框迴歸。但是與R-CNN不同的是,Fast R-CNN將兩個任務融合到了一個網絡,使得將分類和定位兩個任務能夠同時進行,不必項R-CNN一樣分別處理,極大加快的訓練和測試速度。同時,Fast R-CNN使得分類和定位兩大任務能夠共享特徵提取網絡的權重這,減少了內存開銷。

2.6 SVD分解

在Fast R-CNN論文中,作者利用了SVD來分解全連接層的網絡權重,使得網絡權重維度降低,進而減小網絡前向傳播過程中矩陣乘法的時間複雜度,加快網絡訓練與測試。

下面也簡單給SVD分解的具體公式。在網絡中每層的權重 可以利用SVD分解近似表示成如下等式:
W=UΣtVT(6) W=U \Sigma_{t} V^{T}\tag6

其中,Σt\Sigma_{t}是前tt大奇異值組成的對角矩陣, UUΣt\Sigma_{t}對應tt個特徵向量組成的左奇異向量組,維度爲u×tu \times tVVWWtt個右奇異向量組,維度爲v×tv \times ttmin(u,v)t \ll \min (u, v)時,截斷SVD分解可以使得網絡權重 的維度從u×vu \times v下降至t(u+v)t(u+v) 。因此,利用SVD壓縮網絡使得一個全連接層被兩個全連接層近似代替。第一個全連接層的網絡權重爲tVT\sum_{t} V^{T} ,不需要加上偏置,第二個全連接層的網絡權重是UU ,且使用原來全連接層的偏置。當RoI數量較多時,SVD分解壓縮能夠給Fast R-CNN帶來較大的加速。


三、總結

總體來看,Fast R-CNN解決了R-CNN存在的2個問題:

  1. Fast R-CNN採用ROI池化層來避免對每個候選區域提取特徵,避免大量重複計算
  2. Fast R-CNN採用多任務損失,分類和定位兩大任務融入到一個網絡中,共享網絡參數,訓練測試速度大大加快,較少了物理內存開銷

雖然Fast R-CNN解決R-CNN的兩大缺點,加快的網絡訓練和測試速度,並且獲得與R-CNN基本相當的檢測性能,但是仍未解決如下幾個問題:

  1. Fast R-CNN的推薦區域的生成仍未融入到網絡中,還需SS算法獲取,必須放在cpu是進行運算,不能使用gpu進行加速
  2. 同時,Fast R-CNN的檢測速度仍未達到實時要求
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章