乾貨|基於深度學習的目標檢測學習總結

來源:csdn 作者:NodYoung

在計算機視覺領域,「目標檢測」主要解決兩個問題:圖像上多個目標物在哪裡(位置),是什麼(類別)。 圍繞這個問題,人們一般把其發展歷程分為3個階段:

1. 傳統的目標檢測方法 2. 以R-CNN為代表的結合region proposal和CNN分類的目標檢測框架(R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN, R-FCN) 3. 以YOLO為代表的將目標檢測轉換為回歸問題的端到端(End-to-End)的目標檢測框架(YOLO, SSD)

下面結合參考資料分別對其做一下總結和自己的理解。

傳統的目標檢測方法

傳統目標檢測的方法一般分為三個階段:首先在給定的圖像上選擇一些候選的區域,然後對這些區域提取特徵,最後使用訓練的分類器進行分類。分別如下:

  1. 區域選擇:利用不同尺寸的滑動窗口框住圖中的某一部分作為候選區域。
  2. 特徵提取:提取候選區域相關的視覺特徵。比如人臉檢測常用的Harr特徵;行人檢測和普通目標檢測常用的HOG特徵等。由於目標的形態多樣性,光照變化多樣性,背景多樣性等因素使得設計一個魯棒的特徵並不是那麼容易,然而提取特徵的好壞直接影響到分類的準確性。
  3. 分類器:利用分類器進行識別,比如常用的SVM模型。

傳統的目標檢測中,多尺度形變部件模型DPM(Deformable Part Model)表現比較優秀,連續獲得VOC(Visual Object Class)2007到2009的檢測冠軍,。DPM把物體看成了多個組成的部件(比如人臉的鼻子、嘴巴等),用部件間的關係來描述物體,這個特性非常符合自然界很多物體的非剛體特徵。DPM可以看做是HOG+SVM的擴展,很好的繼承了兩者的優點,在人臉檢測、行人檢測等任務上取得了不錯的效果,但是DPM相對複雜,檢測速度也較慢,從而也出現了很多改進的方法。

總結:傳統目標檢測存在的兩個主要問題:一個是基於滑動窗口的區域選擇策略沒有針對性,時間複雜度高,窗口冗餘;二是手工設計的特徵對於多樣性的變化並沒有很好的魯棒性。

基於Region Proposal的深度學習目標檢測演算法

對於滑動窗口存在的問題,region proposal(候選區域)提供了很好的解決方案。region proposal利用了圖像中的紋理、邊緣、顏色等信息預先找出圖中目標可能出現的位置,可以保證在選取較少窗口(幾千個甚至幾百個)的情況下保持較高的召回率。這大大降低了後續操作的時間複雜度,並且獲取的候選窗口要比滑動窗口的質量更高。這裡貼兩張介紹region proposal的PPT:

2014年,RBG(Ross B. Girshick)大神使用region proposal+CNN代替傳統目標檢測使用的滑動窗口+手工設計特徵,設計了R-CNN框架,使得目標檢測取得巨大突破,並開啟了基於深度學習目標檢測的熱潮。

R-CNN

R-CNN的目標檢測流程:

  1. 輸入圖像,用selective search演算法在圖像中提取2000個左右的region proposal(侯選框),並把所有region proposal warp(縮放)成固定大小(原文採用227×227)
  2. 將歸一化後的region proposal輸入CNN網路,提取特徵
  3. 對於每個region proposal提取到的CNN特徵,再用SVM分類來做識別,用線性回歸來微調邊框位置與大小,其中每個類別單獨訓練一個邊框回歸(bounding-box regression)器。

總結:R-CNN框架仍存在如下問題:

  1. 重複計算:我們通過region proposal提取2000個左右的候選框,這些候選框都需要進行CNN操作,計算量依然很大,其中有不少其實是重複計算
  2. multi-stage pipeline,訓練分為多個階段,步驟繁瑣:region proposal、CNN特徵提取、SVM分類、邊框回歸,
  3. 訓練耗時,佔用磁碟空間大:卷積出來的特徵數據還需要單獨保存

SPP-net

SPP-net的主要思想是去掉了原始圖像上的crop/warp等操作,換成了在卷積特徵上的空間金字塔池化層(Spatial Pyramid Pooling,SPP)。 為何要引入SPP層 ?一部分原因是fast R-CNN里對圖像進行不同程度的crop/warp會導致一些問題,比如上圖中的crop會導致物體不全,warp導致物體被拉伸後形變嚴重。但更更更重要的原因是:fast R-CNN里我們對每一個region proposal都要進行一次CNN提取特徵操作,這樣帶來了很多重複計算。試想假如我們只對整幅圖像做一次CNN特徵提取,那麼原圖一個region proposal可以對應到feature map(特徵圖)一個window區域,只需要將這些不同大小window的特徵映射到同樣的維度,將其作為全連接的輸入,就能保證只對圖像提取一次卷積層特徵。

SPP就是為了解決這種問題的。SPP使用空間金字塔採樣(spatial pyramid pooling)將每個window劃分為4*4, 2*2, 1*1的塊,然後每個塊使用max-pooling下採樣,這樣對於每個window經過SPP層之後都得到了一個長度為(4*4+2*2+1)*256維度的特徵向量,將這個作為全連接層的輸入進行後續操作。

總結:使用SPP-NET大大加快了目標檢測的速度,但是依然存在著很多問題:

  1. 訓練分為多個階段,依然步驟繁瑣
  2. SPP-NET在微調網路時固定了卷積層,只對全連接層進行微調,而對於一個新的任務,有必要對卷積層也進行微調。(分類的模型提取的特徵更注重高層語義,而目標檢測任務除了語義信息還需要目標的位置信息)(這一點其實不是很懂啊)

Fast R-CNN

Fast R-CNN在R-CNN的基礎上又做了一些改進:

  1. 與SPP類似,它只對整幅圖像做一次CNN特徵提取,在後面加了一個類似於SPP的ROI pooling layer,其實就是下採樣。不過因為不是固定尺寸輸入,因此每次的pooling網格大小需要動態調整。比如某個ROI區域坐標為 (x1,y1,x2,y2),即輸入size為 (y2?y1)?(x2?x1)(y2?y1)?(x2?x1) ,如果要求pooling的輸出size統一為 pooledheight?pooledwidth ,那麼每個網格的size為 y2?y1pooledheight?x2?x1pooledwidth。
  2. 整個的訓練過程是端到端的(除去region proposal提取階段),梯度能夠通過RoI Pooling層直接傳播,直接使用softmax替代SVM分類,同時利用Multi-task Loss(多任務損失函數)將邊框回歸和分類一起進行。這裡著重說一下Multi-task Loss函數:L(p,u,tu,v)=Lcls(p,u)+λ[u?1]Lloc(tu,v)Lcls(p,u)=?logpuLloc(tu,v)=∑i?x,y,w,hsmoothL1(tui?vi))smoothL1(x)={0.5x2|x|?0.5if|x|<>

簡單解釋一下, p=(p0,p1,?,pk),是針對每個ROI區域的分類概率預測; tk=(tkx,tky,tkw,tkh),是針對每個ROI區域坐標的偏移(具體偏移怎麼算看下位RPN處); u為真實類別, v為groundtruth坐標。

這裡再說一下Fast R-CNN的主要步驟:

  1. 特徵提取:以整張圖片為輸入利用CNN得到圖片的特徵層;
  2. region proposal:通過Selective Search等方法從原始圖片提取區域候選框,並把這些候選框一一投影到最後的特徵層;
  3. 區域歸一化:針對特徵層上的每個區域候選框進行RoI Pooling操作,得到固定大小的特徵表示;
  4. 分類與回歸:然後再通過兩個全連接層,分別用softmax做多目標分類,用回歸模型進行邊框位置與大小微調。

總結:Fast R-CNN確實做得很棒,其缺點在於:region proposal的提取使用selective search,目標檢測時間大多消耗在這上面(提region proposal 2~3s,而提特徵分類只需0.32s),無法滿足實時應用。

Faster R-CNN

Faster R-CNN最大的貢獻就是RPN(Region Proposal Networks)網路。RPN的核心思想是使用卷積神經網路直接產生region proposal,使用的方法本質上是滑動窗口。假設我們得到的conv feature map維度是 13?13?256,sliding window的大小是 3?3,即我們需要用一個 3?3?256?256的卷積核從而對每個位置得到一個256-d的向量;然後就是k=9,對每一個anchor box輸出是物體和是背景的概率,所以cls layer就是18個輸出節點了,那麼在256-d和cls layer之間使用一個 1?1?256?18的卷積核,就可以得到cls layer;同理,reg layer的輸出是36個,所以對應的卷積核是 1?1?256?36,這樣就可以得到reg layer。 這裡有一點我剛開始沒想通:怎麼體現論文中所說的3種尺度(128,256,512),3種長寬比(1:1,1:2,2:1)這個先驗知識?其實這個通過loss founction可以看出來。說白了,我們相當於是以anchor box為錨點來對其附近的ground-truth box做一個bounding-box回歸,好饒,,, RPN的loss founcton:

這裡 x,xa和x?分別代表於此窗口、anchor box窗口和ground-truth窗口的值。 在訓練過程中,我們給每一個anchor對應的區域標註label。正標籤:那些和任意一個ground truth box的重疊區域IOU最大的,對於那些和指定的ground truth的IOU超過0.7的。負標籤:與所有的ground truth的IOU都小於0.3的。剩下的既不是正樣本也不是負樣本,不用於最終訓練。

Faster R-CNN的主要步驟如下:

  1. 特徵提取:同Fast R-CNN;
  2. region proposal:在最終的卷積特徵層上利用k個不同的矩形框(Anchor Box)進行region proposal;即對每個Anchor Box對應的區域進行object/non-object二分類,並用k個回歸模型(各自對應不同的Anchor Box)微調候選框位置與大小
  3. 區域歸一化:同fast R-CNN;
  4. 分類與回歸:進行目標分類,並做邊框回歸(感覺這一塊再做一次邊框回歸是不是有點重複)。

Faster R-CNN的訓練:為了讓RPN的網路和Fast R-CNN網路實現卷積層的權值共享,其訓練方法比較複雜,簡而言之就是迭代的Alternating training。具體可參考下面給出的鏈接。

這篇論文非常優秀,其中介紹到的一些解決multiple scale或帶有權值共享的聯合訓練的方式都很值得學習借鑒。

R-FCN

這一塊沒了解清楚,只知道一個概念:位置敏感得分地圖。 RCNN學習筆記(11):R-FCN: Object Detection via Region-based Fully Convolutional Networks 深度學習論文筆記:R-FCN 論文筆記 | R-FCN: Object Detection via Region-based Fully Convolutional Networks

http://www.infocool.net/kb/OtherMobile/201610/196041.html

基於回歸方法的端到端(End-to-End)的深度學習目標檢測演算法

本小節介紹的為徹底端到端(End-to-End)的目標檢測方法,這些方法無需region proposal。

YOLO

從網路結構可以看出整個過程非常簡單,不需要中間的region proposal在找目標,直接回歸便完成了位置和類別的判定。

那麼如何才能做到直接在不同位置的網格上回歸出目標的位置和類別信息呢?上面是YOLO的網路結構圖,主要是最後兩層的結構,卷積層之後接了一個4096維的全連接層,然後後邊又全連接到一個7*7*30維的張量上。實際上這7*7就是劃分的網格數,現在要在每個網格上預測目標兩個可能的位置以及這個位置的目標置信度和類別,也就是每個網格預測兩個目標,每個目標的信息有4維坐標信息(中心點坐標+長寬),1個是目標的置信度,還有類別數20(VOC上20個類別),總共就是(4+1)*2+20 = 30維的向量。這樣可以利用前邊4096維的全圖特徵直接在每個網格上回歸出目標檢測需要的信息(邊框+類別信息)。

下面說一下loss函數:YOLO使用均方誤差(mean squared error,均方誤差是各數據偏離真實值的距離平方和的平均數)作為loss函數來優化模型參數,即網路輸出的 S?S?(B?5+C)維向量與真實圖像的對應 S?S?(B?5+C)維向量的均方誤差。

如下式所示。其中,coordError、iouError和classError分別代表預測數據與標定數據之間的坐標誤差、IOU誤差和分類誤差。

YOLO對上式loss的計算進行了如下修正。 a) 位置相關誤差(坐標、IOU)與分類誤差對網路loss的貢獻值是不同的,因此YOLO在計算loss時,使用 λcoord=5修正 coordError。

b) 在計算IOU誤差時,包含物體的格子與不包含物體的格子,二者的IOU誤差對網路loss的貢獻值是不同的。若採用相同的權值,由於一幅圖片中不包含物體的格子更多,自然他們對loss函數在計算網路參數梯度時的影響更大。為解決這個問題,YOLO 使用 λnoobj=0.5修正iouError。(注此處的『包含』是指存在一個物體,它的中心坐標落入到格子內)。

c) 對於相等的誤差值,大物體誤差對檢測的影響應小於小物體誤差對檢測的影響。這是因為,相同的位置偏差佔大物體的比例遠小於同等偏差佔小物體的比例。YOLO將物體大小的信息項(w和h)進行求平方根來改進這個問題。(註:這個方法並不能完全解決這個問題)。

綜上,YOLO在訓練過程中Loss計算如下式所示:

其中, x,y,w,C,p為網路預測值, x,y,w,C,p帽 為標註值。 Πobji 表示物體落入格子i中, Πobjij 和 Πnoobjij 分別表示物體落入與未落入格子i的第j個bounding box內。

總結:YOLO簡化了整個目標檢測流程,速度的提升也很大,但是YOLO還是有不少可以改進的地方,比如S×S的網格就是一個比較啟發式的策略,如果兩個小目標同時落入一個格子中,模型也只能預測一個。另一個問題是YOLO loss函數中,大物體IOU誤差和小物體IOU誤差對網路訓練中loss貢獻值接近(雖然採用求平方根方式,但沒有根本解決問題);因此,對於小物體,小的IOU誤差也會對網路優化過程造成很大的影響,從而降低了物體檢測的定位準確性。並且,YOLO採用了多個下採樣層,網路學到的物體特徵並不精細,因此也會影響檢測效果。

與faster rcnn相比,YOLO有更加明顯的優勢,首先faster rcnn需要一個rpn網路代替selective search來找出候選區域,而yolo則直接將7x7這49個區域作為候選區域。

SSD

SSD和YOLO的網路結構對比

對於SSD說兩點: a) 上面分析了YOLO存在的問題,使用整圖特徵在7*7的粗糙網格內回歸對目標的定位並不是很精準。那是不是可以結合region proposal的思想實現精準一些的定位?YOLO預測某個位置使用的是全圖的特徵,SSD預測某個位置使用的是這個位置周圍的特徵(感覺更合理一些)。那麼如何建立某個位置和其特徵的對應關係呢?可能你已經想到了,使用Faster R-CNN的anchor機制。如SSD的框架圖所示,假如某一層特徵圖(圖b)大小是8*8,那麼就使用3*3的滑窗提取每個位置的特徵,然後這個特徵回歸得到目標的坐標信息和類別信息(圖c)。

b) 不同於Faster R-CNN,這個anchor是在多個feature map上,這樣可以利用多層的特徵並且自然的達到多尺度(不同層的feature map 3*3滑窗感受野不同)。

具體還沒有搞清楚,參考: 論文閱讀:SSD: Single Shot MultiBox Detector 目標檢測方法簡介:RPN(Region Proposal Network) and SSD(Single Shot MultiBox Detector)

http://blog.csdn.net/u010167269/article/details/52563573

YOLO v2精度的改進(Better)

  1. Batch Normalization(批規範化) :使用Batch Normalization對網路進行優化,讓網路提高了收斂性,同時還消除了對其他形式的正則化(regularization)的依賴。
  2. High Resolution Classifier :在YOLOv2中,作者首先採用448×448解析度的ImageNet數據finetune使網路適應高解析度輸入;然後將該網路用於目標檢測任務finetune。
  3. Convolutional With Anchor Boxes :之前的YOLO利用全連接層的數據完成邊框的預測,導致丟失較多的空間信息,定位不準。作者在這一版本中借鑒了Faster R-CNN中的Anchor思想,回顧一下,anchor是RNP網路中的一個關鍵步驟。
  4. Dimension Clusters(維度聚類) :之前Anchor Box的尺寸是手動選擇的,所以尺寸還有優化的餘地。 為了優化,在訓練集(training set)Bounding Boxes上跑了一下k-means聚類,來找到一個比較好的值。 如果我們用標準的歐式距離的k-means,尺寸大的框比小框產生更多的錯誤。因為我們的目的是提高IOU分數,這依賴於Box的大小,所以距離度量的使用:

  • Direct location prediction :在YOLO模型上採用anchor boxes的第二個關鍵是模型不穩定性,特別是在前面幾輪訓練。大部分不穩定因素來源於預測boxes位置(x,y)。作者就沒有採用預測直接的offset的方法,而使用了預測相對於grid cell的坐標位置的辦法。
  • Fine-Grained Features(細粒度特徵) :有別於faster rcnn和SSD採用多尺度的特徵圖進行預測,yolov2提出了一個全新的思路,作者引入了passthrough layer,這個層的作用就是將上一層特徵圖的相鄰像素都切除一部分組成了另外一個通道。例如,將26*26*512的特徵圖變為13*13*2048的特徵圖(這裡具體的實現過程需要看作者的源碼,但是,為了解釋這個變化過程,可以做這樣的解釋,就是將一個26*26的圖的像素放到4個13*13的圖中,水平每2個像素取1個,垂直也是每2個像素取一個,一共就可以得到2*2=4個,512*4=2048),使得特徵圖的數目提高了4倍,同時,相比於26*26的特徵圖,13*13的特徵圖更有利用小目標物的檢測。
  • Multi-Scale Training :最初的YOLO輸入尺寸為448×448,加入anchor boxes後,輸入尺寸為416×416。模型只包含卷積層和pooling 層,因此可以隨時改變輸入尺寸。作者在訓練時,每隔幾輪便改變模型輸入尺寸,以使模型對不同尺寸圖像具有魯棒性。
  • 更加快速(faster)

    1. Darknet-19
    2. Training for classification: 網路訓練在 ImageNet 1000類分類數據集,訓練了160epochs。
    3. Training for detection :網路去掉了最後一個卷積層,而加上了三個3*3卷積層,每個卷積層有1024個Filters,每個卷積層緊接著一個1*1卷積層, with the number of outputs we need for detection。

    多分類的改進(Stronger)

    使用聯合訓練方法時,中間會出現一些問題:但是檢測數據集只有粗粒度的標記信息,像「貓「、「 狗」之類,而分類數據集的標籤信息則更細粒度,更豐富。比如狗這一類就包括」哈士奇「」牛頭梗「」金毛狗「等等。所以如果想同時在監測數據集與分類數據集上進行訓練,那麼就要用一種一致性的方法融合這些標籤信息。

    作者結合詞向量樹(wordtree)等方法,使YOLOv2的檢測種類擴充到了上千種。

    作者大概說的是,之前的技術改進對檢測任務很有幫助,在未來的工作中,可能會涉足弱監督方法用於圖像分割。監督學習對於標記數據的要求很高,未來要考慮弱標記的技術,這將會極大擴充數據集,提升訓練量。

    後一半寫的凌亂了,有時間再整理一下。

    《全球人工智慧》開始招人啦!

    一、1名中文編輯(深圳):熟悉國內AI技術媒體、企業,對AI有一定了解,有非常強烈的興趣進入這個行業,學習能力強,負責中文類AI技術新聞采編(有經驗)。待遇:8-12k

    二、1名英文編譯(深圳):英語水平能看懂英文的新聞,對AI有一定了解,有非常強力的興趣進入這個行業,學習能力強,負責英文類AI技術新聞采編和兼職翻譯管理(有經驗)。待遇:8-12k

    三、1名課程規劃(深圳):計算機相關專業,對人工智慧技術有濃厚興趣,能對ai技術進行系統化梳理,對培訓教育比較感興趣,學習能力強。負責技術課程的梳理和規劃(英語好懂技術)。待遇:8-12k

    四、2名導師管理(深圳):溝通能力強,能善於負責人工智慧技術專家的拓展、關係維護、培訓溝通、課程時間協調等工作(英語好懂技術)。待遇:8-12k+提成

    五、2名渠道商務(深圳):有一定渠道商務拓展或銷售經驗,對新生事物比較敏感,熟悉線上線下渠道拓展業務。待遇:6-10k+提成

    推薦閱讀:

    「檢驗」和「檢測」的區別,專業從每個辭彙開始
    化妝品檢測方法有哪些?
    九年級生字詞檢測題及答案
    僅一道題!檢測出你是不是「智慧型」父母?!

    TAG:學習 | 目標 | 目標檢測 | 乾貨 | 總結 | 檢測 | 深度學習 | 深度 |