1. 程式人生 > >DeepLearning.ai筆記:(4-3)-- 目標檢測(Object detection)

DeepLearning.ai筆記:(4-3)-- 目標檢測(Object detection)


title: ‘DeepLearning.ai筆記:(4-3)-- 目標檢測(Object detection)’
id: dl-ai-4-3
tags:

  • dl.ai
    categories:
  • AI
  • Deep Learning
    date: 2018-10-11 17:02:09

首發於個人部落格:fangzh.top,歡迎來訪
這一週主要講了卷積神經網路的進一步應用:目標檢測。

主要內容有:目標定位、特徵點檢測、目標檢測、滑動視窗、Bounding Box,IOU,NMS,Anchor Boxes,Yolo演算法。

目標定位(Object localization)

在進行目標檢測之前,需要先了解一下目標定位。

因為進行目標檢測的時候需要預測出目標的具體位置,所以在訓練的時候需要先標定一下這個目標的實際位置。

假設我們需要分類的類別有3個,行人,汽車,自行車,如果什麼都沒有,那麼就是背景。可以看到,y一共有8個引數:

  • P c P_c
    :是否有目標
  • b x , b y , b
    h , b w b_x,b_y,b_h,b_w
    :目標的位置x,y,高寬h,w
  • c 1 , c 2 , c 3 c_1,c_2,c_3 :行人、汽車、自行車

如果 P c = 0 P_c = 0 那麼表示沒有目標,那麼我們就不關心後面的其他引數了。

特徵點檢測(Landmark detection)

如果是要檢測人臉,那麼可以在人臉上標註若干個特徵點,假設有64個特徵點,那麼這個時候就有128個引數了,再加上判斷是否有人臉,就有129個引數。

假設要檢測的是人體肢體的動作,那麼同樣也可以標註若干個肢體上的特徵點。

注意,這些都是需要人工進行標註的。

目標檢測

滑動視窗

目標檢測通常採用的是滑動視窗的方法來檢測的。也就是用一定視窗的大小,按照指定的步長,遍歷整個影象;而後再選取更大的視窗,再次遍歷,依次迴圈。這樣子,每個視窗都相當於一張小圖片,對這個小圖片進行影象識別,從而得到預測結果。

但是這個方法有個很明顯的問題,就是每個視窗都要進行一次影象識別,速度太慢了。因此就有了滑動視窗的卷積實現。在此之前,我們需要知道如何把全連線層變為卷積層。

全連線層轉化為卷積層

如圖,在經過Max pool後,我們得到了 5 × 5 × 16 5 \times 5 \times 16 的影象,經過第一個FC層後變成了400個節點。

而此時我們可以使用400個 5 × 5 5\times5 的卷積核,進行卷積,得到了 1 × 1 × 400 1\times1\times400

而後再使用400個 1 × 1 1\times1 的卷積核,再得到了 1 × 1 × 400 1\times1\times400 矩陣,所以我們就將全連線層轉化成了卷積層。

卷積滑動視窗的實現

因為之前的滑動視窗每一次都要進行一次計算,太慢了。所以利用上面的全連線層轉化為卷積層的做法,可以一次性把滑動視窗的結果都計算出來。

為了方面觀察,這裡把三維影象畫成了平面。

假設滑動的視窗是 14 × 14 × 3 14\times14\times3 ,原影象大小是 16 × × 16 × 3 16\times\times16\times3

藍色表示滑動視窗,如果步數是2的話,很容易可以得到 2 × 2 2\times2 的影象,不難看出,在圖中最後輸出的左上角的藍色部分就是原圖中藍色部分的計算結果,以此類推。

也就是說,只需要原圖進行一次運算,就可以一次性得到多個滑動視窗的輸出值。

具體例子如下圖:

可以看到,原圖為 28 × 28 28\times28 ,最後得到了 8 × 8 = 64 8\times8 = 64 個滑動視窗。

Bounding Box

上面介紹的滑動視窗的方法有一個問題,就是很多情況下並不能檢測出視窗的精確位置。

那麼如何找到這個準確的邊界框呢?有一個很快的演算法叫做YOLO(you only look once),只需要計算一次便可以檢測出物體的位置。

如圖,首先,將圖片分為 n × n n \times n 個部分,如圖是劃分成了 3 × 3 = 9 3\times3=9 份,而每一份都由一個向量y來表示。

因此最終得到了 3 × 3 × 8 3\times3\times8 的矩陣。

要得到這個 3 × 3 × 8 3\times3\times8 的矩陣,只要選擇適當的卷積神經網路,讓輸出矩陣為這個矩陣就行,而每一個小影象都有一個目標標籤y,這個時候y中的 b x , b y b_x,b_y 都是這個小影象的相對位置,在0-1之間,而 b h , b w b_h,b_w 是可以大於1的,因為整個大目標有可能在框框外。

在實際過程中可以選用更精細的劃分,如 19 × 19 19\times19

交併比(Intersection over Union, IoU)

如何判斷框框是否正確呢?

如圖紅色為車身的框,而紫色為檢測到的框,那麼紫色的框到底算不算有車呢?

這個時候可以用交併比來判斷,也就是兩個框框的交集和並集之比。

I o U = IoU = \frac{交集面積}{並集面積}

一般來說 I o U 0.5 IoU \geq 0.5 ,那麼說明檢測正確,當然,這個閾值可以自己設定。

非最大值抑制(NMS)

在實際過程中,很可能很多個框框都檢測出同一個物體,那麼如何判斷這些邊界框檢測的是同一個物件呢?

  • 首先,每一個框都會返回一個概率 P c P_c ,我們需要先去掉那些概率比較低的框,如去掉 P c 0.55 P_c \leq 0.55 的框。
  • 而後,在 P c P_c 中找到概率最大的框,然後用演算法遍歷其他的邊框,找出並取消掉和這個邊框IoU大於0.5的框(因為如果IoU大於0.5,我們可以認為是同一個物體)
  • 迴圈第二步的操作

如果有多個目標類別的檢測,那麼對每個類別分別進行上面的NMS演算法。

Anchor Box

如果一張格子中有多個目標,那怎麼辦?這時候就需要Anchor Box了,可以同時檢測出多個物件。

我們預先定義了兩個不同形狀的Anchor box,如比較高的來檢測人,比較寬的來檢測汽車,然後重新定義了目標向量y:

這個時候最後輸出的矩陣從原來的 3 × 3 × 8 3\times3\times8 變成了 3 × 3 × 16 3\times3\times16 ,也可以是 3 × 3 × 2 × 8 3\times3\times2\times8

在計算的時候就可以根據不同的box輸出了,?號表示我們不關係這個值。

問題:

  • 如果使用兩個Box,那麼如果出現3個目標怎麼辦,這時候需要別的手段了
  • 如果同一個格子的兩個物件的box相同怎麼辦,那也需要別的手段來處理了。

因為這兩種情況出現的機率都比較少,所以問題不大。

注意:

  • Anchor box的形狀都是人工指定的,一般可以選擇5-10種不同的形狀,來涵蓋我們想要檢測的不同物件
  • 更高階一點的使用k-means聚類演算法,將不同的物件形狀進行聚類,然後得到一組比較具有代表性的boxes

YOLO演算法

假設我們需要檢測三種目標:行人、汽車、摩托車,使用兩種anchor box

在訓練集中:

  • 輸入同樣大小的圖片X
  • 每張圖片的輸出Y是 3 × 3 × 16 3\times3\times16 的矩陣
  • 人工標定輸出Y

預測:

輸入圖片和訓練集大小相同,得到 3 × 3 × 16 3\times3\times16 的輸出結果

這個時候得到了很多個框框,如果是兩個Anchor box,那麼就有 2 × 9 = 18 2\times9=18 個預測框框,那麼就需要把沒用的框框都去掉,也就用到了上面的NMS非最大值抑制演算法。

進行NMS演算法:

  • 去掉 P c P_c 小於某個閾值的框框
  • 對於每個物件分別使用NMS演算法得到最終的邊界框。

候選區域

這裡還介紹了其他的目標檢測演算法,不過貌似都是比較慢的。

R-CNN:

原本的滑動視窗,只有在少部分的區域是可以檢測到目標的,很多區域都是背景,所以運算很慢,用R-CNN後,只選擇一些候選的視窗,不需要對整個圖片進行滑動。

R-CNN使用的是影象分割演算法,將圖片分割成很多個色塊,從而減少了視窗數量。

是對每個候選區域進行分類,輸出的標籤和bounding box

Fast R-CNN:

候選區域,使用滑動視窗在區分所有的候選區域。

Faster R-CNN:

使用卷積神經網路而不是影象分割來獲得候選區域。