目標檢測算法(1)目標檢測中的問題描述和R-CNN算法


目標檢測(object detection)是計算機視覺中非常具有挑戰性的一項工作,一方面它是其他很多后續視覺任務的基礎,另一方面目標檢測不僅需要預測區域,還要進行分類,因此問題更加復雜。最近的5年使用深度學習方法進行目標檢測取得了很大的突破,因此想寫一個系列來介紹這些方法。這些比較重要的方法可以分成兩條主線,一條是基於區域候選(region proposal)的方法,即通過某種策略選出一部分候選框再進行后續處理,比如RCNN-SPP-Fast RCNN-Faster RCNN-RFCN等;另一條是直接使用卷積神經網絡將圖像變換到一個小的尺度,在新的尺度上使用anchor box來預測目標區域,這一類方法包括SSD以及Yolo的各個版本等;另外這個系列中也會穿插一些其他的算法如OverFeat、DPM等。本文是目標檢測系列的第一篇,主要提及目標檢測中的基本問題,並詳細地介紹了RCNN算法。

一 目標識別問題的基本描述

目標檢測是計算機視覺中非常具有挑戰性的一項工作,它是其他很多后續視覺任務的基礎,比如我們通常所說的識別(分類)問題,以人臉識別為例,通常其不是一個完全的端到端(end to end)的過程,如果想要獲得很好的識別精度,一般情況下需要首先進行人臉檢測,然后對檢測得到的區域進行人臉定位(face landmark),然后再進行人臉對齊(face alignment),最后才進行分類或者驗證,好的人臉檢測算法對最后的識別精度提升很大,而有的算法會把檢測和定位一步做出來;另一方面,目標檢測是一項相對比較有難度的工作,其考慮的問題比較多,比如我們怎樣合理選擇定位區域?怎樣對定位區域的圖像內容進行分類?如果框柱的區域有誤差我們怎么修正?

1. 目標檢測中的一些基本概念

在回答上面幾個問題之前,這里首先介紹目標識別過程中經常提及的一些概念。我們可以把分類任務和檢測任務做一個比較(這幾張圖片都來源於\(RBG\)大神RCNN的ppt,戳這里):

圖1 classification vs detection

左邊一張是分類,右邊一張是檢測。可以看出分類只需要判斷給定的圖像屬於哪一類,但很明顯由於其他物體或者背景的干擾,直接這么做肯定效果不好。相比較而言,檢測則是判斷某個固定的區域中是否包含物體,並且判斷其中的物體屬於哪一類,我們把框住這個區域的矩形框叫做bounding box,那么目標檢測的問題可以看成是:給定目標類別集合比如\(\left \{ airplane, bird, motorbike, person, sofa \right \}\),判斷這些bounding box中是否包含目標,如圖2所示:

圖2 目標檢測示例:左圖是輸入,右圖是輸出

另外,對於這些預測的bounding box是否真實包含物體,通常會有預測的置信度,也就是這個框出來的區域有多大概率屬於某類的物體,所以目標檢測實際的輸出會包含三個內容:預測的bounding box,bounding box中物體的類別,以及屬於這個類別的置信度。

圖3 'person' detector predictions 和 ground truth 'person' boxes

圖3中橙色的區域是我們預測時的bounding box,而紫色的是真實物體包含的區域,通常叫做ground truth(GT),訓練的目的是讓我們預測到的bounding box和GT的交並比(即兩個區域的重疊部分除以相並的部分, Intersection over Union,簡稱IoU)的值比較高。那在測試階段我們到底應該怎樣衡量預測的好壞呢?這里用到一個非常重要的概念mAP,即平mean Average Precision(平均AP)的值,注意這里的AP是針對每個類別求出的,那每個類的AP值到底是怎樣計算的呢?

首先在進行預測后,我們可以按照置信度大小排序並且選擇一個閾值作為預測的正負類的評判標准,大於閾值預測為正類否則為負類,如下圖所示:

圖4 置信度排序及precision和recall的計算方式

假如我們選擇置信度\(t=0.5\)為正負類的閾值,那么小於\(t\)的全部預測為負類,這里引出兩個機器學習中非常常見的概念,也就是查准率(precision)值和查全率(recall)值,二者的計算方式如下

\(precision=\frac{true positive}{true positive+false positive}\)

\(recall=\frac{true positive}{ground truth}\)

(1) true positive表示正確的預測為正類,在目標檢測中就是指預測的bounding box和ground truth的IoU超過0.5的box的個數;

(2) false positive表示錯誤的預測為正類,對應於bounding box和ground truth的IoU小於等於0.5的box的個數,還有那些重復預測同一個ground truth的box的個數。

還有兩種預測行為true negative和false negative也很容易根據(1)、(2)推斷出來,這里的AP值重點考察(1)和(2)所以沒列出來。從precision和recall值的定義來看,它們衡量分類性能的角度不一樣,precision側重於考察預測的結果為正類樣本中的准確程度,而recall側重於考察真實的正類樣本是被預測正確的全面程度。現在我們知道怎樣計算precision和recall的值,那么對於每一類樣本我們可以依照某個采樣規則畫出precision和recall關系的序列圖,如下圖所示,橫坐標為recall值,縱坐標為precision值,根據采樣的recall值的不同來得到不同的precision值,然后畫出相應的點連成曲線,這里的曲線下方面積就是這個類的AP值,AP值越高表明在給定recall的情況下precision的值也比較高。注意到我們選取不同的閾值\(t\)可以得到不同的曲線,此時的AP值也不同。

 圖5 mAP計算示意圖

以上是關於目標檢測的基本概念,在實際應用中到底怎樣進行檢測,又有哪些難點呢?我們接下來要講的RCNN主要會解決一下三個問題:

(1) 怎樣找出這些預測的bounding box?

容易想到的很笨的方法是選擇大小、比例不同的滑窗,讓這個滑窗遍歷整個圖像,對每個滑過的位置都進行預測分類,判斷是否有物體存在,像下圖一樣:

 

圖6 使用大小比例不同的bounding box滑窗經過每個圖像的位置進行預測,導致需要檢測很多個窗口

這樣操作的缺點十分明顯:選區的滑窗的大小和比例不同以及需要滑過圖像中每一個位置,導致需要檢測的窗口數量巨大。那么我們是否能想出一個間接的方法,即並不是一步處理所有的窗口,而是首先通過相對比較“粗糙”的方法過濾那些肯定不包含物體的區域?

(2) 假如我們已經找到了一個bounding box,怎樣判斷屬於哪一個類?

這個問題可以看成是一個分類的問題,對於指定區域的圖像,我們可以用傳統的手工特征提取方法,比如LBP、HOG、Haar特征等等,更好的方法是通過卷積神經網絡可以自動選擇特征,並且效果非常好,提取到特征之后再進行分類。

(3) 是否需要對找到的包含物體的box進行修正?

由於選擇的bounding box的位置通常會有一定程度的偏差,那么需要對這個位置進行修正,此問題可以看成是一個回歸的問題,回歸預測的值通常是這個box左上角的坐標,區域的寬和高。

 帶着這三個問題,這篇文章主要介紹目標檢測領域一個里程碑的算法RCNN,即基於區域的卷積神經網絡方法。

二 R-CNN算法

R-CNN(region with CNN feature)於13年被Ross Girshick(江湖人稱RBG大神)提出,是使用深度學習進行目標檢測的里程碑式的工作,RBG主頁:http://www.rossgirshick.info,主頁中列出的關於目標檢測及相關領域的工作都非常經典,可以說這些工作很大程度推動了深度學習在目標檢測中的應用。廢話不多說,首先我們看看RCNN算法的動機。

1. 動機及解決的問題

(1) 與分類任務不同,目標檢測需要框出指定的區域,有相關paper直接使用回歸的方法得到區域的位置,但實際應用起來效果並不好;另外,有方法直接使用滑窗加深度學習的方法,不過這一類方法通常網絡層次並不深,主要考慮到的是一旦網絡層次加深,最后輸出的特征圖對應的原始圖像的感受野太大,造成檢測精度不高;

(2) 一個更好地解決方案是是使用所謂“區域建議(region proposal)”的方法給出一堆候選區域,這些候選區域能夠先過濾掉那些大概率不包含物體的區域,然后選擇一個深度神經網絡抽取特征;

(3) 一旦抽取特征之后可以設計一個SVM分類器,即對每一個類別的物體都看成是一個單獨的二元分類問題;

(4) 最后使用回歸的方法對包含物體的bounding box進行回歸,回歸的目的是修正bounding box的偏差。

值得一提的是,RCNN論文中的細節很多,怎樣得到region proposal,怎樣把候選得到的區域縮放到統一尺寸以使其適配CNN網絡的輸入大小,怎樣進行多階段的訓練(CNN網絡的“pre-training”和“fine-training”,SVM分類器的訓練以及回歸器的訓練)等等,CNN網絡為什么不直接接入一個softmax層轉而使用SVM進行分類,等等這些會在下文中介紹。

2. 算法架構

圖7 RCNN算法框架

RCNN的算法框架如圖7所示,算法過程描述如下:

(1) 第一步,即圖7中的1~2,對於給定的輸入圖像,使用選擇性搜索(selective search)的區域建議方法提取出大約2000個候選區域,即首先過濾掉那些大概率不包含物體的區域,通過這一階段將原始圖像中需要處理的區域大大減少;

(2) 第二步,分為兩個小步:

  • 第一小步,需要對第一階段中抽取得到的候選區域,經過一個叫做"warp"的過程,這個warp實際就是一個縮放的過程,因為第一步我們提取出的候選區域大小不一,但是后續接入的深度網絡的輸入是固定的,因此這些區域的大小需要適配CNN網絡固定大小的輸入;
  • 第二小步,把第一小步中warp之后的候選區域接入到卷積神經網絡,抽取一個相對低維的特征;

(3) 第三步,對應圖中的3~4,對每個類都訓練一個二元的線性SVM,然后判斷上一步抽取的特征是否包含物體。

(4) 第四步,這一步圖上並沒有畫出,這一步用於對包含物體的候選區域位置進行回歸,以修正偏差。

3. 算法具體流程

通過算法框架我們能夠大致了解RCNN運作的流程,但真正實施起來會包含很多問題,我們一一來看。

(1) 怎樣使用selective search方法提取候選區域

RCNN一大創新點是對原始圖像抽取一些候選區域,再使用深度學習進行特征抽取,文中列舉了一些區域建議的方法,最后使用的是selective search的方法:“Selective Search for Object Recognition”。selective search是一種“hierarchical bottom-up grouping”的方法,即層次、自底向上的分組方法,簡單來說就是先找出圖像中的相鄰區域,然后定義一個領域相識度的計算規則,使用這些規則一直合並相似度較高的區域並且更新,最后知道覆蓋至整張圖像,完成處理的圖像中不同的區域就是這些“region proposal”。以下是示意圖:

圖8 selective search算法示意圖

了解一個算法最好的方法就是看原始的paper,原始的paper對算法的描述步驟如下:

輸入:一張圖像(彩色) 輸出:候選的box區域

算法開始需要初始化一些區域的集合:\(R=\left \{ r_{1},r_{2},...r_n{} \right \}\),文章中使用paper:“Efficient graph-based image segmentation”來做這件事;同時還初始化一個空的相似度區域的集合\(S=\varnothing \)

a. 對於所有的相鄰區域\((r_{i},r_{j})\),按照相似度規則計算相似度\(s(r_{i},r_{j})\),並且計算\(S=S\cup s(r_{i},r_{j})\),即計算所有領域的相似度集合;

b. 假如\(S\neq \varnothing \):

  • 獲取\(S\)中相似度最高的一對區域\(s(r_{i},s_{j})=max(S)\);
  • 對最相似的兩個區域進行合並\(r_{t}=r_{i}\cup r_{j}\);
  • 從\(S\)集合中去除和\(r_{i}\)及\(r_{j}\)相鄰的相似區域;
  • 計算合並后的區域和其鄰域的相似度集合\(S=S\cup S_{t}\)及\(R=R\cup R_{t}\)
  • 重復以上步驟直至\(S= \varnothing \)

c. 從集合\(R\)中提取出所有的boxes,即定位的矩形區域

對於相似度的計算方法selective search的原始論文中定義為顏色、紋理、尺寸等幾種不同度量方式的疊加之和:

\(s(r_{i},r_{j})=a_{1}s_{colour}(r_{i},r_{j})+a_{2}s_{texture}(r_{i},r_{j})+a_{3}s_{size}(r_{i},r_{j})+a_{4}s_{fill}(r_{i},r_{j})\)    \(a\in \left \{ 0,1 \right \}\)   

對每種具體的計算方式這里就不多提了。

(2) CNN網絡輸入

使用選擇性搜索提取出大小不一的候選區域之后,然后經過卷積神經網絡提取特征,文中提到的是使用12年的AlexNet,此網絡的輸入是固定大小的\(227\times 227\),輸出是\(4096\)維的特征向量,由於輸出的尺寸固定,而RCNN第一步抽取的候選區域大小不一,因此給出了幾種方法對候選區域的大小進行變換以適配網絡輸入:

a. 各向異性(anisotropically)縮放,即對候選區域縮放的高和寬的倍數不同,直接拉成CNN中輸入大小的形式,這種變換在文中稱為“warp”;

b. 各向同性(isotropically)縮放,即縮放的高和寬的比例倍數相同,這里又分為兩種:一種對原始的圖像按等比例縮放后的灰色區域進行填充,另一種不進行填充。

如下圖所示,其中(A)為原始圖像;(B)、(C)分別對應各向同性的兩種方法;(D)對應的是各向異性的方法。另外每種方法在下圖中有兩行,上面的一行表示縮放之后如果候選區域超出了邊界不進行padding,即不使用周圍的像素進行填充,下一行是進行16像素的padding。文中進行的實驗表明使用padding為16像素的“warp”方法效果最好。

 圖9 幾種候選區域縮放的方法對比

(3) CNN網絡訓練

訓練分成“pre-training”+“fine-tuning”:首先選用caffe中已經訓練好的模型在大的數據集上進行預訓練(ILSVRC2012圖像分類的數據集 )得到一個初始的網絡,然后在此網絡的基礎上細調:替換網絡最后的輸出層,因為ImageNet分類數據集的輸出層包含1000個類,這里進行目標檢測的類別不一致,比如VOC使用的是20個類,而ILSVRC2013 的目標檢測使用的是200個類,把背景也當成一類的話,實際的網絡輸出層的個數應該是\(N+1\),\(N\)為目標的類別。在細調的時候考慮與ground truth(也就是真實的包含物體的區域)的IoU超過0.5的為正類,其余的均為負類,迭代的時候使用SGD方法,選取0.001的學習率,使用包含32個正類樣本和96個負類樣本組成mini-bacth。

(4) SVM分類器的訓練

一旦CNN網絡訓練完成,去除網絡中的最后的輸出層,以全連接層的輸出得到新的特征向量,以供訓練SVM。這里文中提到了SVM訓練階段正負樣本的划分,注意的是這里的正負類的選擇和CNN網絡訓練時的不同,訓練SVM時正類定義為ground truth,候選區域中與ground truth的IoU小於0.3的定義為負類,其余的候選區域忽略;文中附錄探討了為什么這樣做的兩個問題:一個是為什么不直接在CNN網絡后面用softmax進行分類,而使用SVM;一個是正負類樣本的定義方式,我們放在第(8)點專門介紹。

(5) 非極大值抑制過濾重疊的bounding box

在test階段,候選區域經過CNN提取特征之后最后使用SVM進行分類評分,得到很多的bounding box,由於這些bounding box包含很多重疊的部分,如下:

圖8 左圖是預期的bounding box,右圖是實際得到的bounding box

文中使用非極大值抑制(non-maximum suppression,NMS)方法去除那些輸出的重疊程度比較高的bounding box,NMS是目標檢測中用的非常頻繁的一種算法,大致的步驟是:

首先對輸出的bounding box進行打分,找出評分最高的bounding box,計算其他的bounding box和它的IoU值,選取一個閾值,從輸出的bounding box中移除那些IoU小於這個閾值的box,然后重復這個步驟,直至僅存在保留的bounding box。文中使用NMS基於每個單獨的類。

(6) 檢測時間分析

整個檢測階段的時間包含:選擇性搜索得到一系列region proposal,然后通過CNN抽取這些region proposal的特征,使用SVM分類打分,最后使用NMS去除重疊部分;作者認為有兩個特性讓檢測比較有效,其一是網絡共享,其二是使用CNN進行了降維;主要的時間開銷時間在計算候選區域和特征(GPU上13s一張,CPU上53秒一張,現在看來真的是非常慢。。。);作者也提到了和DPM算法的比較,精度和速度都有大幅度提升。可想而知,別看現在我們能做到實時高精度的檢測,前幾年這些深度學習方法在目標檢測中的突破真的是巨大。

(7) 回歸器修正box偏差

候選區域經過SVM打分之后,需要經過回歸器進行修正,修正的目的是得到一個新的bounding box,新的bounding box預測的偏差減小,文中使用的回歸器修正啟發於deformable part models(DPM,深度學習火熱之前比較重要的一種目標檢測方法,在以后的blog中有時間會詳細解釋這種方法),而且回歸是基於每個特定類的。具體來說給定預測的bounding box和ground truth的集合\({(P^{i},G^{i})}_{i=1,...,N}\),其中\(P^{i}=(p_{x}^{i},p_{y}^{i},p_{w}^{i},p_{h}^{i})\),\(G^{i}=(g_{x}^{i},g_{y}^{i},g_{w}^{i},g_{h}^{i})\),\(x,y,w,h\)分別表示左上角的坐標以及box的寬和高,修正的目的是把\(P\)變換到預測的ground truth\(\hat{G}\),變換的的函數有四個分別是\(d_{x}(P),d_{y}(P),d_{w}(P),d_{h}(P)\),變換的具體公式如下:

\(\hat{G}_{x}=P_{w}d_{x}(P)+P_{x}\)

 \(\hat{G}_{y}=P_{h}d_{y}(P)+P_{y}\)

\(\hat{G}_{w}=P_{w}exp(d_{w}(P))\)

\(\hat{G}_{h}=P_{h}exp(d_{h}(P))\)

這里的四個\(d_{x}(P)\),\(d_{y}(P)\),\(d_{w}(P)\),\(d_{h}(P)\)由CNN最后一層的pooling層的特征經過線性變換得到:\(d_{*}(P)=w_{*}^{T}\varnothing (P)\),因此這里我們需要學習的參數變成\(w_{*}\),此問題可以看成是一個標准的嶺回歸問題:

 \(w_{*}=\underset{\hat{w}_{*}}{argmin}\sum_{i}^{N}(t_{*}^{i}-\hat{w}_{*}\varnothing(P^{i}) )+\lambda \left \| \hat{w}_{*} \right \|^{2}\)

而上式中回歸的目標\(t\)可以由給定的\(P\)和\(G\)及公式(1)~(4)反推得到:

 \( t_{x}=(G_{x}-P_{x})/P_{w}\)

\( t_{y}=(G_{y}-P_{y})/P_{h}\)

\(t_{w}=log(G_{w}/P_{w})\)

\(t_{h}=log(G_{h}/P_{h})\)

這里帶正則項的標准回歸問題很容易得到封閉解。

(8) 為什么RCNN使用SVM替代softmax層進行分類?

對於這個問題作者分兩點進行了解釋:

其一,作者做過實驗表明,在微調階段嘗試使用和SVM相同定義的正負類樣本數,效果比較差,對此作出假設:怎樣定義正負類樣本數並不重要,重要的是造成這種結果的差異源於微調中數據的有限,當使用IoU0大於0.5的樣本作為正類時(文中用“jittered”形容這些數據),樣本增加了接近30倍,避免了過擬合;並且,這些jittered的數據導致了fine-tuning階段的結果並不是最優的,因為現在選的正類樣本並不是“精准定位”的(顯然這是由於IoU閾值變高導致正類樣本的門檻變“低”了);

其二,根據第一點解釋恰好引出了第二個點,即為什么使用SVM而不是直接使用softmax層進行分類,作者認為按照剛才的解釋,微調階段CNN並不能進行“精准定位”,並且softmax訓練的時候只是隨機采樣負類樣本,而SVM訓練階段可以考慮那些“hard negative”的樣本。這里使用了“hard negative mining”的思想,以目標檢測為例,第一輪訓練的時候先按照預先定義好的正負類樣本進行分類;第二輪對於那些本身是負類卻被誤判為正類的樣本,即通常我們所說的“false positive”樣本,計入負類樣本重新進行訓練,這個過程重復幾次最終得到的效果會比較好。

基於以上兩點考慮,作者認為有必要在CNN后面接上SVM進行分類。

三 RCNN中的對比實驗分析、特征可視化、“Ablation studies”、誤差分析等工作

除了這篇博客第二節中分析的模型架構流程外,作者在實驗分析、數據可視化以及“Ablation studies”、誤差分析等多個方面都進行了很詳盡的分析,這里的內容太多不細說,而是稍微提及。

1. 在Pascal VOC10-12以及ILSVRC2013 detection 的實驗結果
在VOC10上作者主要和DPM類方法(DPM以及SegDPM)以及UVA系統(主要是selective search方法,使用四層空間金字塔的sift方法+核SVM)進行了對比,RCNN在實驗精度上從35.1mAP提升到了53.7mAP,並且速度上也有一定程度提高,而在VOC12上也獲得了53.3的mAP;在ILSVRC2013數據集上和OverFeat方法進行對比(實際列舉的對比方法比較多)從24.3mAP提升到31.4mAP。

2. 特征學習可視化

作者使用了一種非參數的方法來顯示網絡到底學習到了什么,重點分析了最后一個pooling層的激活值的可視化。

3. Ablation studies
Ablation studies 可以看成是去除算法中的某些結構,然后進行實驗並比較分析實驗的對比效果,比較了沒有fine-tuning和有fine-tuning的效果對比;同時還分析了RCNN和兩種不同的DPM方法(HOG+DPM和稀疏編碼直方圖+DPM,簡稱HSC+DPM),得出的結論是RCNN的性能也要好於二者。

4. 關於網絡結構

作者除了使用AlexNet以外,還使用了VGG代替進行實驗,結果從58.5%mAP提升到66.0%mAP,代價是由於網絡變深不少導致計算時間提升。

5. 關於誤差分析

這里的誤差分析使用了paper“Diagnosing error in object detector”的方法,而減小誤差的方法就是之前提到的DPM中使用的回歸修正偏差。

除以上外作者還詳細地討論了在ILSVRC2013上從訓練、驗證、Ablation studies等等非常詳細的實驗對比和討論,工作量非常的豐富,有興趣的同學可以直接看原始paper。

四 RCNN算法總結及其缺點

RCNN是使用深度學習進行目標檢測中非常有意義的一項工作,它首先利用選擇性搜索選取一些區域候選框,然后通過CNN抽取特征並使用SVM進行分類,然后使用NMS排除重疊的bounding box,最后使用回歸器對box的位置進行修正。一方面,RCNN在精度上和速度上相比較傳統方法均有很大的提升,是一個有里程碑意義的研究;另一方面我們應該也可以看到,RCNN這篇論文中的工作量非常大,了解其中的細節便於我們理解目標識別領域的關鍵問題,同時RCNN也結合或借鑒了之前的算法,比如選擇性搜索進行區域候選、使用NMS篩選窗口、DPM中的回歸修正的思想等等,可以說是“站在前人的肩膀上”。通過分析我們可以得出RCNN的一些缺點:

(1) RCNN的耗時體現在兩個階段,一個是區域候選需要一定時間,另一個是對於每一個區域候選框都需要重新丟進網絡里才能抽取特征,特別是后者導致RCNN非常的慢;

(2) RCNN在網絡的輸入是使用的warp方法,這種縮放會不會對最終的精度有影響?

(3) RCNN顯然並不是一個端到端的工作,通常情況下我們認為端到端的工作可以達到更好的效果,因為不同模塊之間的銜接可能會存在一定的信息損失。

本文是目標檢測系列的第一篇,主要介紹目標檢測中的基本問題以及RCNN算法,下篇將介紹SPP算法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM