目標檢測系列——Faster R-CNN原理詳解
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的流程?這裡幫大家回憶一下,其步驟如下:
- 候選區域生成
- 完整影象輸入網路,候選框投影到特徵圖得到特徵矩陣
- 特徵矩陣經ROI pooling層縮放至統一大小,後將特徵圖展平得到預測結果
那麼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網路結構,如下圖所示:
倘若你是第一次看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較為詳細的流程圖,後文我也會按照這個結構為大家講述,這樣應該會更清晰點。
🌷🌷🌷🌷🌷🌷
特徵提取網路✨✨✨
特徵提取網路結構如下圖所示:
可以看到,對於一個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的網路結構如下:
圖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的尺寸。特徵圖中心點到原圖的大致對映關係圖如下:
上文談到使用3*3的滑動視窗遍歷特徵圖,其實這就對應了圖4.1路徑①中的第一個3*3的卷積,卷積過程padding=1,stride=1。其中該卷積和原圖生成anchor的對應關係如下圖所示:可見經過這一步我們會在原圖上生成許多許多的anchor,很明顯這些anchor很多都是我們不需要的,後面就會對這些anchor進行取捨。
接下來我們看看經過3*3卷積後特徵圖的變化,因為採用的是卷積核k=3*3,p=1,s=1的卷積,所以卷積後特徵圖尺寸沒有發生變化,這裡說一下這個channel=512是由於VGG網路最後一層的輸出通道數為512。
再來對照圖4.1看看3*3的卷積後進行了什麼操作?3*3卷積後由分別走路徑③和路徑④進行相關操作。其實路徑③就是對剛剛得到的anchor進行分類(前景和背景),而路徑④則是對anchor進行迴歸微調。
那麼就分別來講講③和④,首先先來談談路徑③。首先進行一個1*1的卷積,卷積核個數為18。如下圖所示:
其實上圖採用18個卷積核是很有講究的。首先我們要知道的是路徑③我們要做的是區分每個anchor是前景還是背景,即分成兩個類別,而對於每個小方格都會在原圖上生成9個anchor。這樣2*9=18,得到的結果中每個小方塊就代表原始影象中某個位置每個anchor是否為前景或背景的概率。為方便大家理解,摳出某個方格對18通道的資料進行解釋,如下圖所示:
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。如下圖所示:
這裡的36同樣是有講究的呀,因為在進行迴歸微調anchor的時候每個anchor需要四個引數,4*9=36,得到的結果中每個小方塊就代表原始影象中某個位置每個anchor四個需要調整的引數。同樣也畫個圖片幫助大家理解,如下:
接下來路徑③和路徑④在Proposal這步結合,這步是幹什麼的呢?其實呀,這一步就是綜合了路徑③和路徑④中的資訊,即分類結果和anchor框的迴歸引數,目的是得到更加精確的候選框(Region Proposal)。細心的同學可能還發現了proposal這步還有一個輸入,即im_info,這個引數儲存了一些圖片尺寸變換的資訊,像開始的resize,後面的池化等等。
RPN層損失函式✨✨✨
RPN層的損失函式如下:RPN層的分類損失和fast R-CNN類似,也是由兩部分組成,即分類損失和邊界框迴歸損失。
下面來具體看看①和②部分:【注:邊界框迴歸損失在之前文章 R-CNN中有介紹,不明白的可以去了解一下】
ROI Pooling
上文已經較為詳細的講述了RPN層,即我們圖4.1中的①路徑,接下來我們繼續來講路徑②【路徑②為ROI Pooling層】。可以看到ROI Pooling層的輸入有兩個:分別為
- 原始的feature maps
- RPN輸出的proposal
ROI Pooling層我在fast R-CNN中已經講過了,這裡就不過多敘述了,不明白的可以前去充充能。🍊🍊🍊
不過這裡我還是想說明一點:我們傳入ROI Pooling層的輸入為原始特徵圖和RPN輸出的候選框,我們相當於是把每個候選框對應到原始特徵圖的不同部分,然後把這些部分剪裁下來分別傳入ROI Poolinng層。
分類迴歸微調部分
後面這部分其實就完全和Fast R-CNN後半部分完全一致了,因為我們同樣都經過ROI Pooling層得到了候選框的相關特徵,接著送入分類和迴歸網路即可。🌱🌱🌱這部分有不明白的也歡迎去閱讀我之前文章對此部分的講解。
小結
這部分來總結一下Faster R-CNN的步驟,如下:
- 將完整影象輸入網路得到相應的特徵圖
- 使用RPN接面構生成候選框,將RPN生成的候選框投影到原始特徵圖獲取相應的特徵矩陣【相當於我們ROI Pooling部分所說通過剪裁得到的結果】
- 特徵矩陣經ROI pooling層縮放至統一大小,後將特徵圖展平得到預測結果
🌼🌼🌼至此,Faster R-CNN的理論部分就都將完了,希望大家都能有所收穫。🌼🌼🌼
參考資料
如若文章對你有所幫助,那就🛴🛴🛴
咻咻咻咻~~duang\~~點個讚唄
我正在參與掘金技術社群創作者簽約計劃招募活動,點選連結報名投稿。
- 兔年到了,一起來寫個春聯吧
- CV攻城獅入門VIT(vision transformer)之旅——VIT程式碼實戰篇
- 對抗生成網路GAN系列——GANomaly原理及原始碼解析
- 對抗生成網路GAN系列——WGAN原理及實戰演練
- CV攻城獅入門VIT(vision transformer)之旅——近年超火的Transformer你再不瞭解就晚了!
- 對抗生成網路GAN系列——DCGAN簡介及人臉影象生成案例
- 對抗生成網路GAN系列——CycleGAN簡介及圖片春冬變換案例
- 對抗生成網路GAN系列——AnoGAN原理及缺陷檢測實戰
- 目標檢測系列——Faster R-CNN原理詳解
- 目標檢測系列——Fast R-CNN原理詳解
- 目標檢測系列——開山之作RCNN原理詳解
- 【古月21講】ROS入門系列(4)——引數使用與程式設計方法、座標管理系統、tf座標系廣播與監聽的程式設計實現、launch啟動檔案的使用方法
- 使用kitti資料集實現自動駕駛——繪製出所有物體的行駛軌跡
- 使用kitti資料集實現自動駕駛——釋出照片、點雲、IMU、GPS、顯示2D和3D偵測框
- 基於pytorch搭建ResNet神經網路用於花類識別
- 基於pytorch搭建GoogleNet神經網路用於花類識別
- 基於pytorch搭建VGGNet神經網路用於花類識別
- UWB原理分析
- 論文閱讀:RRPN:RADAR REGION PROPOSAL NETWORK FOR OBJECT DETECTION IN AUTONOMOUS
- 凸優化理論基礎2——凸集和錐