目標檢測(object detection)是計算機視覺中很是具備挑戰性的一項工做,一方面它是其餘不少後續視覺任務的基礎,另外一方面目標檢測不只須要預測區域,還要進行分類,所以問題更加複雜。最近的5年使用深度學習方法進行目標檢測取得了很大的突破,所以想寫一個系列來介紹這些方法。這些比較重要的方法能夠分紅兩條主線,一條是基於區域候選(region proposal)的方法,即經過某種策略選出一部分候選框再進行後續處理,好比RCNN-SPP-Fast RCNN-Faster RCNN-RFCN等;另外一條是直接使用卷積神經網絡將圖像變換到一個小的尺度,在新的尺度上使用anchor box來預測目標區域,這一類方法包括SSD以及Yolo的各個版本等;另外這個系列中也會穿插一些其餘的算法如OverFeat、DPM等。本文是目標檢測系列的第一篇,主要說起目標檢測中的基本問題,並詳細地介紹了RCNN算法。算法
一 目標識別問題的基本描述api
目標檢測是計算機視覺中很是具備挑戰性的一項工做,它是其餘不少後續視覺任務的基礎,好比咱們一般所說的識別(分類)問題,以人臉識別爲例,一般其不是一個徹底的端到端(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) 第二步,分爲兩個小步:
(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 \):
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算法。