讀論文系列:Object Detection ICCV2015 Fast RCNN

Fast RCNN是對RCNN的性能優化版本,在VGG16上,Fast R-CNN訓練速度是RCNN的9倍, 測試速度是RCNN213倍;訓練速度是SPP-net的3倍,測試速度是SPP-net的3倍,並且達到了更高的準確率,本文為您解讀Fast RCNN。

Overview

Fast rcnn直接從單張圖的feature map中提取RoI對應的feature map,用卷積神經網路做分類,做bounding box regressor,不需要額外磁碟空間,避免重複計算,速度更快,準確率也更高。

Related work

RCNN缺點

  • Multi-stage training

需要先預訓練卷積層,然後做region proposal, 然後用SVM對卷積層抽取的特徵做分類,最後訓練bounding-box回歸器。

  • 訓練時間和空間代價很大

    訓練過程中需要把CNN提取的特徵寫到磁碟,佔用百G級的磁碟空間,GPU訓練時間為2.5GPU*天(用的是K40,壕,友乎?)
  • 目標檢測很慢

    Region proposal很慢,VGG16每張圖需要花47秒的時間

總結:RCNN就是慢!最主要的原因在於不同的Region Proposal有著大量的重複區域,導致大量的feature map重複計算。

SPP-net

SPP-net中則提出只過一遍圖,從最後的feature map裁剪出需要的特徵,然後由Spatial pyramid pooling層將其轉為固定尺寸特徵,由於沒有重複計算feature map,訓練速度提升3倍,測試速度提升了10-100倍。

但是SPP-net也有缺點,SPP-net的fine-tune不能越過SPP層,因為pyramid BP開銷太大了,只能fine-tune全連接層,tune不到卷積層,所以在一些較深的網路上準確率上不去。

Fast RCNN architecture

  • 首先將整個圖片輸入到一個基礎卷積網路,經過max pooling得到整張圖的feature map,
  • 然後用一個RoI pooling層為region proposal從feature map中提取一個固定長度的特徵向量,
  • 每個特徵會輸入到一系列全連接層,得到一個RoI特徵向量,
  • 再分叉傳入兩個全連接層輸出,
    • 其中一個是傳統softmax層進行分類,
    • 另一個是bounding box regressor,
  • 根據RoI特徵向量(其中包含了原圖中的空間信息)和原來的Region Proposal位置回歸真實的bounding box位置(如RCNN做的那樣,但是是用神經網路來實現)。

其他都是一目了然的,接下來主要講RoI pooling

RoI pooling

我們可以根據卷積運算的規則,推算出原圖的region對應feature map中的哪一部分。但是因為原圖region的大小不一,這些region對應的feature map尺寸是不固定的,RoI pooling就是為了得到固定大小的feature map。

- RoI pooling層使用max pooling將不同的RoI對應的feature map轉為固定大小的feature map。

- 首先將h * w的feature map劃分為H * W個格子

- 對每個格子中的元素做max pooling

由於多個RoI會有重複區域,所以max pooling時,feature map里同一個值可能對應pooling output的多個值。所以BP算梯度的時候,從RoI pooling層output y到input x的梯度是這樣求的

其中

  • i^*(r, j) = argmax_{i∈R(r,j)} x_i^{} ,也就是在 R(r, j) 這個區域中做max pooling得到的結果,
  • i = i ^* (r, j) 是一個條件表達式,就是判斷input的 x_i 是否是max pooling的結果,如果不是,輸出的梯度就不傳到這個值上面
  • r是RoI數量, j 是在一個region中,與 x 對應的輸出個數
  • y_{rj} 是第 j 個跟 x 對應的輸出

舉例:

也就是說,將Loss對輸出的梯度,傳回到max pooling對應的那個feature unit上,再往回傳

其實這是SPPnet的一個特例,是Spatial pooling,沒有pyramid,也因此計算量大大減少,能夠實現FC到CNN的梯度反向傳播,並且,實驗發現其實feature pyramid對準確率提升不大。倒是原圖層面的Pyramid作用大些:

  • 訓練時,為每張訓練圖片隨機選一個尺度,縮放後扔進網路學
  • 測試時,用image pyramid為每張測試圖片中的region proposal做尺度歸一化(將它們縮放到224x224)

但是這種Pyramid方法計算代價比較大,所以Fast RCNN中只在小模型上有這樣做

Multi-task loss

  • L_{cls} : SoftMax多分類Loss,沒啥好說的
  • L_{loc} :bounding box regression loss

定義真實的bounding box為(vx, vy, vw, vh),預測的bounding box位置(由第二個fc層輸出,有K個類,每個類分別有4個值,分別為)txk,tyk,twk, thk

L_{loc}(t_k, v) = ∑_{i∈{x,y,w,h}} smooth_{L_1}(t_i^k - v_i)

即預測位置和真實位置四個值的差值求和,其中

smooth_{L_1}(x) = 0.5x^2 if |x|<1 otherwise  |x|-0.5

是一個軟化的L1(畫一下圖像可以看出來,在(-1,1)的範圍內是拋物線,沒L1那麼尖銳),如果採用L2 loss,需要仔細調節學習率防止梯度爆炸。

整個模型的Loss就是:

L(p, k, t_k, v) = L_{cls}(p, k) + λ|k ≥ 1| L_{loc}(t_k, v)

  • p 代表預測類別, k 代表真實類別
  • k≥1 意味著不算0類(也就是背景類)的bounding box loss,因為背景的bounding box沒啥意義
  • λ是超參數,在論文的實驗中設為1

訓練

  • ImageNet預訓練
  • 最後一層換成RoI pooling層
  • FC+sofmax分類層換成兩個FC,分別求softmax分類和bounding box回歸loss,每個類有自己的bounding box regressor
  • 用Detection數據BP微調整個神經網路

這就比較厲害了,之前RCNN是需要分開微調SVM分類層和bounding box regressor的

前面講了RoI pooling使得梯度反向傳播到卷積層成為可能,但是這種BP訓練仍然很耗顯存和時間,尤其是在輸入的ROI屬於不同圖片時,因為單張圖的feature map是不存到磁碟的,當一張圖的幾個RoI和其他圖的幾個RoI混在一起交替輸入時,需要反覆前向傳播計算feature map,再pooling,實際上也就反覆計算了feature map。

在Fast RCNN的訓練中,每次輸入兩張圖(這麼小的batch size),每張圖取64個ROI,單張圖的多個ROI在前向計算和後向傳播過程中是共享feature map的的,這樣就加快了訓練速度。

然而,這犯了訓練中的一個忌諱,實際上,相當於訓練數據(ROI)沒有充分shuffle,但在Fast RCNN的實驗中效果還行,就先這樣搞了。

樣本篩選

  • 正樣本:與bounding box有超過50%重疊率的
  • 負樣本(背景):與bounding box重疊率位於0.1到0.5之間的。

Truncated SVD加速全連接層運算

  • Truncated SVD

W ≈ USigma_tV^T

u	imes v 大小的矩陣 W 分解為三個矩陣相乘,其中, U 是一個 u	imes t 的矩陣,包含 W 的前 t 個左奇異向量, Sigma_t 是一個 t×t 的對角矩陣,包含 W 的前 t 個上奇異向量, V^T 是一個 v	imes t 的矩陣,包含W的前t個右奇異向量,參數數量從 u	imes v 變成 t(u+v) ,當 t 遠小於 min(u,v) 時,參數數量就顯著少於 W

具體實現上,將一個權重為 W 的全連接層拆成兩個,第一層的權重矩陣為 Sigma_tV^T (並且沒有bias),第二層的權重矩陣為 U (帶上 W 原來的bias)。

在Fast RCNN中,Truncated SVD減少了30%的訓練時間。

實驗結果

PK現有方法

  • 在VOC12上取得65.7%的mAP,是當時的SOA
  • 在VGG16上,Fast R-CNN訓練速度是RCNN的9倍, 測試速度是RCNN213倍;
  • 訓練速度是SPP-net的3倍,測試速度是SPP-net的3倍

創新點必要性驗證

  • RoI pooling是否比SPP更優?(是否有fine tune卷積層的必要?)
    • 使用VGG16,在Fast RCNN中凍結卷積層,只fine tune全連接層:61.4%
    • 使用VGG16,在Fast RCNN中fine tune整個網路:66.9%
  • Multi Loss(Softmax + bb regressor)是否比Single task(只用Softmax loss)更優?stage-wise和Multi Task同時進行(end2end)哪個更優?

在VOC07上,end2end + bb regressor > stage-wise+ bb regressor > end2end

  • Image Pyramid是否必須?

    實際上,使用Pyramid在Fast RCNN上只提升了1%左右,所以這個也沒被列為正式的創新點

  • 如果用SVM來分類會不會更好?

S M L是由淺到深的三個網路,可以看到,只用Softmax分類也能達到不錯的效果,在網路比較深的情況下,也有超越SVM的可能。

  • 模型泛化能力

    一個模型如果能夠在更多訓練數據的條件下學到更好的特徵分布,這個模型效果越好,RBG用VOC12去訓練Fast RCNN,然後在VOC07上測試,準確率從66.9%提升到70.0%。在其他組合上也取得了提升。

注意,在訓練更大的數據的時候,需要更多的iteration,更慢的learning rate decay。

  • 使用更多的Region Proposal效果會不會更好?(不是很想講這方面,太玄學)

圖中紅色線表示Average Recall,通常人們用Average Recall來評價Region Proposal的效果,然而,proposals越多,AR這個指標一直往上漲,但實際上的mAP並沒有上升,所以使用AR這個指標比較各種方法的時候要小心,控制proposal的數量這個變數不變。

圖中藍色線表示mAP(= AVG(AP for each object class)),可以看到,

  • 太多的Region Proposal反而會損害Fast RCNN的準確度
  • DPM使用滑動窗口+層次金字塔這種方法提供密集的候選區域,用在Fast RCNN上略有下降。

推薦閱讀:

《Detecting and Recognition Human-Object Interactions》論文筆記
基於深度學習的「目標檢測」演算法綜述
說一說最近很火的離線跟蹤
目標檢測入門(二):模型的評測與訓練技巧
優於MobileNet、YOLOv2:移動設備上的實時目標檢測系統Pelee

TAG:目標檢測 | 圖像識別 | 計算機視覺 |