R-CNN學習筆記

Lung-Ying Ling
Taiwan AI Academy
Published in
16 min readMar 23, 2019

1. 大綱

RCNN主要用於物體檢測,首先通過selective search選擇2000個候選區域,這些候選區域中有我們所需要對應物體的bounding-box,對於每一個region proposal都wrap到固定大小的 scale(以AlexNet input size為例: 227x227),對於每一個處理過後的圖片,都把它放到CNN模型進行特徵提取,得到每個region proposal的feature map,這些特徵用固定長度的特徵集合feature vector來表示。

對於每一個類別,都會得到很多的feature vector,把這些特徵向量直接放到svm分類器去判斷當前region所對應的實物是background還是所對應的物體類別,每個region都會給出所對應的score,針對這些score,選出數值較大的score,再用非極大值抑制(canny NMS)來進行邊緣檢測,最後就會得到所對應的bounding-box。

2. 架構圖

RNN算法分為4個步驟:

1. 候選區域生成:一張圖像生成約2k個候選區域(採用Selective Search方法)

2. 特徵提取:對每個候選區域,使用深度捲積網路提取特徵(CNN)

3. 類別判斷:特徵送入每一類的SVM分類器,判別是否屬於該類

4. 位置精修:使用回歸器精細修正候選框位置

我們在ILSVRC 2012的數據集上進行分類,主要模擬的CNN模型是利用AlexNet進行分類,這個過程為"pre-train"。

再來要做的是"fine-tuning",主要就是對上面得到的model進行稍微的改動。首先改變了數據集的大小,前面pre-train用的數據集是比較大的,適用於分類,這裡使用的數據集相對較小,並且是通過selective search之後的region proposal作為網絡的輸入。如果當前region proposal的IOU大於0.5,就把它標記為positive,其餘的是作為negtive,去訓練detection網路,並針對SGD的參數進行修改。

上面的model訓練好之後,就需要針對每一個region proposal進行特徵集合(feature vector)訓練,得到的特徵輸入到SVM進行分類看這個feature vector所對應的region proposal是需要的物體,還是background。

3. 候選區域生成

使用了Selective Search方法從一張圖像生成約2k個候選區域。基本思路如下:

輸入:彩色圖片

⚫輸出:物體可能位置(bounding box)

⚫ 首先,將圖片初始化為很多區域

⚫ 初始化一個相似集合為空集:

⚫ 計算所有相鄰區域之間的相似度,放入集合S中,集合S保存的其實是一 個區域對以及他們之間的相似度。

⚫ 找出S中相似度最高的區域對將它們合併,並從S中刪除與它們相關的所有相似度和區域對。重新計算這個新區域與周圍區域的相似度,放入集合S中,並將這個新合併的區域放入集合R中,重複這個步驟直到S為空。

⚫ 從R中找出所有區域的bounding box,這個box可能就是物體可能的區域。

相似度計算方法

相似度計算方法將直接影響合併區域的順序,進而影響到檢設結果的好壞。在Selective Search的論文中比較了八種顏色空間的特點,在實際操作中,只選擇一個顏色空間(ex:RGB空間)進行計算。作者將相似度度量公式分為四個公式,稱為互補相似度測量(Complementary Similarity Measures)。這四個公式的值都會被歸一化到區間[0–1]內。

1.顏色相似度S{color} (rᵢ,rⱼ )

顏色是一個很重要區分物體的因素,論文中將每個region的像素按不同顏色通道統計成直方圖,其中每個顏色通道的直方圖為25bins(ex:0~255的顏色通道來說,就是每隔9(255/25=9)個數值統計像素數量)。這樣三個通道可以得到一個75維的直方圖向量 ∁ᵢ=∁ᵢ¹⋯∁ᵢⁿ (其中n=75)。之後我們用L1正規化(絕對值之和)。由直方圖就可以計算兩個區域的顏色相似度:

這個相似度其實就是計算兩個區域直方圖的交集。這個顏色直方圖可以在合併區域的時候,很方便地傳遞給下一級區域。即它們合併後的區域的直方圖向量為:

其中size(rᵢ) 表示區域rᵢ 的面積,合併後的區域為size(rᵢ )=size(rᵢ )+size(rⱼ)。

2.紋理相似度Sₜₑₓₜᵤᵣₑ (rᵢ,rⱼ)

另一個需要考慮的因素是紋理,即圖像的梯度訊息。論文中對紋理的計算採用了SIFT-like特徵,該特徵借鑒了SIFT的計算思路,對每個顏色通道的像素點,沿周圍8個方向計算高斯一階倒數(σ=1) ,每個方向統計一個直方圖(bin=10),這樣一個顏色通道統計得到的直方圖向量為80維,三個通道就是240維:Tᵢ=tᵢ¹⋯tᵢⁿ(n=240)。注意這個直方圖要用L1正規化。然後我們按照顏色相似度的計算思路計算兩個區域的紋理相似度:

同理,合併區域後紋理直方圖可以很方便地傳遞到下一級區域,計算方法和顏色直方圖一樣。

3.尺寸相似度Size (rᵢ,rⱼ)

在合併區域的時候,論文優先考慮小區域的合併,這種做法可以在一定程度上保證每次合併的區域面積都比較相似,防止大區域對小區域的逐步蠶食。理由很簡單,我們要均勻地在圖片的每個角落生成不同尺寸的區域,作用相當於exhaustive search中用不同尺寸的矩形掃描圖片。具體的相似度計算公式為:

其中size(im)表示原圖片的像素數量。

4.填充相似度S{fill} (rᵢ,rⱼ)

填充相似度主要用來測量兩個區域之間fit的程度。在給出填充相似度的公式前,我們需要定義一個矩形區域BBᵢⱼ,它表示包含rᵢ和rⱼ的最小的bounding box。基於此,填充相似度計算公式為:

為了高效的計算BBᵢⱼ,我們可以在計算每個region的時候都保存它們的bounding box的位置,這樣BBᵢⱼ就可以很快地由兩個區域的bounding box 推出來。

5.相似度計算公式

綜合上面四個子公式,可以得到計算相似度的最終公式:

其中aᵢ的取值為0或1,表示某個相似度是否被採納。

4. 候選框搜索階段

實現方式

當我們輸入一張圖片時,我們要搜索出所有可能是物體的區域,這個採用的方法是傳統文獻的算法:《search for object recognition》,通過這個算法我們搜索出2000個候選框。然後從上面的總流程圖中可以看到,搜出的候選框是矩形的,而且是大小各不相同。然而CNN對輸入圖片的大小是有固定的,如果把搜索到的矩形選框不做處理就扔進CNN中肯定不行。因此對於每個輸入的候選框都需要縮放到固定的大小。下面我們講解要怎麼進行縮放處理,為了簡單起見我們假設下一階段CNN所需要的輸入圖片大小是個正方形圖片227x227。因為我們經過selective search 得到的是矩形框,paper試驗了兩種不同的處理方法。

(1)各項異性縮放

方法很簡單,就是不管圖片的長寬比例,全部缩放到CNN输入的大小227x227,如下图(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的精度最高。

5. CNN特徵提取階段

網路結構設計階段

網絡架構我們有兩個可選方案:第一選擇經典的Alexnet;第二選擇VGG16。經過測試Alexnet精度為58.5%,VGG16精度為66%。 VGG這個模型的特點是選擇比較小的捲積核、選擇較小的跨步,這個網絡的精度高不過計算量是Alexnet的7倍。後面為了簡單起見,我們就直接選用Alexnet,並進行講解;Alexnet特徵提取部分包含了5個卷積層、2個全連接層,在Alexnet中p5層神經元個數為9216、f6、f7的神經元個數都是4096,通過這個網絡訓練完畢後,最後提取特徵每個輸入候選框圖片都能得到一個4096維的特徵向量。

A. ImageNet預訓練階段

參數初始化部分:物體檢測的一個難點在於,物體標籤訓練數據少,如果要直接採用隨機初始化CNN參數的方法,那麼目前的訓練數據量是遠遠不夠的。這種情況下,最好的是採用某些方法,把參數初始化了,然後在進行有監督的參數微調,這邊文獻採用的是有監督的預訓練。所以論文在設計網絡結構的時候,是直接用Alexnet的網絡,然後連參數也是直接採用它的參數,作為初始的參數值,然後再fine-tuning訓練。

網絡優化求解:採用隨機梯度下降法(SGD),學習速率大小為0.001。

B. fine-tuning階段

我們接著採用selective search 搜索出來的候選框,然後處理到指定大小圖片,繼續對上面預訓練的cnn模型進行fine-tuning訓練。假設要檢測的物體類別有N類,那麼我們就需要把上面預訓練階段的CNN模型的最後一層給替換掉,替換成N+1個輸出的神經元(加1,表示還有一個背景) ,然後這一層直接採用參數隨機初始化的方法,其它網絡層的參數不變;接著就可以開始繼續SGD訓練了。開始的時候,SGD學習率選擇0.001,在每次訓練的時候,我們batch size大小選擇128,其中32個正樣本、96個負樣本。由於負樣本很多,使用hard negative mining方法。

hard negative mining

在bootstrapping方法中,我們先用初始的正負樣本(一般是正樣本+與正樣本同規模的負樣本的一個子集)訓練分類器,然後再用訓練出的分類器對樣本進行分類,把其中錯誤分類的那些樣本(hard negative)放入負樣本集合,再繼續訓練分類器,如此反覆,直到達到停止條件(比如分類器性能不再提升)。

C.SVM分類器訓練階段

在訓練SVMs的過程中,作者把IoU低於0.3的proposal設置為negative樣本,對於postive則是groundtruth的包圍盒圖像。作者對每個類別都訓練了一個線性的SVM分類器,由於訓練圖像過多,同時為了保證訓練的效果,所以作者在訓練的過程中採用了hard negative mining方法。作者的文章的附錄B中討論了兩個問題,這裡我也簡單介紹一下:

(1)為什麼fine-tuning時採用的IoU閾值和SVM訓練時採用的閾值不同呢?

首先作者承認,在實驗開始他們並沒有fine-tuning的過程,而最開始使用SVM訓練時閾值就是0.3,在後面的實驗中加入finetuing以後,採用相同的閾值發現效果比使用現在的0.5閾值要差很多。作者的猜想是閾值的設置並不是很重要,而是微調時數據量的問題,在微調時採用0.5閾值的話會出現很多所謂的“抖動”的樣本,這些樣本於groundtruth的IoU在0.5到1之間,採用0.5的閾值以後正樣本增加了30倍,所以fine-tuning時訓練數據增多,效果會更好。

(2)為什麼不直接使用CNN的分類結果,而還要繼續訓練若干個SVM分類器呢?

作者也直接使用CNN分類結果進行了實驗,發現效果相比SVM有所降低,他發現使用CNN直接分類結果並不注重於精確定位(我覺得這個情況很合理,因為CNN識別能力非常強大,非常的魯棒,所以不是那麼精確的定位也可以得到比較好的結果,所以不注重精確定位)第二個原因在於SVM訓練時採用的hard negative mining選擇的樣本比CNN中隨機選擇的樣本要好,所以結果會更好。作者也提出,可能通過更改fine-tuning的一些細節可以提升效果(他們也是這麼做的,Fast RCNN中他們改變了loss函數)。

D.Bounding-box回歸

作者在完成了前面提到的“生成候選區域 — CNN提取特徵 — SVM進行分類”以後,為了進一步的提高定位效果,在文章的附錄C中介紹了Bounding-box Regression的處理。 Bounding-box Regression訓練的過程中,輸入數據為N個訓練對{(P^i,G^i)}_{(i=1⋯N)}, 其中P^i=(P_x^i,P_y^i,P_w^i,P_h^i) 為proposal的位置,前兩個座標表示proposal的中心座標,後面兩個座標分別表示proposal的width和height,而G=(Gₓ,G,G,Gₕ)表示groundtruth的位置,regression的目標就是學會一種映射將P轉換為G。 作者設計了四種座標映射方法dₓ (p),d (p),d (p),dₕ (p),其中前兩個表示對proposal中心座標的尺度不變的平移變換,後面兩個則是對proposal的width和height的對數空間的變換,文章中映射方式為:

其中d_* (p)(where*is one of x,y,w,h) 表示對該proposal的pool5層提取的特徵∅₅ (P) 進行線性變化操作 ,即d_*=w_* ∅₅ (P),最終優化方法為:

這是一個典型的最小二乘問題。最終在進行實驗時λ = 1000,同時作者發現同一對中P和G相距過遠時通過上面的變換是不能完成的,而相距過遠實際上也基本不會是同一物體,因此作者在進行實驗室時,對於pair(P,G)的選擇是選擇離P較近的G進行配對,這裡表示較近的方法是需要P和一個G的最大的IoU要大於0.6,否則則拋棄該P。

6. 測試階段的檢測

Testing流程:

  1. 先將region通過selective search檢測出來(約2k),然後根據CNN提取的region特徵丟入SVM進行分類(Compute score),得到的就是一個region-bbox以及對應的類別。
  2. 在利用IoU<-nms得到具體的框,目的為防止氾濫,得到精確的bbox。
  3. 再根據pool5 feature做了個bbox regression來decrease location error。

詳細過程:

測試階段,使用selective search的方法在測試圖片上提取2000個region propasals ,將每個region proposals歸一化到227x227,然後再CNN中正向傳播,將最後一層得到的特徵提取出來。然後對於每一個類別,使用為這一類訓練的SVM分類器對提取的特徵向量進行打分,得到測試圖片中對於所有region proposals的對於這一類的分數,再使用貪心的非極大值抑制去除相交的多餘的框。非極大值抑制(NMS)先計算出每一個bounding box的面積,然後根據score進行排序,把score最大的bounding box作為選定的框,計算其餘bounding box與當前最大score與box的IoU,去除IoU大於設定的閾值的bounding box。然後重複上面的過程,直至候選bounding box為空,然後再將score小於一定閾值的選定框刪除得到一類的結果。作者提到花費在region propasals和提取特徵的時間是13s/張-GPU和53s/張-CPU,可以看出時間還是很長的,不能夠達到及時性。

7. IoU的定義

簡單來講就是模型產生的目標窗口和原來標記窗口的交疊率。具體我們可以簡單的理解為: 即檢測結果(DetectionResult)與 Ground Truth 的交集比上它們的連集,即為檢測的準確率 IoU。

如下圖所示:GT = GroundTruth; DR = DetectionResult;

黃色邊框框起來的是:GT⋂DR

綠色框框起來的是:GT⋂DR

最理想的情況就是 DR 與 GT 完全重合,即IoU=1

8. 非極大值抑制(NMS)

主要目的是為了消除多餘的框,找到最佳的物體檢測的位置。

  1. 將所有框的得分排序,選中最高分及其對應的框。

2. 遍歷其餘的框,如果和當前最高分框的重疊面積(IOU)大於一定閥值,我們就將框刪除。

3. 從未處理的框中繼續選一個得分最高的,重複上述過程。

7. Reference

🔵深度学习(十八)基于R-CNN的物体检测

🔵【目标检测】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

🔵RCNN学习笔记(0):rcnn简介

🔵NMS — — 非极大值抑制

🔵论文笔记:Selective Search for Object Recognition

--

--