1. 程式人生 > >深度學習(二十)基於Overfeat的圖片分類、定位、檢測

深度學習(二十)基於Overfeat的圖片分類、定位、檢測

作者:hjimce

一、相關理論

本篇博文主要講解來自2014年ICLR的經典圖片分類、定位物體檢測overfeat演算法:《OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks》,至今為止這篇paper,已然被引用了幾百次,把圖片分類、定位、檢測一起搞,可見演算法牛逼之處非同一般啊。開始前,先解釋一下文獻的OverFeat是什麼意思,只有知道了這個單詞,我們才能知道這篇文獻想要幹嘛,OverFeat說的簡單一點就是特徵提取運算元,就相當於SIFT,HOG等這些運算元一樣。Along with this paper, we release a feature extractor  named “OverFeat”,這是文獻對overfeat定義的原話。

這篇文獻最牛逼的地方,在於充分利用了卷積神經網路的特徵提取功能,它把分類過程中,提取到的特徵,同時又用於定位檢測等各種任務,牛逼哄哄啊。只需要改變網路的最後幾層,就可以實現不同的任務,而不需要從頭開始訓練整個網路的引數。

其主要是把網路的第一層到第五層看做是特徵提取層,然後不同的任務共享這個特徵提取層。基本用了同一個網路架構模型(特徵提取層相同,分類迴歸層根據不同任務稍作修改、訓練)、同時共享基礎特徵。

二、計算機視覺的三大任務

開始講解paper演算法前,先讓我們來好好學習一下計算機視覺領域中:分類、定位、檢測這三者的區別。因為文獻要一口氣幹掉這三個任務,所以先讓我們需要好好區分一下這三個任務的區別:

A、圖片分類:給定一張圖片,為每張圖片打一個標籤,說出圖片是什麼物體,然而因為一張圖片中往往有多個物體,因此我們允許你取出概率最大的5個,只要前五個概率最大的包含了我們人工標定標籤(人工標定每張圖片只有一個標籤,只要你用5個最大概率,猜中其中就可以了),就說你是對的。

B、定位任務:你除了需要預測出圖片的類別,你還要定位出這個物體的位置,同時規定你定位的這個物體框與正確位置差不能超過規定的閾值。

C、檢測任務:給定一張圖片,你把圖片中的所有物體全部給我找出來(包括位置、類別)。

OK,解釋完三個任務,我們接著就要正式開始學習演算法了,我們先從最簡單的任務開始講起,然後講定位,最後講物體檢測,分三大部分進行講解。

三、Alexnet圖片分類回顧

因為paper的網路架構方面與Alexnet基本相同,所以先讓我們來好好回顧一下Alexnet的訓練、測試:

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

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

overfeat這篇文獻的圖片分類演算法,在訓練階段採用與Alexnet相同的訓練方式,然而在測試階段可是差別很大,這就是文獻最大的創新點(overfeat的方法不是裁剪出10張224*224的圖片進行結果預測平均,具體方法請看下面繼續詳細講解)。

四、基礎學習

開始講解overfeat這篇文獻的演算法前,讓我們先來學兩招很重要的基礎招式:FCN、offset max-pooling,等我們學完這兩招,再來學overfeat這篇paper演算法。

1、FCN招式學習

FCN又稱全卷積神經網路,這招是現如今是圖片語義分割領域的新寵(來自文獻:《Fully Convolutional Networks for Semantic Segmentation》),同時也看懂overfeat這篇文獻所需要學會的招式。

我們知道對於一個各層引數結構都設計好的網路模型來說,輸入的圖片大小是固定的,比如Alexnet設計完畢後,網路輸入圖片大小就是227*227。這個時候我們如果輸入一張500*500的圖片,會是什麼樣的結果?我們現在的希望是讓我們的網路可以一直前向傳導,讓一個已經設計完畢的網路,也可以輸入任意大小的圖片,這就是FCN的精髓。FCN演算法靈魂:

1、把卷積層-》全連線層,看成是對一整張圖片的卷積層運算。

2、把全連線層-》全連線層,看成是採用1*1大小的卷積核,進行卷積層運算。

下面用一個例子,講解怎麼讓一個已經設計好的CNN模型,可以輸入任意大小的圖片:

 

如上圖所示,上面圖中綠色部分表示:卷積核大小。假設我們設計了一個CNN模型,輸入圖片大小是14*14,通過第一層卷積後我們得到10*10大小的圖片,然後接著通過池化得到了5*5大小的圖片。OK,關鍵部分來了,接著要從:5*5大小的圖片-》1*1大小的圖片:

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

(2)FCN:FCN並不是把5*5的圖片展平成一維向量,再進行計算,而是直接採用5*5的卷積核,對一整張圖片進行卷積運算。

其實這兩個本質上是相同的,只是角度不同,FCN把這個過程當成了對一整張特徵圖進行卷積,同樣,後面的全連線層也是把它當做是以1*1大小的卷積核進行卷積運算。

從上面的例子中,我們看到網路的輸入是一張14*14大小的圖片,這個時候加入我就用上面的網路,輸入一張任意大小的圖片,比如16*16大小的圖片,那麼會是什麼樣的結果?具體請看下面的示意圖:

 

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

OK,這個時候我們回來思考一個問題,比如Alexnet網路設計完畢後,我們也用FCN的思想,把全連線層看成是卷積層運算,這個時候你就會發現如果Alexnet輸入一張500*500圖片的話,那麼它將得到1000張10*10大小的預測分類圖,這個時候我們可以簡單採用對著每一張10*10大小的圖片求取平均值,作為圖片屬於各個類別的概率值。

其實Alexnet在測試階段的時候,採用了對輸入圖片的四個角落進行裁剪,進行預測,分別得到結果,最後的結果就是類似對應於上面2*2的預測圖。這個2*2的每個畫素點,就類似於對應於一個角落裁剪下來的圖片預測分類結果。只不過Alexnet把這4個畫素點,相加在一起,求取平均值,作為該類別的概率值。

需要注意的是,一會兒overfeat就是把採用FCN的思想把全連線層看成了卷積層,讓我們在網路測試階段可以輸入任意大小的圖片。

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],最後計算每組的最大值,這就是我們以前所學CNN中池化層的原始碼實現方法了。

上面我們說到,如果我們只分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種概率,取其最大值,做為此類別的預測概率值)。

OK,學完了上面兩種招式之後,文獻的演算法,就是把這兩種招式結合起來,形成了文獻最後測試階段的演算法,接著我們就來講講怎麼結合。

五、overfeat圖片分類

我們先從文獻是怎麼搞圖片分類的開始說起,訓練階段基本變化不大,最大的區別在於網路的測試階段。

1、paper網路架構與訓練階段

(1)網路架構

對於網路的結構,文獻給出了兩個版本,快速版、精確版,一個精度比較高但速度慢;另外一個精度雖然低但是速度快。下面是高精度版本的網路結構表相關引數:

 

表格引數說明:

網路輸入:從上面的表格,我們知道網路輸入圖片大小為221*221;

網路結構方面基本上和AlexNet是一樣的,也是使用了ReLU啟用,最大池化。不同之處在於:(a)作者沒有使用區域性響應歸一化層;(b)然後也沒有采用重疊池化的方法;(c)在第一層卷積層,stride作者是選擇了2,這個與AlexNet不同(AlexNet選擇的跨步是4,在網路中,如果stride選擇比較大得話,雖然可以減少網路層數,提高速度,但是卻會降低精度)。

這邊需要注意的是我們需要把f7這一層,看成是卷積核大小為5*5的卷積層,總之就是需要把網路看成我們前面所學的FCN模型,沒有了全連線層的概念,因為在測試階段我們可不是僅僅輸入221*221這樣大小的圖片,我們在測試階段要輸入各種大小的圖片,具體請看後面測試階段的講解。

(2)網路訓練

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

優化求解引數設定:訓練的min-batchs選擇128,權重初始化選擇高斯分佈的隨機初始化:

 

然後採用隨機梯度下降法,進行優化更新,動量項引數大小選擇0.6,L2權重衰減係數大小選擇10-5次方。學習率一開始選擇0.05,然後根據迭代次數的增加,每隔幾十次的迭代後,就把學習率的大小減小一半。

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

2、網路測試階段

這一步需要宣告一下,網路結構在訓練完後,引數的個數、結構是固定的,而這一步的演算法並沒有改變網路的結構,也更不肯可能去改變網路引數。

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

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

Overfeat演算法:訓練完上面所說的網路之後,在測試階段,我們不再是用一張221*221大小的圖片了作為網路的輸入,而是用了6張大小都不相同的圖片,也就是所謂的多尺度輸入預測,如下表格所示:

 

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

然後當網路前向傳導到layer 5的時候,就使出了前面我們所講的FCN、offset pooling這兩招相結合的招式。在這裡我們以輸入一張圖片為例(6張圖片的計算方法都相同),講解layer 5後面的整體過程,具體流程示意圖如下:

 

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

從layer-5 post-pool到classifier map(pre-reshape):我們知道在訓練的時候,從卷積層到全連線層,輸入的大小是4096*(5*5),然後進行全連線,得到4096*(1*1)。但是我們現在輸入的是各種不同大小的圖片,因此接著就採用FCN的招式,讓網路繼續前向傳導。我們從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個預測值矩陣,每一列就表示圖片屬於某一類別的概率值,然後我們求取每一列的最大值,作為本尺度的每個類別的概率值。

最後我們一共用了6種不同尺度(文獻好像用了12張,另外6張是水平翻轉的圖片),做了預測,然後把這六種尺度結果再做一個平均,作為最最後的結果。

OK,至此overfeat圖片分類的任務就結束了,從上面過程,我們可以看到整個網路分成兩部分:layer 1~5這五層我們把它稱之為特徵提取層;layer 6~output我們把它們稱之為分類層。

六、定位任務

後面我們用於定位任務的時候,就把分類層(上面的layer 6~output)給重新設計一下,把分類改成迴歸問題,然後在各種不同尺度上訓練預測物體的bounding box。

我們把用圖片分類學習的特徵提取層的引數固定下來,然後繼續訓練後面的迴歸層的引數,網路包含了4個輸出,對應於bounding box的上左上角點和右下角點,然後損失函式採用歐式距離L2損失函式。

說到這邊,感覺好累,因為後面基本上沒有比較好玩的演算法,所以就講到這邊,不然這篇文章就又要寫十幾頁了。

個人總結:個人感覺學習這篇文獻最重要的在於學習FCN、offset pooling,然後把它們結合起來,提高分類任務的精度,同時也讓我們看到了CNN特徵提取、遷移學習的強大威力。

參考文獻:

1、《Fully Convolutional Networks for Semantic Segmentation》

2、《OverFeat: Integrated Recognition, Localization and Detection  using Convolutional Networks》

**********************作者:hjimce   時間:2015.12.5  聯絡QQ:1393852684   原創文章,轉載請保留作者、原文地址資訊********************