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的數據包含一個大致充滿圖像的中心目標,但是目標在圖像中的大小和位置有着顯著差異。解決這個問題有幾個做法。
- 使用多個固定大小的滑動窗口移動,對每個掃過的窗口圖像做CNN預測。該方法的缺點在於窗口沒有包含整個目標,甚至中心也沒有,只是包含了一部分(比如狗狗的頭),雖然適合做分類,但是定位和檢測效果很差。
- 訓練一個卷積網絡,不僅產生分類的分布,還產生預測框bouding box(預測目標的大小和位置)。
- 累積每個位置和尺寸對應類別的置信度。
AlexNet展示了CNN可在圖像分類和定位任務上取得了優秀的表現,但是並沒有公開描述他們的定位方法。
這篇論文是第一次清晰地解釋CNN如何用於定位和檢測。
視覺任務(How)
論文探索了圖像處理的三大任務,按難度上升的順序分別是:
- 分類(classification),給每一張圖像打標簽,表示是什么物體。只要概率最大的前5個中有一個是正確的就認為是正確(top5)。
- 定位(localization),除了打標簽,還需要給出目標的位置大小,而且bounding box和真實框的相似度必須達到閾值(比如交並比至少要為0.5)。也有top5指標,5個標簽必須有一個標簽,分類正確且邊框符合條件,才算正確。
- 檢測(detection),一張圖像有很多個目標物體,需要全部找出來(分類並定位)。分類和定位使用同一個數據集,而檢測使用另外的數據集,里面的物體會更小一些。
- 下面分為三個部分來講講論文是怎么做的(分類,定位和檢測),重點主要是講述分類任務,然后是定位任務,至於最后的檢測任務論文沒怎么提具體做法,就稍微提了一下。
分類任務
-
論文的網絡結構和alexNet很類似,在網絡設計和測試階段的做法上做了一些改進。論文的網絡分為兩個版本,一個快速版,一個精確版。下圖是精確版的網絡結構圖。
-
該網絡和alexNet類似,有幾點不同,一是沒有使用對比歸一化,二是沒有使用重疊的池化,三是stride的超參用2代替了4,大stride可以提升速度,減小精度。
-
該網絡和alexNet最大的不同之處在於測試階段使用了不同的方法來預測。
-
alexNet在測試階段對256*256的圖像做裁剪(四個角落和中間)和水平翻轉,得到5*2也就是10張227*227的圖像,然后送進網絡里面得到10個結果求平均來進行預測。這樣的做法有兩個問題,裁剪時可能忽略了圖像的一些區域,以及10張圖像有很多重疊部分導致了冗余計算。
-
該網絡的測試階段,用到了多尺度的,滑動窗口的方法(實驗最多輸入了6個不同尺度的圖像)。這也是論文最大的創新點。
多尺度分類——全卷積(全卷積意為全部都是卷積層)
- 上圖中各層的輸入大小是訓練時的,由於在測試時會輸入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測試階段的做法),而且消除了很多冗余計算,提高了模型的魯棒性又保證了效率。
多尺度分類——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種)交錯后得到的最后的輸出圖。
-
上述這個操作會對重復6*2也就是12次,其中6代表6個scale,如下圖所示的6個不同的scale,而2表示水平翻轉后會得到兩個圖。
-
在這12次里面的每一次,對位置信息取最大,以Scale2為例,最后大小為6x9xC,就在這6x9個值中取最大。
-
那么就會得到12個長度為C的向量,12個向量加起來取平均,得到一個長度為C的向量,然后求Top1或Top5,得到最后的結果。
驗證集上的分類結果
其中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個版本(類),下圖中只是表示了一個類。
累積預測
- 對於回歸網絡得到的一系列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上滑窗,相比於傳統的原始圖像滑窗(用一個滑窗對整幅圖像進行密集采樣,然后處理每一個采樣得到的圖像,再組合結果),大大提高了效率。