1. 程式人生 > >R-CNN文章詳細解讀

R-CNN文章詳細解讀

這是13年的文章《Rich feature hierarchies for accurate object detection and semantic segmentation》,網上雖然很多文章寫過,但是有些很亂,有些不詳細,自己也花了不少時間看原文和各種部落格,想寫篇詳細的自己記錄下並分享出來。

先介紹幾個物體檢測的相關知識

不同於分類問題,物體檢測可能會存在多個檢測目標,這不僅需要我們判別出各個物體的類別,而且還要準確定位出物體的位置

下面圖片上有貓,有狗,還有小黃鴨,這是多物體檢測:
這裡寫圖片描述

物體檢測演算法常用到的概念

下面我們講解一下在物體檢測演算法中常用到的幾個概念:Bbox,IoU,非極大值抑制。

Bounding Box(bbox)

bbox是包含物體的最小矩形,該物體應在最小矩形內部,如上圖紅色框藍色框和綠色框。

物體檢測中關於物體位置的資訊輸出是一組(x,y,w,h)資料,其中x,y代表著bbox的左上角(或者其他固定點,可自定義),對應的w,h表示bbox的寬和高.一組(x,y,w,h)可以唯一的確定一個定位框。

Intersection over Union(IoU)

對於兩個區域R和R′,則兩個區域的重疊程度overlap計算如下:
O(R,R′)=|R∩R′|/|R∪R′|


在訓練網路的時候,我們常依據侯選區域和標定區域的IoU值來確定正負樣本。

非極大值抑制(Non-Maximum Suppression又稱NMS)
非極大值抑制(NMS)可以看做是區域性最大值的搜尋問題,NMS是許多計算機視覺演算法的部分。如何設計高效的NMS演算法對許多應用是十分關鍵的,例如視訊跟蹤、資料探勘、3D重建、物體識別以及紋理分析等。

這裡我們主要針對非極大值抑制在物體檢測上的應用,非極大值抑制就是把不是極大值的抑制掉,在物體檢測上,就是對一個目標有多個標定框,使用極大值抑制演算法濾掉多餘的標定框。

下圖一個小貓有多個紅框標定:


使用非極大值抑制演算法後:

介紹完上面的一些基礎知識後開始正式介紹R-CNN

下圖示為slow R-CNN是因為這圖是介紹fast rcnn的ppt,所以最初的R-CNN叫作slow R-CNN
這裡寫圖片描述

這裡寫圖片描述
如上圖所示,R-CNN這個物體檢查系統可以大致分為四步進行:
1.獲取輸入影象
2.提取約2000個候選區域
3.將候選區域分別輸入CNN網路(這裡需要將候選圖片進行縮放)
4.將CNN的輸出輸入SVM中進行類別的判定

上述四個步驟是一個大致的過程,而且是一個檢測的過程,實際上訓練過程比較麻煩,下面開始詳細介紹。

一、候選區域的提取

這部分有很多傳統的方法可以選擇,本文為了和之前的物體檢測演算法進行對比,選擇了selective search方法

二、縮放候選區域

因為CNN對輸入影象的大小有限制,所以在將候選區域輸入CNN網路之前,要將候選區域進行固定尺寸的縮放。
縮放分為兩大類(該部分在原文附錄A):

1)各向同性縮放,長寬放縮相同的倍數

  • tightest square with context:
    把region proposal的邊界進行擴充套件延伸成正方形,灰色部分用原始圖片中的相應畫素填補,如下圖(B)所示
  • tightest square without context:
    把region proposal的邊界進行擴充套件延伸成正方形,灰色部分不填補,如下圖(C)所示

2)各向異性縮放, 長寬放縮的倍數不同
不管圖片是否扭曲,長寬縮放的比例可能不一樣,直接將長寬縮放到227*227,如下圖(D)所示

這裡寫圖片描述

在放縮之前,作者考慮,在region proposal周圍補額外的原始圖片畫素(pad p)。上圖中,第一層p=0,第二層p=16。

最後試驗發現,採用各向異性縮放並且p=16的時候效果最好。

三、測試方法

測試時其實分兩個結果
1.分類
在測試的時候,先對帶檢測影象提取出約2000個候選區域,將每個區域都進行縮放,然後將縮放後的圖片輸入CNN進行特徵提取,對CNN輸出的特徵用SVM進行打分(每類都有一個SVM,21類就有21個SVM分類器),對打好分的區域使用NMS即非極大抑制(每類都單獨使用)。

這裡SVM怎麼打分的這些細節沒有細講,只是簡單的說檢測的時候使用2000*4096維度的特徵矩陣與4096*N的SVM引數矩陣相乘(N為所要分的類別數),我也沒看過原碼,所以也不太清楚,知道的可以討論一下。

到這裡分類就完成了,但是得到的位置只是候選區在影象中的位置,而候選區的位置並不一定就是ground truth,即檢測目標的真實位置。

2.定位(迴歸)
將CNN對候選區域提取出的特徵輸入訓練好的線形迴歸器中,得到更為精確的位置定位,具體情況會在下面訓練方法中詳細介紹。但要明確的是,這些迴歸器是按照類來訓練的,即每類分類完後進行迴歸。

四、訓練方法

1.預訓練
訓練的時候,文章用了個trick,他先用ILSVRC2012資料庫訓練Alexnet,訓練的時候目標時圖片分類,因為ILSVRC2012資料庫沒有分類的標定資料。這步稱為預訓練。

2.fine-tuning
這種方法也是當資料量不夠的時候,常用的一種訓練方式,即先用別的資料庫訓練網路,然後再用自己的資料庫微調訓練(fine-tuning)。微調期間,定義與ground truth的IoU大於0.5的候選區域為正樣本,其餘的為負樣本。
這裡訓練時,網路輸出要有所改變,因為分類問題,網路輸出為N+1,其中N為正樣本的類別數,1為背景。
對於VOC,N=20,對於ILSVRC2013, N=200。

3.目標分類
因為最終目標分類是通過SVM進行分類的,而不是通過網路框架中的softmax分類的。

下面先說一下在SVM的訓練中,正負樣本的定義,為什麼這樣定義,然後再說一下為什麼不直接用softmax輸出的結果而是再訓練SVM來進行分類的。

1)SVM正負樣本的定義,為什麼fine-tuning與SVM正負樣本定義不一樣?
在訓練SVM時,正樣本為groundtruth,負樣本定義為與ground truth的IoU小於0.3的候選區域為負樣本,介於0.3與0.7之間的樣本忽略。
fine-tuning時擔心過擬合的原因,要擴大正樣本的樣本量,所以定義比較寬鬆,但是SVM是最終用於分類的分類器,而且SVM原理就是最小的距離最大化,越難分的資料越有利於SVM的訓練,所以對樣本的定義比較嚴格。

2)為什麼不直接用softmax的輸出結果?
因為在訓練softmax的時候資料本來就不是很準確,而SVM的訓練使用的是hard negative也就是樣本比較嚴格,所以SVM效果會更好。

4.迴歸器訓練
迴歸器是線性的,輸入為Alexnet pool5的輸出。
bbox迴歸認為候選區域和ground-truth之間是線性關係(因為在最後從SVM內確定出來的區域比較接近ground-truth,這裡近似認為可以線性關係)

訓練迴歸器的輸入為N對值, { ( P i , G i ) } i = 1 , 2 , . . . , N ,分別為候選區域的框座標和真實的框座標,下面在不必要時省略i。這裡選用的Proposal必須和Ground Truth的IoU>0.6才算是正樣本.

從候選框P到預測框 G ^ 的基本思路如下:

因為我們在分類之後得到候選框P ( P x , P y , P w , P h ) ,其中 P x P y 為候選框的中心點, P w P h 為候選框的寬高,下面介紹中所有框的定位都用這種定義,即x和y表示中心點座標,w和h表示框的寬高。知道候選框的表示,那麼只要估計出出候選框與真實框的平移量和尺度縮放比例,就可以得到我們的估計框了

1)先求平移量(Δx,Δy)

Δx= P w d x ( P ) , Δy= P h d y ( P )

即R-CNN論文裡面的:
G x ^ = P w d x ( P ) + P x , G y ^ = P w d y ( P ) + P y

2)算尺度放縮量 ( S w , S h )
S w = P w d w ( P ) , S h = P h d h ( P )
G w ^ = P w e x p ( d w ( P ) ) , G h ^ = P h e x p ( d h ( P ) )

我們要學習的是 d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) 這四個變換,就可以得到估計框了。

這四個變換可以用下列公式表示: