1. 程式人生 > >卷積神經網路(3):目標檢測學習筆記[吳恩達Deep Learning]

卷積神經網路(3):目標檢測學習筆記[吳恩達Deep Learning]

1.目標定位

1.1 分類、定位、檢測簡介

這裡寫圖片描述
- Image classification
影象分類,就是給你一張圖片,你判斷目標是屬於哪一類,如汽車、貓等等。
- Classification with localization
定位分類,不但判斷目標的類別,還要輸出目標物體的位置,如用框框起來。
- Detection
檢測,圖片中可能有多個物體,需要把它們找出來。

1.2 定位分類

這裡寫圖片描述
1.2.1 給定一張圖片,你要確定目標是什麼、位置在哪,把圖片置入卷積神經網路CNN訓練,輸出類別和位置。如上圖,給定4類:行人、車、摩托車、背景(無物體), 卷積之後輸出2, 位置(bx, by, bh, bw),以(0, 0)、(1, 1)分別表示圖片左上角和左下角, (bx, by, bh, bw)確定矩形框, (bx, by)確定汽車左上角座標,bh, bw分別表示汽車高度和寬度。
這裡寫圖片描述


1.2.2 訓練資料(x, y),x為圖片,假設32*32*3, y為label,需要表示分類和定位的位置框,如y=(pc, bx, by, bh, bw, c1, c2, c3),pc=1表示圖片目標為行人、車、摩托車,pc=0表示無目標,為背景圖片。c1,c2,c3用以表示目標具體屬於哪一類。如y=(1, 0.3, 0.6, 0.3, 0.4, 0, 1, 0)表示目標為汽車;y=(0, ?, ?, ?, ?, ?, ?, ?)表示背景圖片,沒有目標,後面引數無需知道。

2.特徵點檢測

這裡寫圖片描述
特徵點為人為規定的點,將一幅圖片放入卷積神經網路,修改使輸出增加特徵點的座標。

2.1 人臉識別

對於人臉,假設有64個特徵點,(l1x, l1y)、(l2x, l2y)、… 、(l64x, l64y)分別表示左外眼角、左內眼角、右內眼角、右外眼角等等, 輸出y=(face, l1x, l1y, … , l64x, l64y)。

2.2 姿勢檢測

對於人體姿勢,同樣可以人為地規定一些特徵點,找到這些特徵點後,可以把它們作為輸入,用以訓練識別不同的姿勢,如運動、躺下、蹲著等等。

3.目標檢測

滑動視窗檢測
大致實現思路是先給定一個標籤訓練集(X, Y),標籤訓練集中的待檢測目標物體儘量充滿整個圖片,用該訓練集訓練,輸出表示是否是該目標,1或0。
這裡寫圖片描述
應用以上訓練好的網路,使用不同大小的滑動視窗來卷積待檢測的圖片,如果識別成功,則會檢測出待檢測圖片裡面的目標物體,如汽車。
這裡寫圖片描述

4.卷積的滑動視窗實現

4.1 將全連線層轉換成卷積層

如上圖,上半部分是一個典型的LeNet,先卷積、池化、拉伸、接入全連線層、輸出。下半部分為全連線層轉換成卷積層。
這裡寫圖片描述


- 對於網路層單元5*5*16,先用5*5*16進行卷積,輸出為1*1,再用400個過濾器,即可得到1*1*400,區別於全連線的400。
- 具體理解5*5*16卷積5*5*16變成1*1,可以想成16個5*5的圖片,對於每一張5*5圖片,你用5*5進行卷積,則得到1*1,直觀理解就是一張圖片捲成1點,這時16個圖片捲成16*1,再用16個過濾器卷積,變成1*1。
- 之後的FC轉換CN亦如此。

4.2 應用滑動視窗檢測

原理簡單的就是按照一定大小的視窗在原圖片上滑,直到檢測出目標,道理很簡單,但是實現起來會重複許多計算。如圖:
這裡寫圖片描述
- 假設14*14*3為標籤訓練集,輸出y表示類別。待檢測的圖片是16*16*3,步幅假設為2,在最開始的演算法中,我們要把16*16*3的圖片分了4個14*14*3放入最上面的卷積網路進行卷積,得到4個輸出結果,但是這其中重複計算太多東西,如中間重疊部分,你用5*5*3卷積的時候,重疊部分完全重複計算了4次。
- 假設28*28*3圖片為待檢測圖片,用以上方法重複計算的更多。

4.3 如何改進

這裡寫圖片描述
我們可以不用連續的進行卷積,可以把整個待測試圖片進行卷積,一次性得到所有預測值,減少重複計算。

  • 最開始使用小圖片(14 * 14 * 3)標籤訓練集訓練,本身就是使用的卷積神經網路CNN,假設為X1->CNN1->Y1。
  • 對測試集(28 * 28 * 3) 使用滑動視窗時,是以(14 * 14 * 3)為最開始卷積,然後接入CNN1,最後產生預測值,這時產生重複計算,設為X2->X1->CNN1->Y2
  • 綜上,我們可以直接卷積測試集(28 * 28 * 3),X2->CNN1->Y3,避免大量重複計算,可能結果Y3不一定優於Y2,但是快!

5.Bounding Box預測

這裡寫圖片描述
目標檢測需要確定邊界框,而且必須考慮準確性、實時性,下面介紹YOLO演算法。

5.1 YOLO演算法

這裡寫圖片描述

  • 假設待測圖片大小X(100*100*3),圖片被分成3*3網格,參照上面分類定位的輸出y格式8維向量(pc, bx, by, bh, bw, c1, c2, c3)。對於每一個格子,若有且只有一個待檢測目標的中心點在格子內,pc = 1,否則,pc =0;(bx, by)表示中心點座標,(bh, bw)表示目標相較於格子大小的高度和寬度。則目標輸出Y為3*3*8。
  • 構建卷積神經網路CNN,X->CNN->Y,優點是可以精確預測出邊界框,當然是神經網路的功勞,具體原因不明。

5.2 YOLO補充

如圖,輸出(bh, bw)值為目標高度寬度對於格子大小的比,值可大於1,但是(bx, by)值介於0和1之間,因為每個格子左上角表示(0,0),右下角表示(1,1)。
這裡寫圖片描述

6.交併比

交併比用於目標檢測演算法中,很簡單,就是預測框與實際框並集比上交集,一般值大於0.5,則可判定預測正確。
這裡寫圖片描述

7.非極大值抑制

7.1 演算法概述

  • 對於一張待測圖片,應用YOLO演算法和交併比,去掉所有pc<0.6的預測框
  • 選取剩下pc值最大的預測框
  • 去掉所有其他預測框

這裡寫圖片描述

7.2 舉例

如檢測汽車,先留取大於0.6的所有預測框,在比較剩下所有預測框,左邊汽車選取0.8,右側汽車選取0.9,其他預測框則全部刪去。
這裡寫圖片描述

8.Anchor Boxes

上面所說的一個格子只能檢測出一個目標,對於檢測出多個目標則需要另一個演算法,Anchor Boxes演算法。

8.1 簡介舉例

Anchor Boxes演算法通過擴增輸出y來描述多個物體,假設一個格子要檢測兩個物體,對3*3Grid,某個格子裡落下兩個物體的中心點,人和汽車,這時y = (y1, y2), yi = (pc, bx, by, bh, bw, c1, c2, c3), i = 1,2。
這裡寫圖片描述

8.2 Anchor Boxes演算法

對於之前的一個格子對應一個目標,現在一個格子不止對應一個目標,更對於一個Anchor Box,即(grid cell, anchor box),再選取交併比最高的。以兩個Anchor Boxes為例,本來3*3*8變成3*3*2*8。
這裡寫圖片描述

9.YOLO演算法

前面以學習到目標檢測的基本元素,下面可以組合這些元素構成YOLO演算法:
- 輸入X(100*100*3),將之劃分3*3Grid網格,待檢測目標3類,人、車、摩托車,兩個Anchor Boxes;
- 置入分類定位的卷積神經網路,運用極大值抑制和交併比,輸出y = (y1, y2),yi = (pc, bx, by, bh, bw, c1, c2, c3),i=1,2。
- 輸出Y(100*3*3*16)

這裡寫圖片描述