2014 ICLR
紐約大學 LeCun團隊
Pierre Sermanet, David Eigen, Xiang Zhang, Michael Mathieu, Rob Fergus, Yann LeCun算法
簡單介紹(What)
Ovefeat是2013年ImageNet定位任務的冠軍,同時在分類和檢測任務也取得了不錯的結果。網絡
- 它用一個共享的CNN來同時處理圖像分類,定位,檢測三個任務,能夠提高三個任務的表現。
- 它用CNN有效地實現了一個多尺度的,滑動窗口的方法,來處理任務。
- 提出了一種方法,經過累積預測來求bounding boxes(而不是傳統的非極大值抑制)。
論文動機(Why)
雖然ImageNet的數據包含一個大體充滿圖像的中心目標,可是目標在圖像中的大小和位置有着顯著差別。解決這個問題有幾個作法。ide
- 使用多個固定大小的滑動窗口移動,對每一個掃過的窗口圖像作CNN預測。該方法的缺點在於窗口沒有包含整個目標,甚至中心也沒有,只是包含了一部分(好比狗狗的頭),雖然適合作分類,可是定位和檢測效果不好。
- 訓練一個卷積網絡,不只產生分類的分佈,還產生預測框bouding box(預測目標的大小和位置)。
- 累積每一個位置和尺寸對應類別的置信度。
AlexNet展現了CNN可在圖像分類和定位任務上取得了優秀的表現,可是並無公開描述他們的定位方法。
這篇論文是第一次清晰地解釋CNN如何用於定位和檢測。測試
視覺任務(How)
論文探索了圖像處理的三大任務,按難度上升的順序分別是:spa
- 分類(classification),給每一張圖像打標籤,表示是什麼物體。只要機率最大的前5箇中有一個是正確的就認爲是正確(top5)。
- 定位(localization),除了打標籤,還須要給出目標的位置大小,並且bounding box和真實框的類似度必須達到閾值(好比交併比至少要爲0.5)。也有top5指標,5個標籤必須有一個標籤,分類正確且邊框符合條件,纔算正確。
- 檢測(detection),一張圖像有不少個目標物體,須要所有找出來(分類並定位)。分類和定位使用同一個數據集,而檢測使用另外的數據集,裏面的物體會更小一些。
- 下面分爲三個部分來說講論文是怎麼作的(分類,定位和檢測),重點主要是講述分類任務,而後是定位任務,至於最後的檢測任務論文沒怎麼提具體作法,就稍微提了一下。
分類任務設計
論文的網絡結構和alexNet很相似,在網絡設計和測試階段的作法上作了一些改進。論文的網絡分爲兩個版本,一個快速版,一個精確版。下圖是精確版的網絡結構圖。
3d
- 該網絡和alexNet相似,有幾點不一樣,一是沒有使用對比歸一化,二是沒有使用重疊的池化,三是stride的超參用2代替了4,大stride能夠提高速度,減少精度。
- 該網絡和alexNet最大的不一樣之處在於測試階段使用了不一樣的方法來預測。
- alexNet在測試階段對256*256的圖像作裁剪(四個角落和中間)和水平翻轉,獲得5*2也就是10張227*227的圖像,而後送進網絡裏面獲得10個結果求平均來進行預測。這樣的作法有兩個問題,裁剪時可能忽略了圖像的一些區域,以及10張圖像有不少重疊部分致使了冗餘計算。
該網絡的測試階段,用到了多尺度的,滑動窗口的方法(實驗最多輸入了6個不一樣尺度的圖像)。這也是論文最大的創新點。blog
多尺度分類——全卷積(全卷積意爲所有都是卷積層)io
- 上圖中各層的輸入大小是訓練時的,因爲在測試時會輸入6張不一樣尺寸的圖,因此大小確定都不同的。
- 全卷積是什麼:上圖中後三層的全鏈接層實際上使用的是全卷積,全鏈接層是能夠轉爲全卷積的,舉例來講,全鏈接層的輸入shape爲5*5*1024的feature map,輸出爲4096的話,參數個數就是5*5*1024*4096,這個時候轉爲全卷積層,那麼卷積的參數就是,卷積核大小爲5*5*1024,卷積核個數爲4096,兩者的參數量是同樣的。
- 全卷積致使了什麼:以下圖所示,對14*14的圖像進行卷積操做,在獲得5*5的feature map後的這一步,若是使用全鏈接,就會把它壓平再全鏈接,這樣就破壞了feature map的圖像位置關係,直接轉爲一列特徵。可是若是使用的是全卷積,最後會獲得1*1*C的feature map,C是channel數,也是類別的大小。這個時候若是來了一張16*16的圖像,通過全卷積後就會獲得2*2*C的feature map,這個時候能夠對這個2*2的4個值作一個取最大或平均,就會變成一個值了,以此類推,來了更大的圖像,最後獲得的feature map就是3*3*C,4*4*C,5*5*C的大小,輸出的大小和輸入的大小相關,但老是能夠對這個輸出map池化(取最大)來獲得這個類別的值。
- 全卷積的好處:下圖中第一個圖是訓練時用14*14的圖像,最後產生一個輸出,下面的圖是測試時,能夠用16*16的圖像產生了「2*2」個輸出,以此類推咱們能夠在測試時使用更大的圖像(使用多scale),產生「更多」的輸出進行(取最大)預測。這個作法相對於傳統的滑動窗口(用14*14大小,步長爲2的滑動窗口在16*16的圖像上執行4次卷積操做進行分類)的優勢是,只須要執行一次,保證了效率同時能夠建模用各類不一樣尺度圖像,不侷限於固定的裁剪翻轉方式(相對於alexNet測試階段的作法),並且消除了不少冗餘計算,提升了模型的魯棒性又保證了效率。
![](http://static.javashuo.com/static/loading.gif)
多尺度分類——offset池化圖像處理
- 爲了解釋結合offset池化後最後計算出來的輸出,如下圖爲例,(a)是第5層獲得的暫未池化的一張圖的某一維,好比圖的大小爲20*23,下圖中畫出的是20*23中的20。(20*23是後面的scale2在第5層獲得的一個圖的大小,後面咱們會用到6個scale,這裏以scale2的某一維爲例子)。
- 傳統的作法,對長度爲20的序列進行3*3的最大池化後會獲得長度爲6的序列,就是(b)中\(\Delta = 0\)這樣的池化
- offset池化就是移動必定的位置再池化,(b)中\(\Delta = 0, 1, 2\)就能夠表示能夠作三種池化,獲得三個結果,由於圖像是二維的,因此最後會獲得3*3也就是9種池化結果,最後對於每一個類別就有9個結果,能夠對這些結果集成預測(下圖的例子中只考慮一維的因此圖中最後會獲得三個結果,紅藍綠三種顏色表示三種池化後獲得的結果)。
(c)表示進行3*3池化後獲得6*6的圖(6個格子)。(d)表示通過5*5的全卷積獲得2*2的圖(2個格子)。e表示把位置信息(長度爲2)和offset方式(3種)交錯後獲得的最後的輸出圖。
![](http://static.javashuo.com/static/loading.gif)
- 上述這個操做會對重複6*2也就是12次,其中6表明6個scale,以下圖所示的6個不一樣的scale,而2表示水平翻轉後會獲得兩個圖。
- 在這12次裏面的每一次,對位置信息取最大,以Scale2爲例,最後大小爲6x9xC,就在這6x9個值中取最大。
那麼就會獲得12個長度爲C的向量,12個向量加起來取平均,獲得一個長度爲C的向量,而後求Top1或Top5,獲得最後的結果。
![](http://static.javashuo.com/static/loading.gif)
驗證集上的分類結果
![](http://static.javashuo.com/static/loading.gif)
其中coarse stride表示\(\Delta=0\),fine stride表示\(\Delta=0,1,2\)。
- 使用fine stride能夠提高模型表現,可是提高不大,說明實際上offset-pooling在這裏的做用不大。
- 使用多scale,增長scale能夠提高模型表現。
- 最後多模型融合,又提高了表現
定位任務
- 前面提到的分類任務中,1到5層作特徵提取網絡,6到輸出層做爲分類網絡,這個時候只要在5層(池化後的)後面接一個迴歸網絡就能夠來作定位了。
- 訓練的時候固定特徵提取網絡,根據box和真實box之間的l2損失進行訓練。
- 以下圖所示,一樣以scale2爲例,第五層輸出的是6*7的圖,經過迴歸網絡的一系列卷積後,獲得2*3個位置信息(2*3個box),4個channel表示box的四個邊值(座標)。
- 迴歸層最後是1000個版本(類),下圖中只是表示了一個類。
![](http://static.javashuo.com/static/loading.gif)
累積預測
- 對於迴歸網絡獲得的一系列bounding box,該論文不是經過傳統的非極大值抑制,而是使用了累積預測的方法。
- 首先對於每一個scale計算出前k個類別,對每一個類別計算出全部的bouding box。
- 而後合併全部scale的bounding box獲得集合\(B\),重複如下步驟
- \((b_1^*, b_2^*) = arg min_{b_1 \neq b_2 \in B} match\_score(b_1, b_2)\)
- 假如,\(match\_score(b_1, b_2) > t\),則中止
- 不然,\(B \leftarrow B \ \verb|\| \{ b_1^*, b_2^* \} \cup box\_merge(b_1^*, b_2^*)\)
其中\(match\_score(b_1, b_2)\)計算的是兩個box中點的距離和交集區域的面積之和,當它大於某個閾值時算法中止\(box\_merge(b_1^*, b_2^*)\)計算的是兩個box座標的平均值。
經過合併具備高置信度的box來獲得最終預測。
這種方法能夠淘汰那些低置信度以及低連續(多個box相差很遠)的類別,會更加魯棒。
檢測任務
- 檢測的訓練和分類的訓練差很少,只是分類最後輸出的是1*1的一個輸出,而檢測產生的是n*n的spatial輸出,一張圖像的多個位置被同時訓練。
- 和定位任務相比,最主要的不一樣是須要預測一個背景類,考慮一個圖像沒有物體時。
總結
- 本文使用一個CNN來集成三個任務,分類,定位和檢測(共享前層的特徵)。
- 第一次具體解釋了CNN是如何被用於定位和檢測的。
- 提出了一個多尺度的,滑動窗口的方法,可以提高任務的表現。
- 在多尺度分類這一塊,在feature map上滑窗,相比於傳統的原始圖像滑窗(用一個滑窗對整幅圖像進行密集採樣,而後處理每個採樣獲得的圖像,再組合結果),大大提升了效率。