目標檢測論文解讀1:(RCNN解讀)Rich feature hierarchies for accurate object detection...

一、番外說明

大家好,我是小P,今天和大家一起學習目標檢測領域的經典文章-RCNN,希望大家支持和喜歡。此外,對“目標檢測/模型壓縮/語義分割”感興趣的小夥伴,歡迎加入QQ羣 813221712 討論交流,進羣請看羣公告!
點擊鏈接加入羣聊【Object Detection】:https://jq.qq.com/?_wv=1027&k=5kXCXF8

二、資料推薦

1、本文相關資料推薦

注:爲方便下載,部分資源已上傳百度網盤,點擊即可下載,若網盤失效,望告知!
①論文原著地址:https://pan.baidu.com/s/1Lj-ZQYG4h1FKH-cTmdRbgg
②中英對照翻譯:https://pan.baidu.com/s/15EA2A-JDc_D7L1Af2_ACeA
③官方源碼地址:http://www.cs.berkeley.edu/˜rbg/rcnn
④其他版本代碼:https://github.com/Liu-Yicheng/R-CNN

三、基礎知識

1、目標分類 VS 目標檢測 VS 語義分割 VS 實例分割

千言萬語,不如一張圖來的直接(此處以行人爲例進行說明)!如下圖所示:
計算機視覺典型任務實例圖
(a)圖表示目標分類,模型只需告訴你該圖片的主體對象是什麼類別,人?車?類似的常用數據集有cifar10、cifar100、MNIST、貓狗大戰、ImageNet等。此外,模型往往會給出 Top_k 的概率,即該圖片中對象有可能的類別排序,通常的評測指標也分 Top_1 和 Top_5。目標分類的結果爲:給圖片整體打一個標籤。

(b)圖表示目標檢測,該任務可以描述爲兩個子任務。首先,這張圖片中哪兒有對象?這是定位問題,其次,該對象屬於什麼類別?這是分類問題。目標檢測任務相對於目標分類來說更復雜,主要體現在需要額外的位置信息,而且一張圖片可能出現的對象種類和個數通常不止一個和一類。常用的目標檢測數據集有:VOC、COCO、KITTI、伯克利等。目標檢測的結果爲:用矩形框或其它形式標識出圖片中的對象,同時說明該對象的類別。

(c)圖表示語義分割,這是一種基於像素級別的分類問題,即確定圖片中的每一個像素點屬於何種類別。常用的語義分割數據集有:VOC、Cityscapes等。語義分割的結果爲:一張圖片的像素類別掩碼。

(d)圖表示實例分割,其也是一種基於像素級別的分類問題,與語義分割最大的差異在於需要區分類內差異,也就是即使是同一個類別,如:人,也需要區分不同的個體,如圖(d)用不同的顏色標識。常用的實例分割數據集有:Cityscapes。實例分割的結果爲:一張圖片的像素類別掩碼。

注意:現在通常使用Bbox表示的目標檢測任務其實是一種不精細的表示方式,如圖(b)中的三個矩形框,每個矩形框中不僅包含了該對象本身,還包含了其它對象和背景。而實例分割則可以視爲一種精確的目標檢測,一個對象的所有像素點給檢測出來,達到了像素級別,所以,筆者認爲目標檢測的終極目標應該是實例分割的形式,只是現階段受限於硬件的算力和模型的精度。

2、有監督預訓練與無監督預訓練

有監督預訓練Supervised pre-training)
所謂的有監督預訓練,我們也可以把它稱之爲遷移學習。
比如你已經有一大堆標註好的人臉年齡分類的圖片數據,訓練了一個CNN,用於人臉的年齡識別。

然後當你遇到新的項目任務是:人臉性別識別.

那麼這個時候你可以利用已經訓練好的年齡識別CNN模型,去掉最後一層,然後其它的網絡層參數就直接複製過來,繼續進行訓練。這就是所謂的遷移學習,說的簡單一點就是把一個任務訓練好的參數,拿到另外一個任務,作爲神經網絡的初始參數值,這樣相比於你直接採用隨機初始化的方法,精度可以有很大的提高。

圖片分類標註好的訓練數據非常多,但是物體檢測的標註數據卻很少,如何用少量的標註數據,訓練高質量的模型,這就是文獻最大的特點,這篇paper採用了遷移學習的思想。

文獻就先用了ILSVRC2012這個訓練數據庫(這是一個圖片分類訓練數據庫),先進行網絡的圖片分類訓練。這個數據庫有大量的標註數據,共包含了1000種類別物體,因此預訓練階段cnn模型的輸出是1000個神經元,或者我們也直接可以採用Alexnet訓練好的模型參數。

無監督預訓練(Unsupervised pre-training)

無監督預訓練這個名詞我們比較熟悉,棧式自編碼、DBM採用的都是採用無監督預訓練。因爲預訓練階段的樣本不需要人工標註數據,所以就叫做無監督預訓練。這樣操作是爲了讓系統獲得更好的初始化參數。

3、IOU定義

物體檢測需要定位出物體的bounding box,就像下面的圖片一樣,我們不僅要定位出車輛的bounding box 我們還要識別出bounding box 裏面的物體就是車輛。對於bounding box的定位精度,有一個很重要的概念,因爲我們算法不可能百分百跟人工標註的數據完全匹配,因此就存在一個定位精度評價公式:IOU。

IOU定義了兩個bounding box的重疊度,如下圖所示:
矩形框A、B的一個重合度IOU計算公式爲(這個CSDN我實在不大會排版/大哭):
IOU=(A∩B)/(A∪B)
就是矩形框A、B的重疊面積佔A、B並集的面積比例:
IOU=S(A∩B)/S(A∪B)
IOU=S(A∩B)/(S(A)+S(B)-S(A∩B))

4、非極大值抑制(NMS)

目標檢測會從一張圖片中找出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是我們保留下來的第二個矩形框。

就這樣一直重複,找到所有被保留下來的矩形框。

5、何爲mAP

評價檢測器好壞的指標通常有:對數平均漏檢率(Log Average Miss-rate,LAMR)、幀率(Frame per Second,FPS)、查準率(Average Precision,AP)和查全率(Recall)。幀率表徵模型的效率,查準率、對數平均漏檢率和查全率反映模型的精度。

mAP這個概念是PASCAL VOC比賽中所明確的metric。它的意思是輸出的結果是一個ranked list,裏邊每一個元素包含了類別、框的信息,以及confidence,這個confidence就用來排序。有了排序,就可以計算AP了,然後再針對所有分類,取一個mean,就得到了mAP。這裏爲何要排序呢?是因爲每一個框有一個confidence,mAP作爲評估指標,需要考慮confidence進來。比方說我給出一個框,說我有99%的信心這裏有一個貓,結果這裏沒有,相比我給出一個框,說我有10%的信心這裏有一個貓,結果也沒有,這兩個框的penalty和reward不能一樣的。因爲99%信心說有,結果沒有,那就說明這個系統很有問題。反之,假如我給出一個框,99%的信心說有一個貓,然後真有貓,相比10%信心說有貓,結果也是有貓,這兩個框也不一樣。也就是越“靠譜”,reward越大。什麼叫靠譜?靠譜的意思是信心足的時候,一般結果正確。所以我們根據confidence進行排序之後,就應該給排名靠前的結果,也就是confidence比較大的一些更大的權重。所以纔會有ranked list。或者可以理解爲,我有一個query,查詢的內容是,系統中的圖片裏貓都在那兒?那麼這個就肯定需要ranked list了。

值得一提的是在2010年之前,VOC比賽用的AP計算方法並不是上邊所述的計算方法,而是對interpolated 的那個圖均勻取11個點,[0.0 0.1 0.2 … 1.0]然後求平均。後來才成上邊所述的AP計算方法。

計算方式和代碼參考:https://github.com/rafaelpadilla/Object-Detection-Metrics#create-the-ground-truth-files

6、邊界框迴歸

邊界框迴歸問題很重要也很複雜,詳細參考博客:
https://blog.csdn.net/zijin0802034/article/details/77685438

四、論文解讀

1、本文的應用背景(擬解決關鍵問題)

①目標檢測任務的性能在2010年至2012年提升很少,基本上是模型的組合或在現有的技術上少許改進。

②以AlexNet爲代表的CNN網絡在目標分類任務上取得了很好的成就,CNN對ImageNet的分類結果在多大程度上可以泛化爲PASCAL VOC目標檢測挑戰賽的結果?

③CNN的層次結構特徵,多大程度上影響了檢測任務的性能(不同層次的特徵使用的效果對比)

2、本文亮點

①將複雜的CNN網絡應用於自下而上的候選區域之上,以便定位和分割對象。

②使用了遷移學習來提高了目標檢測的性能。

③文章列舉了大量的實驗分析數據,十分值得借鑑,具體可參考文章拜讀。

3、算法流程

測試階段流程,如上圖所示:
第一步:輸入待處理的圖片
第二步:應用SS(Selective search)算法在輸入圖片上生成大約2000個候選框(有可能是目標的框)
第三步:對第二步中生成的所有候選框,利用CNN提取固定長度的特徵
第四步:基於每個候選框提取出來的特徵,放入二分類的SVM中進行分類
第五步:對於每一類目標的候選框(第四步後的候選框已經有類別信息)應用NMS篩選重複框
第六步:對於第五步後保留的候選框的特徵,使用邊界框迴歸來精修位置
注:原則上第三步到第六步可以重複以提高精度,但作者文中已說明沒必要這樣做,提升不大

幾點說明:
①SS算法主要是基於目標的顏色、形狀、輪廓、紋理等信息的,算法具體參考:
https://www.koen.me/research/pub/uijlings-ijcv2013-draft.pdf
https://blog.csdn.net/Julialove102123/article/details/77938017

②提取特徵的CNN網絡有兩個可選方案:第一選擇經典的Alexnet;第二選擇VGG16。經過測試Alexnet精度爲58.5%,VGG16精度爲66%。VGG這個模型的特點是選擇比較小的卷積核、選擇較小的跨步,這個網絡的精度高,不過計算量是Alexnet的7倍。

爲了簡單起見,我們就直接選用Alexnet,並進行講解;Alexnet特徵提取部分包含了5個卷積層、2個全連接層,在Alexnet中p5層神經元個數爲9216、 f6、f7的神經元個數都是4096,通過這個網絡訓練完畢後,最後提取特徵每個輸入候選框圖片都能得到一個4096維的特徵向量。

③由於AlexNet和VGG中均有全連接層,所以要求輸入特徵提取網絡的圖片(候選區域)的尺寸固定(如 227 * 227),而SS算法根據實際目標生成的候選區域大小差異很大,則需要將候選區域變形到固定尺寸(227 * 227),變形的方式有:
(1)各向異性縮放

這種方法很簡單,就是不管圖片的長寬比例,管它是否扭曲,進行縮放就是了,全部縮放到CNN輸入的大小227*227,如下圖(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的精度最高,具體不再囉嗦。

OK,上面處理完後,可以得到指定大小的圖片,因爲我們後面還要繼續用這2000個候選框圖片,繼續訓練CNN、SVM。然而人工標註的數據一張圖片中就只標註了正確的bounding box,我們搜索出來的2000個矩形框也不可能會出現一個與人工標註完全匹配的候選框。

因此我們需要用IOU爲2000個bounding box打標籤,以便下一步CNN訓練使用。在CNN階段,如果用selective search挑選出來的候選框與物體的人工標註矩形框的重疊區域IoU大於0.5,那麼我們就把這個候選框標註成物體類別,否則我們就把它當做背景類別。SVM階段的正負樣本標籤問題,等到了svm講解階段我再具體講解。

④AlexNet和VGG有很多層特徵可以使用,如pool5,fc6,fc7,究竟選擇哪一層的特徵用於SVM和邊界框迴歸好?
在這裏插入圖片描述
如上圖的一二三行所示,當分別選取AlexNet的pool5,fc6,fc7時的mAP其實差異不大,但fc6和fc7含有的參數量分別爲:4096 * 9216 和 4096 * 4096,參數量巨大。注意此時是沒有微調和加邊界框迴歸的。

⑤AlexNet和VGG均是基於ImageNet訓練的,是否需要微調?
文獻給我們證明了一個理論,如果你不進行fine-tuning,也就是你直接把Alexnet模型當做萬金油使用,類似於HOG、SIFT一樣做特徵提取,不針對特定的任務。然後把提取的特徵用於分類,結果發現p5的精度竟然跟f6、f7差不多,而且f6提取到的特徵還比f7的精度略高;如果你進行fine-tuning了,那麼f7、f6的提取到的特徵最會訓練的svm分類器的精度就會飆漲。對比上表的前七行結果。

據此我們明白了一個道理,如果不針對特定任務進行fine-tuning,而是把CNN當做特徵提取器,卷積層所學到的特徵其實就是基礎的共享特徵提取層,就類似於SIFT算法一樣,可以用於提取各種圖片的特徵,而f6、f7所學習到的特徵是用於針對特定任務的特徵。

打個比方:對於人臉性別識別來說,一個CNN模型前面的卷積層所學習到的特徵就類似於學習人臉共性特徵,然後全連接層所學習的特徵就是針對性別分類的特徵了。

⑥CNN訓練的時候,本來就是對bounding box的物體進行識別分類訓練,是一個端到端的任務,在訓練的時候最後一層softmax就是分類層.那麼爲什麼作者閒着沒事幹要先用CNN做特徵提取(提取fc7層數據),然後再把提取的特徵用於訓練svm分類器?

這個是因爲svm訓練和cnn訓練過程的正負樣本定義方式各有不同,導致最後採用CNN softmax輸出比採用svm精度還低。事情是這樣的:

1).cnn在訓練的時候,對訓練數據做了比較寬鬆的標註,比如一個bounding box可能只包含物體的一部分,那麼我也把它標註爲正樣本,用於訓練cnn;

2).採用這個方法的主要原因在於因爲CNN容易過擬合,所以需要大量的訓練數據,所以在CNN訓練階段我們是對Bounding box的位置限制條件限制的比較松(IOU只要大於0.5都被標註爲正樣本了);

3).然而svm訓練的時候,因爲svm適用於少樣本訓練,所以對於訓練樣本數據的IOU要求比較嚴格,我們只有當bounding box把整個物體都包含進去了,我們才把它標註爲物體類別,然後訓練svm,具體請看下文。

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

網絡優化求解:採用隨機梯度下降法,學習速率大小爲0.001;

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

3、二分類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個候選框,可以得到20004096這樣的特徵向量矩陣,然後我們只需要把這樣的一個矩陣與svm權值矩陣4096N點(Therefore,the pool5 need to be set as)乘(N爲分類類別數目,因爲我們訓練的N個svm,每個svm包好了4096個W),就可以得到結果了。

4、還存在什麼問題

很明顯,最大的缺點是對一張圖片的處理速度慢,這是由於一張圖片中由selective search算法得出的約2k個建議框都需要經過變形處理後由CNN前向網絡計算一次特徵,這其中涵蓋了對一張圖片中多個重複區域的重複計算,很累贅;

知乎上有人說R-CNN網絡需要兩次CNN前向計算,第一次得到建議框特徵給SVM分類識別,第二次對非極大值抑制後的建議框再次進行CNN前向計算獲得Pool5特徵,以便對建議框進行迴歸得到更精確的bounding-box,這裏文中並沒有說是怎麼做的,博主認爲也可能在計算2k個建議框的CNN特徵時,在硬盤上保留了2k個建議框的Pool5特徵,雖然這樣做只需要一次CNN前向網絡運算,但是耗費大量磁盤空間;

訓練時間長,雖然文中沒有明確指出具體訓練時間,但由於採用RoI-centric sampling【從所有圖片的所有建議框中均勻取樣】進行訓練,那麼每次都需要計算不同圖片中不同建議框CNN特徵,無法共享同一張圖的CNN特徵,訓練速度很慢;

整個測試過程很複雜,要先提取建議框,之後提取每個建議框CNN特徵,再用SVM分類,做非極大值抑制,最後做bounding-box迴歸才能得到圖片中物體的種類以及位置信息;同樣訓練過程也很複雜,ILSVRC 2012上預訓練CNN,PASCAL VOC 2007上微調CNN,做20類SVM分類器的訓練和20類bounding-box迴歸器的訓練;這些不連續過程必然涉及到特徵存儲、浪費磁盤空間等問題。

再補充自己幾點總結:(1)數據總共有三個訓練用途:CNN fine-tune、SVM training、bounding-box regression training;(2)文中作者還分析了幾種可能會對實驗結果產生影響的因素,建議看一看,對以後自己想問題很有幫助:三種訓練集數量、數據集選擇、BB、RP這幾種影響因素;(3)文中作者還考慮了R-CNN和Overfeat算法的關係,並留下了如何提速R-CNN這一懸念;(4)用R-CNN來做語義分割,計算features的兩種策略:fg和full以及它們如何選擇;(5)附錄中對於resized操作、Bounding-box regression、數據冗餘等有詳細介紹,可以看一看;

五、特別鳴謝

https://blog.csdn.net/zhangyoufei9999/article/details/80406423
https://blog.csdn.net/u011534057/article/details/51218250
https://www.cnblogs.com/zf-blog/p/6740736.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章