1. 程式人生 > >【卷積神經網路】Lesson 3--目標檢測

【卷積神經網路】Lesson 3--目標檢測

課程來源:吳恩達 深度學習課程 《卷積神經網路》
筆記整理:王小草
時間:2018年6月8日

1.目標定位Object localization

1.1 什麼是目標定位

明確下目標定位與檢測的定義。

識別一張圖片的型別(比如貓狗分類)叫做影象分類image classification,比如下面這張圖篇是分類到汽車:
image_1cfaljgdje3re0r139313771n0l9.png-56.8kB

不僅識別出圖片的型別,還將目標物體的位置標出來叫做分類定位classification with localization
image_1cfallnr6plgoej1ln9rrl7b6m.png-59.7kB

檢測出圖片中所有目標物體中的位置叫做目標檢測detection
比如給出一張交通圖片,檢測並標記出裡面的車輛,行人,自行車,交通燈等等。(注意,detection與classification with localization的不同在於單張圖片中有不同分類的物件)
image_1cfalmve4m281jd414pfk651ep313.png-62kB

本節要講述的是以上第二種情況,即給圖片分類,並定位和標記出出目標物體的位置

1.2 定位方法的介紹

標準的影象分類問題,假如如下輸入一張圖片,通過卷積神經網路卷啊卷,最後經過softmax層,分成4類:行人,汽車,摩托車,啥都沒有
image_1cfamlq6ne351rmg1kqgd403sh1g.png-101.8kB

如果你還想定點陣圖片中汽車的位置,該咋辦呢?你可以讓上面這個神經網路再多加幾個輸出,輸出汽車的邊框。
汽車的邊框資訊只需要4個數字來表示:b_x,b_y,b_h,b_w,分別表示邊框的中心點的橫坐、,縱座標,邊框的高,邊框的寬。
image_1cfanahit179t122l1ve71obg2iv1t.png-143.3kB

因此在標註訓練資料時,除了給出類別的標籤,還要給出表示邊框的4個數字。然後通過有監督的訓練模型,輸出一個分類標籤和四個邊框引數值。

1.3 符號約定

(1)定義標籤y
y是8*1的向量(注意這裡我們只限定講解影象中只有一個目標物體的情況)。
image_1cfanjd6b1gonuv6177e192qpen2a.png-19kB
Pc表示概率:是否有目標物體,若有車輛,摩托車,行人目標物體,則Pc=1,若這三個都沒有則Pc=0;
bx,by,bh,bw分別表示目標物體邊框的中心點橫縱座標與高寬
c1,c2,c3分別表示當Pc=1時,圖片屬於車輛,摩托車,行人的類別的概率。

因此上面這個例子的標籤y可以寫成圖左,而什麼都沒檢測到可以寫成圖右。
image_1cfant39s1i44117i1ickehb1tve2n.png-113.7kB

(2)定義損失函式
分別將y向量中的8個元素寫成y1,y2,…,y8,其中Pc=y1,以此類推。
對於單個樣本的損失:
當y1=1時,就是這把個元素對應的平方差損失之和;
當y1=0時,就只是y1的平方差,後面7個元素都不用考慮
image_1cfao9bbnqu896eghaekqn3034.png-40.1kB

在實際中,也可以不這樣定義,可以將y1的輸出用邏輯迴歸的損失函式定義,bx,by,bh,bw的輸出用平方差和來定義,而c1,c2,c3用softmax的Log損失來定義.

2.特徵點檢測Landmark detection

神經網路可以通過對特徵點(x,y)的輸出來識別目標特徵。來舉2個例子。

例子1:
假設要識別人臉左眼角的特徵點,則只需要讓神經網路的最後一層輸出(Pc,lx,ly)3個值即可,Pc表示是否是人臉,lx,ly是人臉上眼角的座標點。
image_1cfaphe3f1184sjn1ndpgb93gu3h.png-69.2kB

假設想定位兩隻眼睛的4個眼角的位置,那就將輸出改為4組座標對應的數字(l1_x,l1_y),…,(l4_x,l4_y)
image_1cfapm3711j1s12uvj02mqn7ib3u.png-69.4kB

假設想定位兩隻眼睛的一圈,則可能需要10幾個特徵點,同樣,將輸出增加到10幾座標即可,這樣就可以識別出人臉上眼睛的形狀等特徵從而做一些後續的判斷。同理,可以輸出臉部的更多特徵點,比如嘴脣,從而可以根據這些特徵點預測任務的表情,是傷心還是開心。
image_1cfapqsqq604umpr274iejqe4b.png-71.3kB
假設總共有128個特徵點,則輸出有129維,y={Pc, l1_x,l1_y,…l128_x,l128_y}

通過特徵點檢測,想想我們平時用的美顏相機(哦,對了,筆者是女生),可以在臉上頭上加一些裝飾,比如貓鬍子啊,皇冠啊,帽子啊,髮飾啊,並且無論怎麼動都能加在正確的位置上,者也是用了特徵檢測,檢測出某些特徵點的位置,然後將這些額外的裝飾新增在對應的特徵點位置上。

例子2:
若將身體的關鍵點作為特徵點,則可以識別任務的動作與形態:
image_1cfaq5m6c110hvf81bg4hm8141t4o.png-62.9kB

3.目標檢測object detection

目標檢測實則分為兩步。

假設要檢測圖片中所有汽車
第一步:圖片分類
先收集圖片,將有汽車的圖片中的汽車挖出來作為圖片的中心,然後進行標記汽車與非汽車,並利用卷積神經網路學習出汽車分類模型。
image_1cfaqjc4n1h9bamj9j7i81i1c55.png-64.4kB

第二步:滑動視窗檢測
設定一個指定大小的視窗,從圖片的左上角開始,以指定的步長進行從左往右,從上往下的滑動,每滑動一次,都將視窗內的影象截取出來,輸出第一步訓練好的分類模型中預測是否是汽車,若是,則輸出該視窗當前的左邊資訊,若不是,則繼續滑動尋找。
image_1cfaqr8af1ch11vj71sdg11gb1n9n5i.png-85.5kB
image_1cfaqs45np0o1gpkuifnd51gnp5v.png-83.5kB

若滑動完所有區域還是沒有找到汽車,則將視窗增大一點點,繼續從新滑動尋找。
image_1cfaqstvbg14ig16i19js1e886c.png-266.2kB

這樣做的缺點很明顯:每滑動一次都要用神經網路預測一次,計算量非常大。

4.滑動視窗的卷積實現

上一節講了通過視窗滑動來進行目標檢測,但效率低計算量大,本節來講一講如何在卷積上實現視窗滑動,從而提升效率與速度。

來自論文[Sermanet et al.2014,Overfeat:Integrated recognition, location and detection using convolutional network]

4.1 將全連線層轉變為卷積層

首先了解一下如何將全連線層轉變為卷積層,接下去的滑動視窗的實現會用到它。
傳統的影象分類結構如下,輸入圖片,經過卷積和池化,然後經過全連線層和softmax層,最終預測分類類別的概率。
image_1cfbn8d14sq518oac3g177q8pc7p.png-68kB

將最後兩層的全連線層修改為卷積層。將第二層的輸出556經過400個556的卷積核,得到11400的輸出,代替原來的全連線層的輸出400,同理第二個全連線層也改成經過400個11400的卷積核,得到11400的輸出,將最後的全連線層也改成經過4個11400的卷積核,得到114的輸出。
image_1cfbnhd7mm51p6p2gege215kd86.png-89.9kB
於是後面3層的全連線都變成了卷積層的模式。

4.2 滑動視窗的卷積實現

將上面全連線轉變成卷積層後的如下顯示(注意,其實是立體的,只是為了方便直觀理解接下去的講解,現在以平面的視角展示)
image_1cfbnq542r6ir151ui3fno8ra93.png-90.4kB

假設我們已經訓練好上面這個4分類的模型了。
現在給出一張16163的圖片,滑動視窗的大小為14143。
以傳統的做法:滑動視窗以2個畫素的步長進行從左到右,從上到下的滑動,會得到4張截圖,分別依次輸給分類卷積神經網路進行預測,得到分類的類別。總共做了4次卷積預測,但這樣當圖片很大,滑動視窗又比較小的時候,會帶來巨大計算量
image_1cfbo1mr1jmn1gsik6p13rp65a9g.png-41.7kB

實際上,4次卷積操作中有很多計算都是重複的。
我們將16163的圖片也同樣進行如上卷積,與11400對應的,會有22400的輸出結果。在最終輸出的4個自放款中,左上角藍色那一塊實則對應了左上角14143的藍色區域。
image_1cfbodnrm11711p6ia9oh841ioe9t.png-257kB

因此,實際上,無需通過滑動視窗依次取出截圖去執行前向傳播進行分類預測,只需要直接將原影象進行卷積,其中的共有區域可以共享很多計算。
也就是說,給出一張圖片,比如汽車:
image_1cfbokrij1rbi18ro15ahuu71gklaa.png-133kB
無需滑動n次,並進行n次分類預測,而是直接把整張圖片進行卷積後,一次性得到每個區域的分類結果。

5.Bounding box預測

5.1 yolo演算法

上一節的方法大大降低了目標檢測的計算量,但仍有缺陷:檢測的邊框不夠精確。本節來解決邊框預測不精確的問題。

很多時候,視窗無論怎麼滑動都取不到完整的目標物體:
image_1cfbotp0pm53csb11kb1nv81ilian.png-238.2kB

要解決這個問題,常用的解決辦法是yolo演算法,優點是隻要看一次。
來自論文[Redmon et al.,2015, You Only Look Once:Unified real-time object detection]

給出一張100100的圖片,為了方便講解,此處粗粒度地分為33的格子。
image_1cfbpem9g4d6c7tfsgu8obcbh.png-119.1kB
一般情況下,對每個格子對應的影象進行分類預測,分類的方式與第1節講述的一樣,因此在訓練資料中藥現將每個格子都進行標記:
image_1cfbpdffu1b6k19ki1t5l607102lb4.png-19.6kB
因此,對於最左上角的格子,什麼東東都沒有,得標記成:
image_1cfbpfrd51kft1r8bn7c1v8cop5bu.png-13.9kB
而有大部分車體的兩個格子(yolo演算法將物體的中心點所在的格子算作是有該物體的格子)的標記為:
image_1cfbpjj214491lt9aso11l5174cb.png-29.5kB

因為有33個格子,且每個格子的預測label向量有8個元素,總共輸出的吃春是33*8.

yolo的整個過程是,輸入圖片1001003,若以33的根子為劃分,經過卷積神經網路,輸出338
image_1cfbq5ups1ha67aies29fdahld8.png-31.7kB
若一個格子中存在多個物件,我們稍後討論。但在實踐中一般會用更小的格子網路,比如19
19,那麼多個物件分配到同一個格子上的概率就會小很多

yolo的優點:
(1)輸出更精確的座標,不收滑動窗法分類器的步長限制
(2)使用卷積實現的過程,可以一次性得到結果

3.2 如何編碼邊框座標

在yolo演算法中,每個格子的左上角是(0,0),右下角是(1,1),以下圖右車為例:
image_1cfbqpc3r92s1i7m19tkvl117agdl.png-129.4kB
車的中線點座標為(0.4,0.3),即bx=0.4,by=0.3
寬和高是相對於格子的百分比,車子的寬大概佔了格子寬的90%,因此bw = 0.9,車子的高佔了格子的50%,則bh = 0.5

其中bx,by肯定是0-1之間的座標,因此其值在0-1之間;
而bw,bh可能超過1,因為可能車子的長度超過了格子長度,有一部分跑到了另一個格子去。

6.交併化Intersection over union

如何判斷物件檢測演算法運作良好呢?我們可以使用並交比函式來評價物件檢測演算法。

假設下圖,紅框是正確的檢測邊框,紫框是模型預測出來的檢測邊框
image_1cfd6ovjk1ars2migba6k66sj9.png-61.6kB
要評價模型預測的效果,就用兩者相交的面積/兩者相併的面積,這個佔比就是交併化函式輸出的指標,在0-1之間,一般指定一個閥值0.5,若佔比>=0.5則模型的預測是可以接受的。當然嚴格一點的話,你也可以提高閥值。

7.非極大值抑制Non-max suppression

Non-max suppression可以有效保證在影象中只對物體檢測一次,避免重複檢測加大計算量。

假設用Yolo演算法,把影象分成19*19的網格,這兩輛車只會屬於其中心點所在的網格,但是實際上車子覆蓋的其他網格,也都會去想我這裡是不是一輛車,造成了重複計算。
image_1cfd7mvjbkgftri15cevid1gl9m.png-164.1kB

直觀得來了解下Non-max suppression是如何起作用的。
image_1cfd80bso1b6s6h18a91a6k1tf413.png-163.4kB
首先會有多個框框檢測出自己裡面都有汽車,每個框框都會得到一個並交比係數;
對於同一個目標物體的多個框框,比較它們的並交比,選出最大的那個框框顏色加深,將其他的比值小的框框都減弱顏色使其變暗,最終目標物體會得到1個較好的邊框。

深入得來理解下Non-max suppression的演算法過程
仍然將影象分割成19*19的網格:
image_1cfd8tbvb17381ul31dbv1us51qc21t.png-87.3kB
假設只識別汽車這一個類別,每個網格的輸出就是:
image_1cfd8t2t3v8ibc5lftb9s1rrf1g.png-10.9kB
1.首先拋棄掉pc<=0.6的box
2.對剩下的boxs(邊界框):

  • 選擇pc最大的那個輸出作為預測值
  • 將剩下的pc與預測值相同,IoU >= 0.5 的box拋棄掉
    直到每個box都被判斷過,它們有的作為輸出結果,剩下的和輸出結果重疊面積太高的會被拋棄掉。

若同一張圖片中檢測n個目標物,則要對每個物體都進行以上步驟。

8.Anchor Boxes

以上所有,有個缺點,就是每個網格只能檢測出一個物件。如果想讓一個格子能檢測出多個物件,那麼久可以用Anchor Boxes。

假設這樣一張圖片:
image_1cfd9ki7m1nc51um81taehngnkt3a.png-96.7kB
人和車重疊,其兩個物體的中心點都在同一個網格內,此時若還是用這樣的輸出:
image_1cfd9nj6ka1110qvtur1j5b6n13n.png-7.2kB
就不行了,因為一次只能輸出一個類別。

Anchor Boxes的做法是預先定義兩個不通過形狀的anchor box(實踐中可能會用更多個)
image_1cfd9qmjf1ephq8j3fu86944.png-20.6kB
然後將預測結果將這兩個anchor box關聯起來。
重新定義標籤y:
image_1cfd9u7tb170h1n281i2cmtg1f5q4h.png-39.9kB
前面8個元素是針對行人的預測,後面8個元素是針對汽車的預測。

訓練的時候,不僅僅關注與標註的邊框一樣,還要關注預測的邊框與anchor box的並交比。

例子:
還是這張圖片:
image_1cfdas4s71a6tpioe249udvfv4u.png-115.9kB

預定義兩個Anchor Boxes
image_1cfdat6v71g0a1fcsles11ov1pqu5b.png-14.7kB

輸出標籤y的形式:
image_1cfdb0v0516211etf1rs21rvb1oab68.png-17.5kB

因此又有人又有車的網格的標籤應該是y:
image_1cfdb41nf1dbg1uls178v125q3ck6l.png-29.1kB
若檢測到的邊框與Anchor Boxes1的並交比很大,則將預測值寫在y的上面8個元素,若與Anchor Boxes2的並交比較大,則將預測值輸出再y的下面8各元素,以此來區分檢測出來的邊框到底是人呢還是汽車。

若沒有人只有車,則y:
image_1cfdb7kqeiep8q1l1r1dcn1kdi72.png-25.2kB

Anchor Boxes演算法有兩個缺點:
(1)當兩個目標物圖的邊框很相似或一樣的時候,就失效了,比如檢測電視機和電腦,都是差不多方方的形狀。
(2)當資料集中出現了3個目標物體,則失效了,需要重新定義模型,定義新的輸出y的形式才行了。

9.YOLO演算法

至此,我們已經講述了物件檢測演算法的大部分零件,這一節,將將所欲零件組裝構成完整的yolo物件檢測演算法。

9.1 構建訓練集

假設要檢測一張圖片中的3個類別:pedestrain, car, motocycle,分成33的網格(實踐中一般為1919)。
image_1cfeappvfidipf1o7kv6v1f3t7s.png-84.5kB

訓練集的標籤y為3328:(28分別是2個Anchor Boxes對應的類別)
image_1cfeamjrt1j7t1adi1jn016at13707f.png-9.9kB

訓練集的特徵x是遍歷網格中的9個小格子,分別給他們都標記一個y.
其實這個圖片中只有1個格子裡有車,其餘8個格子裡都沒有車,因此沒有車的標記為
image_1cfeat8cd80j4mm1967f5fo7l89.png-7.4kB
有車的標記為
image_1cfeatvo39ja1gojl98q9tmc8m.png-11.4kB
其中bx,by,bh,bw就是這輛車在該格子中的邊框

9.2 預測

因此向卷積神經網路中輸如影象為1001003,若分割成33的網格,則輸出的大小為33*16
image_1cfeba8lm14en1flk15v45mtqm093.png-161.1kB

###9.3 使用Non-max suppression
為了讓例子更有趣,我們用一張新的美女圖。
image_1cfebdr3d14ot19ramjjvbo66v9g.png-86.3kB

若使用2個anchor box,則針對每個網格都會輸出2個預測邊框,其中一個概率pc很低(注意,有些邊框可能會超出所在格子的寬度和高度)
image_1cfebnj8g1uok189s1t6qh3l1at29t.png-95.1kB

接著,你要拋棄pc概率低的預測,得到這些剩下的邊框
image_1cfebpv094uv16gk1u3s7gp28raa.png-91.1kB

然後,如果你有3個類別(行人,車,摩托車),則你要分別對這3個類別單獨進行Non-max suppression,執行3次來得到最終的預測結果

10 RPN網路Region proposals

10.1 R-CNN

如果你讀了物件檢測的論文,你會發現有一個概念叫Region proposals候選區域,在計算機視覺裡很有影響力。

迴歸上文的演算法(非yolo),會對一張圖片中的滑動視窗,都過一遍卷積神經網路,但問題是一張圖片中其實只有少量視窗有目標物體,其他吃昂口是完全沒有任何用的,因此對於完全沒有目標物體的視窗去計算也顯得耗時耗力。因此,論文[Girshik et,al,2013,Rich feature hierarchies for accurate object detection and semantic segmentation]提出了一種叫做R-CNN的演算法,即帶區域的卷積神經網,只是選擇某些有意義的視窗運行卷積神經網路進行預測。

執行影象分割演算法,得到如下結果:
image_1cfechlcaievf2ahcicao76an.png-38kB
然後將每個色塊作為一個整體跑一下分類器去進行檢測(加入有2000個色塊),因此上圖在藍色區域進行檢測,可能能檢測出一個人,淡藍色區域可能能檢測出一輛車

通過影象分割,從而針對性得對一些整體去檢測,比在影象的所有位置都跑一邊要大大減小計算量。

10.2 R-CNN的改進

R-CNN的速度還是不能使研究者們滿意,於是有了一系列研究工作對該演算法進行改進。

基本的R-CNN:
利用影象分割求出候選區域,對每個候選區域進行分類,輸出類別標籤和邊框。

Fast R-CNN:
[Cirshik,2015.Fast R-CNN]
與R-CNN的區別是,Fast R-CNN使用了滑動視窗的卷積實現來進行分類(本文第4節),而不是對每個視窗都進行分類。

Faster R-CNN:
[Ren et.al, 2016. Faster R-CNN: Toweards real-time object detection with region prposal network]
但Fast R-CNN還是有缺點,即影象分割的時候,色塊的聚類特別慢。於是另一個研究組提出了Faster R-CNN,利用卷急神經網路來獲取候選區域色塊。

但實際上,大部分更快的R-CNN,都還是比yolo演算法慢。