1. 程式人生 > >吳恩達深度學習筆記之卷積神經網路(目標檢測)

吳恩達深度學習筆記之卷積神經網路(目標檢測)

3.1 目標定位

定位分類問題意味著我們不僅要用演算法判斷出圖片中是否有該物體,還要標記出它的位置,例如圖片有一輛汽車,我們需要用邊框把汽車圈起來。
影象分類問題已不陌生,例如輸入一張圖片到多層卷積神經網路,它會輸出一個特徵向量,並反饋給softmax來預測圖片型別。
比如某張圖片包括以下幾類,人,汽車,摩托車,背景。如果在該張圖片中沒有檢測到物件,則輸出結果就會是背景,這些分類就是softmax函式可能輸出的結果。
如果還想定點陣圖片中的汽車,行人等的位置,此時我們可以讓神經網路多輸出幾個單元,輸出一個邊界框,具體來說就是讓神經網路多輸出四個數字,標記為bx,by,bh,bw分別代表邊框的中心座標,以及邊框的長和寬,當然還可以有其他的表示方法。

定義以下標籤

行人
汽車
摩托車
背景

注意:這裡有4個分類,神經網路輸出的是這 4個數字,和一個分類標籤出現的概率。目標標籤Y的定義如下:他是一個向量。如下所示:y=[pcbxbybhbwc1c2c3]T其中pc表示有無有無要檢測的物件如果pc=0表示只有背景,則後面的引數均無意義,如果pc=1,表示有檢測物件,同時輸出c1,c2,c3表示該物件屬於1-3中的哪一個類。
最後一下,我們介紹訓練神經網路的損失函式,其引數為類別Y,和網路輸出Y^,這裡損失函式採用平方誤差策略,L(Y^,Y)=(Y^1Y1)2+(Y^2Y2)2++(Y^8Y8)2,因為上向量有8個引數,損失值等於每個元素相應差值的平方和,如果圖片中存在定位物件,損失值就是不同元素的平方和,另一種情況,如果不存在物件,損失值就是(

Y^1Y1)2,因為對於這種情況,我們不需要考慮其他元素。
目標定位的簡單模型如下:

這裡寫圖片描述

3.2 目標檢測(objection detection)

這節我們主要介紹基於滑動視窗的目標檢測演算法,具體步驟先看可能下面的圖:

這裡寫圖片描述 這裡寫圖片描述

步驟如下:首先選定一個特定大小的視窗,將這個視窗輸入卷積網路,卷積網路開始進行預測,即判斷紅色方框內是否存在汽車。接著處理第二張圖片,如此迴圈下去。在這裡可以調節步幅以及視窗的大小,這就是滑動視窗檢測的簡要步驟。
滑動視窗目標檢測有明顯的缺點,就是計算成本太大,因為要剪出太多的小方塊,然後卷積網路要一個一個的處理,如果選用步幅太大,又會影響效能。

3.3 卷積的滑動視窗實現(Convolution implementation of sliding windows)

上一小節,我們學習瞭如何通過卷積網路實現視窗物件檢測演算法,但是其效率很低,這一節我們介紹如何在卷積上應用這個演算法。
為了構建滑動視窗的卷積應用,首先需要把神經網路的全連線層轉化為卷積層。
如圖所示:

這裡寫圖片描述

輸出表示分別對應softmax單元所輸出的4個分類出現的概率,如下演示將上述的全連線層轉為卷積層。

這裡寫圖片描述

利用400個5*5*16的過濾器將其轉化為1*1*400的輸出,接著使用1*1卷積。1*1卷積的作用在這裡不在贅述 。以上就是用卷積層代替全連線層的過程。
我們再看看如何通過卷積實現滑動視窗檢測演算法
為了簡單起見,假設向滑動視窗卷積網路輸入14*14*3的訓練集圖片如下:

這裡寫圖片描述

測試集圖片為16*16*3如下:

這裡寫圖片描述

該卷積操作的原理是我們不需要把輸入圖片分割成四個子集,分別執行前向傳播,而是把他們作為一張圖片輸入給卷積網路進行計算,其中的共有區域可以共享很多計算。
總結一下:滑動視窗的實現過程,在圖片上剪切出一塊區域,假設它的大小是14*14,將它輸入到卷積網路,繼續輸入下一塊區域,重複此操作。但是現在我們不用依靠連續的卷積操作來識別圖片中的汽車,比如我們可以對大小為28*28的整張圖片進行卷積操作,一次性得到所有預測值,這樣神經網路就可以識別出汽車的位置,他提高了整個演算法的效率。
缺點:邊界框的位置可能不夠準確。
如下所示:

這裡寫圖片描述

3.4 Bounding Box 預測

滑動視窗的卷積實現,該演算法效率高,但是存在一個問題就是不能輸出精準的邊界框。有一個得到更精準的邊界框的演算法是YOLO(you only look once)演算法,它的思想如下:加入我們輸入影象是100*100的,然後在影象上放一個網格,可能是3*3,也可能是19*19,如圖為了方便,我們設定為3*3

這裡寫圖片描述

然後對這9個格子,每個格子都指定一個標籤,y是8維向量,和我們之前看到的一樣,y=[pcbxbybhbwc1c2c3]T,YOLO演算法做的就是取兩個物件的中點,然後將物件分配給包含物件中點的格子。如圖所示

這裡寫圖片描述

對於3*3的網格,9個格子中的任何一個,我們都會得到一個8維的輸出向量,總的輸出標籤尺寸是3*3*8。
YOLO演算法的優點是可以輸出精確的邊界框。只要每個格子中物件數目沒有超過一個,這個演算法就應該沒什麼問題,如果存在多個物件,後面再討論。
YOLO演算法的好處是它的執行速度非常快,幾乎可以達到實時識別。

重要細節

就是在YOLO演算法中,bx,by,bh,bw是如何定義的,我們看下面一張圖就一目瞭然了。

這裡寫圖片描述

格子的左上角座標定義為(0,0),右下角座標定義為(1,1)
bx,by在0到1之間,而bh,bw可以大於1。它們是相對格子尺度的比例。

3.5 交併化(Intersection over union)

交併化可以用來評價物件檢測演算法的好壞。它做的是計算兩個邊界框交集和並集之比。如下所示:

這裡寫圖片描述

一般約定,在計算檢測任務中,如果說IoU>0.5,就說檢測正確,IoU越高,邊界框越精確,這是一種衡量定位精確度的方式。

3.6 非最大值抑制(Non-max suppression)

我們的演算法可能對同一個物件做多次檢測,非最大值抑制就是上述的一些檢測結果,只輸出概率最大的分類結果。如圖所示:

這裡寫圖片描述

上面那張圖有多個檢測結果,但是我們只保留概率為0.9,和概率為0.8的結果,其餘的結果均丟棄掉,這就叫非最大值抑制。
如下圖所示:

這裡寫圖片描述

3.7 Anchor Boxes

到目前為止,物件檢測存在的問題是每個格子只能檢測出一個物件,如果想要檢測多個物件,可以使用anchor box這個概念。
假設我們有下面這樣一張圖:

這裡寫圖片描述

對於這樣一個例子,如果我們繼續使用3*3網格,我們會發現行人和汽車的中店幾乎一樣,兩者都落在同一個格子中,所以此時,我們需要定義兩個anchor box,一般來說需要定義5到10個anchor box,這裡為了簡單,定義兩個。此時,我們需要做的是將預測結果和這兩個anchor box關聯起來,用的向量也不再是以前的向量,而是如下圖所示的向量:

這裡寫圖片描述

前面8個引數和anchor box1關聯,後面8個引數和anchor box2 關聯。然後我們就看哪一個anchor box和實際邊界框的交併比更高。
我們建立anchor box這個概念是為了處理兩個物件出現在 同一個格子的情況。
人們一般手工指定anchor box的形狀,我們可以選擇5到10個anchor box 形狀覆蓋到多種不同的形狀。

3.8 RPN 網路

R-CNN:意思是帶區域的卷積神經網路,該演算法嘗試選出一些區域,在這些區域上運行卷積網路分類器。所以這裡不再針對每個滑動窗跑檢測演算法,而是選擇一些視窗,在少數視窗上運行卷積網路分類器,選出候選區域的方法是執行影象分割演算法,如圖所示:

這裡寫圖片描述

分割演算法在某個地區找到一個色塊,然後在這個色塊上跑分類器,這樣可以減少卷機網路分類器執行時間,比在影象所有位置跑一遍分類器要快,這就是R-CNN的概念。
注意:R-CNN不會直接新人輸入的邊界框,它也會輸出一個邊界框bx,by,bh,bw,這樣得到的邊界框比較精確,但是R-CNN還是太慢了。
Fast-RCNN:Fast-RCNN基本上是R-CNN,不過用卷積實現了滑動窗法
Faster-RCNN:使用的是卷積神經網路,而不是更傳統的分割演算法來獲得候選區域色塊,結果比快速Fast-Rcnn快得多。
R-CNN:Propose regions,classify proposed regions one at a time,output label+bounding box
Fast R-CNN : Use convolution implementation of sliding windows to classified all the proposed regions
Faster R-CNN : Use convolutional network to propose regions .