論文筆記:OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks


2014 ICLR
紐約大學 LeCun團隊
Pierre Sermanet, David Eigen, Xiang Zhang, Michael Mathieu, Rob Fergus, Yann LeCun

簡單介紹(What)
Ovefeat是2013年ImageNet定位任務的冠軍,同時在分類和檢測任務也取得了不錯的結果。

  1. 它用一個共享的CNN來同時處理圖像分類,定位,檢測三個任務,可以提升三個任務的表現。
  2. 它用CNN有效地實現了一個多尺度的,滑動窗口的方法,來處理任務。
  3. 提出了一種方法,通過累積預測來求bounding boxes(而不是傳統的非極大值抑制)。

論文動機(Why)
雖然ImageNet的數據包含一個大致充滿圖像的中心目標,但是目標在圖像中的大小和位置有着顯著差異。解決這個問題有幾個做法。

  1. 使用多個固定大小的滑動窗口移動,對每個掃過的窗口圖像做CNN預測。該方法的缺點在於窗口沒有包含整個目標,甚至中心也沒有,只是包含了一部分(比如狗狗的頭),雖然適合做分類,但是定位和檢測效果很差。
  2. 訓練一個卷積網絡,不僅產生分類的分布,還產生預測框bouding box(預測目標的大小和位置)。
  3. 累積每個位置和尺寸對應類別的置信度。

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

視覺任務(How)
論文探索了圖像處理的三大任務,按難度上升的順序分別是:

  1. 分類(classification),給每一張圖像打標簽,表示是什么物體。只要概率最大的前5個中有一個是正確的就認為是正確(top5)。
  2. 定位(localization),除了打標簽,還需要給出目標的位置大小,而且bounding box和真實框的相似度必須達到閾值(比如交並比至少要為0.5)。也有top5指標,5個標簽必須有一個標簽,分類正確且邊框符合條件,才算正確。
  3. 檢測(detection),一張圖像有很多個目標物體,需要全部找出來(分類並定位)。分類和定位使用同一個數據集,而檢測使用另外的數據集,里面的物體會更小一些。
  4. 下面分為三個部分來講講論文是怎么做的(分類,定位和檢測),重點主要是講述分類任務,然后是定位任務,至於最后的檢測任務論文沒怎么提具體做法,就稍微提了一下。

分類任務

  1. 論文的網絡結構和alexNet很類似,在網絡設計和測試階段的做法上做了一些改進。論文的網絡分為兩個版本,一個快速版,一個精確版。下圖是精確版的網絡結構圖。

  2. 該網絡和alexNet類似,有幾點不同,一是沒有使用對比歸一化,二是沒有使用重疊的池化,三是stride的超參用2代替了4,大stride可以提升速度,減小精度。

  3. 該網絡和alexNet最大的不同之處在於測試階段使用了不同的方法來預測。

  4. alexNet在測試階段對256*256的圖像做裁剪(四個角落和中間)和水平翻轉,得到5*2也就是10張227*227的圖像,然后送進網絡里面得到10個結果求平均來進行預測。這樣的做法有兩個問題,裁剪時可能忽略了圖像的一些區域,以及10張圖像有很多重疊部分導致了冗余計算。

  5. 該網絡的測試階段,用到了多尺度的,滑動窗口的方法(實驗最多輸入了6個不同尺度的圖像)。這也是論文最大的創新點

多尺度分類——全卷積(全卷積意為全部都是卷積層)

  1. 上圖中各層的輸入大小是訓練時的,由於在測試時會輸入6張不同尺寸的圖,所以大小肯定都不一樣的。
  2. 全卷積是什么:上圖中后三層的全連接層實際上使用的是全卷積,全連接層是可以轉為全卷積的,舉例來說,全連接層的輸入shape為5*5*1024的feature map,輸出為4096的話,參數個數就是5*5*1024*4096,這個時候轉為全卷積層,那么卷積的參數就是,卷積核大小為5*5*1024,卷積核個數為4096,二者的參數量是一樣的。
  3. 全卷積導致了什么:如下圖所示,對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池化(取最大)來得到這個類別的值。
  4. 全卷積的好處:下圖中第一個圖是訓練時用14*14的圖像,最后產生一個輸出,下面的圖是測試時,可以用16*16的圖像產生了“2*2”個輸出,以此類推我們可以在測試時使用更大的圖像(使用多scale),產生“更多”的輸出進行(取最大)預測。這個做法相對於傳統的滑動窗口(用14*14大小,步長為2的滑動窗口在16*16的圖像上執行4次卷積操作進行分類)的優點是,只需要執行一次,保證了效率同時可以建模用各種不同尺度圖像,不局限於固定的裁剪翻轉方式(相對於alexNet測試階段的做法),而且消除了很多冗余計算,提高了模型的魯棒性又保證了效率。

多尺度分類——offset池化

  1. 為了解釋結合offset池化后最后計算出來的輸出,以下圖為例,(a)是第5層得到的暫未池化的一張圖的某一維,比如圖的大小為20*23,下圖中畫出的是20*23中的20。(20*23是后面的scale2在第5層得到的一個圖的大小,后面我們會用到6個scale,這里以scale2的某一維為例子)。

  2. 傳統的做法,對長度為20的序列進行3*3的最大池化后會得到長度為6的序列,就是(b)中\(\Delta = 0\)這樣的池化

  3. offset池化就是移動一定的位置再池化,(b)中\(\Delta = 0, 1, 2\)就可以表示可以做三種池化,得到三個結果,因為圖像是二維的,所以最后會得到3*3也就是9種池化結果,最后對於每個類別就有9個結果,可以對這些結果集成預測(下圖的例子中只考慮一維的所以圖中最后會得到三個結果,紅藍綠三種顏色表示三種池化后得到的結果)。

  4. (c)表示進行3*3池化后得到6*6的圖(6個格子)。(d)表示經過5*5的全卷積得到2*2的圖(2個格子)。e表示把位置信息(長度為2)和offset方式(3種)交錯后得到的最后的輸出圖。

  5. 上述這個操作會對重復6*2也就是12次,其中6代表6個scale,如下圖所示的6個不同的scale,而2表示水平翻轉后會得到兩個圖。

  6. 在這12次里面的每一次,對位置信息取最大,以Scale2為例,最后大小為6x9xC,就在這6x9個值中取最大。

  7. 那么就會得到12個長度為C的向量,12個向量加起來取平均,得到一個長度為C的向量,然后求Top1或Top5,得到最后的結果。

驗證集上的分類結果

其中coarse stride表示\(\Delta=0\),fine stride表示\(\Delta=0,1,2\)

  1. 使用fine stride可以提升模型表現,但是提升不大,說明實際上offset-pooling在這里的作用不大。
  2. 使用多scale,增加scale可以提升模型表現。
  3. 最后多模型融合,又提升了表現

定位任務

  1. 前面提到的分類任務中,1到5層做特征提取網絡,6到輸出層作為分類網絡,這個時候只要在5層(池化后的)后面接一個回歸網絡就可以來做定位了。
  2. 訓練的時候固定特征提取網絡,根據box和真實box之間的l2損失進行訓練。
  3. 如下圖所示,同樣以scale2為例,第五層輸出的是6*7的圖,通過回歸網絡的一系列卷積后,得到2*3個位置信息(2*3個box),4個channel表示box的四個邊值(坐標)。
  4. 回歸層最后是1000個版本(類),下圖中只是表示了一個類。

累積預測

  1. 對於回歸網絡得到的一系列bounding box,該論文不是通過傳統的非極大值抑制,而是使用了累積預測的方法。
  2. 首先對於每個scale計算出前k個類別,對每個類別計算出所有的bouding box。
  3. 然后合並所有scale的bounding box得到集合\(B\),重復以下步驟
  4. \((b_1^*, b_2^*) = arg min_{b_1 \neq b_2 \in B} match\_score(b_1, b_2)\)
  5. 假如,\(match\_score(b_1, b_2) > t\),則停止
  6. 否則,\(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*1的一個輸出,而檢測產生的是n*n的spatial輸出,一張圖像的多個位置被同時訓練。
  2. 和定位任務相比,最主要的不同是需要預測一個背景類,考慮一個圖像沒有物體時。

總結

  1. 本文使用一個CNN來集成三個任務,分類,定位和檢測(共享前層的特征)。
  2. 第一次具體解釋了CNN是如何被用於定位和檢測的。
  3. 提出了一個多尺度的,滑動窗口的方法,能夠提升任務的表現。
  4. 在多尺度分類這一塊,在feature map上滑窗,相比於傳統的原始圖像滑窗(用一個滑窗對整幅圖像進行密集采樣,然后處理每一個采樣得到的圖像,再組合結果),大大提高了效率。


免責聲明!

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



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