- 深度學習高手筆記(卷2):經典應用
- 劉巖(@大師兄)
- 2436字
- 2024-09-05 16:45:38
1.4.1 區域候選網絡
1.提出動機
由于CNN具有強大的擬合能力,很自然地我們可以想到使用CNN提取候選區域,因此,便產生了Faster R-CNN最核心的模塊:區域候選網絡(region proposal network,RPN)。通過SPP-Net的實驗得知,CNN可以很好地提取圖像語義信息,例如圖像的形狀、邊緣等。所以,這些特征理論上也應該能夠用于提取候選區域(這也符合深度學習解決一切圖像問題的思想)。在Faster R-CNN的論文中給RPN的定義如下:RPN是一種可以進行端到端訓練的全卷積網絡,主要用來生成候選區域。
2.RPN與Fast R-CNN
RPN最核心的結構是一個叫作錨點(anchor)的模塊。錨點是通過在Conv5上使用大小為3×3、步長為1的滑窗,在輸入圖像上取得的一系列檢測框。在取錨點時,同一個中心點取3個尺度、3個比例,共9個錨點。Faster R-CNN使用的候選區域便是用RPN標注了標簽為正的錨點。從另一個角度講,RPN的思想類似于注意力機制,注意力機制中“where to look”要看的地方便是錨點。
在Faster R-CNN中,RPN用來生成候選區域,Fast R-CNN使用RPN生成的候選區域進行目標檢測,且二者共享CNN的參數,這便是Faster R-CNN的核心框架(見圖1.12)。由此可見,RPN和Fast R-CNN是相輔相成的,在Faster R-CNN的論文中使用了交叉訓練的方法訓練該網絡,RPN和Fast R-CNN兩個模塊互相用對方優化好的參數,具體內容會在1.4.2節介紹。

圖1.12 Faster R-CNN的核心框架
Faster R-CNN分成兩個核心部分:
● 使用RPN生成候選區域;
● 使用這些候選區域的Fast R-CNN。
首先我們要確定RPN的輸入與輸出,RPN的輸入是任意尺寸的圖像,輸出是候選區域的坐標和它們的置信度得分。當然,由于RPN是一個多任務的監督學習,因此我們也需要圖像的真值框。RPN是一個多任務模塊,它的任務有兩個,任務一是計算當前錨點是前景的概率和是背景的概率,所以是兩個二分類問題;任務二是預測錨點中前景區域的坐標(x, y, w, h),所以是一個回歸任務,該回歸任務預測4個值。RPN對每一組不同尺度的錨點區域,都會單獨訓練一組多任務損失,且這些任務參數不共享。這么做是為了避免多個錨點無法和單一的真值框對應的問題。所以,如果有k個錨點,那么RPN是一個有6×k個輸出的模型。
3.RPN的錨點
首先,RPN的滑窗(步長為1)是在特征層(Conv5層)進行的,通過3×3卷積將該窗口內容映射為特征向量(圖1.13中的256維的特征向量)。根據卷積的位移不變性,要將Conv5層特征映射到輸入圖像感受野的中心點只需要乘降采樣尺度即可。由于VGG使用的都是same卷積,降采樣尺度等于所有池化的步長的積,如式(1.10)所示。相對位移便是特征圖上的位移除以降采樣尺度。

圖1.13 RPN的滑窗

(1.10)
因此,在特征層上的步長為1的滑窗也可以理解為在輸入圖像上步長為_feat_stride的滑窗。例如,一個最短邊縮放到600的4 : 3的輸入圖像,經過4次降采樣后,特征圖的大小為。進行步長為1的滑窗后,得到了W×H×k個錨點。由于部分錨點邊界超過了圖像,這部分錨點會被忽略,因此并不是所有錨點都參與采樣。
特征圖上的一個點可以對應輸入圖像上的一個區域,這個區域便是感受野。在感受野的每個中心取9個錨點,這9個錨點有3個尺度,分別是1282、2562和5122,每個尺度有3個比例,分別是1 : 1、1 : 2和2 : 1。代碼中錨點的坐標為:
[[?-84.??-40.???99.???55.] ?[-176.??-88.??191.??103.] ?[-360.?-184.??375.??199.] ?[?-56.??-56.???71.???71.] ?[-120.?-120.??135.??135.] ?[-248.?-248.??263.??263.] ?[?-36.??-80.???51.???95.] ?[?-80.?-168.???95.??183.] ?[-168.?-344.??183.??359.]]
可視化該錨點,得到圖1.14,其中黃色部分代表中心點的感受野。在這個錨點列表中,會有很多數值為負的錨點,在實際的實現過程中,錨點的值會被向上/向下進行截斷,因此不會有超出圖像邊界的問題。

圖1.14 Faster R-CNN的錨點可視化
根據SPP-Net所介紹的感受野的知識,我們知道特征圖上的一個點對應的感受野是輸入圖像的一個區域,該區域可以根據CNN結構反向遞推得出。我們可以計算出VGG-16的感受野的大小是228,遞推過程總結如圖1.15所示,圖中Convi-j表示的是第i個網絡塊的第j個卷積,箭頭上方的數字表示該層的感受野的大小[14]。雖然Faster R-CNN的論文中說這種錨點并沒有經過精心設計,但我認為這批錨點表現好不是沒有原因的。這些錨點分別覆蓋被感受野包圍、和感受野大小類似以及完全將感受野覆蓋3種情況,可見這樣設計錨點覆蓋的情況還是非常全面的。
[14] 由于RPN的特征向量是從Conv5層經過大小為3×3的卷積核獲得的,因此應該從3開始向前遞推。

圖1.15 RPN的滑窗
在輸出特征圖中,每個中心對應了9個不同的錨點,進而會產生9種不同的預測結果。Faster R-CNN根據9種不同尺寸和比例的錨點,獨立地訓練9個不同的回歸模型,這些模型的參數是不共享的,這就是RPN的模型有6k個輸出的原因,如圖1.16所示。

圖1.16 RPN的輸出層
4.損失函數
對接近2000個錨點都進行分類是不太現實的。一個原因是這2000個錨點的數量過于龐大,會影響訓練速度;另一個原因是這2000個錨點絕大多數都是負樣本錨點,正負樣本的分布極其不均衡。RPN的分類任務使用的是名為“Image-centric”的采樣方法,即每次采樣少量的圖像,然后從圖像中隨機采樣錨點正負樣本。具體來講,RPN每次隨機采樣一幅圖像,然后在每幅圖像中采樣256個錨點,并盡量保證正負樣本的比例是1 : 1。由于負樣本的數量超過128,因此當正樣本數量不夠時,將使用負樣本補充。在回歸任務中,RPN使用的是全部錨點。
RPN的損失函數是一個多任務的損失函數,其中分類任務Lcls用來判斷該錨點是正樣本還是負樣本,回歸任務用來檢測目標的檢測框,表示為式(1.11):

(1.11)
式(1.11)中,Ncls和Nreg分別是參與分類和檢測的樣本數,其中Ncls=256,Nreg=2000。是樣本的標簽值(對于正樣本,值為1;對于負樣本,值為0),它乘Lreg表明只有正樣本參與檢測框的計算,λ是用來平衡兩個任務的參數,因為Ncls和Nreg的差距過大,在Faster R-CNN的實驗中,λ的值為
。
在檢測任務中,Faster R-CNN采用的是R-CNN提出的針對錨點(候選區域)的相對位置的預測。假設模型預測框的坐標為(x, y, w, h),真值框的坐標為(x*, y*, w*, h*),錨點的坐標為(xa, ya, wa, ha),那么預測框關于錨點的相對位置的計算方式如式(1.12)。同理,真值框相對于錨點的相對位置的計算方式如式(1.13)。

(1.12)

(1.13)
因為在RPN中只有正負兩類樣本,所以Lcls使用的是二類交叉熵損失函數,而Lreg使用的是Fast R-CNN中采用的Smooth L1損失。