目標檢測系列——Faster R-CNN原理詳解

語言: CN / TW / HK

theme: fancy

 

🍊作者簡介:禿頭小蘇,致力於用最通俗的語言描述問題

🍊往期回顧:目標檢測系列——開山之作RCNN原理詳解    目標檢測系列——Fast R-CNN原理詳解

🍊近期目標:擁有10000粉絲

🍊支援小蘇:點贊👍🏼、收藏⭐、留言📩

 

目標檢測系列——Faster R-CNN原理詳解

寫在前面

  前文我已經介紹過R-CNN、Fast R-CNN的原理,具體內容可以點選下面連結閱讀。【注:閱讀此篇之前建議對R-CNN和Fast R-CNN有一定的瞭解】

  Faster R-CNN算是這個目標檢測系列的最後一篇了,在速度和準確率上也相對達到了比較好的效果,所以還是非常重要的。後面可能會更新語義分割Mask RCNN,當然這都是後話啦。現在就和我一起來學學Faster R-CNN吧。🍻🍻🍻

 

Faster R-CNN整體流程

​  不知大家是否還記得Fast R-CNN的流程?這裡幫大家回憶一下,其步驟如下:

  1. 候選區域生成
  2. 完整影象輸入網路,候選框投影到特徵圖得到特徵矩陣
  3. 特徵矩陣經ROI pooling層縮放至統一大小,後將特徵圖展平得到預測結果

image-20220624200100888


​  那麼Faster R-CNN相較於Fast R-CNN有什麼要的改進呢?其實最主要的就是在Fast R-CNN中我們依舊是和R-CNN一樣採用SS演算法來生成候選框,而在Faster R-CNN中我們採用的是一種稱為RPN(Region Proposal Network)的網路結構來生成候選框。其它部分基本和Fast R-CNN一致,所以我們可以將Faster R-CNN的網路看成兩部分,一部分是RPN獲取候選框網路結構,另一部分是Fast R-CNN網路結構,如下圖所示:

image-20220624204618088

​  倘若你是第一次看Faster R-CNN,看了這個圖,我覺得你還是處於一個比較懵逼的狀態。但是沒有關係,這個圖是論文中所給的,我貼在這裡的主要目的是想讓你大致知道Faster R-CNN的結構就好,那麼靈魂一問——大致結構你知道了嘛?

  其實呀,Faster R-CNN的結構和Fast R-CNN還是很像的,都會產生一些候選框,然後基於特徵提取網路對這些候選框進行分類和迴歸操作,不同的是Fast R-CNN採用的是傳統的SS演算法提取候選框,而Faster R-CNN採用RPN網路來進行提取。

​  好了,Faster R-CNN整體流程部分就介紹這麼多,你肯定還是存在著諸多疑惑,不用急,下面我們一步步的講解。🌻🌻🌻


🌷🌷🌷🌷🌷🌷

  想想這裡還是再加點內容,見下圖,其是Faster R-CNN較為詳細的流程圖,後文我也會按照這個結構為大家講述,這樣應該會更清晰點。

image-20220624211516578🌷🌷🌷🌷🌷🌷

   

特徵提取網路✨✨✨

​  特徵提取網路結構如下圖所示:

​  可以看到,對於一個P*Q大小的圖片,我們先將其resize到特定的M*N大小,之後再送入特徵提取網路。【注:這裡圖片尺寸沒有加通道數,大家理解就好】

  此外,可以看到圖中的特徵提取網路有13個卷積層,4個池化層,其實這個特徵提取網路用到就是大名鼎鼎的VGG。【注:在VGG網路中有13個卷積層,5個池化層,這裡丟棄了最後一個池化層】

  對於VGG網路不熟悉的可以點選☞☞☞瞭解詳情。值得一提的是在VGG網路中,卷積採用的都是3*3的卷積核,卷積後特徵圖尺寸不變;而池化採用的是2*2的池化核,池化後特徵圖尺寸減半。也就是說,在上圖的特徵提取網路中,含有四個池化層,因此我們最終得到的特徵圖的尺寸是原來的$\frac{1}{{16}}$,即為$\frac{M}{{16}}*\frac{N}{{16}}$ 。

​  還有一點也值得注意,即本次講解的特徵提取網路是VGG,我們一般稱之為backbone(骨幹網路)。這個backbone是可以根據需求更換的,像換成ResNet、MobileNet等等都是可以的。🥝🥝🥝

   

RPN網路結構✨✨✨

  RPN的網路結構如下:

image-20220625110444667

              圖4.1 RPN網路結構

  我們上一步已經得到了$\frac{M}{{16}}\frac{N}{{16}}$大小的特徵圖(Feature Map)【注:為方便後文敘述,現令$W=\frac{M}{{16}},H=\frac{N}{{16}}$】*,可以看到我們會對特徵圖分別進行路徑①和路徑②上的操作,其中路徑①上的操作即為RPN網路結構。下面我們就來重點談談這個RPN網路結構。

  首先我們先來明確RPN是用來幹什麼的?enmmm....,要是這個網路的作用現在還不知道的話那我前面真是白說了,有點失敗。☘☘☘但是這一點再強調也不為過——RPN就是來提取候選框的!!!

  那麼RPN到底是怎麼做的呢?首先,我們會用一個3*3的滑動視窗遍歷剛剛得到的特徵圖,之後計算出滑動視窗中心點對應原始影象上的中心點, 最後在原始影象每個中心點繪製9種anchor boxes 。【注:怎麼由特徵圖的中心點座標得到原圖的中心點呢?——我們採用的是VGG骨幹網路,原圖和特徵圖尺寸相差16倍,因此只需要將特徵圖中心點座標乘16即可;或者我們可以計算出中心點在特徵圖中的相對位置,進一步得到原圖中心點位置】

  我們需要在原圖中繪製9中anchor,論文中給出三種尺度(128*128 、256*256 、512*512)和三種比例(1:1、1:2、2:1)一共9種anchor,說是由經驗設計,其實我們在實現過程中是可以根據任務調整的,比如我們要檢測的目標較小,那麼就可以適當減小anchor的尺寸。特徵圖中心點到原圖的大致對映關係圖如下:

image-20220625122115740

  上文談到使用3*3的滑動視窗遍歷特徵圖,其實這就對應了圖4.1路徑①中的第一個3*3的卷積,卷積過程padding=1,stride=1。其中該卷積和原圖生成anchor的對應關係如下圖所示:可見經過這一步我們會在原圖上生成許多許多的anchor,很明顯這些anchor很多都是我們不需要的,後面就會對這些anchor進行取捨。

pic

​  接下來我們看看經過3*3卷積後特徵圖的變化,因為採用的是卷積核k=3*3,p=1,s=1的卷積,所以卷積後特徵圖尺寸沒有發生變化,這裡說一下這個channel=512是由於VGG網路最後一層的輸出通道數為512。

image-20220625130731032

  再來對照圖4.1看看3*3的卷積後進行了什麼操作?3*3卷積後由分別走路徑③和路徑④進行相關操作。其實路徑③就是對剛剛得到的anchor進行分類(前景和背景),而路徑④則是對anchor進行迴歸微調。

  那麼就分別來講講③和④,首先先來談談路徑③。首先進行一個1*1的卷積,卷積核個數為18。如下圖所示:

image-20220625151255098

  其實上圖採用18個卷積核是很有講究的。首先我們要知道的是路徑③我們要做的是區分每個anchor是前景還是背景,即分成兩個類別,而對於每個小方格都會在原圖上生成9個anchor。這樣2*9=18,得到的結果中每個小方塊就代表原始影象中某個位置每個anchor是否為前景或背景的概率。為方便大家理解,摳出某個方格對18通道的資料進行解釋,如下圖所示:

image-20220625152703861

​  1*1的卷積後,就進行了softmax層進行分類。【注:在softmax層前後都有一個reshape的操作,這是因為在編寫程式碼時會對輸入的格式有要求,這裡大家可以先不關心,後面講解程式碼時在敘述】 softmax層分類後我們會得到所有的正類的anchor(positive anchors)和負類的anchor(negative anchors)。

​  這裡補充一下正負樣本的選取規則:正樣本有兩個條件,第一:選取與真實框IOU最大的anchor;第二:選取與真實框IOU大於0.7的anchor。【注:其實大部分情況第二個條件都可以滿足,但是防止存在一些極端情況設定了條件一】負樣本的選取條件為與所有真實框IOU都小於0.3的anchor。


  接著就來談談路徑④,同樣的,先是一個1*1的卷積,卷積核個數為36。如下圖所示:

image-20220625154852032

  這裡的36同樣是有講究的呀,因為在進行迴歸微調anchor的時候每個anchor需要四個引數,4*9=36,得到的結果中每個小方塊就代表原始影象中某個位置每個anchor四個需要調整的引數。同樣也畫個圖片幫助大家理解,如下:

image-20220625155415966


  接下來路徑③和路徑④在Proposal這步結合,這步是幹什麼的呢?其實呀,這一步就是綜合了路徑③和路徑④中的資訊,即分類結果和anchor框的迴歸引數,目的是得到更加精確的候選框(Region Proposal)。細心的同學可能還發現了proposal這步還有一個輸入,即im_info,這個引數儲存了一些圖片尺寸變換的資訊,像開始的resize,後面的池化等等。

   

RPN層損失函式✨✨✨

​  RPN層的損失函式如下:RPN層的分類損失和fast R-CNN類似,也是由兩部分組成,即分類損失和邊界框迴歸損失。

image-20220625163317420

​  下面來具體看看①和②部分:【注:邊界框迴歸損失在之前文章 R-CNN中有介紹,不明白的可以去了解一下】

image-20220625163554470

   

ROI Pooling

​  上文已經較為詳細的講述了RPN層,即我們圖4.1中的①路徑,接下來我們繼續來講路徑②【路徑②為ROI Pooling層】。可以看到ROI Pooling層的輸入有兩個:分別為

  • 原始的feature maps
  • RPN輸出的proposal

  ROI Pooling層我在fast R-CNN中已經講過了,這裡就不過多敘述了,不明白的可以前去充充能。🍊🍊🍊

​  不過這裡我還是想說明一點:我們傳入ROI Pooling層的輸入為原始特徵圖和RPN輸出的候選框,我們相當於是把每個候選框對應到原始特徵圖的不同部分,然後把這些部分剪裁下來分別傳入ROI Poolinng層。

image-20220625110444667

   

分類迴歸微調部分

​  後面這部分其實就完全和Fast R-CNN後半部分完全一致了,因為我們同樣都經過ROI Pooling層得到了候選框的相關特徵,接著送入分類和迴歸網路即可。🌱🌱🌱這部分有不明白的也歡迎去閱讀我之前文章對此部分的講解。

image-20220626223655405


   

小結

​  這部分來總結一下Faster R-CNN的步驟,如下:

  1. 將完整影象輸入網路得到相應的特徵圖
  2. 使用RPN接面構生成候選框,將RPN生成的候選框投影到原始特徵圖獲取相應的特徵矩陣【相當於我們ROI Pooling部分所說通過剪裁得到的結果】
  3. 特徵矩陣經ROI pooling層縮放至統一大小,後將特徵圖展平得到預測結果

🌼🌼🌼至此,Faster R-CNN的理論部分就都將完了,希望大家都能有所收穫。🌼🌼🌼

   

參考資料

Faster RCNN理論合集🍁🍁🍁

目標檢測演算法之Faster RCNN🍁🍁🍁

一文讀懂Faster RCNN🍁🍁🍁

    如若文章對你有所幫助,那就🛴🛴🛴

咻咻咻咻~~duang\~~點個讚唄

   

我正在參與掘金技術社群創作者簽約計劃招募活動,點選連結報名投稿