【目標檢測算法系列】四、Faster R-CNN算法

前面我們學習了

【目標檢測算法系列】一、R-CNN算法

【目標檢測算法系列】二、SPP-Net算法.

【目標檢測算法系列】三、Fast R-CNN算法

這次,我們緊接着,繼續看下 Faster R-CNN。

上次我們講到Fast R-CNN時,說過Fast R-CNN雖然已經對之前的R-CNN系列算法做了很多改進,不管是速度還是精度,都得到了一個很大的提升,但是還有一個可以優化的地方就是最開始時候的,候選框的提取算法。不管是R-CNN, SPP-Net, Fast R-CNN,都是依靠區域選擇算法來進行推測目標位置,但是這種方案很耗時。而Faster R-CNN的提出,終於解決了這個瓶頸問題,Faster R-CNN使用了一種新的區域提出網絡(RPN),該網絡將與檢測網絡共享整個圖像的卷積特徵,從而大大減少了候選框提取的時間成本,同時使Faster R-CNN成爲一個真正意義上的端到端的網絡模型。下面我們來具體看看

一、Faster R-CNN整體架構

Faster R-CNN整體架構如上圖所示,它由兩個模塊組成,負責進行候選框提取的RPN網絡模塊,以及使用提取出來的候選框進行檢測的Fast R-CNN檢測模塊。具體來講這兩個模塊的關係,就是RPN告訴Fast R-CNN要看哪裏。兩個模塊共享卷積特徵,整個Faster R-CNN系統,就是一個統一的目標檢測網絡模型。

二、區域提案網絡(RPN)詳解

Faster R-CNN模型,最主要的就是RPN網絡的提出,下來我們具體看下。

1.RPN網絡概況

RPN是一個全卷積網絡,它將通過基礎網絡(VGG等)的對應共享卷積模塊提取出來的feature map 作爲輸入,最終輸出提案框(候選框)的集合,每個提案框中有對應類別信息(背景或者前景)以及對應框的座標信息。

在RPN網絡中,在輸入的feature map上,滑動一個n*n(一般使用3*3)的小網絡窗口,每一個滑動窗口將會映射到一個低維向量上(對於ZF是256-d,對於VGG來說就是521-d),將這個向量輸出給兩個同級的全連接層,即檢測框迴歸層(reg)和檢測框分類層(cls)。如圖所示:

注:上面說過,RPN網絡是一個全卷積網絡,爲何這塊又會出現全連接層呢?其實這個是針對單個滑動窗口來說,結合到一塊,整體針對整個輸入的feature map,就是先進行3*3的卷積,然後再跟上兩個同級的1*1的卷積filter進行分類和迴歸,如下圖所示:

 

2.anchor boxs

爲了解決各個待檢測對象大小不定的問題,RPN中引入了anchor boxs。

爲了檢測不同大小的對象,在上述每一個滑動窗口的位置,以滑動窗口的中心爲中心點,我們同時預測k個anchor ,anchor 一般採用三種面積尺寸(128^2,256^2,512^2)以及每個尺寸下的三種長寬比(1:1,1:2,2:1),所以針對每個滑動窗口,需要使用k=9個anchor.如下圖:

因爲在RPN網絡中,最終輸入與輸出的長寬尺寸是不變的,改變的只是channel通道數,所以,針對於的feature map,總共需要個anchor,最終RPN網絡的分類層輸出爲:,迴歸層輸出爲:

(因爲RPN只進行前景和背景的粗分類,所有對於feaure map中的每個位置,輸出爲2k個值,每個anchor需要通過4個值來定位,所以每個位置對應的迴歸層輸出個數爲4k)

3.anchor的具體提取

雖然anchors是基於共享卷積層後feature map來定義的,但是最終的anchors是建立在原始圖片上的。

所以,我們是基於原圖來生成anchors的,之前在說Fast R-CNN中的ROIpooling層我們說過,因爲提取feature map的卷積模塊,只有卷積層和pooling層,所以feature map的尺寸與原圖的尺寸是成比例映射關係的,如果圖片尺寸 w*h,特徵圖的尺寸則是w/r * h/r 如果在卷積特徵圖空間位置定義 anchor,則最終的圖片會是由 r 像素劃分的 anchors 集. (VGG 中, r=16)。另外,對於那些跨越圖像邊界的anchor,我們直接忽略掉。

4.RPN網絡具體訓練過程

首先,RPN網絡的輸入即爲共享卷積模塊提取出來的feature map。在訓練時,需要將所有的anchor分爲正樣本(前景)和負樣本(背景)。

其中正樣本包含以下兩類anchor:

  1. 與ground-truth(真實檢測框)IOU最高的anchor

  2. 與任意ground-truth(真實檢測框)的IOU大於0.7的anchor

可以看到,一個ground-truth可能對應多個anchor。

而對於與所有的ground-truth的IOU都小於0.3的anchor,我們分配到負樣本。對於剩餘的那些非正非負的anchor,我們將其丟棄,不進行訓練。

對於一張圖片的所有正負樣本的anchor,並不會都用來訓練,而是隨機在一張圖片中採樣256個anchor作爲一個mini-batch,計算mini-batch的損失函數,其中採樣的正負anchor的比例最多是1:1。如果一個圖像中的正樣本數小於128,我們就用負樣本填補這個mini-batch。(如果採用所有的anchor的話,預測結果會偏向於負樣本,因爲負樣本是佔大多數的)。

RPN網絡中的損失函數,與Fast R-CNN中的基本保持一致,如下所示:

相關參數代表含義如下:

其中爲第i個anchor預測爲前景的概率,當第i個anchor爲正樣本時,,當第i個anchor爲負樣本時,,由此可見,只有在正樣本時,纔會去關係後面的迴歸檢測。即爲一個mini-batch

爲第i個anchor(正樣本)到預測區域的對應4個平移縮放參數,爲第i個anchor(正樣本)到ground-truth(真實檢測框)的對應4個平移縮放參數。

即爲一個mini-batch。

下面具體看下

對於分類損失函數,因爲RPN中的分類是一個二值分類器,所以

迴歸損失函數爲(兩種變換之差最小化):

其中,

最後,參數用來權衡分類和迴歸損失,默認值爲=10

至此,通過RPN網絡得到了對應提案框以及每個提案框的得分,並對得分使用NMS(非極大值抑制),閾值爲0.7,得到得分靠前的TOP-N(論文中爲300個)個提案框提供給後續的ROI池化層。

三、ROI池化層

Faster R-CNN中的ROI池化層和Fast R-CNN中的是一樣的。對於前面的共享卷積層所提取出來的feature map,既會提供給RPN網絡進行提案框的提取,也會提供給ROI池化層。

對於ROI池化層來說,對於輸入的feature map,會根據RPN網絡最終所提供出來的提案框,來找到對應提案框在feature map上的映射,也就是對應ROI(候選框所對應的feature map)。正如之前所有,RPN告訴Fast R-CNN要看哪裏。然後後續,就和Fast R-CNN完全一樣,將輸入的不同ROI(候選框所對應的feature map)劃分爲H*W的塊,然後在每個塊中使用最大池化層提取出一個特徵,對應池化操作獨立於每個feature map通道,最終輸出H*W*c(c爲通道數)的特徵。將輸入的特徵轉換爲特徵向量餵給後面的全連接層。(對於使用的VGG16爲基礎模型來說,這塊H*W爲7*7)。

四、最終的分類和迴歸

講過ROI池化層,提取出固定長度的特徵向量,進行後續的全連接層、分類,迴歸,和Fast R-CNN中完全一樣,這塊不再贅述。

五、Faster R-CNN完整訓練流程

通過上面的說明,我們知道了,Faster R-CNN是將經過共享卷積模塊提取出來的feature map通過RPN網絡來進行候選框的提取,同時進行粗分類和粗迴歸,然後再經過ROI池化層來提取出固定的特徵向量,送入全連接層中,進行最終的精確分類與迴歸。

完整訓練流程如下:

1. 先使用ImageNet數據集訓練一個CNN網絡(這塊採用VGG)

2. 進行數據預處理,將輸入圖像的尺寸經過縮放固定到600*600,

3. 使用預訓練網絡的卷積模塊(具體到block5_conv3)提取feature map,送入RPN網絡中,端到端的fine-tune(微調)RPN網絡。

4. 先固定RPN的權值,利用第3步中RPN生成的提案框,訓練一個單獨 的Fast R-CNN檢測網絡。這個檢測網絡同樣是由ImageNet預訓練 的模型初始化的,這時候兩個網絡還沒有共享卷積層

5. 用第四步訓練的檢測網絡來初始化RPN訓練,但是訓練時,我們固 定共享的用來提取feature map的卷積層,只微調RPN獨有的層。

6. 繼續保持固定共享的卷積層,微調Fast R-CNN的FC層。

這樣進行下來,兩個網絡共享相同的卷積層,構成一個統一的網絡。上述的最後的交替訓練可以迭代多次,但是論文中提出對結果並沒有多大改進。

上述就是Faster R-CNN的相關內容,一個真正意義上的端到端的網絡模型,相對於之前的RCNN系列,檢測速度有個很大的提升,幾乎可以做到實時檢測,並且,精度上也有較大提升。

歡迎關注我的個人公衆號 AI計算機視覺工坊,本公衆號不定期推送機器學習,深度學習,計算機視覺等相關文章,歡迎大家和我一起學習,交流。

                                

 

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