目標檢測入門系列手冊二:RCNN訓練教程

視覺計算發表於2019-12-10

,學習全套目標檢測演算法&模型

image.png

目標檢測需要獲取圖片中所有目標的位置及其類別,對於圖2-1 中的 3 張圖而言,當圖片中只有一個目標時,“regression head”預測 4 個值,當圖片中有 3 個目標時,“regression head”預測 12 個值,那麼當圖片中有多個目標時,“regression head”要預測多少個值呢?

image.png

這時根據讀者已經學過的一些知識,可能會嘗試用滑窗的方法來解決,如圖2-2所示。但是,這裡有一個問題,我們需要設計大量的不同尺度和長寬比的“滑窗”使它們透過CNN,然而這個計算量是非常巨大的。有沒有什麼方法能使得我們快速定位到目標的潛在區域,從而減少大量不必要的計算呢?

image.png

image.png

學者們在這個方向做了很多研究,比較有名的是selective search 方法,具體方法這裡不做詳細說明,感興趣的讀者可以看關於selective search 的論文。大家只要知道這是一種從圖片中選出潛在物體候選框(Regions of Interest,ROI)的方法即可。有了獲取ROI 的方法,接下來就可以透過分類和合並的方法來獲取最終的目標檢測結果。基於這個思路有了下面的R-CNN 方法。

R-CNN

下面介紹R-CNN[1] 的訓練過程,整體訓練流程如圖2-3 所示:

image.png

圖2-3 R-CNN 訓練過程[9]

(1)選出潛在目標候選框(ROI)
objectness[10], selective search[11], category-independent object proposals[12]等很多論文都講述了候選框提取的方法,R-CNN 使用selective search 的方法選出2000 個潛在物體候選框。

(2)訓練一個好的特徵提取器
R-CNN 的提出者使用卷積神經網路AlexNet 提取4096 維的特徵向量,實際上使用VGGNet/GoogLeNet/ResNet 等也都可以。細心的讀者會發現,AlexNet等網路要求輸入的圖片尺寸是固定的,而步驟(1)中的ROI 尺寸大小不定,這就需要將每個ROI 調整到指定尺寸,調整的方法有多種,可參見圖2-4,其中(a)是原始ROI 圖片,(b)是包含上下文的尺寸調整,(c)是不包含上下文的尺寸調整,(d)是尺度縮放。

image.png

接下來,為了獲得一個好的特徵提取器,一般會在ImageNet 預訓練好的模型基礎上做調整(因為ImageNet 預測的種類較多,特徵學習相對完善),唯一的改動就是將ImageNet 中的1000 個類別的輸出改為(C+1)個輸出,其中C 是真實需要預測的類別個數,1 是背景類。新特徵的訓練方法是使用隨機梯度下降(stochastic gradient descent,即SGD),與前幾章介紹的普通神經網路的訓練方法相同。

提到訓練,就一定要有正樣本和負樣本,這裡先丟擲一個用於衡量兩個矩形交疊情況的指標:IOU(Intersection Over Union)。IOU 其實就是兩個矩形面積的交集除以並集,如圖2-5 所示。一般情況下,當IOU>=0.5 時,可以認為兩個矩形基本相交,所以在這個任務中,假定兩個矩形框中,1 個矩形代表ROI,另一個代表真實的矩形框,那麼當ROI 和真實矩形框的IOU>=0.5 時則認為是正樣本,其餘為負樣本。

至此,R-CNN 的第二步特徵提取器可以開始訓練了,不過在訓練過程中要注意,需要對負樣本進行取樣,因為訓練資料中正樣本太少會導致正負樣本極度不平衡。最終在該步得到的是一個卷積神經網路的特徵提取器,其特徵是一個4096 維特徵向量。

image.png

(3)訓練最終的分類器
這裡為每個類別單獨訓練一個SVM 分類器。這裡面有個小技巧,SVM 的訓練也需要選擇正負樣本,R-CNN 的提出者做了一個實驗來選擇最優IOU 閾值,最終僅僅選擇真實值的矩形框作為正樣本。

注意:正負樣本的選擇比較有講究,Fast R-CNN 和Faster R-CNN 是根據IOU 的大小選取正負樣本,2.2.3 節有詳細介紹。

(4)為每個類訓練一個迴歸模型,用來微調ROI 與真實矩形框位置和大小的偏差,如圖2-6 所示。

image.png

下面是所有檢測問題都會用到的一塊程式碼:IOU 的計算。

def bboxIOU (bboxA, bboxB):

A_xmin = bboxA[0]
A_ymin = bboxA[1]
A_xmax = bboxA[2]
A_ymax = bboxA[3]
A_width = A_xmax - A_xmin
A_height = A_ymax - A_ymin

B_xmin = bboxB[0]
B_ymin = bboxB[1]
B_xmax = bboxB[2]
B_ymax = bboxB[3]
B_width = B_xmax - B_xmin
B_height = B_ymax - B_ymin

xmin = min(A_xmin, B_xmin)
ymin = min(A_ymin, B_ymin)
xmax = max(A_xmax, B_xmax)
ymax = max(A_ymax, B_ymax)

A_width_and = (A_width + B_width) - (xmax - xmin) # 寬的交集
A_height_and = (A_height + B_height) - (ymax - ymin) # 高的交集

if ( A_width_and <= 0.0001 or A_height_and <= 0.0001):
return 0

area_and = (A_width_and * A_height_and)
area_or = (A_width  A_height) + (B_width B_height)
IOU = area_and / (area_or - area_and)

return IOU

預測階段有如下幾個步驟:
(1)同樣地,使用selective search 方法先選出2000 個ROI。

(2)所有ROI 調整為特徵提取網路所需的輸入大小並進行特徵提取,得到2000個ROI 對應的2000 個4096 維的特徵向量。

(3)將2000 個特徵向量分別輸入到SVM 中,得到每個ROI 預測的類別。

(4)透過迴歸網路微調ROI 的位置。

(5)最終使用非極大值抑制(Non-Maximum Suppression,NMS)方法對同一個類別的ROI 進行合併得到最終檢測結果。NMS 的原理是得到每個矩形框的分數(置信度),如果兩個矩形框的IOU 超過指定閾值,則僅僅保留分數大的那個矩形框。

以上就是R-CNN 的全部過程,我們可以從中看出,R-CNN 存在的一些問題:
● 不論是訓練還是預測,都需要對 selective search 出來的 2000 個 ROI 全部透過CNN 的forward 過程來獲取特徵,這個過程非常慢。

● 卷積神經網的特徵提取器和用來預測分類的 SVM 是分開的,也就是特徵提取的過程不會因SVM 和迴歸的調整而更新。

● R-CNN 有非常複雜的操作流程,而且每一步都是分裂的,如特徵提取器透過softmax 分類獲得,最終分類結果由SVM 獲得,矩形框的位置透過迴歸方式獲得。

文章來源:阿里雲-機器智慧技術



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69956605/viewspace-2667644/,如需轉載,請註明出處,否則將追究法律責任。

相關文章