RCNN (論文:Rich feature hierarchies for accurate object detection and semantic segmentation) 是將CNN方法引入目標檢測領域, 大大提高了目標檢測效果,可以說改變了目標檢測領域的主要研究思路, 緊隨其後的系列文章:( RCNN), Fast RCNN, Faster RCNN 代表該領域當前最高水準。
【論文主要特點】(相對傳統方法的改進)
- 速度: 經典的目標檢測算法使用滑動窗法依次判斷所有可能的區域。本文則(採用
Selective Search
方法)預先提取一系列較可能是物體的候選區域,之後僅在這些候選區域上(採用CNN
)提取特徵,進行判斷。 - 訓練集: 經典的目標檢測算法在區域中提取人工設定的特徵。本文則採用深度網絡進行特徵提取。使用兩個數據庫: 一個較大的識別庫(
ImageNet ILSVC 2012
):標定每張圖片中物體的類別。一千萬圖像,1000類。 一個較小的檢測庫(PASCAL VOC 2007
):標定每張圖片中,物體的類別和位置,一萬圖像,20類。 本文使用識別庫進行預訓練得到CNN
(有監督預訓練),而後用檢測庫調優參數,最後在檢測庫上評測。
基本流程
RCNN算法分爲4個步驟
- 候選區域生成: 一張圖像生成
1K~2K
個候選區域 (採用Selective Search
方法) - 特徵提取: 對每個候選區域,使用深度卷積網絡提取特徵 (
CNN
) - 類別判斷: 特徵送入每一類的
SVM
分類器,判別是否屬於該類 - 位置精修: 使用迴歸器精細修正候選框位置
基礎知識
1. Selective Search 主要思想:
- 使用一種過分割手段,將圖像分割成小區域
(1k~2k
個) - 查看現有小區域,按照合併規則合併可能性最高的相鄰兩個區域。重複直到整張圖像合併成一個區域位置
- 輸出所有曾經存在過的區域,所謂候選區域
其中合併規則如下: 優先合併以下四種區域:
- 顏色(顏色直方圖)相近的
- 紋理(梯度直方圖)相近的
- 合併後總面積小的: 保證合併操作的尺度較爲均勻,避免一個大區域陸續“吃掉”其他小區域 (例:設有區域
a-b-c-d-e-f-g-h
。較好的合併方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh
。 不好的合併方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh
) - 合併後,總面積在其
BBOX
中所佔比例大的: 保證合併後形狀規則。
上述四條規則只涉及區域的顏色直方圖、梯度直方圖、面積和位置。合併後的區域特徵可以直接由子區域特徵計算而來,速度較快。
2. 有監督預訓練與無監督預訓練:
(1)無監督預訓練(Unsupervised pre-training
)
預訓練階段的樣本不需要人工標註數據,所以就叫做無監督預訓練。
(2)有監督預訓練(Supervised pre-training
)
所謂的有監督預訓練也可以把它稱之爲遷移學習。比如你已經有一大堆標註好的人臉年齡分類的圖片數據,訓練了一個CNN
,用於人臉的年齡識別。然後當你遇到新的項目任務時:人臉性別識別,那麼這個時候你可以利用已經訓練好的年齡識別CNN
模型,去掉最後一層,然後其它的網絡層參數就直接複製過來,繼續進行訓練,讓它輸出性別。這就是所謂的遷移學習,說的簡單一點就是把一個任務訓練好的參數,拿到另外一個任務,作爲神經網絡的初始參數值,這樣相比於你直接採用隨機初始化的方法,精度可以有很大的提高。
對於目標檢測問題: 圖片分類標註好的訓練數據非常多,但是物體檢測的標註數據卻很少,如何用少量的標註數據,訓練高質量的模型,這就是文獻最大的特點,這篇論文采用了遷移學習的思想: 先用了ILSVRC2012
這個訓練數據庫(這是一個圖片分類訓練數據庫),先進行網絡圖片分類訓練。這個數據庫有大量的標註數據,共包含了1000種類別物體,因此預訓練階段CNN
模型的輸出是1000個神經元(當然也直接可以採用Alexnet
訓練好的模型參數)。
3. 重疊度(IOU):
物體檢測需要定位出物體的bounding box
,就像下面的圖片一樣,我們不僅要定位出車輛的bounding box
,我們還要識別出bounding box
裏面的物體就是車輛。
對於bounding box
的定位精度,有一個很重要的概念: 因爲我們算法不可能百分百跟人工標註的數據完全匹配,因此就存在一個定位精度評價公式:IOU
。 它定義了兩個bounding box
的重疊度,如下圖所示
就是矩形框A、B的重疊面積佔A、B並集的面積比例。
4. 非極大值抑制(NMS
):
RCNN
會從一張圖片中找出n個可能是物體的矩形框,然後爲每個矩形框爲做類別分類概率:
就像上面的圖片一樣,定位一個車輛,最後算法就找出了一堆的方框,我們需要判別哪些矩形框是沒用的。非極大值抑制的方法是:先假設有6個矩形框,根據分類器的類別分類概率做排序,假設從小到大屬於車輛的概率分別爲A、B、C、D、E、F。
(1)從最大概率矩形框F開始,分別判斷A~E與F的重疊度IOU
是否大於某個設定的閾值;
(2)假設B、D與F的重疊度超過閾值,那麼就扔掉B、D;並標記第一個矩形框F,是我們保留下來的。
(3)從剩下的矩形框A、C、E中,選擇概率最大的E,然後判斷E與A、C的重疊度,重疊度大於一定的閾值,那麼就扔掉;並標記E是我們保留下來的第二個矩形框。
就這樣一直重複,找到所有被保留下來的矩形框。
非極大值抑制(NMS
)顧名思義就是抑制不是極大值的元素,搜索局部的極大值。 這個局部代表的是一個鄰域,鄰域有兩個參數可變,一是鄰域的維數,二是鄰域的大小。這裏不討論通用的NMS
算法,而是用於在目標檢測中用於提取分數最高的窗口的。例如在行人檢測中,滑動窗口經提取特徵,經分類器分類識別後,每個窗口都會得到一個分數。但是滑動窗口會導致很多窗口與其他窗口存在包含或者大部分交叉的情況。這時就需要用到NMS
來選取那些鄰域裏分數最高(是行人的概率最大),並且抑制那些分數低的窗口。
5. VOC物體檢測任務:
相當於一個競賽,裏面包含了20個物體類別:PASCAL VOC2011 Example Images 還有一個背景,總共就相當於21個類別,因此一會設計fine-tuning CNN
的時候,我們softmax
分類輸出層爲21個神經元。
各個階段詳解
總體思路再回顧:
首先對每一個輸入的圖片產生近2000個不分種類的候選區域(region proposals
),然後使用CNNs
從每個候選框中提取一個固定長度的特徵向量(4096維度),接着對每個取出的特徵向量使用特定種類的線性SVM
進行分類。也就是總個過程分爲三個程序:a、找出候選框;b、利用CNN
提取特徵向量;c、利用SVM
進行特徵向量分類。
候選框搜索階段:
當我們輸入一張圖片時,我們要搜索出所有可能是物體的區域,這裏採用的就是前面提到的Selective Search
方法,通過這個算法我們搜索出2000個候選框。然後從上面的總流程圖中可以看到,搜出的候選框是矩形的,而且是大小各不相同。然而CNN
對輸入圖片的大小是有固定的,如果把搜索到的矩形選框不做處理,就扔進CNN
中,肯定不行。因此對於每個輸入的候選框都需要縮放到固定的大小。下面我們講解要怎麼進行縮放處理,爲了簡單起見我們假設下一階段CNN
所需要的輸入圖片大小是個正方形圖片227*227
。因爲我們經過selective search
得到的是矩形框,paper
試驗了兩種不同的處理方法:
(1) 各向異性縮放
這種方法很簡單,就是不管圖片的長寬比例,管它是否扭曲,進行縮放就是了,全部縮放到CNN
輸入的大小227*227
,如下圖(D)所示;
(2) 各向同性縮放
因爲圖片扭曲後,估計會對後續CNN
的訓練精度有影響,於是作者也測試了“各向同性縮放”方案。有兩種辦法
A、先擴充後裁剪: 直接在原始圖片中,把bounding box
的邊界進行擴展延伸成正方形,然後再進行裁剪;如果已經延伸到了原始圖片的外邊界,那麼就用bounding box
中的顏色均值填充;如上圖(B)所示;
B、先裁剪後擴充:先把bounding box
圖片裁剪出來,然後用固定的背景顏色填充成正方形圖片(背景顏色也是採用bounding box
的像素顏色均值),如上圖©所示;
對於上面的異性、同性縮放,文獻還有個padding
處理,上面的示意圖中第1、3行就是結合了padding=0
,第2、4行結果圖採用padding=16
的結果。經過最後的試驗,作者發現採用各向異性縮放、padding=16
的精度最高。
(備註:候選框的搜索策略作者也考慮過使用一個滑動窗口的方法,然而由於更深的網絡,更大的輸入圖片和滑動步長,使得使用滑動窗口來定位的方法充滿了挑戰。)
CNN特徵提取階段:
1、算法實現
a、網絡結構設計階段
網絡架構兩個可選方案:第一選擇經典的Alexnet
;第二選擇VGG16
。經過測試Alexnet
精度爲58.5%,VGG16
精度爲66%。VGG
這個模型的特點是選擇比較小的卷積核、選擇較小的跨步,這個網絡的精度高,不過計算量是Alexnet
的7倍。後面爲了簡單起見,我們就直接選用Alexnet
,並進行講解;Alexnet
特徵提取部分包含了5個卷積層、2個全連接層,在Alexnet
中p5
層神經元個數爲9216, f6
、f7
的神經元個數都是4096,通過這個網絡訓練完畢後,最後提取特徵每個輸入候選框圖片都能得到一個4096維的特徵向量。
b、網絡有監督預訓練階段 (圖片數據庫:ImageNet ILSVC
)
參數初始化部分:物體檢測的一個難點在於,物體標籤訓練數據少,如果要直接採用隨機初始化CNN
參數的方法,那麼目前的訓練數據量是遠遠不夠的。這種情況下,最好的是採用某些方法,把參數初始化了,然後在進行有監督的參數微調,這裏文獻採用的是有監督的預訓練。所以paper
在設計網絡結構的時候,是直接用Alexnet
的網絡,然後連參數也是直接採用它的參數,作爲初始的參數值,然後再fine-tuning
訓練。網絡優化求解時採用隨機梯度下降法,學習率大小爲0.001;
c、fine-tuning
階段 (圖片數據庫: PASCAL VOC
)
我們接着採用 selective search
搜索出來的候選框 (PASCAL VOC
數據庫中的圖片) 繼續對上面預訓練的CNN
模型進行fine-tuning
訓練。假設要檢測的物體類別有N
類,那麼我們就需要把上面預訓練階段的CNN
模型的最後一層給替換掉,替換成N+1
個輸出的神經元(加1,表示還有一個背景) (20 + 1bg = 21),然後這一層直接採用參數隨機初始化的方法,其它網絡層的參數不變;接着就可以開始繼續SGD
訓練了。開始的時候,SGD
學習率選擇0.001,在每次訓練的時候,我們batch size
大小選擇128,其中32個是正樣本、96個是負樣本。
關於正負樣本問題:
一張照片我們得到了2000個候選框。然而人工標註的數據一張圖片中就只標註了正確的bounding box
,我們搜索出來的2000個矩形框也不可能會出現一個與人工標註完全匹配的候選框。因此在CNN
階段我們需要用IOU
爲2000個bounding box
打標籤。如果用selective search
挑選出來的候選框與物體的人工標註矩形框(PASCAL VOC
的圖片都有人工標註)的重疊區域IOU
大於0.5,那麼我們就把這個候選框標註成物體類別(正樣本),否則我們就把它當做背景類別(負樣本)。
(備註: 如果不針對特定任務進行fine-tuning
,而是把CNN
當做特徵提取器,卷積層所學到的特徵其實就是基礎的共享特徵提取層,就類似於SIFT
算法一樣,可以用於提取各種圖片的特徵,而f6
、f7
所學習到的特徵是用於針對特定任務的特徵。打個比方:對於人臉性別識別來說,一個CNN
模型前面的卷積層所學習到的特徵就類似於學習人臉共性特徵,然後全連接層所學習的特徵就是針對性別分類的特徵了)
2. 疑惑點:
CNN
訓練的時候,本來就是對bounding box
的物體進行識別分類訓練,在訓練的時候最後一層softmax
就是分類層。那麼爲什麼作者閒着沒事幹要先用CNN
做特徵提取(提取fc7
層數據),然後再把提取的特徵用於訓練SVM
分類器?
這個是因爲SVM
訓練和CNN
訓練過程的正負樣本定義方式各有不同,導致最後採用CNN softmax
輸出比採用SVM
精度還低。事情是這樣的,CNN
在訓練的時候,對訓練數據做了比較寬鬆的標註,比如一個bounding box
可能只包含物體的一部分,那麼我也把它標註爲正樣本,用於訓練CNN
;採用這個方法的主要原因在於因爲CNN
容易過擬合,所以需要大量的訓練數據,所以在CNN
訓練階段我們是對bounding box
的位置限制條件限制的比較鬆(IOU
只要大於0.5都被標註爲正樣本了);然而SVM
訓練的時候,因爲SVM
適用於少樣本訓練,所以對於訓練樣本數據的IOU
要求比較嚴格,我們只有當bounding box
把整個物體都包含進去了,我們才把它標註爲物體類別,然後訓練SVM
,具體請看下文。
SVM訓練、測試階段
訓練階段:
這是一個二分類問題,我麼假設我們要檢測車輛。我們知道只有當bounding box
把整量車都包含在內,那才叫正樣本;如果bounding box
沒有包含到車輛,那麼我們就可以把它當做負樣本。但問題是當我們的檢測窗口只有部分包含物體,那該怎麼定義正負樣本呢?作者測試了IOU
閾值各種方案數值0, 0.1, 0.2, 0.3, 0.4, 0.5。最後通過訓練發現,如果選擇IOU
閾值爲0.3效果最好(選擇爲0精度下降了4個百分點,選擇0.5精度下降了5個百分點),即當重疊度小於0.3的時候,我們就把它標註爲負樣本。一旦CNN f7
層特徵被提取出來,那麼我們將爲每個物體類訓練一個SVM
分類器。當我們用CNN
提取2000個候選框,可以得到2000*4096
這樣的特徵向量矩陣,然後我們只需要把這樣的一個矩陣與SVM
權值矩陣4096*N
點乘(N爲分類類別數目,因爲我們訓練的N個SVM
,每個SVM
包含了4096個權值w
),就可以得到結果了。
得到的特徵輸入到SVM
進行分類看看這個feature vector
所對應的region proposal
是需要的物體還是無關的實物(background
) 。 排序,canny
邊界檢測之後就得到了我們需要的bounding-box
。
再回顧總結一下:整個系統分爲三個部分:1.產生不依賴與特定類別的region proposals,這些region proposals定義了一個整個檢測器可以獲得的候選目標; 2.一個大的卷積神經網絡,對每個region產生一個固定長度的特徵向量; 3.一系列特定類別的線性SVM分類器。
位置精修:
目標檢測問題的衡量標準是重疊面積:許多看似準確的檢測結果,往往因爲候選框不夠準確,重疊面積很小。故需要一個位置精修步驟。 迴歸器:對每一類目標,使用一個線性脊迴歸器進行精修。正則項λ=10000。 輸入爲深度網絡pool5
層的4096維特徵,輸出爲xy方向的縮放和平移。 訓練樣本:判定爲本類的候選框中和真值重疊面積大於0.6的候選框。
測試階段:
使用selective search
的方法在測試圖片上提取2000個region propasals
,將每個region proposals
歸一化到227x227
,然後再CNN
中正向傳播,將最後一層得到的特徵提取出來。然後對於每一個類別,使用爲這一類訓練的SVM
分類器對提取的特徵向量進行打分,得到測試圖片中對於所有region proposals
的對於這一類的分數,再使用貪心的非極大值抑制(NMS
)去除相交的多餘的框。再對這些框進行canny
邊緣檢測,就可以得到bounding-box(then B-BoxRegression)
。
非極大值抑制(NMS
)先計算出每一個bounding box
的面積,然後根據score
進行排序,把score
最大的bounding box
作爲選定的框,計算其餘bounding box
與當前最大score
與box
的IOU
,去除IOU
大於設定的閾值的bounding box
。然後重複上面的過程,直至候選bounding box
爲空,然後再將score
小於一定閾值的選定框刪除得到這一類的結果(然後繼續進行下一個分類)。作者提到花費在region propasals
和提取特徵的時間是13s/張-GPU和53s/張-CPU,可以看出時間還是很長的,不能夠達到及時性。
本文主要整理自以下文章:
- RCNN學習筆記(0):rcnn簡介
- RCNN學習筆記(1):Rich feature hierarchies for accurate object detection and semantic segmentation
- RCNN學習筆記(2):Rich feature hierarchies for accurate object detection and semantic segmentation
- 《Rich feature hierarchies for Accurate Object Detection and Segmentation》
- 《Spatial 《Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》