R-CNN、Fast R-CNN、Faster R-CNN深度剖析

目錄

一、何爲目標檢測

二、如何做到目標檢測

三、R-CNN

引入

R-CNN的缺點有哪些

四、Fast R-CNN

引入

Fast R-CNN比R-CNN優化的地方,以及其依舊存在的問題

五、Faster R-CNN

引入

網絡結構

網絡訓練

RPN網絡訓練

總體流程

RPN網絡標籤的生成

RPN網絡LOSS

Faster R-CNN網絡訓練


 

一、何爲目標檢測

給你一張圖片,告訴我圖裏有什麼?在哪?

二、如何做到目標檢測

        學過深度學習的都知道一件事情,一個深度神經網絡就是一個巨大的函數,給它輸入,它給你輸出,相信很多讀者都自己構建過深度神經網絡並在MNIST手寫數字數據集上進行過實驗。

        根據上面的描述,我們總能夠設計一個神經網絡,輸入一張圖片,輸出圖片的類別。也就是說這個神經網絡就是一個判別器。那麼問題來了,如果你要判斷的物體沾滿了整個圖片,那麼還好說,如果你要判別的物體在圖片中的某個角落,或者一個圖片裏面有多個物體,該怎麼辦?顯然只去完成一個判別器的訓練是達不到我們的要求的。

        考慮到要檢測的物體有大有小,其在圖片中的位置,有上右下,所以最暴力的放方法就是枚舉,不同大小的方框,然後將這些方框圈出的圖像區域放入判別器中去判斷到底是什麼物品,最原始的方法就是建立圖像金字塔,簡單來說,就是對原始圖像進行一定比例的放大或者縮小,然後用同一大小的矩形框在不同縮放比例圖片上滑動,來截取區域,一般情況這樣形成的候選區域有上萬個。所以時間代價非常大。我此處介紹的圖像金字塔的方式獲取候選區域的方法非常暴力,還有很多不錯的其他的方法,這裏不做贅述。

        考慮到實際物體的大小並不一定是我們設置好的一個矩形大小,所以其總是有所變動的,所以這裏又將回歸引入到了神經網絡中,也就是說,預測的位置,要儘可能的逼近Ground Truth(GT:數據集中認爲標註出來的正確的物品區域)。

        講到這裏大家已經基本上了解了目標檢測的大體方式,要有候選區域、分類器、迴歸器。

三、R-CNN

引入

        R-CNN算法首次將CNN用作物體的特徵提取器,候選區域的選擇,有獨立的算法,一般用SS(這裏的算法可以百度一下,很多)。

圖一:R-CNN

        根據圖一併且考慮到前面說到的目標檢測的大體步驟,我們可以看出,R-CNN算法的步驟是,在原圖片上進行候選區域的選取,於此同時需要訓練一個CNN的特徵提取器(這個特徵提取器只需要保留一個CNN分類神經網絡的CONV部分即可,全連接層可以不要),之後將每一個候選區域一次放入到CNN特徵提取器中提取圖像特徵,然後將圖像特徵放入SVM中進行判斷是否是物體(此處的SVM也是預先訓練好的),之後再將提取的圖像特徵放入迴歸器中得到迴歸框的位置,然後將經過判斷器判斷爲物體的候選區域的迴歸框標出,這些很多個框框就是檢測出來的目標結果,顯然這些結果中會有很多的重複覆蓋的部分,需要進行一定的篩選,這裏用到了NMS算法(該算法思想簡單,就是普通的編程算法)。

R-CNN的缺點有哪些

  • 候選區域的選擇需要花費大量的時間
  • 所有的候選區域都要進行獨立的特徵提取過程,也就是說,每一次判斷都要進行一個大型的卷積特徵提取過程

四、Fast R-CNN

引入

圖二:Fast R-CNN

        從圖二中,至少可以看明白一點,那就是對應輸入圖片沒有先進行候選區域的選擇,直接將原圖放入了CNN的特徵提取網絡,最後形成了名爲conv5的feature map,但是這並不意味着不需要候選區域了,候選區域還是需要在原始圖片上進行提取的,但是得到的候選區域需要全部映射到conv5的feature上,因爲在特徵提取的CNN網絡ConvNet中,縮放的尺寸是可以計算的(不同的網絡架構有不同的縮放尺寸,一般是縮小了16倍,也就是經歷了4次池化操作),所以所有的候選區域被在conv5的feature map中被框出,然後得到了區域,但是區域有大有小,如何進行大小尺寸的歸一化呢?這裏用到了RoIPooling技術(均等的網格化,來進行池化,具體可以百度),最後將RoIPooling處理之後的特徵區域(該區域大小是認爲強行規定的)作爲一個深度全連接網絡的輸入,輸出爲兩個部分,一個爲分類,一個爲迴歸(這個部分和R-CNN是一致的)。

Q:有的人可能會疑惑,怎麼一個分類,一個迴歸,如何訓練呢?

A:其實很簡單,對於RoIPooling處理之後的特徵區域,加入被映射到1024維度的特徵中,起就是一個矩陣的運算,那麼此時初始化兩個矩陣,一個用於分類,一個用於迴歸,但是都作用在這個1024維的全連接層上,但是此時訓練的時候,就可以分別作損失,然後將損失結果通過一定的比例進行相加即可。

Fast R-CNN比R-CNN優化的地方,以及其依舊存在的問題

  • 運行時間比R-CNN更快了,可以回頭看一下R-CNN的第二條缺點,也就是特徵提取的CNN網絡需要作用在每一個特徵區域上,耗費了大量的時間,但是Fast R-CNN想對圖像進行了CNN網絡的特徵提取,而其候選區域也是直接映射到了feature map上,節省掉了大量的重複時間,這就是爲啥Fast R-CNN更快的點
  • Fast R-CNN依舊沒有能夠擺脫對候選區域的依賴,所以還是耗費了大量的時間在候選區域上

五、Faster R-CNN

引入

        下面將詳細講解本文的重點,Faster R-CNN的原理,訓練流程(我也看過很多blog上,都沒有很好的解釋如何訓練,全是圍繞着什麼優缺點在描述,完全搞不懂Faster R-CNN真實的內在)。

圖三:Faster R-CNN

        幾乎所有的有關Faster R-CNN的blog都會pose上圖三這張圖,說實話,乍一看這張圖你會感覺所有的東西都是一氣呵成的,都是一個輸入圖片,然後得到結果,循環訓練即可,然而當你再仔細扣細節的時候發現,根本就不是這麼回事,自己都解釋不通。那麼該如何去理解上面的這個圖片呢?

網絡結構

        對於圖三,正確的理解是,這是兩個獨立的網絡合成的。首先是RPN網絡,其次是Fast R-CNN網絡。這兩個網絡是完全的單獨訓練的,不是放在一起訓練。(這兩行是理解Faster R-CNN的重點要記住)。

        其實真正的網絡流程是這樣的,我們訓練一個RPN網絡,RPN網絡代替了傳統候選區域的選取算法,那麼RPN就是一個候選區域生成器,之後,我們訓練一個Fast R-CNN網絡,這個網絡的訓練需要在RPN網絡訓練完成之後,因爲Fast R-CNN需要用到候選區域,而這裏的候選區域是通過訓練好的RPN網絡得到的。這麼看的話Faster R-CNN的結構就已經非常的明瞭了,就是將Fast R-CNN中的候選區域算法換成了一個候選區域生成器(CNN網絡)。但是更加細節的流程,將在文章的後面介紹。

        相信讀到這裏,我們對Faster R-CNN有了非常宏觀的理解了。

網絡訓練

圖四:Faster R-CNN網絡結構

RPN網絡訓練

總體流程

        如果只是根據圖四的話,很多人又開始暈了,這張圖又將兩個要獨立訓練的網絡放到了一起。所以有關RPN訓練的具體步驟,請參考我手繪的下圖

圖五:RPN網絡結構

        首先來講解一個這裏流程,對於一個輸入圖片,對其進行縮放(使高等於600),然後將一個CNN特徵提取器作用在上面,這裏的CNN特徵提取器可以是VGG等(爲什麼用VGG這種網絡呢?因爲這些網絡可以很好的區分物體之間,以及區分背景和物體之間,並不是爲了其分類效果)。在經歷了CNN特徵提取器之後,我們得到了256個40x60的feature map(張量形式[40, 60, 256]),再添加一個核大小爲3x3,輸出通道爲256的卷積層,之後就需要兵分兩路了。

 Q:1x1卷積的作用是什麼?

A:很多blog總是說一句話,相當於全連接層,但是這樣很容易產生歧義理解,通過下圖,便可以一目瞭然,1x1卷積的值只是一個對原始一層feature map的放縮,就相當於對上一層的一個神經元加上一個權重。

圖六:1x1卷積理解

         理解了1x1卷積的作用,下面就是如何理解k的值,k表示的anchor的個數,對於anchor的理解,相信在很多blog裏面都有講解,這裏不做贅述(本文的重點的理解Faster R-CNN的整體過程),那麼左邊的分支表示的是,對於feature map上的每一個像素點,以該點位中心,k個anchor所圈出的區域是否爲背景,右邊的分支表示,k個anchor所選出的區域如果存在物體,那麼其box框的位置在哪(一個框位置的界定,由四個部分組成,中心點座標x、y,矩形框的寬高w、h)。

RPN網絡標籤的生成

        既然是要單獨訓練RPN網絡那麼其標籤又是什麼樣子的呢?形象的說地話,RPN網絡的標籤的形式就是圖五的輸出形式。我們總可以將40x60feature map上的一個區域映射到原始圖片上,並且我們知道原始圖像中物體所在的位置(框出的物體框-數據集給出),接下來通過解決下面的三個問題就可以解決RPN網絡的標籤問題了。

Q1:如何判斷一個像素點的k個anchor在原圖中是否框出了一個物體?

A1:論文指出,通過兩種方式

  • 第一種:對於一個像素點,對其k個anchor在原始圖像中的映射與GT進行IoU的計算,選擇最大的爲1(存在物體)
  • 第二種:如果一個anchor在原始圖像中的映射與GT進行IoU計算,如果IoU>0.7就標註爲1

如果IoU<0.3,標註爲0(背景);如果IoU在0.3~0.7之間,那麼不做處理。此時就可以理解爲什麼要用1x1卷積的輸出通道數爲2k了,因爲一個種類的anchor有兩種結果,分別是negitive、positive。

Q2:RPN網絡迴歸框輸出部分如何理解?

A2:我們知道迴歸框部分是經過核爲1x1,輸出通道爲4k,得到的一個40x60x4k的一個方塊,那麼每一個特徵像素點下面有着4k長度的向量,表示k個anchor在原圖中的映射框定位(x、y、w、h)。

Q3:RPN網絡迴歸框的LOSS如何定義?

A3:RPN分類部分的LOSS很好定義,使用SoftMax Loss的定義即可,那麼對於迴歸部分,我們要達到的要求是,讓預測值和anchor的比例更加接近GT與anchor的比例,anchor起到了中間值過度的作用,這樣只需要縮放anchor即可。具體步驟如下

設 x,x_{a},x^{*}分別表示預測值的、anchor的、GT的

t_{x}=\frac{x-x_{a}}{w_{a}},t_{y}=\frac{y-y_{a}}{h_{a}}

t_{w}=log\frac{w}{w_{a}},t_{h}=log\frac{h}{h_{a}}

t_{x}^{*}=\frac{x^{*}-x_{a}}{w_{a}},t_{y}^{*}=\frac{y^{*}-y_{a}}{h_{a}}

t_{w}^{*}=log\frac{w^{*}}{w_{a}},t_{h}^{*}=log\frac{h^{*}}{h_{a}}

RPN網絡LOSS

        讀到這裏我們知道RPN的原理,以及RPN是如何訓練的。

Faster R-CNN網絡訓練

         上文講述了,如何獨立的訓練RPN網絡,那麼還有第二個需要獨立訓練的部分就是一個Fast R-CNN網絡部分,這個部分需要用到候選區域,那麼就用我們訓練好的RPN網絡生成候選區域,然後用來獨立地訓練Fast R-CNN網絡。但是此時我們遇到一個問題,無論是訓練Fast R-CNN網絡還是訓練RPN網絡,我們對原始圖片的特徵提取的VGG是預訓練好的(但是在後續訓練中需要對其進行微調),但是他們訓練之後變成了參數不同的VGG網絡,這對合並Fast R-CNN和RPN網絡增加了難度,所以將採取以下方式來減少合併網絡帶來的影響

  1. 用VGG作爲RPN的特徵提取器,訓練RPN網絡
  2. 使用RPN提取圖片的候選區
  3. 使用2中的候選區,訓練Fast R-CNN網絡
  4. 用訓練好的Fast R-CNN網絡的特徵提取器部分的參數初始化RPN特徵提取器部分的神經網絡
  5. 再次對RPN網絡進行訓練
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章