寫在前面的話
在目標檢測的歷史中,RCNN的出現使得深度學習和目標檢測結合在了一起,RCNN的出現就是這一發展的開端。
在我自己的學習中,結束了Selective Search的學習后,自然就開始學習了RCNN,本來想三個RCNN一個一個學的,后來發現這三個之間的聯系非常緊密,並且是一步一步將所有的工作就放入深度學習中,(重點是只有faster-rcnn的開源代碼)doge所以我先學習了三種算法的原理和步驟以及區別,后面便是針對一份開源代碼進行理解和加深。發現自己水文字的能力挺強🐶
RCNN
算法步驟
Step 1:分割候選區域(一般采用Selective Search方法、Slide Window方法等)我上一篇文章、關於Selective Search
Step 2:每個候選區域進入到CNN網絡中提取特征向量
Step 3:對於提取到的特征向量,利用支持向量積進行分類,同時對其進行邊界框回歸 (難點 為什么要邊界框回歸和怎么進行?)
RCNN 難點
為什么要邊界框回歸和怎么進行
答:
1.之所以要進行邊界框回歸,是因為僅僅靠第一步分割的候選區域和真正的ground truth相比比較粗糙,利用邊界框回歸可以候選框更加細致。
2.邊界框回歸的具體可以看我參考博客的第2條,下面說說我的理解:
首先介紹一些名詞:
名詞變量 | 解釋 |
---|---|
ground truth | 人工標記的目標框,包含四個參數,分別是xmin,ymin,xmax,ymax |
bounding box | 一般指的是算法中的候選框,簡記為bbox,同理也包含相同的參數 |
(xmin,ymin) | 框的左下角 |
(xmax,ymax) | 框的右上角 |
關於邊界框的回歸,直觀但是錯誤的理解是根據提取的特征向量學習(xmin,ymin,xmax,ymax)坐標,然后利用平方損失函數梯度下降等等,修改可學習的參數;實際上邊界框回歸學習的是bbox和ground truth之間的變形比例,變形比例包含了平移變換和縮放變換。
為了學習平移變換和縮放變換比例,進行如下變換:
原來的坐標 | 后來的坐標 |
---|---|
bbox的坐標\(P(x_{min},y_{min},x_{max},y_{max})\) | \(P(x,y,w,h)\) |
ground truth的坐標\(G(x_{min},y_{min},x_{max},y_{max})\) | \(G(x,y,w,h)\) |
其中\(x = \frac{x_{min}+x_{max}}{2},y = \frac{y_{min}+y_{max}}{2},w = x_{max}-x_{min},h = y_{max}-y_{min}\)
RCNN中的變形轉換關系:
\(\hat{G_x} = P_wd_x(P)+P_x\)
\(\hat{G_y} = P_hd_y(P)+P_y\)
\(\hat{G_w} = P_w\exp(d_w(P))\)
\(\hat{G_h} = P_h\exp(d_h(P))\)
我們的目的就是求的\(d_x(P),d_y(P),d_w(P),d_h(P)\)使得兩個框最接近,這四個參數都是通過提取到的特征向量\(\phi(P)\)學習出來的,即\(d_*(P) = w_*\phi(P)\),這里的\(w_*\)就是邊界框回歸需要學習的參數,而\(d_*(P)\)是學習的結果。
學習目標:\(w_* = {argmin}_{w_*} \sum_i^N(t_*^i-w_*\phi(P))+\lambda{||w_*||}^2\)
其中:\(t_x = \frac{G_x-P_x}{P_w},t_y = \frac{G_y-P_y}{P_h},t_w = log(\frac{G_w}{P_w}),t_h = log(\frac{G_h}{P_h})\)
這就是邊界框回歸的內容了,通過這個優化問題就可以求出最合適的變形比例。
Fast-RCNN
算法步驟
Step 1:分割候選區域,同RCNN第一步
Step 2:將整個圖片都放入CNN網路中提取特征圖(這里和RCNN就不同了,因為沒有將候選區域一個一個放入CNN,所以速度得到了極大的提升)
Step 3:找到原圖上的候選區域ROI在特征圖上的映射 (難點1 原圖和特征圖之間的映射?)
Step 4:對於每個ROI映射采用ROI Pooling(簡單的說就是使不規則的輸入變成規則的輸出,可以認為是在根據輸出反推pool層的Bins) (難點2 什么是ROIpooling?)
Step 5:接全連接層,預測分類和邊界款回歸
Fast-RCNN 難點
步驟2中原圖和特征圖之間的映射?
在介紹原圖和特征圖之間的映射之前,首先介紹一個重要的概念:
感受野概念
在機器視覺領域的深度神經網絡中有一個概念叫做感受野,用來表示網絡內部的不同位置的神經元對原圖像的感受范圍的大小。神經元之所以無法對原始圖像的所有信息進行感知,是因為在這些網絡結構中普遍使用卷積層和pooling層,在層與層之間均為局部相連(通過sliding filter)。神經元感受野的值越大表示其能接觸到的原始圖像范圍就越大,也意味着他可能蘊含更為全局、語義層次更高的特征;而值越小則表示其所包含的特征越趨向於局部和細節。因此感受野的值可以大致用來判斷每一層的抽象層次。(來自參考資料,第三條)
簡單來說,就是一個神經元的輸出是由輸入圖像哪些區域(field)決定
上圖中,如果第一層是原圖輸入的話,那么第二層卷積神經網絡的神經元的感受野為11。
感受野計算公式
\(r_n = r_{n-1}\times k_n - (r_{n-1} - \prod_{i=1}^{n-1}s_i)\times(k_n - 1) = r_{n-1} + (k_n - 1)\prod_{i=1}^{n-1}s_i,n\geq 2\)
\(r_i\):表示第i層神經元的感受野大小,\(k_i\):表示第i層的卷積層kernel_size,\(s_i\):表示第i層的步長。
需要注意的是r1計算是沒有標明的,而且r0 = 1;同時,只有神經元具有感受野,輸出的圖像並不具備,但是直觀上來講,總是卷積層的輸出的一個像素點對應原圖的范圍,但是不是該像素點具有感受野,這是我自己經常理解錯誤的細節,所以r0 = 1也是存在一定爭議的,因為並不具備神經元,但是直觀上來說輸入圖像上的一像素點確實只能看見自己。
(具體內容可以見參考資料第三條,不足的就是只有卷積層的計算公式沒有其他層的,總覺着這里有缺陷)
感受野上的坐標映射
公式:一般都是中心點的映射(具體內容見參考資料第四條)
\(for\quad conv/pooling\quad layer: p_i = s_ip_{i+1}+\frac{k_i-1}{2}-padding\)
\(for\quad activate\quad cell : p_i = p_{i+1}\)
\(p_i\):表示神經網絡中第i張特征圖(包括原圖)的坐標,
當然如果padding的取值為\(\lfloor \frac{k_i}{2}\rfloor\),對於卷積或者池化層,公式變為\(p_i = s_ip_{i+1}\),同時對公式進行級聯,可知第i+1個特征圖上任意一點對應於原圖的坐標\(p_0 = p_{i+1}\prod_{j=0}^is_j\)
什么是ROIpooling?
一般情況下的pooling層是給定pool層的系數,對特征圖進行池化操作,但是在這個fast-rcnn中,每個區域的大小不完全相同,導致通過正常的pool層后,特征向量大小不同無法進行下一步轉換。
ROIpooling是一種特殊pool層,特殊的地方在於不要求輸入特征圖和pool層的大小,但是規定了輸出的特征向量大小,也就是說,根據輸入特征圖的大小和規定的輸出尺寸,反推在輸入特征圖上的Bins,然后在Bins上進行max或者average操作。
ROIpooling過程:根據給定的特征圖和ROIs,找到每個ROI在特征圖上的映射,然后放入ROIpooling層進行轉換操作
Faster-RCNN
算法步驟
Step 1: 將整張圖片放入網絡的extractor中提出特征圖(可以發現沒有了獨立於網絡的提取候選區域)
Step 2:利用RPN網絡(Region Proposal Network)提取候選區域ROI(候選區域是針對原圖的,而不是提取的特征圖),此時候選區域應該稱作anchor boxes。(難點 RPN?)
Step 3:ROIpooling
Step 4: 接全連接層,預測分類和邊界框回歸
這里可以很明顯的看到,整個過程都是利用了神經網絡和深度學習,沒有任何獨立的步驟。(在代碼中可以發現,網絡流程中包含了很多creator,但沒有獨立於網絡)
Faster-RCNN 難點
RPN的網絡結構
- 首先看看RPN的整體結構:可以看到是由一個3x3的卷積層,然后分別接上1x1x18的卷積層和1x1x36的卷積層組成。
設圖中features的大小為(C,H,W),通過3x3卷積層后,特征圖為(512,H,W)(至於為什么特征圖的H和W沒有變化是由於卷積核的巧妙設置),接着分別通過兩個卷積層,特征圖變為(18,H,W)和(36,H,W)
- 這么設計網絡結構的理由是:(來自於CSDN博主懶人元的理解,我覺得很能夠接受,參考資料第1條)
1.首先對特征圖進行3x3的卷積(圖片左上角),通過調整卷積核的參數,可以相當於在特征圖上進行滑動窗口為3x3的滑動窗口分割圖像,輸出的大小為(512,H,W),相當於H*W個特征向量。
2.在每個位置上,對特征向量接入兩個全連接層,大小分別是(512,2)和(512,4),可以得到這個位置在原圖上的感受野區域是前景還是背景的得分(2),還有感受野區域的變形比例(4)(圖中是x,y,w,h,我覺得應該不是,而且在代碼也是求出變形比例)。
3.引入anchor box的內容,在每個像素點上都具有9個固定大小的anchor boxes,那么兩個全連接層的大小應該是(512,18)和(512,36),也就是第二點的描述中,感受野區域變為了H*W*9個anchor boxes。
4.同時兩個全連接層可以用1x1x18和1x1x36的卷積核代替
5.生成的anchor box可以通過非極大抑制和“加上”變形比例等操作生成我們需要的ROIs,候選區域。
至於RPN的損失和訓練方式,在代碼中就可以看到,原理層面我不太會用語言描述
參考博客和資料
感謝他們🎉🎉🎉🎉,接下來就是對代碼的整體邏輯和重點代碼進行描述和理解啦
同一博主我只貼上一份鏈接
- RPN解析--懶人元--CSDN
- bounding box理解--huapyuan--cnblog
- 深度神經網絡中的感受野(Receptive Field)--藍榮禕--zhihu
- 原始圖片中的ROI如何映射到到feature map?--lemon--zhihu