「目標檢測算法系列」四、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演算法

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)。如圖所示:

「目標檢測算法系列」四、Faster R-CNN演算法

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

「目標檢測算法系列」四、Faster R-CNN演算法

2。anchor boxs

為了解決各個待檢測物件大小不定的問題,RPN中引入了anchor boxs。

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

「目標檢測算法系列」四、Faster R-CNN演算法

因為在RPN網路中,最終輸入與輸出的長寬尺寸是不變的,改變的只是channel通道數,所以,針對於

「目標檢測算法系列」四、Faster R-CNN演算法

的feature map,總共需要

「目標檢測算法系列」四、Faster R-CNN演算法

個anchor,最終RPN網路的分類層輸出為:

「目標檢測算法系列」四、Faster R-CNN演算法

,迴歸層輸出為:

「目標檢測算法系列」四、Faster R-CNN演算法

(因為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:

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

與任意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中的基本保持一致,如下所示:

「目標檢測算法系列」四、Faster R-CNN演算法

相關引數代表含義如下:

其中

「目標檢測算法系列」四、Faster R-CNN演算法

為第i個anchor預測為前景的機率,當第i個anchor為正樣本時,

「目標檢測算法系列」四、Faster R-CNN演算法

,當第i個anchor為負樣本時,

「目標檢測算法系列」四、Faster R-CNN演算法

,由此可見,只有在正樣本時,才會去關係後面的迴歸檢測。

「目標檢測算法系列」四、Faster R-CNN演算法

即為一個mini-batch

「目標檢測算法系列」四、Faster R-CNN演算法

為第i個anchor(正樣本)到預測區域的對應4個平移縮放參數,

「目標檢測算法系列」四、Faster R-CNN演算法

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

「目標檢測算法系列」四、Faster R-CNN演算法

即為一個mini-batch。

下面具體看下

「目標檢測算法系列」四、Faster R-CNN演算法

「目標檢測算法系列」四、Faster R-CNN演算法

對於分類損失函式

「目標檢測算法系列」四、Faster R-CNN演算法

,因為RPN中的分類是一個二值分類器,所以

「目標檢測算法系列」四、Faster R-CNN演算法

迴歸損失函式

「目標檢測算法系列」四、Faster R-CNN演算法

為(兩種變換之差最小化):

「目標檢測算法系列」四、Faster R-CNN演算法

其中,

「目標檢測算法系列」四、Faster R-CNN演算法

最後,

「目標檢測算法系列」四、Faster R-CNN演算法

引數用來權衡分類和迴歸損失,預設值為

「目標檢測算法系列」四、Faster R-CNN演算法

=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系列,檢測速度有個很大的提升,幾乎可以做到實時檢測,並且,精度上也有較大提升。

後面,我們將透過keras來實現Faster RCNN。

參考文獻:K碼農-http://kmanong。top/kmn/qxw/form/home?top_cate=28