Coursera吳恩達《卷積神經網絡》課程筆記(3)-- 目標檢測

我的CSDN博客地址:紅色石頭的專欄 
我的知乎主頁:紅色石頭 
我的微博:RedstoneWill的微博 
我的GitHub:RedstoneWill的GitHub 
我的微信公衆號:紅色石頭的機器學習之路(ID:redstonewill) 
歡迎大家關注我!共同學習,共同進步!

《Convolutional Neural Networks》是Andrw Ng深度學習專項課程中的第四門課。這門課主要介紹卷積神經網絡(CNN)的基本概念、模型和具體應用。該門課共有4周課時,所以我將分成4次筆記來總結,這是第3節筆記,主要介紹目標檢測。

1. Object Localization

前兩節課程中,我們介紹的是利用CNN模型進行圖像分類。除此之外,本週課程將繼續深入介紹目標定位和目標檢測(包含多目標檢測)。

這裏寫圖片描述

標準的CNN分類模型我們已經很熟悉了,如下所示:

這裏寫圖片描述

原始圖片經過CONV卷積層後,Softmax層輸出4 x 1向量,分別是:

1000[1000] 0100[0100] 0010[0010] 0001[0001]

注意,class label也可能是概率。上述四個向量分別對應pedestrain,car,motorcycle和background四類。

對於目標定位和目標檢測問題,其模型如下所示:

這裏寫圖片描述

原始圖片經過CONV卷積層後,Softmax層輸出8 x 1向量。除了包含上述一般CNN分類3 x 1向量(class label)之外,還包含了(bx, by),表示目標中心位置座標;還包含了bh和bw,表示目標所在矩形區域的高和寬;還包含了Pc,表示矩形區域是目標的概率,數值在0~1之間,且越大概率越大。一般設定圖片左上角爲原點(0, 0),右下角爲(1, 1)。在模型訓練時,bx、by、bh、bw都由人爲確定其數值。例如上圖中,可得bx=0.5,by=0.7,bh=0.3,bw=0.4。

輸出label可表示爲:

Pcbxbybhbwc1c2c3[Pcbxbybhbwc1c2c3] Pc=1:1bxbybhbwc1c2c3[1bxbybhbwc1c2c3] Pc=0:0???????[0???????]

若Pc=0,表示沒有檢測到目標,則輸出label後面的7個參數都可以忽略。

對於損失函數Loss function,若使用平方誤差形式,有兩種情況:

  • Pc=1,即y1=1y1=1

L(y^,y)=(y^1y1)2+(y^2y2)2++(y^8y8)2L(y^,y)=(y^1−y1)2+(y^2−y2)2+⋯+(y^8−y8)2

  • Pc=0,即y1=0y1=0

L(y^,y)=(y^1y1)2L(y^,y)=(y^1−y1)2

當然,除了使用平方誤差之外,還可以邏輯迴歸損失函數,類標籤c1,c2,c3c1,c2,c3也可以通過softmax輸出。比較而言,平方誤差已經能夠取得比較好的效果。

2. Landmark Detection

除了使用矩形區域檢測目標類別和位置外,我們還可以僅對目標的關鍵特徵點座標進行定位,這些關鍵點被稱爲landmarks。

例如人臉識別,可以對人臉部分特徵點座標進行定位檢測,並標記出來,如下圖所示:

這裏寫圖片描述

該網絡模型共檢測人臉上64處特徵點,加上是否爲face的標誌位,輸出label共有64x2+1=129個值。通過檢測人臉特徵點可以進行情緒分類與判斷,或者應用於AR領域等等。

除了人臉特徵點檢測之外,還可以檢測人體姿勢動作,如下圖所示:

這裏寫圖片描述

3. Object Detection

目標檢測的一種簡單方法是滑動窗算法。這種算法首先在訓練樣本集上搜集相應的各種目標圖片和非目標圖片。注意訓練集圖片尺寸較小,儘量僅包含相應目標,如下圖所示:

這裏寫圖片描述

然後,使用這些訓練集構建CNN模型,使得模型有較高的識別率。

最後,在測試圖片上,選擇大小適宜的窗口、合適的步進長度,進行從左到右、從上倒下的滑動。每個窗口區域都送入之前構建好的CNN模型進行識別判斷。若判斷有目標,則此窗口即爲目標區域;若判斷沒有目標,則此窗口爲非目標區域。

這裏寫圖片描述

滑動窗算法的優點是原理簡單,且不需要人爲選定目標區域(檢測出目標的滑動窗即爲目標區域)。但是其缺點也很明顯,首先滑動窗的大小和步進長度都需要人爲直觀設定。滑動窗過小或過大,步進長度過大均會降低目標檢測正確率。而且,每次滑動窗區域都要進行一次CNN網絡計算,如果滑動窗和步進長度較小,整個目標檢測的算法運行時間會很長。所以,滑動窗算法雖然簡單,但是性能不佳,不夠快,不夠靈活。

4. Convolutional Implementation of Sliding Windows

滑動窗算法可以使用卷積方式實現,以提高運行速度,節約重複運算成本。

首先,單個滑動窗口區域進入CNN網絡模型時,包含全連接層。那麼滑動窗口算法卷積實現的第一步就是將全連接層轉變成爲卷積層,如下圖所示:

這裏寫圖片描述

全連接層轉變成卷積層的操作很簡單,只需要使用與上層尺寸一致的濾波算子進行卷積運算即可。最終得到的輸出層維度是1 x 1 x 4,代表4類輸出值。

單個窗口區域卷積網絡結構建立完畢之後,對於待檢測圖片,即可使用該網絡參數和結構進行運算。例如16 x 16 x 3的圖片,步進長度爲2,CNN網絡得到的輸出層爲2 x 2 x 4。其中,2 x 2表示共有4個窗口結果。對於更復雜的28 x 28 x3的圖片,CNN網絡得到的輸出層爲8 x 8 x 4,共64個窗口結果。

這裏寫圖片描述

之前的滑動窗算法需要反覆進行CNN正向計算,例如16 x 16 x 3的圖片需進行4次,28 x 28 x3的圖片需進行64次。而利用卷積操作代替滑動窗算法,則不管原始圖片有多大,只需要進行一次CNN正向計算,因爲其中共享了很多重複計算部分,這大大節約了運算成本。值得一提的是,窗口步進長度與選擇的MAX POOL大小有關。如果需要步進長度爲4,只需設置MAX POOL爲4 x 4即可。

5. Bounding Box Predictions

滑動窗口算法有時會出現滑動窗不能完全涵蓋目標的問題,如下圖藍色窗口所示。

這裏寫圖片描述

YOLO(You Only Look Once)算法可以解決這類問題,生成更加準確的目標區域(如上圖紅色窗口)。

YOLO算法首先將原始圖片分割成n x n網格,每個網格代表一塊區域。爲簡化說明,下圖中將圖片分成3 x 3網格。

這裏寫圖片描述

然後,利用上一節卷積形式實現滑動窗口算法的思想,對該原始圖片構建CNN網絡,得到的的輸出層維度爲3 x 3 x 8。其中,3 x 3對應9個網格,每個網格的輸出包含8個元素:

y=Pcbxbybhbwc1c2c3y=[Pcbxbybhbwc1c2c3]

如果目標中心座標(bx,by)(bx,by)不在當前網格內,則當前網格Pc=0;相反,則當前網格Pc=1(即只看中心座標是否在當前網格內)。判斷有目標的網格中,bx,by,bh,bwbx,by,bh,bw限定了目標區域。值得注意的是,當前網格左上角座標設定爲(0, 0),右下角座標設定爲(1, 1),(bx,by)(bx,by)範圍限定在[0,1]之間,但是bh,bwbh,bw可以大於1。因爲目標可能超出該網格,橫跨多個區域,如上圖所示。目標占幾個網格沒有關係,目標中心座標必然在一個網格之內。

劃分的網格可以更密一些。網格越小,則多個目標的中心座標被劃分到一個網格內的概率就越小,這恰恰是我們希望看到的。

6. Intersection Over Union

IoU,即交集與並集之比,可以用來評價目標檢測區域的準確性。

這裏寫圖片描述

如上圖所示,紅色方框爲真實目標區域,藍色方框爲檢測目標區域。兩塊區域的交集爲綠色部分,並集爲紫色部分。藍色方框與紅色方框的接近程度可以用IoU比值來定義:

IoU=IUIoU=IU

IoU可以表示任意兩塊區域的接近程度。IoU值介於0~1之間,且越接近1表示兩塊區域越接近。

7. Non-max Suppression

YOLO算法中,可能會出現多個網格都檢測出到同一目標的情況,例如幾個相鄰網格都判斷出同一目標的中心座標在其內。

這裏寫圖片描述

上圖中,三個綠色網格和三個紅色網格分別檢測的都是同一目標。那如何判斷哪個網格最爲準確呢?方法是使用非最大值抑制算法。

非最大值抑制(Non-max Suppression)做法很簡單,圖示每個網格的Pc值可以求出,Pc值反映了該網格包含目標中心座標的可信度。首先選取Pc最大值對應的網格和區域,然後計算該區域與所有其它區域的IoU,剔除掉IoU大於閾值(例如0.5)的所有網格及區域。這樣就能保證同一目標只有一個網格與之對應,且該網格Pc最大,最可信。接着,再從剩下的網格中選取Pc最大的網格,重複上一步的操作。最後,就能使得每個目標都僅由一個網格和區域對應。如下圖所示:

這裏寫圖片描述

總結一下非最大值抑制算法的流程:

  • 1. 剔除Pc值小於某閾值(例如0.6)的所有網格;

  • 2. 選取Pc值最大的網格,利用IoU,摒棄與該網格交疊較大的網格;

  • 3. 對剩下的網格,重複步驟2。

8. Anchor Boxes

到目前爲止,我們介紹的都是一個網格至多隻能檢測一個目標。那對於多個目標重疊的情況,例如一個人站在一輛車前面,該如何使用YOLO算法進行檢測呢?方法是使用不同形狀的Anchor Boxes。

如下圖所示,同一網格出現了兩個目標:人和車。爲了同時檢測兩個目標,我們可以設置兩個Anchor Boxes,Anchor box 1檢測人,Anchor box 2檢測車。也就是說,每個網格多加了一層輸出。原來的輸出維度是 3 x 3 x 8,現在是3 x 3 x 2 x 8(也可以寫成3 x 3 x 16的形式)。這裏的2表示有兩個Anchor Boxes,用來在一個網格中同時檢測多個目標。每個Anchor box都有一個Pc值,若兩個Pc值均大於某閾值,則檢測到了兩個目標。

這裏寫圖片描述

y=Pcbxbybhbwc1c2c3Pcbxbybhbwc1c2c3y=[Pcbxbybhbwc1c2c3Pcbxbybhbwc1c2c3]

在使用YOLO算法時,只需對每個Anchor box使用上一節的非最大值抑制即可。Anchor Boxes之間並行實現。

順便提一下,Anchor Boxes形狀的選擇可以通過人爲選取,也可以使用其他機器學習算法,例如k聚類算法對待檢測的所有目標進行形狀分類,選擇主要形狀作爲Anchor Boxes。

9. YOLO Algorithm

這一節主要介紹YOLO算法的流程,算是對前幾節內容的回顧。網絡結構如下圖所示,包含了兩個Anchor Boxes。

  • 1. For each grid call, get 2 predicted bounding boxes.

  • 2. Get rid of low probability predictions.

  • 3. For each class (pedestrian, car, motorcycle) use non-max suppression to generate final predictions.

這裏寫圖片描述

10. Region Proposals

之前介紹的滑動窗算法會對原始圖片的每個區域都進行掃描,即使是一些空白的或明顯沒有目標的區域,例如下圖所示。這樣會降低算法運行效率,耗費時間。

這裏寫圖片描述

爲了解決這一問題,儘量避免對無用區域的掃描,可以使用Region Proposals的方法。具體做法是先對原始圖片進行分割算法處理,然後支隊分割後的圖片中的塊進行目標檢測。

這裏寫圖片描述

Region Proposals共有三種方法:

  • R-CNN: 滑動窗的形式,一次只對單個區域塊進行目標檢測,運算速度慢。

  • Fast R-CNN: 利用卷積實現滑動窗算法,類似第4節做法。

  • Faster R-CNN: 利用卷積對圖片進行分割,進一步提高運行速度。

比較而言,Faster R-CNN的運行速度還是比YOLO慢一些。

更多AI資源請關注公衆號:紅色石頭的機器學習之路(ID:redstonewill) 
這裏寫圖片描述

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