SPP背景

傳統CNN所需要的固定維度輸入這一限制,是造成任意尺度的圖片識別準確率低的原因.傳統的CNN需要先對訓練圖片進行處理,使其維度相同.具體有兩種做法,裁剪(cropping)和扭曲(warping).如下圖.

缺點是:裁剪了的區域可能並不包含整個物體,而扭曲則會帶入幾何方面的失真.另外,即使是裁剪和扭曲,我們仍然是認為規定了一個輸入尺度,而真實的物體尺度很多,這個固定維度的輸入直接忽略掉了這一點.

為何非要給CNN限制一個固定維度的輸入?作者說,CNN就分兩塊,卷積層和全連層(fully-connected layer),卷積層的輸出是特徵圖(feature map),這個特徵圖反映出了原始輸入圖片中對filter(卷積核)激活的空間信息.卷積這一步是不需要固定大小的.是最後的全連層帶來的這個限制.

作者針對這個問題,提出了在CNN的最後一個卷積層之後,加入一個SPP層,也就是空間金字塔池化,對之前卷積得到的特徵進行」整合」(aggregation),然後得到一個固定長度的特徵向量,再傳到全連層去.如下圖.

SPP是詞袋模型(Bag-of-Words)的擴展.為什麼說是擴展?詞袋模型沒有特徵的空間信息(就像它只能統計一個句子中每個單詞的詞頻,而不能記錄詞的位置信息一樣).在深層CNN里加入SPP會有3個優勢: 1) 相比之前的滑動窗池化(sliding window pooling),SPP可以對不同維度輸入得到固定長度輸出. 2) SPP使用了多維的spatial bins(我的理解就是多個不同大小的窗),而滑動窗池化只用了一個窗. 3) 因為輸入圖片尺度可以是任意的,SPP就提取出了不同尺度的特徵.作者說這3點可以提高深度網路的識別準確率.

SPP-net既然只在網路的最後幾層(深層網路)中加入,而本質上就是池化,所以它可以加入到其他CNN模型中,比如AlexNet.作者的實驗表明,加入了SPP的AlexNet效果確實提升了.作者認為SPP應該能提升更複雜的網路的能力.

SPP原理

在輸入不同尺寸的圖片,經過卷積層會輸出的不同大小的feature map.把最以後一次卷積後的池化層去掉,換成一個SPP去做最大池化操作(max pooling).如果最後一次卷積得到了k個feature map,也就是有k個filter,SPP有M個bin(M個不同維度的pyramid),那經過SPP得到的是一個kM維的向量.我的理解是,比如上圖中第一個feature map有16個bin,一共有256個feature map,每一個經過16個bin的max pooling得到16個數,那256個feature map就是16x256的向量了,第二個產生4x256維向量,SPP的bin大小可以選擇多個,所以經過SPP還能產生4x256,1x256維的向量.

具體地,在一個CNN里,把最以後一次池化層去掉,換成一個SPP去做最大池化操作(max pooling).如果最後一次卷積得到了k個feature map,也就是有k個filter,SPP有M個bin,那經過SPP得到的是一個kM維的向量.我的理解是,比如上圖中第一個feature map有16個bin,一共有256個feature map,每一個經過16個bin的max pooling得到16個數,那256個feature map就是16x256的向量了.SPP的bin大小可以選擇多個,所以經過SPP還能產生4x256,1x256維的向量.

假設原圖輸入是224x224,對於conv5出來後的輸出是13x13x256的,可以理解成有256個這樣的filter,每個filter對應一張13x13的reponse map。如果像上圖那樣將reponse map分成1x1(金字塔底座),2x2(金字塔中間),4x4(金字塔頂座)三張子圖,分別做max pooling後,出來的特徵就是(16+4+1)x256 維度。如果原圖的輸入不是224x224,出來的特徵依然是(16+4+1)x256維度。這樣就實現了不管圖像尺寸如何 池化n 的輸出永遠是 (16+4+1)x256 維度。SSP後的全連接是由上圖綠色,藍色,灰色產生的向量拼接而成。

實際運用中只需要根據全連接層的輸入維度要求設計好空間金字塔即可。

訓練

###單一大小訓練

如果一個圖片大小固定,比如224x224,那麼我們就能計算出它的池化窗口(bin)的大小.比如經過第五個卷積層conv5之後得到的feature map是a x a(13x13),如果金字塔大小n x n,那麼窗口大小就是ceil(a / n), 步長是floor(a / n).我們可以用ll個不同大小的窗口,比如3x3, 2x2, 1x1.然後把這ll個輸出連接起來,送入之後的全連層.下圖是這樣3個窗口和最後的全連層的的配置文件.

###多個大小的訓練

我們再考慮一種輸入大小(180x180),兩種大小也算是」多個大小訓練」啊.這個180x180的直接取224x224圖片的按尺度縮放圖片,這兩張圖除了解析度不同別的都相同.180x180的圖片經過第五層卷積後的feature map是10x10,這時我們依然用剛才的公式,窗口大小就是ceil(a / n), 步長是floor(a / n),這樣的話後得到的特徵長度與之前的224x224的特徵長度相同.舉個例子,如果金字塔是3*3,即n=3,那麼對於第一種大小,窗口長為5,步長4,第二中大小,窗口4,步長3,如下圖.

紅色區域代表窗口,經過最大池化後,兩張圖得到的特徵向量長度均為3x3=9.所以180的網路和224的網路參數完全一樣,於是SPP訓練階段,對於這兩種網路只要共享參數即可.

實際訓練時,為了減少不停轉換網路帶來的開銷,需要使用全部數據一次訓練一個網路,然後再換成第二個,作為一次迭代.所以作者根本沒有實現訓練不同大小輸入的CNN的BP演算法,只是針對各種各樣大小不同的輸入,定義出不同的網路,但這些網路實際上參數都相同,於是就可以用現有工具來訓練.

這個是訓練階段,需要不停轉化網路,當訓練好模型用於測試時,只要輸入圖片就行了.

該文主要參考:

[論文筆記]Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition?

sinb.github.io
圖標
曉雷:SPPNet-引入空間金字塔池化改進RCNN?

zhuanlan.zhihu.com
圖標

推薦閱讀:
相关文章