1. 程式人生 > >卷積神經網路課程筆記-實際應用(第三、四周)

卷積神經網路課程筆記-實際應用(第三、四周)

所插入的圖片仍然來源於吳恩達老師的課件。

第三週 目標檢測

1. 物件的分類與定位,在輸出層不僅輸出類別,還應輸出包含物體的邊界框(bx,by,bh,bw),從而達到定位的目的。注意網路的輸出(例如下圖的輸出就有是否為目標,邊界框的引數,以及是哪類的判斷)和損失函式的定義(針對不同的輸出元素應用不同的損失,例如可以對pc應用sigmoid,邊界應用平方差,分類類別應用絕對值等等)

                                                

 2.特徵點的檢測:還是利用上文輸出邊界框的思路,首先標記諸多個特徵點,作為標籤,同樣,輸出層輸出相應個數的特徵點。注意輸出層的第一項,仍然為前景與背景的判別標誌。 

3. 物件檢測:一種思路為基於滑動視窗的目標檢測,假設進行車輛檢測,以固定視窗(每次遍歷完圖片,都可改變視窗大小,進行新一次的檢測)滑動整個影象,利用訓練好的網路判斷當前滑動的視窗是否包含檢測物件。這裡注意訓練的樣本應是適度剪下過的資料,即汽車基本佔據整個圖片且位於中心位置。這種方法作為作為傳統的計算機視覺內的目標檢測方法,存在的劣勢顯而易見,一是計算成本高且執行慢;二是檢測到物體的範圍實際上邊界框的範圍,並不能很好的檢測出物體具體的邊界範圍。

解決第一個問題:上節課提到,利用滑動視窗進行目標檢測時,速度又慢且成本又高,其中的一個解決方案便是利用卷積層代替全連線層。

也就是說在網路後半部分,利用卷積層來代替全連線層,為什麼能夠這麼做,因為卷積操作實則也就是對於filter中的元素進行全連線,仔細思考,3*3*3的filter不就是對於其包含的27元素進行加權求和,不就是將1維的全連線擴充套件為3維的全連線,我只是這樣理解的,至於全連線的具體數學意義並沒有深究。看第一行的5*5*16利用5*5*400的過濾器得到1*1*400的卷積層,以此代替全連線層(400)。其實,這種手段,真正省去的計算步驟在於前面的卷積層的計算,由此省去了佔了較大比例的重複計算,後面的本應是全連線層操作的計算保留,只不過換了一種形式。既保證了結果不變,同時也省去了大量的計算步驟。

具體在滑動視窗檢測中,滑動視窗之間很容易有共享的地方,因此如若單個視窗進行輸入計算,會進行許多重複的計算,看上面圖片中的第2行與第3行,以第3行為例。此時,輸入的物件不再是一個視窗,而是整個影象28*28*3,而輸出為8*8*4,其中每一個i*j*4(i,j為行列號),就是原有的滑動視窗在原影象上移動的結果。

記得在物件檢測中仍然存在著待檢測目標邊界框不準確的問題。通過上述步驟能夠增強滑動視窗的方法的計算效率,但是仍然不能很好的解決探測目標的邊界框的問題。YOLO(You only look once)演算法便可用來解決這問題。Yolo演算法首先將原影象劃分為若干個框,以目標的中心點作為判斷目標落入哪個框的標誌,注意邊界框的長度和寬度可能大於1,這個1是相對於影象劃分的框的長度與寬度而言。這種做法從檢測物體的角度出發來進行訓練。

在Yolo演算法中,存在著以下幾個概念:

(1)交併比(intercection over union)-loU。 評價提取出來的邊界框是否好的一個指標。通過計算提取的邊界框和實際的邊界框的交集和並集之比,顯然取值範圍0-1,越高越好。一般約定0.5為閾值,大於0.5就認為結果可以接受。當然這個值作為超引數可根據實際情況來設定。

(2)非最大值抑制(No-max Suppression):確保演算法對每個物件只檢測一次。思路很清晰, 利用交併比,將與最大可能邊界框相似的邊界框去除。這是為了解決一個物體可能檢測出多個邊界框的問題。

(3)Anchorbox 解決一個框有多個物件的問題。一個物件不僅分配到一個格網之中,還分配到一個anchorbox之中,因此,設定的標籤y的元素個數就擴大為原來的兩倍(觀看上圖的例子,若採用anchorbox方式,標籤個數即由8擴大為16)。

4. 候選區域(region proposals)

R-CNN (Region-CNN,帶區域的卷積網路):利用影象分割演算法,嘗試選擇一些區域作為候選區域,進行卷積網路的分析。

Fast R-CNN:在R-CNN基礎上,利用滑動視窗的進行卷積實現。

Faster R-CNN:在R-CNN基礎上,利用卷積神經網路來進行候選區域的選取。 

5. 看完這周的內容,做一個小小的總結:

利用深度學習進行目標檢測和定位,最開始的方法是借用滑動視窗的思想,將訓練好的網路根據滑動視窗一次又一次的判斷,找出判斷的物體所在的視窗。不僅慢,而且邊界框無法確定。

一個改進是利用卷積的方式,代替滑動視窗,將整個影象作為一個輸入單元,這樣做省略了大量的計算。

進一步改進,利用Yolo的思路,將影象劃分為n*n規則的區域(常用19*19),每個區域的標籤不僅包含待檢測的樣本,更應包含檢測樣本的外包矩形框。這樣不僅是對於影象進行卷積操作,更能夠得到較為精準的邊界區域。

再一步改進,在此基礎上,利用Anchorbox解決一個框中出現多個目標的情況。最後對於提取出來的結果,可能有一些邊界框包含的是同一個目標,因此採用非最大抑制的方式,通過交併比的判斷原則,捨棄多餘的邊界框。

第四周 人臉識別與神經風格遷移

第一個應用為人臉識別。

1. 一次學習問題(one shot learning):只能通過一個樣本來學習並進行識別。解決此問題的方式是設定一個差異函式d,輸入兩張圖片。輸出兩張圖片的差異值。

2. Siamese 網路:對於輸入的兩張待比較的圖片,輸入到同一引數的神經網路,分別輸出兩個向量,並利用向量範數來比較他們的差異。

其中有兩種思路進行訓練。

(1)第一種是利用三元組損失函式(Triple Loss),同時關注於三張圖片,(anchor,positive,negative)-(A,P,N)。每次訓練的輸入都為樣本,與樣本相近的正例子,與樣本不相近的反例子。目標是使成本函式最小化,有一個超引數\alpha,可理解為間隔。

(2)另一種思路是將人臉識別當做一個二分類問題來解決。注意上下兩個網路同樣應使用相同的引數。

第二個應用為神經風格遷移。

3. 要理解神經風格遷移,前提是要初步理解神經網路中到底在做什麼。理解淺層網路和深層網路在做什麼。直觀上看,淺層網路檢測一些簡單的特徵,深層網路檢測複雜的特徵。由淺層逐漸加深向深層過度,也可理解為由畫素級別不斷向上抽象。深層網路可以理解為淺層網路的組合,因此檢測由簡單特徵所組合得到的複雜特徵,也不難理解。有一篇利用可視分析進行卷積網路分析的開山論文。

在神經風格遷移中,有內容影象(C),風格影象(S)和生成影象(G),如何定義損失函式判斷生成影象好不好。生成影象G初始化隨機生成,進行的是畫素級別上的更新。代價函式由兩部分組成,前一部分衡量與內容影象的差異,後一部分衡量與風格影象的差異。兩個超引數可看做權重。內容代價函式的定義看做是每層啟用函式的輸出值的差異。而風格代價函式則定義為啟用函式的相關係數的差異。

                                               J(G) = \alpha J_{Content}(C,G) + \beta J_{Style}(S,G)

對這一門課程做一個小小總結。卷積神經網路的理論,實在是挺龐大的。現在的我只是剛剛踏入,連入門都還算不上。但是我覺得要理解卷積神經網路,首先要理解為什麼卷積神經網路在影象中應用廣泛,卷積網路的網路節點究竟承擔著什麼樣的任務。從神經網路的角度出發,卷積神經網路中的每層做的也是上一層輸入單元的線性組合後來進行非線性對映,而每一層做的也是在不斷的提取特徵,組合特徵。隨著網路深度的增加,由低維特徵組合到高維特徵。在影象上面來看,即是由畫素級別的特徵不斷的組合到範圍內部的更高階特徵。具體為什麼是這樣也不清楚,這真是個黑匣子,至少現在我也只能這麼理解。我覺得這也是神經網路的基本思想:由基本特徵的線性組合加之非線性對映,隨著網路的深入,通過不斷的線性組合和非線性對映,由原本的簡單特徵學習到高階的特徵。