R-CNN目標檢測詳細解析
《Rich feature hierarchies for Accurate Object Detection and Segmentation》
Author:Mr. Sun
Date:2019.03.18
Loacation: DaLian university of technology
摘要:
這篇論文是深度學習進行物體檢測的鼻祖級論文,Regions with CNN features(R-CNN)也可以說是利用深度學習進行目標檢測的開山之作。 R-CNN是將CNN方法應用到目標檢測上的一個里程碑,由年輕有為的RBG大神提出,借助CNN良好的特征提取和分類性能,通過Region Proposals方法實現目標檢測問題的轉化。
1、研究思路剖析—站在巨人的肩膀上
在過去的十多年時間里,傳統的機器視覺領域,通常采用特征描述算子來應對目標識別任務,這些特征描述算子最常見的就是 SIFT 和 HOG,而 OpenCV 有現成的 API 可供大家實現相關的操作。但是最近SIFT 和 HOG 的王者地位被卷積神經網絡撼動。
2012 年 Krizhevsky 等人在 ImageNet 舉辦的 ILSVRC 目標識別挑戰大賽中一戰成名,豪奪當年的第一名,Top5 錯誤率 15%,而他們團隊提出來的網絡結構以他們的導師名字命名,它就是 AlexNet,該結構有 5 層卷積層,2 層全連接層。詳細結構如圖1所示。
圖1:AlexNet-8網絡結構
因為 AlexNet 的出現,世人的目光重回神經網絡領域,以此為契機,不斷涌出各種各樣的網絡比如 VGG、GoogleNet、ResNet 等等。受 AlexNet 啟發,論文作者嘗試將 AlexNet 在 ImageNet 目標識別的能力泛化到 PASCAL VOC 目標檢測上面來。但一切開始之前,需要解決兩個主要的問題。
(1)如何利用深度的神經網絡去做目標的定位?
借鑒了滑動窗口思想,R-CNN 采用對區域進行識別的方案。具體是:
(a)給定一張輸入圖片,從圖片中提取 2000 個獨立的候選區域。
(b)對於每個區域利用 CNN 抽取一個固定長度的特征向量。
(c)再對每個區域利用 SVM 進行目標分類。
(2)如何在一個小規模的數據集上訓練能力強勁的網絡模型?
采用在 ImageNet 上已經訓練好的模型,然后在 PASCAL VOC 數據集上進行 fine-tune。因為 ImageNet 的圖像高達幾百萬張,利用卷積神經網絡充分學習淺層的特征,然后在小規模數據集做微訓練調優,從而可以達到好的效果。現在,我們稱之為遷移學習,是必不可少的一種技能。
2、R-CNN模型結構與訓練過程詳解
2.1 R-CNN結構分析
R-CNN的分類器結構如下圖2所示:
圖2:R-CNN模型結構
R-CNN算法一共分為四個步驟:
(1)候選區域選擇(Region Proposal)
能夠生成候選區域的方法很多,比如:objectness、selective search、category-independen object proposals、constrained parametric min-cuts(CPMC)、multi-scale combinatorial grouping、Ciresan等等。
Region Proposal就是為了獲得候選框的方法,本文作者不具體研究 Region Proposal 的方法而是采用的是 Selective Search,一般Candidate選項為2000個即可,這里不再詳述; 根據Proposal提取的目標圖像變形為固定尺寸(227*227)然后去均值,作為CNN的標准輸入。
(2)CNN特征提取(Feature Extraction )
標准CNN過程,根據輸入進行卷積/池化等操作,得到固定維度的輸出。本文在訓練SVM分類器時用的是FC7的特征輸出作為SVM的訓練輸入,在訓練Bounding-box回歸時使用的是conv5之后的pool5(6*6*256)的特征作為輸入的。
(3)分類(Classification)
對上一步的輸出向量進行分類(需要根據輸出特征訓練分類器),本文使用的是線性的SVM二分類分類器,每一個分類器都需要單獨訓練。
(4)邊界回歸(Bounding-box Regression)
通過邊界回歸(bounding-box regression) 得到精確的目標區域,由於實際目標會產生多個子區域,旨在對完成分類的前景目標進行精確的定位與合並,避免多個檢出。
R-CNN的整體結構如下圖3所示:
圖3:R_CNN整體結構
2.2 R-CNN訓練過程分析
步驟一:有監督分類器預訓練
ILSVRC樣本集上僅有圖像類別標簽,沒有圖像物體位置標注;而PASCAL VOC 2007樣本集上既有圖像中物體類別標簽,也有圖像中物體位置標簽;但是PASCAL VOC訓練樣本太少不足以去訓練一個大型的神經網絡, 因此作者以ILSVRC2012分類數據集(沒有約束框數據)作為輔助預訓練了CNN。預訓練采用了Caffe的CNN庫。總體來說,使用的CNN十分接近krizhevsky等人的網絡的性能,在ILSVRC2012分類驗證集在top-1錯誤率上比他們高2.2%。差異主要來自於訓練過程的簡化。
作者采用AlexNet CNN網絡進行有監督訓練,學習率=0.01;該網絡的輸入為227×227的ILSVRC訓練集圖像,輸出最后一層為4096維特征->1000類的映射,訓練的是網絡參數。然后傳入下一步進行遷移學習,也就是特定樣本下的 fine-tune ,獲得適合該樣本下的最優模型。AlexNet網絡結構如下圖4所示。
圖4:AlexNet網絡結構
步驟二:特定樣本下的分類器微調(fine-tune)
坦率的說,這一步就是我們經常說的遷移學習(Transfer Learning)。加載步驟一中訓練好的模型,使用該模型中特征提取的參數來初始化我們這里的CNN的參數。我們將AlexNet的FC7之后的1000-way(ImageNet類別數)換成21-way(PASCAL VOC類別數 + 背景),然后進行softmax回歸。這里使用通過SS(Selective Search)算法對圖像處理獲得2000個左右的候選區域(Region Proposal),然后將候選區域和真實標注區域(Ground Truth)的 IOU>0.5時作為正樣本,否則作為負樣本進行訓練。需要注意的是對於每一個隨機梯度(SGD)迭代,我們使用一個mini_batch=128的小批次,其中使用32個當前類的樣本(正樣本)和96個背景樣本作為負樣本。這一步的目的就是讓模型去學習特定的樣本,通過作者的實驗發現這一步驟還是很有必要的。作者得出結論是:不針對特定任務進行微調,而將CNN當成特征提取器,pool5層得到的特征是基礎特征, 從fc6和fc7等全連接層中所學習到的特征是針對特征任務特定樣本的特征,類似於學習到了分類性別分類年齡的個性特征。
這里的隨機梯度處理的是一張圖片的候選區域嗎?這里的mini_batch=128小批次中的32個正樣本和96和負樣本均來自哪?這里的正樣本中包含多少類別呢?
這個疑問我一直沒搞懂,先簡單說一下我的理解:首先,PASCAL VOC數據集標簽中應該是有標准矩形框的坐標和所屬類別的。我個人覺得這里處理的確實是一張圖片的2000個候選區域,然后通過和標准的Ground Truth計算IOU值選出很多正樣本和負樣本,然后在正樣本中隨機選出32張、在負樣本中選出96張,將它們作為一個批次進行前向傳播計算去fine-tune參數。反向傳播結束之后,再換下一張圖片進行下一輪的Region Proposal,一直到把這個分類模型訓練好,訓練結束后保存FC7層的特征(權重參數)。
步驟三:訓練SVM分類器
建立新的SVM的分類器模型,模型的FC7層之后修改為SVM分類器(多個線性二分類SVM)。將步驟二的模型的卷積層參數和FC6、FC7的參數加載到模型中,保持前7層參數不變,其它參數隨機初始化,只是讓分類器通過學習前面學習到的特征對物體進行分類。訓練的樣本仍然是來自一張圖片的2000個Region Proposal,計算IOU之后篩選出來正負樣本用於訓練分類器
針對每個類別訓練一個SVM的二分類器。輸入是FC7的特征,FC7的輸出維度是2000*4096,輸出的是是否屬於該類別,訓練結果是得到SVM的權重矩陣W,W的維度是4096*20。這里負樣本的選定和前面的有所不同,將IOU的閾值從0.5改成0.3,即IOU<0.3的是負樣本,IOU>0.7是正樣本。IOU的閾值選擇和前面fine-tuning不一樣,主要是因為:前面fine-tuning需要大量的樣本,所以設置成0.5會比較寬松。而在SVM階段是由於SVM適用於小樣本,所以設置0.3會更嚴格一點。
步驟四:邊界框回歸(Bounding-box Regression)
使用conv5之后的pool5的特征6*6*256維(輸入特征)和bounding box的ground truth(相當於要回歸的值)來訓練回歸,每種類型的回歸器單獨訓練。輸入是pool5的特征,以及每個樣本對的坐標和長寬值。另外只對那些跟ground truth的IOU超過某個閾值且IOU最大的Region Proposal回歸,其余的region proposal不參與。詳細說一下:對於某個region proposal:R,以及其對應的Ground truth:G,我們希望預測結果是:P,那么我們肯定希望P盡可能接近G。這里通過對pool5層的特征X做線性變換WX得到變換函數F(X),這些變換函數作用於R的坐標達到回歸的作用(包括對x,y的平移以及對w,h的縮放)。因此損失函數可以表達為:R和G的差距減去P和G的差距要盡可能小。
R-CNN的訓練具體流程:
(1)准備region proposal。對於訓練集中的所有圖像,采用selective search方式來獲取,最后每個圖像得到2000個region proposal。
准備正負樣本。如果某個region proposal和當前圖像上的所有ground truth(標記)重疊面積最大的那個的IOU大於等於0.5,則該region proposal作為這個ground truth類別的正樣本,否則作為負樣本。另外正樣本還包括了Ground Truth。因為VOC一共包含20個類別,所以這里region proposal的類別為20+1=21類,1表示背景。簡單說下IOU的概念,IOU是計算矩形框A、B的重合度的公式:IOU=(A∩B)/(A∪B),重合度越大,說明二者越相近。
(2)預訓練。這一步主要是因為檢測問題中帶標簽的樣本數據量比較少,難以進行大規模訓練。采用的是Krizhevsky在2012年的著名網絡AlexNet來學習特征,包含5個卷積層和2個全連接層,在Caffe框架下利用ILSVRC 2012的數據集進行預訓練,其實就是利用大數據集訓練一個分類器,這個ILSVRC 2012數據集就是著名的ImageNet比賽的數據集,也是彩色圖像分類。
(3)fine-tuning。將2中得到的樣本進行尺寸變換,使得大小一致,這是由於2中得到的region proposal大小不一,所以需要將region proposal變形成227*227。本文中對所有不管什么樣大小和橫縱比的region proposal都直接拉伸到固定尺寸。然后作為3中預訓練好的網絡的輸入,繼續訓練網絡,繼續訓練其實就是遷移學習。另外由於ILSVRC 2012是一個1000類的數據集,而本文的數據集是21類(包括20個VOC類別和一個背景類別),遷移的時候要做修改,將最后一個全連接層的輸出由1000改成21,其他結構不變。訓練結束后保存f7的特征。
(4)針對每個類別訓練一個SVM的二分類器。輸入是f7的特征,f7的輸出維度是2000*4096,輸出的是是否屬於該類別,訓練結果是得到SVM的權重矩陣W,W的維度是4096*20。這里負樣本的選定和前面的有所不同,將IOU的閾值從0.5改成0.3,即IOU<0.3的是負樣本,正樣本是Ground Truth。IOU的閾值選擇和前面fine-tuning不一樣,主要是因為:前面fine-tuning需要大量的樣本,所以設置成0.5會比較寬松。而在SVM階段是由於SVM適用於小樣本,所以設置0.3會更嚴格一點。
(5)回歸。用pool5的特征6*6*256維和bounding box的ground truth來訓練回歸,每種類型的回歸器單獨訓練。輸入是pool5的特征,以及每個樣本對的坐標和長寬值。另外只對那些跟ground truth的IOU超過某個閾值且IOU最大的proposal回歸,其余的region proposal不參與。詳細說一下:對於某個region proposal:R,以及其對應的Ground truth:G,我們希望預測結果是:P,那么我們肯定希望P盡可能接近G。這里通過對pool5層的特征X做線性變換WX得到變換函數F(X),這些變換函數作用於R的坐標達到回歸的作用(包括對x,y的平移以及對w,h的縮放)。因此損失函數可以表達為:R和G的差距減去P和G的差距要盡可能小。
3、R-CNN模型的測試過程分析
(1)輸入一張圖像,利用Selective Search得到2000個Region Proposal。
(2)對所有Region Proposal變換到固定尺寸(227*227),然后將所有建議框像素減去該建議框像素平均值后【預處理操作】,並作為已訓練好的CNN網絡的輸入,得到f7層的4096維特征【比以前的人工經驗特征低兩個數量級】,所以f7層的輸出是2000*4096。
(3)對每個類別,采用已訓練好的這個類別的svm分類器對提取到的特征打分(Feature Scores),所以SVM的Weight Matrix是4096*N,N是類別數,這里一共有20個SVM,N=20注意不是21。得分矩陣是2000*20,表示每個Region Proposal屬於某一類的得分。
(4)采用Non-Maximun Suppression(NMS)對得分矩陣中的每一列中的Region Proposal進行剔除,就是去掉重復率比較高的幾個Region Proposal,得到該列中得分最高的幾個Region Rroposal。NMS的意思是:舉個例子,對於2000*20中的某一列得分,找到分數最高的一個Region Proposal,然后只要該列中其他Region Proposal和分數最高的IOU超過某一個閾值,則剔除該Region Proposal。這一輪剔除完后,再從剩下的Region Proposal找到分數最高的,然后計算別的Region Proposal和該分數最高的IOU是否超過閾值,超過的繼續剔除,直到沒有剩下Region Proposal。對每一列都這樣操作,這樣最終每一列(即每個類別)都可以得到一些rRegion Proposal。
(5)用N=20個回歸器對第4步得到的20個類別的region proposal進行回歸,要用到pool5層的特征。pool5特征的權重W是在訓練階段的結果,測試的時候直接用。最后得到每個類別的修正后的Bounding-box。
4、R-CNN存在的明顯問題(后續網絡改進的點)
(1)每張圖像需要提前提取2000個候選區域(Region Proposal),占用較大的磁盤空間(Memory);
(2)針對傳統CNN需要固定尺寸(227*227)的輸入圖像,crop/warp(歸一化)產生物體截斷或拉伸,會導致輸入CNN的信息丟失;
(3)每一個Region Proposal都需要進入CNN網絡計算,上千個Region存在大量的范圍重疊,重復的特征提取帶來巨大的計算浪費。
5、關於R-CNN的一些細節性問題
(1)速度問題
經典的目標檢測算法使用滑窗法依次判斷所有可能的區域。本文采用選擇性搜索(Selective Search)則預先提取一系列較可能是物體的候選區域,之后僅在這些候選區域上提取特征,進行判斷。
(2)訓練集問題
(a)經典的目標檢測算法在區域中提取人工設定的特征(Haar,HOG)。本文則需要訓練深度網絡進行特征提取。可供使用的有兩個數據庫:
(b)一個較大的識別庫(ImageNet ILSVC 2012):標定每張圖片中物體的類別。一千萬圖像,1000類。
(c)一個較小的檢測庫(PASCAL VOC 2007):標定每張圖片中,物體的類別和位置。一萬圖像,20類。
本文使用識別庫進行預訓練,而后用檢測庫調優參數。最后在檢測庫上評測。
(3)直接使用AlexNet做特征提取,省去fine-tune階段可以嗎?
這個是可以的,你可以不重新訓練CNN,直接采用Alexnet模型,提取出pool5、或者FC6、FC7的特征,作為特征向量,然后進行訓練SVM,只不過這樣精度會比較低。那么問題又來了,沒有fine-tuning的時候,要選擇哪一層的特征作為cnn提取到的特征呢?我們有可以選擇pool5、FC6、FC7,這三層的神經元個數分別是9216、4096、4096。從pool5(6*6*256)到FC6這層的參數個數是:9216*4096 ,從f6到f7的參數是4096*4096。那么具體是選擇p5、還是f6,又或者是f7呢?
Paper給我們證明了一個結論,如果你不進行fine-tuning,也就是你直接把Alexnet模型當做特征提取器使用,類似於HOG、SIFT一樣做特征提取,不針對特定的任務。然后把提取的特征用於分類,結果發現pool5的精度竟然跟FC6、FC7差不多,而且FC6提取到的特征還比FC7的精度略高;如果你進行fine-tuning了,那么FC7、FC6的提取到的特征最后訓練出來的svm分類器的精度就會大幅提高。
鑒於此讓我們明白了一個道理,如果不針對特定任務進行fine-tuning,而是把CNN當做特征提取器,卷積層所學到的特征其實就是基礎的共享特征提取層,就類似於SIFT提取特征一樣,可以用於提取各種圖片的基礎特征,而FC6、FC7所學習到的特征是用於針對特定任務的特征(高級抽象特征)。打個比方:對於人臉性別識別來說,一個CNN模型前面的卷積層所學習到的特征就類似於學習人臉共性特征,然后全連接層所學習的特征就是針對特殊個體分類的特征了。
(4)在fine-tune訓練的時候最后一層本來就是softmax分類層,那么為什么(閑的蛋疼)作者要利用CNN做特征提取(提取FC7層數據),然后再把提取的特征用於訓練SVM分類器呢?
這個是因為SVM訓練和CNN訓練過程的正負樣本定義方式各有不同,導致最后采用CNN softmax輸出比采用SVM精度低。事情是這樣的,CNN在訓練的時候,對訓練數據做了比較寬松的標注,比如一個Bounding-box可能只包含物體的一部分,那么我也把它標注為正樣本,用於訓練CNN;采用這個方法的主要原因在於因為CNN容易過擬合,所以需要大量的訓練數據(不太理解,不是一樣使用32個正樣本,96個負樣本嗎?),所以在CNN訓練階段我們是對Bounding-box的位置限制條件限制的比較松(IOU只要大於0.5都被標注為正樣本了);
然而svm訓練的時候,因為SVM適用於少樣本訓練,所以對於訓練樣本數據的IOU要求比較嚴格,我們只有當Bounding-box把整個物體都包含進去了,我們才把它標注為物體類別,然后訓練svm。