您好,登錄后才能下訂單哦!
目標檢測需要獲取圖片中所有目標的位置及其類別,對于圖2-1 中的 3 張圖而言,當圖片中只有一個目標時,“regression head”預測 4 個值,當圖片中有 3 個目標時,“regression head”預測 12 個值,那么當圖片中有多個目標時,“regression head”要預測多少個值呢?
這時根據讀者已經學過的一些知識,可能會嘗試用滑窗的方法來解決,如圖2-2所示。但是,這里有一個問題,我們需要設計大量的不同尺度和長寬比的“滑窗”使它們通過CNN,然而這個計算量是非常巨大的。有沒有什么方法能使得我們快速定位到目標的潛在區域,從而減少大量不必要的計算呢?
學者們在這個方向做了很多研究,比較有名的是selective search 方法,具體方法這里不做詳細說明,感興趣的讀者可以看關于selective search 的論文。大家只要知道這是一種從圖片中選出潛在物體候選框(Regions of Interest,ROI)的方法即可。有了獲取ROI 的方法,接下來就可以通過分類和合并的方法來獲取最終的目標檢測結果。基于這個思路有了下面的R-CNN 方法。
下面介紹R-CNN[1] 的訓練過程,整體訓練流程如圖2-3 所示:
圖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)是尺度縮放。
接下來,為了獲得一個好的特征提取器,一般會在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 維特征向量。
(3)訓練最終的分類器
這里為每個類別單獨訓練一個SVM 分類器。這里面有個小技巧,SVM 的訓練也需要選擇正負樣本,R-CNN 的提出者做了一個實驗來選擇最優IOU 閾值,最終僅僅選擇真實值的矩形框作為正樣本。
注意:正負樣本的選擇比較有講究,Fast R-CNN 和Faster R-CNN 是根據IOU 的大小選取正負樣本,2.2.3 節有詳細介紹。
(4)為每個類訓練一個回歸模型,用來微調ROI 與真實矩形框位置和大小的偏差,如圖2-6 所示。
下面是所有檢測問題都會用到的一塊代碼: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 獲得,矩形框的位置通過回歸方式獲得。
文章來源:阿里云-機器智能技術
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。