吳恩達 DeepLearning.ai 課程提煉筆記(4-3)卷積神經網路 --- 目標檢測

以下為在Coursera上吳恩達老師的 deeplearning.ai 課程項目中,第四部分《卷積神經網路》第三周課程「目標檢測」關鍵點的筆記。本次筆記幾乎涵蓋了所有視頻課程的內容。在閱讀以下筆記的同時,強烈建議學習吳恩達老師的視頻課程,視頻請至 Coursera 或者 網易雲課堂。


1. 目標定位和特徵點檢測

圖片檢測問題:

  • 分類問題:判斷圖中是否為汽車;
  • 目標定位:判斷是否為汽車,並確定具體位置;
  • 目標檢測:檢測不同物體並定位。

目標分類和定位:

對於目標定位問題,我們卷積神經網路模型結構可能如下:

輸出:包含圖片中存在的對象及定位框

  • 行人,0 or 1;
  • 汽車,0 or 1;
  • 摩托車,0 or 1;
  • 圖片背景,0 or 1;
  • 定位框: b_{x}、b_{y}、b_{h}、b_{w}

其中, b_{x}、b_{y} 表示汽車中點, b_{h}、b_{w} 分別表示定位框的高和寬。以圖片左上角為(0,0),以右下角為(1,1),這些數字均為位置或長度所在圖片的比例大小。

目標標籤 y:

y = left[ egin{array}{l} P_{c}\ b_{x}\ b_{y}\ b_{h}\ b_{w}\ c_{1}\ c_{2}\ c_{3} end{array} 
ight]left| egin{array}{l} 是否含有對象,0 or 1\ \ \ \ \ 是否有行人,0 or 1\ 是否有汽車,0 or 1\ 是否有摩托,0 or 1 end{array} 
ight.

  • P_{c}=1 時,表示圖片中存在物體;
  • P_{c}=0 時,表示圖片中不存在物體,那麼此時,輸出 y 的其他值為多少均沒有意義,也不會參與損失函數的計算:

y = left[ egin{array}{l} 0\ ?\ ?\ ...\ ? end{array} 
ight]

損失函數:

如果採用平方誤差形式的損失函數:

  • P_{c}=1 時:L(hat y,y)=(hat y_{1}-y_{1})^{2}+(hat y_{2}-y_{2})^{2}+cdots+(hat y_{8}-y_{8})^{2}

此時,我們需要關注神經網路對所有輸出值的準確度;

  • P_{c}=0 時:L(hat y,y)=(hat y_{1}-y_{1})^{2}

此時,我們只關注神經網路對背景值的準確度。

當然在實際的目標定位應用中,我們可以使用更好的方式是:

  • c_{1}、c_{2}、c_{3} 和softmax使用對數似然損失函數
  • 對邊界框的四個值應用平方誤差或者類似的方法;
  • P_c 應用logistic regression損失函數,或者平方預測誤差

特徵點檢測:

由前面的目標定位問題,我們可以知道,神經網路可以通過輸出圖片上特徵點的坐標(x,y),來實現對目標特徵的識別和定位標記。

如對於人臉表情識別的問題中,我們通過標定訓練數據集中特徵點的位置信息,來對人臉進行不同位置不同特徵的定位和標記。AR的應用就是基於人臉表情識別來設計的,如臉部扭曲、增加頭部配飾等。

在人體姿態檢測中,同樣可以通過對人體不同的特徵位置關鍵點的標註,來記錄人體的姿態。

2. 目標檢測

目標檢測採用的是基於滑動窗口的檢測演算法。

訓練模型:

  • 訓練集X:將有汽車的圖片進行適當的剪切,剪切成整張幾乎都被汽車佔據的小圖或者沒有汽車的小圖;
  • 訓練集Y:對X中的圖片進行標註,有汽車的標註1,沒有汽車的標註0。

滑動窗口目標檢測:

利用滑動窗口在實際圖片中實現目標檢測。

  • 首先選定一個特定大小的窗口,將窗口內的圖片輸入到模型中進行預測;
  • 以固定步幅滑動該窗口,遍歷圖像的每個區域,對窗內的各個小圖不斷輸入模型進行預測;
  • 繼續選取一個更大的窗口,再次遍歷圖像的每個區域,對區域內是否有車進行預測;
  • 遍歷整個圖像,可以保證在每個位置都能檢測到是否有車。

缺點:計算成本巨大,每個窗口的小圖都要進行卷積運算,(但在神經網路興起之前,使用的是線性分類器,所以滑動窗口演算法的計算成本較低)。

卷積層替代全連接層:

對於卷積網路中全連接層,我們可以利用 1	imes1 大小卷積核的卷積層來替代。

在上一周課程中,吳恩達老師講授過 1	imes1 的卷積核相當於在一個三維圖像的切片上應用了一個全連接的神經網路。同樣,全連接層也可以由 1	imes1 大小卷積核的卷積層來替代。需注意卷積核的個數與隱層神經元個數相同。

滑動窗口的卷積實現:

在我們實現了以卷積層替代全部的全連接層以後,在該基礎上進行滑動窗口在卷積層上的操作。下面以一個小的圖片為例:

我們以上面訓練好的模型,輸入一個 16	imes16	imes3 大小的整幅圖片,圖中藍色部分代表滑動窗口的大小。我們以2為大小的步幅滑動窗口,分別與卷積核進行卷積運算,最後得到4幅 10	imes10	imes16 大小的特徵圖,然而因為在滑動窗口的操作時,輸入部分有大量的重疊,也就是有很多重複的運算,導致在下一層中的特徵圖值也存在大量的重疊,所以最後得到的第二層激活值(特徵圖)構成一副 12	imes12	imes16 大小的特徵圖。對於後面的池化層和全連接層也是同樣的過程。

那麼由此可知,滑動窗口在整幅圖片上進行滑動卷積的操作過程,就等同於在該圖片上直接進行卷積運算的過程。所以卷積層實現滑動窗口的這個過程,我們不需要把輸入圖片分割成四個子集分別執行前向傳播,而是把他們作為一張圖片輸入到卷積神經網路中進行計算,其中的重疊部分(公共區域)可以共享大量的計算。

汽車目標檢測:

依據上面的方法,我們將整張圖片輸入到訓練好的卷積神經網路中。無需再利用滑動窗口分割圖片,只需一次前向傳播,我們就可以同時得到所有圖片子集的預測值。

利用卷積的方式實現滑動窗口演算法的方法,提高了整體的計算效率。

3. Bounding Box 預測

前面一節的卷積方式實現的滑動窗口演算法,使得在預測時計算的效率大大提高。但是其存在的問題是:不能輸出最精準的邊界框(Bounding Box)。

在滑動窗口演算法中,我們取的一些離散的圖片子集的位置,在這種情況下,有可能我們沒有得到一個能夠完美匹配汽車位置的窗口,也有可能真實汽車的邊界框為一個長方形。所以我們需要尋找更加精確的邊界框。

YOLO:

YOLO演算法可以使得滑動窗口演算法尋找到更加精準的邊界框。

  • 在整幅圖片上加上較為精細的網格,將圖片分割成 n	imes n 個小的圖片;
  • 採用圖像分類和定位演算法,分別應用在圖像的 n	imes n 個格子中。
  • 定義訓練標籤:(對於每個網格,定義如前面的向量 y_{i}

y_{i} = left[ egin{array}{l} P_{c} b_{x} b_{y} b_{h} b_{w} c_{1} c_{2} c_{3} end{array} 
ight]

對於不同的網格 i 有不同的標籤向量 y_{i}

  • n	imes n 個格子標籤合併在一起,最終的目標輸出Y的大小為: n	imes n	imes 8 (這裡8是因為例子中的目標值有8個)。

通過這樣的訓練集訓練得到目標探測的卷積網路模型。我們利用訓練好的模型,將與模型輸入相同大小的圖片輸入到訓練好的網路中,得到大小為 n	imes n	imes 8 的預測輸出。通過觀察 n	imes n 不同位置的輸出值,我們就能知道這些位置中是否存在目標物體,然後也能由存在物體的輸出向量得到目標物體的更加精準的邊界框。

YOLO notation:

  • 將對象分配到一個格子的過程是:觀察對象的中點,將該對象分配到其中點所在的格子中,(即使對象橫跨多個格子,也只分配到中點所在的格子中,其他格子記為無該對象,即標記為「0」);
  • YOLO顯式地輸出邊界框,使得其可以具有任意寬高比,並且能輸出更精確的坐標,不受滑動窗口演算法滑動步幅大小的限制;
  • YOLO是一次卷積實現,並不是在 n	imes n 網格上進行 n^{2} 次運算,而是單次卷積實現,演算法實現效率高,運行速度快,可以實現實時識別。

bounding boxes 細節:

利用YOLO演算法實現目標探測的時候,對於存在目標對象的網格中,定義訓練標籤Y的時候,邊界框的指定參數的不同對其預測精度有很大的影響。這裡給出一個較為合理的約定:(其他參數指定方式可閱讀論文)

  • 對於每個網格,以左上角為(0,0),以右下角為(1,1);
  • 中點 b_{x}、b_{y} 表示坐標值,在0~1之間;
  • 寬高 b_{h}、b_{w} 表示比例值,存在>1的情況。

4. 交並比(Intersection-over-Union)

交並比函數用來評價目標檢測演算法是否運作良好。

對於理想的邊界框和目標探測演算法預測得到的邊界框,交並比函數計算兩個邊界框交集和並集之比。


m IoU = dfrac{交集面積}{並集面積}

一般在目標檢測任務中,約定如果 IoUgeqslant0.5 ,那麼就說明檢測正確。當然標準越大,則對目標檢測演算法越嚴格。得到的IoU值越大越好。

5. 非最大值抑制(non-max suppression,NMS)

對於我們前面提到的目標檢測演算法,可能會對同一個對象做出多次的檢測,非最大值抑制可以確保我們的演算法對每個對象只檢測一次。

多網格檢測同一物體:

對於汽車目標檢測的例子中,我們將圖片分成很多精細的格子。最終預測輸出的結果中,可能會有相鄰的多個格子里均檢測出都具有同一個對象。

NMS演算法思想:

  • 在對 n	imes n 個網格進行目標檢測演算法後,每個網格輸出的 P_{c} 為一個0~1的值,表示有車的概率大小。其中會有多個網格內存在高概率;
  • 得到對同一個對象的多次檢測,也就是在一個對象上有多個具有重疊的不同的邊界框;
  • 非最大值抑制對多種檢測結果進行清理:選取最大 P_{c} 的邊界框,對所有其他與該邊界框具有高交並比或高重疊的邊界框進行抑制;
  • 逐一審視剩下的邊界框,尋找最高的 P_{c} 值邊界框,重複上面的步驟。
  • 非最大值抑制,也就是說抑制那些不是最大值,卻比較接近最大值的邊界框。

NMS演算法:

以單個對象檢測為例:

  • 對於圖片每個網格預測輸出矩陣: y_{i} = left[ egin{array}{l} P_{c} b_{x} b_{y} b_{h} b_{w} end{array} 
ight] ,其中 P_{c} 表示有對象的概率;
  • 拋棄 P_{c}leqslant0.6 的邊界框,也就是低概率的情況;
  • 對剩餘的邊界框(while):

- 選取最大 P_{c} 值的邊界框,作為預測輸出邊界框;

- 拋棄和選取的邊界框 IoUgeqslant0.5 的剩餘的邊界框。

對於多對象檢測,輸出標籤中就會有多個分量。正確的做法是:對每個輸出類別分別獨立進行一次非最大值抑制。

6. Anchor box

通過上面的各種方法,目前我們的目標檢測演算法在每個格子上只能檢測出一個對象。使用Anchor box可以同時檢測出多個對象。

重疊目標:

對於重疊的目標,這些目標的中點有可能會落在同一個網格中,對於我們之前定義的輸出: y_{i} = left[ egin{array}{l} P_{c} b_{x} b_{y} b_{h} b_{w} c_{1} c_{2} c_{3} end{array} 
ight] ,只能得到一個目標的輸出。

而Anchor box 則是預先定義多個不同形狀的Anchor box,我們需要把預測目標對應地和各個Anchor box 關聯起來,所以我們重新定義目標向量:

y_{i} = left[ P_{c} b_{x} b_{y} b_{h} b_{w} c_{1} c_{2} c_{3} P_{c} b_{x} b_{y} b_{h} b_{w} c_{1} c_{2} c_{3}cdots
ight]

用這樣的多目標向量分別對應不同的Anchor box,從而檢測出多個重疊的目標。

  • 不使用Anchor box:訓練圖片中的每個對象,根據對象的中點,分配到對應的格子中。輸出大小(例如8): n	imes n	imes 8
  • 使用Anchor box:訓練圖片的每個對象,根據對象的中點,分配到對應的格子中,同時還分配到一個和對象形狀的IoU最高的Anchor box 中。輸出大小(例如兩個Anchor box): n	imes n	imes 16

例子:

如下面的圖片,裡面有行人和汽車,我們為其分配兩個Anchor box。對於行人形狀更像Anchor box 1,汽車形狀更像Anchor box 2,所以我們將人和汽車分配到不同的輸出位置。

如果格子中只有汽車的時候,我們使用了兩個Anchor box,那麼此時我們的目標向量就成為:

y_{i} = left[ 0 ? ? ? ? ? ? ? 1 b_{x} b_{y} b_{h} b_{w} 0 1 0
ight]

其中,「?」代表的是該位置是什麼樣的參數我們都不關心。

難點問題:

  • 如果我們使用了兩個Anchor box,但是同一個格子中卻有三個對象的情況,此時只能用一些額外的手段來處理;
  • 同一個格子中存在兩個對象,但它們的Anchor box 形狀相同,此時也需要引入一些專門處理該情況的手段。

但是以上的兩種問題出現的可能性不會很大,對目標檢測演算法不會帶來很大的影響。

Anchor box 的選擇:

  • 一般人工指定Anchor box 的形狀,選擇5~10個以覆蓋到多種不同的形狀,可以涵蓋我們想要檢測的對象的形狀;
  • 高級方法:K-means 演算法:將不同對象形狀進行聚類,用聚類後的結果來選擇一組最具代表性的Anchor box,以此來代表我們想要檢測對象的形狀。

7. YOLO演算法目標檢測

假設我們要在圖片中檢測三種目標:行人、汽車和摩托車,同時使用兩種不同的Anchor box。

訓練集:

  • 輸入X:同樣大小的完整圖片;
  • 目標Y:使用 3	imes3 網格劃分,輸出大小 3	imes3	imes2	imes8 ,或者 3	imes3	imes16
  • 對不同格子中的小圖,定義目標輸出向量Y。

模型預測:

輸入與訓練集中相同大小的圖片,同時得到每個格子中不同的輸出結果: 3	imes3	imes2	imes8

運行非最大值抑制(NMS):

  • 假設使用了2個Anchor box,那麼對於每一個網格,我們都會得到預測輸出的2個bounding boxes,其中一個 P_{c} 比較高;

  • 拋棄概率 P_{c} 值低的預測bounding boxes;

  • 對每個對象(如行人、汽車、摩托車)分別使用NMS演算法得到最終的預測邊界框。

8. 候選區域(region proposals)

R-CNN:

R-CNN(Regions with convolutional networks),會在我們的圖片中選出一些目標的候選區域,從而避免了傳統滑動窗口在大量無對象區域的無用運算。

所以在使用了R-CNN後,我們不會再針對每個滑動窗口運算檢測演算法,而是只選擇一些候選區域的窗口,在少數的窗口上運行卷積網路。

具體實現:運用圖像分割演算法,將圖片分割成許多不同顏色的色塊,然後在這些色塊上放置窗口,將窗口中的內容輸入網路,從而減小需要處理的窗口數量。

更快的演算法:

  • R-CNN:給出候選區域,不使用滑動窗口,對每個候選區域進行分類識別,輸出對象 標籤 和 bounding box,從而在確實存在對象的區域得到更精確的邊界框,但速度慢;
  • Fast R-CNN:給出候選區域,使用滑動窗口的卷積實現去分類所有的候選區域,但得到候選區的聚類步驟仍然非常慢;
  • Faster R-CNN:使用卷積網路給出候選區域。

本文將同時更新在我的CSDN博客

吳恩達Coursera深度學習課程 DeepLearning.ai 提煉筆記(4-3)-- 目標檢測

歡迎關注,一起學習一起進步喲。^_^


推薦閱讀:

目標檢測中region proposal的作用?
視頻中的目標檢測與圖像中的目標檢測具體有什麼區別?
為什麼SSD(Single Shot MultiBox Detector)對小目標的檢測效果不好?
自知視野不夠開闊,目前的平台也不高,如何確定擅長做什麼?找到什麼樣的目標?

TAG:人工智能 | 卷积神经网络CNN | 目标检测 |