Fast R-CNN論文理解

在之前對目標檢測開山論文R-CNN有了理解,接下來我們繼續對R-CNN系列中的Fast R-CNN做一個理解。
在此之前,需要了解的是論文方法產生的前提:
Fast R-CNN的產生並不是僅僅直接來源與R-CNN,而是在SPP-NET的基礎上對R-CNN的改進。
這裏簡單介紹一下SPP-NET同時對它和R-CNN的缺點做一個複習。
我們都知道R-CNN的方法是,首先對一張特定尺度的圖片通過Search Selective的方法產生2K個區域,然後將這些區域分別輸入到CNN當中去,然後將產生特徵向量保存到硬盤當中,最後將其輸入到SVM分類器當中進行訓練並輸出。
這裏我們很容易就知道它的幾個缺點:
(1)訓練分爲多個階段。首先要使用search selective算法從輸入圖像提取約2000個候選區域,其次要訓練CNN網絡,最後還要訓練SVM進行分類、訓練bbox迴歸器進行更爲精確的位置定位。
(2)訓練需要花費大量的時間和空間。因爲是分階段的,CNN將候選區域的特徵提取出來以後要都存入硬盤中,之後取出用於訓練SVM和bbox迴歸器,存儲特徵需要耗費大量的硬盤空間,而且讀寫過程會造成時間的損耗。
(3)檢測階段特別耗時。因爲檢測時也是對帶檢測圖像中的候選區域進行檢測,每個候選區域都要進行前向傳播,所以檢測一張圖像特別耗時。
而SPP-NET,SPP是spatial pyramid pooling,即空間金字塔池化。
也就是,它在R-CNN的基礎上添加了一個共享池化層。即,在其共享卷積層結束之後,引入了一個SPP層,也就是多個不同大小的池化層相疊加。
總結而言,SPP-NET最大的改變就是**能夠一次性的將所有特徵向量輸入CNN中,而不是在逐一輸入,其輸入的圖片大小也可以是任一尺度的。**當網絡輸入的是一張任意大小的圖片,這個時候我們可以一直進行卷積、池化,直到網絡的倒數幾層的時候,也就是我們即將與全連接層連接的時候,就要使用金字塔池化,使得任意大小的特徵圖都能夠轉換成固定大小的特徵向量,這就是空間金字塔池化的意義(多尺度特徵提取出固定大小的特徵向量)。
當然它也帶來了新的問題:
在fune-tuning階段不能對SPP層下面所有的卷積層進行後向傳播(如下圖所示)
在這裏插入圖片描述
因爲在fine-tuning的時候,R-CNN和SPP-net都是取mini-batch爲128,其中32個正樣本,96個負樣本,而這些正負樣本通常來自不同的圖片。在這樣的fine-tuning策略下,當訓練樣本不是同一個圖片的時候,SPP層的更新效率會非常低,效率低的根本原因是每個RoI區域的感受野可能會非常大,從而導致,在一批數據已經訓練完之後,下一批數據的訓練又要重新計算整張圖片的feature map,從而增加了計算量。
針對以上的問題,Fast R-CNN應運而生。

先來看一看Fast R-CNN的系統架構。
在這裏插入圖片描述
Fast R-CNN對於待識別圖片,首先將其使用Selective Search處理獲得一系列候選框,隨後將其歸一化到固定大小,送入CNN網絡中提取特徵。對於提取出的特徵張量,假設其保留了原圖片的空間位置信息,將候選框做對應變換後映射到特徵張量上,提取出大小不同的候選區域的特徵張量。對於每個候選區域的特徵張量,使用RoI pooling層將其大小歸一化,隨後使用全連接層提取固定長度的特徵向量。對於該特徵向量,分別使用全連接層+softmax和全連接層+迴歸判斷類別並計算當前感興趣區域的類別及座標包圍框。最後通過NMS得到最後的結果。
需要提到的是,Fast R-CNN和R-CNN相同,都是先用SS算法得到候選框,然後再輸入到網絡中,這樣一來速度是非常慢的,這個也是該論文一直以來的瓶頸。
下面我們分模塊來一一理解。

CNN特徵提取

Fast R-CNN的基本網絡框架爲VGG-16,對於初始網絡做了一下調整:
(1)最後一個最大值池化層用RoI池化層代替,該池化層可將不同大小的輸入池化爲統一大小輸出。
(2)最後一層全連接層使用兩個分裂的全連接層代替,一個用於計算分類,一個用於計算候選框的調整因子.。
(3)輸入改爲兩個,分別爲原圖和Selective Search產生的候選框座標

ROI池化層

RoI池化層用於將不同大小的輸入張量池化爲固定大小。
RoI池化層指定池化窗口的數量爲W x H,每個池化窗口的大小是根據池化區域變化的,例如一張圖片的尺寸爲w x h,則每個窗口的大小爲 w/W x h/H,假設W=4,H=4,有以下例子:

在這裏插入圖片描述
如圖左右各有一個大小不同的RoI區域,劃分爲W x H個池化窗口,每個池化窗口的大小因原RoI區域尺寸不同而不同,經過RoI池化尺寸變爲相同的W x H。

訓練

模型的訓練過程與RCNN不同,Fast-RCNN將分類器和迴歸器的訓練統一到深度學習的框架下,在Selective Search提取出候選區域RoI後,所有的訓練均在深度學習框架下進行。(R-CNN則是要分別訓練)

批處理

訓練使用SGD算法,因此需要提取batch進行訓練。batch的提取基於N張圖片,每個batch共R個數據,每個batch提取R / N個區域。當N較小時,這種提取方法充分的使用了數據局部性,能提高訓練速度。在本論文中,有R=128,N=2,即每個batch的數據來自兩張圖片,共128個RoI數據,其中要求25%的RoI爲包含物體的(IoU>0.5),這些RoI被標記爲對應類別,剩下的75%的RoI要求IoU在0.1~0.5之間,標記爲背景。

多任務損失函數

在FC層後接入了兩個分支:
一個是softmax用於對每個RoI區域做分類,假如有K類待分(加上背景總共K+1類),輸出結果爲在這裏插入圖片描述
另一個是bbox,用於更精確的定位RoI的區域,輸出結果爲在這裏插入圖片描述
多任務損失函數定義爲:
在這裏插入圖片描述
其中,在這裏插入圖片描述
是一個log形式的損失函數,在這裏插入圖片描述在這裏插入圖片描述 是類別U的真實框的位置,而,在這裏插入圖片描述 是類別U的預測框的位置。在這裏插入圖片描述 表示當在這裏插入圖片描述 時,該值爲1。反之,則爲0。實驗中,在這裏插入圖片描述 上式中, 在這裏插入圖片描述 定義爲:在這裏插入圖片描述 其中,在這裏插入圖片描述
文中認爲,L1 對於噪點相比於 L2更不敏感,所以使用L1正則是的模型更爲魯棒。

訓練過程

這裏簡單來介紹一下Fast R-CNN的訓練過程。
1、獲取預訓練模型。
2、取N=2張圖片前向傳播,按批處理部分所述進行前向傳播,並計算代價函數。
3、根據代價函數反向傳播更新權值跳轉到2。
其中,RoI pooling層的反向傳播與Pooling層相同,不同RoI的反向傳播結果對應位置相加後再反向傳播到前一層。爲了達成尺寸不變性,還在訓練中使用了圖像金字塔和數據增強的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章