RCNN- 將CNN引入目標檢測的開山之作
前面一直在寫傳統機器學習。從本篇開始寫一寫 深度學習的內容。 可能需要一定的神經網路基礎(可以參考 Neural networks and deep learning 日後可能會在專欄發布自己的中文版筆記)。
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 分類器,判別是否屬於該類
- 位置精修: 使用回歸器精細修正候選框位置
【基礎知識 ===================================】
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中所佔比例大的: 保證合併後形狀規則。
上述四條規則只涉及區域的顏色直方圖、梯度直方圖、面積和位置。合併後的區域特徵可以直接由子區域特徵計算而來,速度較快。
有監督預訓練與無監督預訓練:
(1)無監督預訓練(Unsupervised pre-training)
預訓練階段的樣本不需要人工標註數據,所以就叫做無監督預訓練。
(2)有監督預訓練(Supervised pre-training)
所謂的有監督預訓練也可以把它稱之為遷移學習。比如你已經有一大堆標註好的人臉年齡分類的圖片數據,訓練了一個CNN,用於人臉的年齡識別。然後當你遇到新的項目任務時:人臉性別識別,那麼這個時候你可以利用已經訓練好的年齡識別CNN模型,去掉最後一層,然後其它的網路層參數就直接複製過來,繼續進行訓練,讓它輸出性別。這就是所謂的遷移學習,說的簡單一點就是把一個任務訓練好的參數,拿到另外一個任務,作為神經網路的初始參數值,這樣相比於你直接採用隨機初始化的方法,精度可以有很大的提高。
對於目標檢測問題: 圖片分類標註好的訓練數據非常多,但是物體檢測的標註數據卻很少,如何用少量的標註數據,訓練高質量的模型,這就是文獻最大的特點,這篇論文採用了遷移學習的思想: 先用了ILSVRC2012這個訓練資料庫(這是一個圖片分類訓練資料庫),先進行網路圖片分類訓練。這個資料庫有大量的標註數據,共包含了1000種類別物體,因此預訓練階段CNN模型的輸出是1000個神經元(當然也直接可以採用Alexnet訓練好的模型參數)。
重疊度(IOU):
物體檢測需要定位出物體的bounding box,就像下面的圖片一樣,我們不僅要定位出車輛的bounding box 我們還要識別出bounding box 裡面的物體就是車輛。
對於bounding box的定位精度,有一個很重要的概念: 因為我們演算法不可能百分百跟人工標註的數據完全匹配,因此就存在一個定位精度評價公式:IOU。 它定義了兩個bounding box的重疊度,如下圖所示就是矩形框A、B的重疊面積佔A、B並集的面積比例。非極大值抑制(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來選取那些鄰域里分數最高(是行人的概率最大),並且抑制那些分數低的窗口。
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的像素顏色均值),如上圖(C)所示;
對於上面的異性、同性縮放,文獻還有個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分類器。
測試階段:
使用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》
推薦閱讀:
※Fast R-CNN學習總結
※吳恩達 DeepLearning.ai 課程提煉筆記(4-3)卷積神經網路 --- 目標檢測
※目標檢測中region proposal的作用?
※視頻中的目標檢測與圖像中的目標檢測具體有什麼區別?
TAG:机器学习 | 深度学习DeepLearning | 目标检测 |