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

我的CSDN博客地址:紅色石頭的專欄

我的知乎主頁:紅色石頭

我的知乎專欄:紅色石頭的機器學習之路

歡迎大家關注我!共同學習,共同進步!

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

1. Object Localization

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

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

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

left [ egin{matrix} 1 \ 0 \ 0 \ 0 end{matrix} 
ight ] left [ egin{matrix} 0 \ 1 \ 0 \ 0 end{matrix} 
ight ] left [ egin{matrix} 0 \ 0 \ 1 \ 0 end{matrix} 
ight ] left [ egin{matrix} 0 \ 0 \ 0 \ 1 end{matrix} 
ight ]

注意,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可表示為:

left [ egin{matrix} Pc \ bx \ by \ bh \ bw \ c1 \ c2 \ c3 end{matrix} 
ight ] Pc=1: left [ egin{matrix} 1 \ bx \ by \ bh \ bw \ c1 \ c2 \ c3 end{matrix} 
ight ] Pc=0:left [ egin{matrix} 0 \ ? \ ? \ ? \ ? \ ? \ ? \ ? end{matrix} 
ight ]

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

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

  • Pc=1,即y1=1:

L(hat y,y)=(hat y_1-y_1)^2+(hat y_2-y_2)^2+cdots+(hat y_8-y_8)^2

  • Pc=0,即y1=0

L(hat y,y)=(hat y_1-y_1)^2

當然,除了使用平方誤差之外,還可以邏輯回歸損失函數,類標籤 c_1,c_2,c_3 也可以通過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的圖片需進行8次。而利用卷積操作代替滑動窗演算法,則不管原始圖片有多大,只需要進行一次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=left [ egin{matrix} Pc \ bx \ by \ bh \ bw \ c1 \ c2 \ c3 end{matrix} 
ight ]

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

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

6. Intersection Over Union

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

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

IoU=frac 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=left [ egin{matrix} Pc \ bx \ by \ bh \ bw \ c1 \ c2 \ c3 \ Pc \ bx \ by \ bh \ bw \ c1 \ c2 \ c3 end{matrix} 
ight ]

在使用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慢一些。

推薦閱讀:

分分鐘帶你殺入Kaggle Top 1%
[原創]#Deep Learning回顧#之2006年的Science Paper
【量化策略】當Trading遇上Reinforcement Learning
深入淺出理解決策樹演算法(二)-ID3演算法與C4.5演算法

TAG:机器学习 | 深度学习DeepLearning | 卷积神经网络CNN |