4.3)深度卷積網絡:目標檢測

目錄

1)Object localization(重點)

2)Landmark detection

3)Object detection

4)Convolutional implementation of sliding windows

5)Bounding box prediction(重點)

6)Intersection over union

7)Non-max suppression(重點)

8)Anchor Boxes(重點)

9)Putting it together:YOLO algorithm

10 ) Region proposals


以下筆記是吳恩達老師深度學習課程第四門課第三週的的學習筆記:Object detection。筆記參考了黃海廣博士的內容,在此表示感謝。

目標檢測是計算機視覺領域中一個新興的應用方向,其任務是對輸入圖像進行分類的同時,檢測圖像中是否包含某些目標,並對他們準確定位並標識。


1)Object localization(重點)

定位分類問題不僅要求判斷出圖片中物體的種類,還要在圖片中標記出它的具體位置,用邊框(Bounding Box,或者稱包圍盒)把物體圈起來。一般來說,定位分類問題通常只有一個較大的對象位於圖片中間位置;而在目標檢測問題中,圖片可以含有多個對象,甚至單張圖片中會有多個不同分類的對象。

爲了定位圖片中汽車的位置,可以讓神經網絡多輸出 4 個數字,標記爲b_x, b_y, b_h, b_w。將圖片左上角標記爲 (0, 0),右下角標記爲 (1, 1),則有:

  • 紅色方框的中心點:b_x,b_y

  • 邊界框的高度:b_h

  • 邊界框的寬度:b_w

原始圖片經過CONV卷積層後,Softmax層輸出8 x 1向量。輸出label可表示爲,其中,c_n表示存在第 n個種類的概率;如果 p_c,表示沒有檢測到目標,則輸出標籤後面的 7 個參數都是無效的,可以忽略(用 ? 來表示)。

                                y=\left[\begin{matrix}p_c\\\ b_x\\\ b_y\\\ b_h\\\ b_w\\\ c_1\\\ c_2\\\ c_3\end{matrix}\right]$$   ,            p_c=1, y = \left[\begin{matrix}1\\\ b_x\\\ b_y\\\ b_h\\\ b_w\\\ c_1\\\ c_2\\\ c_3\end{matrix}\right],        p\_c=0, y = \left[\begin{matrix}0\\\ ?\\\ ?\\\ ?\\\ ?\\\ ?\\\ ?\\\ ?\end{matrix}\right]$$

損失函數可以表示爲 L(\hat y, y),如果使用平方誤差形式,對於不同的 p_c有不同的損失函數(注意下標 i指標籤的第 i個值):

  1. p_c=1,即y_1=1

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

  2. p_c=0,即y_1=0

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

除了使用平方誤差,也可以使用邏輯迴歸損失函數,類標籤 c_1,c_2,c_3也可以通過 softmax 輸出。相比較而言,平方誤差已經能夠取得比較好的效果。


2)Landmark detection

神經網絡可以像標識目標的中心點位置那樣,通過輸出圖片上的特徵點,來實現對目標特徵的識別。在標籤中,這些特徵點以多個二維座標的形式表示。例如人臉識別,可以對人臉部分特徵點座標進行定位檢測,並標記出來,如下圖所示:

通過檢測人臉特徵點可以進行情緒分類與判斷,或者應用於 AR 領域等等。也可以透過檢測姿態特徵點來進行人體姿態檢測。


3)Object detection

想要實現目標檢測,可以採用基於滑動窗口的目標檢測(Sliding Windows Detection)算法。該算法的步驟如下:

  1. 訓練集上搜集相應的各種目標圖片和非目標圖片,樣本圖片要求尺寸較小,相應目標居於圖片中心位置並基本佔據整張圖片。

  2. 使用訓練集構建 CNN 模型,使得模型有較高的識別率。

  3. 選擇大小適宜的窗口與合適的固定步幅,對測試圖片進行從左到右、從上倒下的滑動遍歷。每個窗口區域使用已經訓練好的 CNN 模型進行識別判斷。

  4. 可以選擇更大的窗口,然後重複第三步的操作。

滑動窗口目標檢測的優點是原理簡單,且不需要人爲選定目標區域;缺點是需要人爲直觀設定滑動窗口的大小和步幅。滑動窗口過小或過大,步幅過大均會降低目標檢測的正確率。另外,每次滑動都要進行一次 CNN 網絡計算,如果滑動窗口和步幅較小,計算成本往往很大。

所以,滑動窗口目標檢測算法雖然簡單,但是性能不佳,效率較低。


4)Convolutional implementation of sliding windows

相比從較大圖片多次截取,在卷積層上應用滑動窗口目標檢測算法可以提高運行速度。所要做的僅是將全連接層換成卷積層,即使用與上一層尺寸一致的濾波器進行卷積運算,如圖所示:

上圖,對於 16x16x3 的圖片,步長爲 2,CNN 網絡得到的輸出層爲 2x2x4。其中,2x2 表示共有 4 個窗口結果。對於更復雜的 28x28x3 的圖片,得到的輸出層爲 8x8x4,共 64 個窗口結果。最大池化層的寬高和步長相等。

運行速度提高的原理:在滑動窗口的過程中,需要重複進行 CNN 正向計算。因此,不需要將輸入圖片分割成多個子集,分別執行向前傳播,而是將它們作爲一張圖片輸入給卷積網絡進行一次 CNN 正向計算。這樣,公共區域的計算可以共享,以降低運算成本。

相關論文:Sermanet et al., 2014. OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks


5)Bounding box prediction(重點)

在上述算法中,邊框的位置可能無法完美覆蓋目標,或者大小不合適,或者最準確的邊框並非正方形,而是長方形。

YOLO(You Only Look Once)算法可以用於得到更精確的邊框。YOLO 算法將原始圖片劃分爲 n×n 網格,並將目標定位一節中提到的圖像分類和目標定位算法,逐一應用在每個網格中,每個網格都有標籤如:

                                                                                       $$\left[\begin{matrix}p_c\\\ b_x\\\ b_y\\\ b_h\\\ b_w\\\ c_1\\\ c_2\\\ c_3\end{matrix}\right]$$

若某個目標的中點落在某個網格,則該網格負責檢測該對象。

如上面的示例中,如果將輸入的圖片劃分爲 3×3 的網格、需要檢測的目標有 3 類,則每一網格部分圖片的標籤會是一個 8 維的列矩陣,最終輸出的就是大小爲 3×3×8 的結果。要得到這個結果,就要訓練一個輸入大小爲 100×100×3,輸出大小爲 3×3×8 的 CNN。在實踐中,可能使用更爲精細的 19×19 網格,則兩個目標的中點在同一個網格的概率更小。

YOLO 算法的優點:

  1. 和圖像分類和目標定位算法類似,顯式輸出邊框座標和大小,不會受到滑窗分類器的步長大小限制。

  2. 仍然只進行一次 CNN 正向計算,效率很高,甚至可以達到實時識別。

如何編碼邊框 b_x,b_y,b_h,b_w?YOLO 算法設b_x,b_y,b_h,b_w的值是相對於網格長的比例。值得注意的是,當前網格左上角座標設定爲(0, 0),右下角座標設定爲(1, 1),且 b_x,b_y在 0 到 1 之間,而 b_h,b_w 可以大於 1。當然,也有其他參數化的形式,且效果可能更好。這裏只是給出一個通用的表示方法。劃分的網格可以更密一些。網格越小,則多個目標的中心座標被劃分到一個網格內的概率就越小,這恰恰是我們希望看到的。

相關論文:Redmon et al., 2015. You Only Look Once: Unified, Real-Time Object Detection


6)Intersection over union

交互比(IoU, Intersection Over Union)函數用於評價對象檢測算法,它計算預測邊框和實際邊框交集(I)與並集(U)之比,如下圖所示:

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

                                                                          IoU = \frac{I}{U}

IoU 的值在 0~1 之間,且越接近 1 表示目標的定位越準確。IoU 大於等於 0.5 時,一般可以認爲預測邊框是正確的,當然也可以更加嚴格地要求一個更高的閾值。


7)Non-max suppression(重點)

YOLO 算法中,可能有很多網格檢測到同一目標。非極大值抑制(Non-max Suppression)會通過清理檢測結果,找到每個目標中點所位於的網格,確保算法對每個目標只檢測一次。

進行非極大值抑制的步驟如下:

  1. 將包含目標中心座標的可信度p_c小於閾值(例如 0.6)的網格丟棄;

  2. 選取擁有最大p_c的網格;

  3. 分別計算該網格和其他所有網格的 IoU,將 IoU 超過預設閾值的網格丟棄;

  4. 重複第 2~3 步,直到不存在未處理的網格。

上述步驟適用於單類別目標檢測。進行多個類別目標檢測時,對於每個類別,應該單獨做一次非極大值抑制。


8)Anchor Boxes(重點)

到目前爲止,我們討論的情況都是一個網格只檢測一個對象。如果要將算法運用在多目標檢測上,需要用到 Anchor Boxes。一個網格的標籤中將包含多個 Anchor Box,相當於存在多個用以標識不同目標的邊框。

在上圖示例中,我們希望同時檢測人和汽車。因此,每個網格的的標籤中含有兩個 Anchor Box。輸出的標籤結果大小從 3×3×8 變爲 3×3×16。若兩個 p_c 都大於預設閾值,則說明檢測到了兩個目標。

在單目標檢測中,圖像中的目標被分配給了包含該目標中點的那個網格;引入 Anchor Box 進行多目標檢測時,圖像中的目標則被分配到了包含該目標中點的那個網格以及具有最高 IoU 值的該網格的 Anchor Box

Anchor Boxes 也有侷限性,對於同一網格有三個及以上目標,或者兩個目標的 Anchor Box 高度重合的情況處理不好。

Anchor Box 的形狀一般通過人工選取。高級一點的方法是用 k-means 將兩類對象形狀聚類,選擇最具代表性的 Anchor Box。


9)Putting it together: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

前面介紹的滑動窗口目標檢測算法對一些明顯沒有目標的區域也進行了掃描,這降低了算法的運行效率。爲了解決這個問題,R-CNN(Region CNN,帶區域的 CNN)被提出。通過對輸入圖片運行圖像分割算法,在不同的色塊上找出候選區域(Region Proposal),就只需要在這些區域上運行分類器。

R-CNN 的缺點是運行速度很慢,所以有一系列後續研究工作改進。例如 Fast R-CNN(與基於卷積的滑動窗口實現相似,但得到候選區域的聚類步驟依然很慢)、Faster R-CNN(使用卷積對圖片進行分割)。不過大多數時候還是比 YOLO 算法慢

相關論文:

 

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