對 OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks 一文的理解


一點最重要的學習方法:  當你讀一篇論文讀不懂時,如果又讀了兩遍還是懵懵懂懂時怎么辦???方法就是別自己死磕了,去百度一下,如果是很好的論文,大多數肯定已經有人讀過並作為筆記了的,比如我現在就把我讀過以后的收獲記下來(我也看了好幾篇前人的博文的)。。。百度沒有去試試google吧。。。如何快速讀懂讀明白一篇文章也是一種能力,選擇的方法往往大於努力的。

對於這篇論文,網上有很多寫的好的總結,大家可以去看,以下我寫的內容零零散散,建議大家不要浪費時間看了哦。

 

文章基於 ILSVRC2013 的數據集進行圖像目標的分類、定位與 detection. 對於分類的話,用官方的top-5 error(意思就是你的網絡的前5個最可能的分類目標中只要有一個對了就可以,為什么呢?因為吧,圖像中可能不僅僅包含要分類的目標還分包括一些不小的目標啦)來衡量網絡的性能。對於定位的話,不但要把圖像目標用矩形框圈出來,並且要分出正確有目標類別;對於detection, 圖像目標中有什么,都找出來什么就可以啦。

 

對於用卷積神經網絡進行圖像目標的分類問題,我們要明白一些相關東西。

1. 一個訓練好的卷積神經網絡,它的相關的參數是固定的對吧, 參數都存在這些地方:第一,卷積核,所以呢,卷積層中的 feature map的個數是固定的,但是它的大小不是固定的哦。 第二就是網絡中的全連接層,全連接層的神經元個數不能改變了。。。         總之,在卷積層中,網絡的輸入大小可以改變,輸入大小的不同的結果僅僅是 feature map 大小的不同。 而在全連接層中,我們網絡的輸入的大小不能改變,必須固定。   在卷積神經網絡中,網絡的前面基本都是卷積層,而網絡的后面幾層基本都會跟着全連接層的,所以,這就決定的網絡在訓練過程中網絡的輸入的大小應該統一固定,在測試中,網絡的輸入應該與訓練時網絡的輸入大小保持一致。 

以上說的為常用的卷積神經網絡。     不過有一種 fully-convnet 可以不受這個限制,它的做法就是把網絡的后面的全連接層看層為卷積層來對待。這樣,我們在測試時,就可以 multi-scale 的輸入了。

 

2.即然在圖像中目標的位置不確定,所以有人提出 slide-window的方法。  但是這個方法基本都是在網絡測試時使用,不在網絡的訓練過程中使用。為什么呢?原因很簡單,因為在監督學習中,如果使用 silide-window 進行網絡的訓練的話, 每個 窗口都要對應一個 label吧, 但是 窗口沒有 align 目標的話,你想給什么樣的label??對吧,我覺得沒法給吧。。。這就是原因。

 

文章對任務建立了兩個分類的模型,分別為快速版與精確版。快速版與精確版的網絡結構的主要差別在於:步長的不同,網絡層次數的不同,網絡的feature map數目的不同。對於下面的網絡,前面的卷積層稱作為特征提取層,它負責學習輸入圖像的特征,后面的全連接層稱為網絡的分類層,負責分類。如果對於定位來說,我們就把后面的分類層改成一個回歸網絡來訓練參數就可以了。

文章對於分類、定位與檢測任務怎么處理的呢。文章用一個網絡來解決這三個問題, 用一個網絡的含義是網絡的特征層不變(前面的卷積層),后面的網絡類型根據不同的任務改改就可以。。。就這個意思應該是。

 

快速版的網絡結構:

image

精確版的網絡結構:

image

兩個網絡的參數個數與連接的數目的對比,如下圖所示:我們會發現快速版的網絡結構的參數多於精確版本的,但是呢,精確版本的連接數目遠遠多於快速版本哦,為什么呢?因為吧,參數最多的地方為卷積層與全連接層的相交之處, 而卷積層的參數相對較少的。

image

 

 

分類任務

要說明一點:基於 LILSVRC data的圖像相關任務中,由於圖像中的目標在圖像中的位置不確定可能中間啦,可能上下左右啦;還有有時候目標的大小相對於圖像來說不是很大,只占一小部分;還圖像中的背景中的目標有對網絡的性能有影響,所以都是把圖像的 fixed-crop 輸入給網絡進行訓練或測試。(對比手寫字體 MNIST 的識別任務,那里的data 的像素很小吧,並且圖像中只有一個目標,背景還都是白色)

 

對於圖像的分類的網絡的訓練方法:

訓練數據的獲取:基本一樣吧,給一個圖片,取圖像的 fixed-crop (如上面的兩個模型分別為231*231和221*221)進行訓練。對於具體的 crop的方法那就自己看着來好了,文中采用的方法是首先把圖像進行縮放到最小邊長(可能原始圖像不是正方形吧)為256像素,然后random 截取 5個大小為221*221的 c rops,然后水平一翻轉就增加了10了吧。

網絡訓練相關的配置:說說文中的吧, mini-batch 為128;權值初始化為:mean為0,variation為0.01的正態分布;權值更新的momentum term 為0.6;L2的權值衰減為1*10-5;學習速率初始化為0.05,然后在30,50,60,70,80的epoch時減為原來的0.5;對於最后的全連接層進行 0.5 rate 的dropout;網絡的激活函數為:RELU;

好啦,基本這樣子,訓練就可以了。。

 

網絡的測試(文章中叫作:classificaiton):

這是應該說是文章的重要重要的重要的重要的地方,有價值的地方,OverFeat.

前面已經說過了,在測試的時候,我們通常采用slide-window的方法的圖像上所有可能的位置選取 crops進行分類的。 對於一般的網絡的話,看上去運算量很大,但是呢,對於卷積神經網絡來說,它的效率還是很高的,因為對於需要重疊計算的地方它可以共享 computation.下面具體來說說哈:

 

1,首說一下什么是 fully-convolutional network,上面其實說過了,把后面的全連接層當作卷積層來對待,我用比較喜歡用圖說明一下:

對於正常的卷積神經網絡是下面這個圖:

image

 

對於fully-convnet,后面網絡的變化為:

image

 

此時,我們的輸入的大小可以與訓練時的大小不相同(如果比訓練時尺寸小的話,zero-padding 就可以啦),如下面:

image

 

2,卷積神經網絡滑動窗口的實現:對於測試時采用的slide-window的原始圖像上進行滑動,對於卷積神經網絡來說,會怎么樣呢?看下面的圖的舉例:

當我們的輸入的窗口大小為14*14時如下圖所示:(后面的classifier就是我們的全連接層看作卷積層的樣子)

image

 

現在假設我們的輸入的圖像為16*16,這時為這樣子的:

image

 

解釋一下:

1. 我們輸入的為16*16的大小,最后輸出的為2*2的大小。對於對於原始圖像的左上角的14*14的大小看作窗口輸入時,這個窗口的最后輸出為2*2output的左上角那里。當我們對原始圖像的右上角的14*14的大小看作窗口輸入時,這個窗口的最后輸出為2*2output的右上角那里(圖上沒有表示出來)…………。看到了吧,這個卷積網絡一下子就可以把所有可能的窗口的輸出都計算出來了。。很efficient, 原因就是在重疊的窗口上的數據不用重復計算。

2. 上面的例子也是為了讓我們好明白簡化了一下過程(或着說理想的過程),在實際中,可能由於zero-padding的原因,僅僅分影響部分計算過程中的邊緣的數據而已(單獨測試窗口的輸入時會補0,而用fully-convnet 同時運算時,會補相鄰的像素值)

3. 分辯率的問題:上面的分辨率為 2,因為pooling的步長為2哦。。當在原始圖像中的窗口平移2個像素值時,就會對應一個 output.   在文章的精確版本中分辨率為2*3*2*3=36.

 

增加分辯率:

精確版的最后一層(第六層)的pooling 層為3*3的步長。現在想辦法來remove 掉該pooling層的loss of resolution.方法是在pooling的時候給它加一個 offset。 具體用一維的例子說明:下面是文章中的配圖:

 

image

 

假設圖中(a)為第6層卷積以后且沒有pooling的feature map,然后呢,圖(b)為對圖(a)進行pooling , 加的offset分別為0,1,2. 圖(C)的話表示后面的相關卷積了,就不用管了,重點是圖(b)的操作。通過這樣的操作,就可以把pooling的操作損失的分辯率找回來。分辯率由原來的2*3*2*3變為了2*3*2。

下面我用在二維的平面的圖示來說明一下:

image

 

解釋一下:圖中的原始圖像為紅色的一個矩形圖。然后呢,圖上的crop1,crop2,crop3,它們的水平與垂直的滑動都為12個像素的。其實它們就對應了在上面的精確版的最后一層(第六層)的pooling 層的offset分別為0,1,2(水平垂直同時位移)的pooling后得到的feature map.  而 crop4, crop 5, crop6 對應了對於offset為2 得到的feature map 進行 后面步長為5*5的卷積得到的 feature map里對應值,在原始圖像中位移為36個像素;而crop4, crop 5, crop6 大小 為221*221.     如果我們把crop1 ,crop2, crop3 看作一級子圖,而 crop4, crop5, crop6 看作二級子圖的話,那么在原始圖像中,經過上面的offset 機制我們可以得到3*3的9張的 一級子圖,像素位移為12個像素, 而在每一個一級子圖里面進行位移為36個像素的窗口滑動。這樣它們交叉起來,窗口滑動的像素即為12個像素哦。這樣的話,使分辨率變為了12個像素哦(我自己已經推過了), 增加了分辨率了吧(以前為36個像素)。

 

現在舉個例子怎么進行分類的哈,采用精確版的模型。

當我們輸入大小為257*293時,最第6層卷積完成以后不進行max-pooling得到的feature map的大小為18*21. 然后呢,我們采用不進行上面offset形式的的pooling,直接進行步長為3*3的pooling,我們得到大小為 6*7的 feature map,然后再進行7-9層的卷積操作,最后得到1000個2*3的一個輸出。 這個輸出表示了什么意思呢??它就代表了在原始圖像上大小為221*221窗口進行36個像素的滑動步長得到一系列crops(共2*3=6個)的對應每一類別的概率哦;然后,我們取6個當中概率最大的一個就可以啦。

當我們輸入大小為281*317時,最第6層卷積完成以后不進行max-pooling得到的feature map的大小為20*23. 然后呢,我們采用上面offset分別為0, 1, 2的形式的的3*3的pooling, ,我們得到大小為 9個大小為6*7的 feature map,然后再進行7-9層的卷積操作,最后得到9 * 1000個2*3的一個輸出。 這個輸出表示了什么意思呢??它就代表了在原始圖像上大小為221*221窗口進行12個像素的滑動步長得到一系列crops(共2*3*9=54個)的對應每一類別的概率哦;然后,我們選取這些當中概率最大的一個就可以啦。

 

multiple scale操作:

上面的操作我們只是對single-scale進行的哈,我們可以選擇不同的scale進行操作,然后求平均的。下圖列出了文章中的6種不同scale(即圖像的大小不一樣啦)。表中的layer 5應該針對的快速版的模型。

image

 

 

localization

不想寫了呢,怎么。

 

Detection

不想寫了呢,怎么。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM