OverFeat——全卷積首次用於檢測問題 (目標檢測)(深度學習)(ICLR 2014)

論文名稱:《 OverFeat:Integrated Recognition, Localization and Detection using Convolutional Networks 》

論文下載:https://arxiv.org/abs/1312.6229

論文代碼:https://cilvr.nyu.edu/doku.php?id=software:overfeat:start


一、概述:

1、文章亮點:

OverFeat就是一種特徵提取算子,就相當於SIFT,HOG等這些算子一樣。這篇文獻充分利用了卷積神經網絡的特徵提取功能,它把分類過程中,提取到的特徵,同時又用於定位檢測等各種任務,只需要改變網絡的最後幾層,就可以實現不同的任務,而不需要從頭開始訓練整個網絡的參數。文章利用卷積網絡爲分類、定位、檢測提供了一個統一的框架,展示了在ConvNet中高效地實現多尺度(multiscale)滑動窗口方法,介紹了一種新的深度學習方法,通過學習預測對象邊界來進行定位Bounding box最後被累積計算而非抑制,以提高檢測的置信度。論文指出不同的任務可以用相同的網絡來同時學習

歸納如下:

(1)用一個共享的CNN(ConvNet)來同時處理圖像分類,定位,檢測三個任務,可以提升三個任務的表現。

(2)用CNN有效地實現了一個多尺度的,滑動窗口的方法,來處理任務。

(3)提出了一種方法,通過累積預測來求bounding boxes(而不是傳統的非極大值抑制)。

2、文章思路:

雖然ImageNet的數據包含一個大致充滿圖像的中心目標,但是目標在不同圖像中的大小和位置有着顯著差異(位於圖像邊角位置的小目標依舊存在)。解決這個問題有以下幾個思路:

(1)使用多個固定大小的滑動窗口移動,對每個掃過的窗口圖像做CNN預測。該方法的缺點在於窗口沒有包含整個目標,甚至中心也沒有,只是包含了一部分(比如狗狗的頭)。這種方法雖然適合做分類,但是定位和檢測效果很差。

(2)訓練一個卷積網絡,不僅產生分類的分佈,還產生預測框bouding box(預測目標的大小和位置)。

(3)累積每個位置和尺寸對應類別的置信度。

AlexNet展示了CNN可在圖像分類和定位任務上取得了優秀的表現,但是並沒有公開描述他們的定位方法。此篇OverFeat論文是第一次清晰地解釋CNN如何用於定位和檢測。

3、任務分析:
論文探索了圖像處理的三大任務,按難度上升的順序排列如下:

這裏寫圖片描述
分類

(1)分類(classification):給定一張圖片,爲每張圖片打一個標籤,說出圖片是什麼類別,然而因爲一張圖片中往往有多個類別,因此我們允許你預測出來的概率最大的5個,只要這五個概率最大的包含了我們人工標定標籤(人工標定每張圖片只有一個標籤,只要你用5個你預測的最大概率的類別,把label類別囊括在內即可)。

這裏寫圖片描述
定位

(2)定位(localization):定位通常與分類一起。圖像中通常包含一個主要對象,除了需要給出5個類別判斷囊括這個對象對象的類別,還需要返回圖像中這個主要對象的bbox (bounding box),且bbox與GT的IoU必須達到50%。每個bbox必須標註爲正確的label,即bbox和label不能分離。

這裏寫圖片描述
檢測

(3)檢測(detection):與分類和定位不同,每張圖像都可以由任意數量的object (也可以沒有object),評價標準是mAP。一張圖像有很多個目標物體,需要全部找出來(分類並定位)。分類和定位共享數據集(使用同一個數據集),而檢測使用另外的數據集,裏面包含更多的小目標(這樣的訓練集有利於提升模型的性能)。

二、本文的核心操作(FCN + offset max-pooling):

1、FCN(Fully Convolutional Network)——大名鼎鼎的全卷積網絡:

        對於一個各層參數結構都設計好的CNN網絡模型來說,輸入的圖片大小是固定的,比如Alexnet設計完畢後,網絡輸入圖片大小就是227*227。作者希望讓一個已經設計完畢的網絡,也可以輸入任意大小的圖片,通過FCN實現。

         FCN 精髓(全卷積,即全都用卷積層,包括FC層也用卷積層來實現):

(1)用 卷積層 實現 全連接層 的效果,把FC層操作看成是對一整張圖片的卷積層運算。

(2)把 全連接層 看做是 1*1卷積層,即採用1*1大小的卷積核,進行卷積層運算。

          具體如何讓一個已經設計好的CNN模型,可以輸入任意大小的圖片:

        上面圖中綠色部分表示:卷積核大小。假設我們設計了一個CNN模型,輸入圖片大小是14*14,通過第一層卷積後我們得到10*10大小的圖片,然後接着通過池化得到了5*5大小的圖片。

         接着要從:5*5大小的圖片 變成 1*1大小的圖片(這就是FC層做的事情):

(1)傳統的CNN:如果從以前的角度進行理解的話,那麼這個過程就是全連接層,我們會把這個5*5大小的圖片,直接reshape展平成爲一個一維的向量,進行計算(寫cnn代碼的時候,這個時候經常會在這裏加一個flatten函數,就是爲了展平成一維向量)。

(2)創新的FCN:FCN並不是把5*5的圖片展平成一維向量,再進行計算,而是直接採用5*5的卷積核,對一整張圖片進行卷積運算,卷積得到這個1*1的圖片(當然有很多層,這其實是個列向量)。

        其實這兩個的表面效果是相同的,只是角度不同,FCN把這個過程當成了對一整張特徵圖進行卷積,同樣,後面的全連接層也是把它當做是以1*1大小的卷積核進行卷積運算。但是,卷積層引入的非線性比直接展平特徵圖保留了更多的有效信息!

      用上面的網絡,輸入一張任意大小的圖片,比如16*16大小的圖片,具體請看下面的示意圖:

        網絡最後的輸出是一張2*2大小的圖片。這個時候,我們就可以發現採用FCN網絡,可以輸入任意大小的圖片。同時需要注意的是網絡最後輸出的圖片大小不在是一個1*1大小的圖片,而是一個與輸入圖片大小息息相關的一張圖片了。

         總結一下:對14*14的圖像進行卷積操作,在得到5*5的feature map後的這一步,如果使用直接使用全連接層,就會把它直接壓平再全連接(直接reshape),這樣就破壞了原feature map的圖像位置關係,直接轉爲一列特徵。但是如果使用的是卷積,最後也會得到1*1*C的feature map,C是channel數,也是類別的大小,但是卷積運算使得得到的列向量中包含了原feature map的圖像位置關係。如果輸入是一張16*16的圖像,經過層層卷積後就會得到2*2*C的feature map,這個時候可以對這個2*2的4個值做一個取最大或平均,就會變成一個值了,即最後得到的也是列向量。以此類推,來了更大的圖像,最後得到的feature map就是3*3*C,4*4*C,5*5*C的大小,輸出的大小和輸入的大小相關,但總是可以對這個輸出進行max池化(取最大)來得到符合FC層輸出形式的各類別的置信值。可以用此方法對16*16的圖像產生了“2*2”個輸出,以此類推我們可以在測試時使用更大的圖像(使用多scale),產生“更多”的輸出進行(取最大)預測(後面跟上max池化)。這個做法相對於傳統的滑動窗口(用14*14大小,步長爲2的滑動窗口在16*16的圖像上執行滑動4次,每次進行一次全連接操作並且進行分類)的優點是,保證了效率(一次全卷積)同時可以用各種不同尺度圖像作爲輸入(通過卷積把三維張量變成列向量,比直接FC的reshape更靈活),消除了很多冗餘計算,提高了模型的魯棒性又保證了效率。

2、offset max-pooling———寧可錯殺三千不可放過一個的全面的池化策略:

offset ,採用一維作爲示例,來講解原理:

如上圖所示,我們在x軸上有20個神經元,如果我們選擇池化size=3的非重疊池化,那麼根據我們之前所學的方法應該是:對上面的20個,從1位置開始進行分組,每3個連續的神經元爲一組,然後計算每組的最大值(最大池化),19、20號神經元將被丟棄,如下圖所示:

我們也可以在20號神經元后面,人爲的添加一個數值爲0的神經元編號21,與19、20成爲一組,這樣可以分成7組:[1,2,3],[4,5,6]……,[16,17,18],[19,20,21],最後計算每組的最大值就是經典的max-pooling。可是如果我們只分6組的話,我們除了以1作爲初始位置進行連續組合之外,也可以從位置2或者3開始進行組合。也就是說我們其實有3種池化組合方法:

A、△=0分組:[1,2,3],[4,5,6]……,[16,17,18];

B、△=1分組:[2,3,4],[5,6,7]……,[17,18,19];

C、△=2分組:[3,4,5],[6,7,8]……,[18,19,20];

示意圖如下:

         以往的CNN中,一般我們只用了△=0,得到池化結果後,就送入了下一層。於是文獻的方法是,把上面的△=0、△=1、△=2的三種組合方式的池化結果,分別送入網絡的下一層。這樣的話,我們網絡在最後輸出的時候,就會出現3種預測結果了。

         如果是2維圖片的話,那麼(△x,△y)就會有9種取值情況(3*3);如果我們在做圖片分類的時候,在網絡的某一個池化層加入了這種offset 池化方法,然後把這9種池化結果,分別送入後面的網絡層,最後我們的圖片分類輸出結果就可以得到9個預測結果(每個類別都可以得到9種概率值,然後我們對每個類別的9種概率,取其最大值,做爲此類別的預測概率值)。優中選優,避免因爲池化而漏掉某些信息,尤其是邊緣的信息。

三、網絡結構:

1、Alexnet的訓練、測試:

AlexNet

(1)訓練階段:每張訓練圖片256*256,然後我們隨機裁剪出224*224大小的圖片,作爲CNN的輸入進行訓練。

(2)測試階段:輸入256*256大小的圖片,我們從圖片的5個指定的方位(上下左右+中間)進行裁剪出5張224*224大小的圖片,然後水平鏡像一下再裁剪5張,這樣總共有10張;然後我們把這10張裁剪圖片分別送入已經訓練好的CNN中,分別預測結果,最後用這10個結果的平均作爲最後的輸出。

Alexnet在測試階段的時候,採用了對輸入圖片的四個角落和中心位置進行裁剪,得到10個大小爲網路喲輸入大小的圖片,分別進行預測,分別得到結果,選出最好結果(平均或最大池化),這最後的結果就是類似對應於上面2*2的預測圖選一個最優值。這個2*2的每個像素點,就類似於對應於一個角落裁剪下來的圖片預測分類結果。只不過Alexnet把這4個像素點,相加在一起,求取平均值,作爲該類別的概率值。

overfeat這篇文獻的圖片分類算法,在訓練階段採用與Alexnet相同的訓練方式,然而在測試階段可是差別很大,overfeat就是把採用FCN的思想把全連接層看成了卷積層,讓我們在網絡測試階段可以輸入任意大小的圖片。這就是文獻最大的創新點(overfeat的方法不是裁剪出10張224*224的圖片進行結果預測平均,具體方法請看下面繼續詳細講解)。

背景:AlexNet是2012年ILSVRC比賽的冠軍,它的出現直接打破了沉寂多年的圖片識別領域(在1998年出現LeNet-5網絡一直佔據圖片識別的領頭地位),給該領域帶來了新的契機,並一步步發展至今,甚至打敗了人類的識別精確度,可惜的是2017年的ILSVRC舉辦方宣佈從2018年起將取消該比賽,因爲目前的神經網絡精確度已經達到很高的程度。但深度學習的步伐不會停止,人們將在其他方面進行深入的研究。AlexNet是神經網絡之父Hinton的學生Alex Krizhevsky開發完成,它總共有8層,其中有5個卷積層,3個全鏈層,附上最經典的AlexNet網絡架構圖,如下。Alex在他的論文中寫到,他在處理圖片的時候使用了兩個GPU進行計算,因此,從圖中看出,在卷積過程中他做了分組的處理。

2、OverFeat 網絡結構:

(1)把網絡的第一層到第五層看做是特徵提取層,然後不同的任務共享這個特徵提取層。基本用了同一個網絡架構模型(特徵提取層相同,分類迴歸層根據不同任務稍作修改、訓練)、同時共享基礎特徵。論文的網絡分爲兩個版本,一個快速版,一個精確版。下圖是精確版的網絡結構圖:

1)訓練集:ImageNet (120W, C=1000);(訓練的圖像不是原始圖像,而是 fixed crop。把圖像縮放爲最小邊長爲256 pixels,然後隨機截取5個大小分別爲221x221的crop,水平翻轉後變爲10個。然後進行訓練)

2)網絡輸入:從上面的表格,我們知道網絡輸入圖片大小爲221*221;

3)網絡結構:基本上和AlexNet一樣,也使用了ReLU激活,最大池化。不同之處在於:

① 作者沒有使用局部響應歸一化層(LRN);

② 沒有采用重疊池化;

③ 在第一層卷積層,stride設置,文章選擇了2,這個與AlexNet不同 ( AlexNet選擇的stride是4,在網絡中,如果stride選擇比較大得話,雖然可以減少網絡層數,提高速度,但是卻會降低精度 )。

        需要注意的是,把f7這一層全連接層,設置成卷積核大小爲5*5的卷積層,即把整個網絡看成FCN模型,沒有了全連接層的概念,全部採用卷積層實現功能(尤其是FC層)。我們在測試階段要輸入各種大小的圖片,FCN思想的採用會在這一步極大地幫助到網絡。OverFeat網絡和alexNet最大的不同之處在於它在測試測試階段使用了不同的方法來預測。OverFeat網絡的測試階段,用到了多尺度、滑動窗口的方法(實驗最多輸入了6個不同尺度的圖像)。這也是論文最大的創新點。

(2)本文在測試時,採用的是 圖像金字塔(圖片上下采樣放縮)+  sliding window 的方法。
即對圖像做不同尺度的縮放,對不同尺度的image進行卷積,得到不同尺寸的feature map,然後用固定大小(i.e.5x5)的sliding window以等距步長在feature map上滑動,對每個sliding window進行分類。 

        最終分類是通過這樣的步驟
1)在每個尺度下,取每個類的最大值,這樣構成C維向量,C個值對應了C個類別在這個尺度下的圖片中的目標置信值;
2)對不同尺度的C維向量取均值,得到了同一圖片在不同尺度下的對每個類別的置信值;
3)取平均化後的C維向量的Top1或Top5作爲預測的類,對每張圖片取置信值第一或者前五高的類別作爲輸出的預測類別;

3、網絡訓練:

(1)訓練輸入:對於每張原圖片爲256*256,然後進行隨機裁剪爲221*221的大小作爲CNN輸入,進行訓練。

(2)參數設置:

1)min-batchs選擇128

2)權重初始化選擇高斯分佈的隨機初始化:

3)採用隨機梯度下降法:動量項參數大小選擇0.6,L2權重衰減係數大小選擇10-5次方。

4)學習率一開始選擇0.05,然後根據迭代次數的增加,每隔幾十次的迭代後,就把學習率的大小減小一半。

5)DropOut,這個只有在最後的兩個全連接層,才採用dropout,dropout比率選擇0.5,也就是網絡的第6、7層。

四、創新亮點:(存在於網絡測試階段)

訓練階段同AlexNet。

網絡結構在訓練完後,參數的個數、結構是固定的,測試階段並沒有改變網絡的結構,也無法改變網絡參數。

1、Alexnet(分類算法)測試時的方法是:輸入一張圖片256*256,然後進行multi-view裁剪,也就是從圖片的四個角進行裁剪,還有就是一圖片的中心進行裁剪,這樣可以裁剪到5張224*224的圖片。然後把原圖片水平翻轉一下,再用同樣的方式進行裁剪,又可以裁剪到5張圖片。把這10張圖片作爲輸入,分別進行預測分類,在後在softmax的最後一層,求取個各類的總概率,求取平均值。

2、Alexnet (分類算法)這種預測方法存在兩個問題:首先這樣的裁剪方式,把圖片的很多區域都給忽略了,說不定這樣裁剪剛好把圖片物體的一部分給裁剪掉了;另外一方面,裁剪窗口重疊存在很多因圖片重疊而產生的冗餘的計算,像上面我們要分別把10張圖片送入網絡,可見測試階段的計算量還是蠻大的。

3、Overfeat算法(用於分類):訓練完上面所說的網絡之後,在測試階段,文章不再是用一張221*221大小的圖片了作爲網絡的輸入,而是用了6張大小都不相同的圖片,也就是所謂的多尺度輸入預測,如下表格所示:

測試階段網絡輸入圖片大小分別是245*245,281*317……461*569。

然後當網絡前向傳導到layer 5的時候,就使出了FCN和offset pooling一記組合拳。以輸入一張圖片爲例(6張圖片的計算方法都相同),講解layer 5後面的過程:

(1)layer-5 pre-pool【輸入是17*17,輸出是(5*5)*(3*3)】:

      通過大小爲(3,3)的池化進行池化,然後△x=0、1、2,△y=0、1、2,這樣我們可以得到對於每一張特徵圖,我們都可以得到9幅池化結果圖。以上面表格中的sacle1爲例,layer-5 pre-pool大小是17*17,經過池化後,大小就是5*5,然後有3*3張結果圖(不同offset得到的結果)。

(2)layer-5 post-pool【輸入是(5*5)*(3*3),輸出是(1*1)*(3*3)*C】:

      在訓練的時候,全連接層輸入的大小是4096*(5*5),然後經過FC層,得到4096*(1*1)。但是現在輸入的是各種不同大小的圖片,因此從第5層後採用FCN的招式(用卷積層代替FC層),讓網絡繼續前向傳導。我們從layer-5 post-pool到第六層的時候,如果把全連接看成是卷積,那麼其實這個時候卷積核的大小爲5*5,因爲訓練的時候,layer-5 post-pool得到的結果是5*5。因此在預測分類的時候,假設layer-5 post-pool 得到的是7*9(上面表格中的scale 3),經過5*5的卷積核進行卷積後,那麼它將得到(7-5+1)*(9-5+1)=3*5的輸出。然後我們就只需要在後面把它們拉成一維向量擺放就ok了,這樣在一個尺度上,我們可以得到一個C*N個預測值向量,每一列就表示圖片屬於某一類別的概率值,共C列,然後我們求取每一列(類別)的N個待選概率中的最大值作爲本尺度的這個類別的概率值。

       從上面過程,我們可以看到整個網絡分成兩部分:layer 1~5這五層我們把它稱之爲特徵提取層;layer 6~output我們把它們稱之爲分類層。具體流程示意圖如下:

以一維爲例,offset池化就是移動一定的位置再池化,(b)中Δ=0,1,2 就可以表示可以做三種池化,得到三個結果,因爲圖像是二維的,所以最後會得到3*3也就是9種池化結果,最後對於每個類別就有9個結果,可以對這些結果集成預測(下圖的例子中只考慮一維的所以圖中最後會得到三個結果,紅藍綠三種顏色表示三種池化後得到的結果)圖中(c)表示進行3*3池化後得到6*6的圖(6個格子)。(d)表示經過5*5的全卷積得到2*2的圖(2個格子)。e表示把位置信息(長度爲2)和offset方式(3種)交錯後得到的最後的輸出圖。

在實際的二維圖像處理中,上述這個操作會對重複6*2也就是12次,其中6代表6個scale,如下圖所示的6個不同的scale,而2表示水平翻轉後會得到兩個圖。在這12次裏面的每一次,對位置信息取最大,以Scale2爲例,最後大小爲6x9xC,就在這6x9個值中取最大。那麼就會得到12個長度爲C的向量,12個向量加起來取平均,得到一個長度爲C的向量,然後求Top1或Top5,得到最後的結果。

4、Overfeat算法(用於定位):

      用於定位任務的時候,就把分類層(上面的layer 6~output)給重新設計,把分類改成迴歸問題,然後在各種不同尺度上訓練預測物體的bounding box。把用分類學習的特徵提取層的參數固定下來,然後繼續訓練後面的迴歸層的參數,網絡包含了4個輸出,對應於bounding box的上左上角點和右下角點,然後損失函數採用歐式距離L2損失函數。

       至於檢測,就是分類+定位。重新設計網絡的最後部分,訓練分類的同時也進行迴歸,類似YOLOv1。

       總之,這篇上古時期的文章理解起來確實不容易,費了好大勁,腦累!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章