Spatial Pyramid Pooling(空间金字塔池化)-变尺度CNN训练
1. 需求創(chuàng)造好的產(chǎn)品,產(chǎn)品拓寬原始的需求
當前的深度神經(jīng)網(wǎng)絡一般都需要固定的輸入圖像尺寸(如224*224). 這種需求很明顯是人為的,潛在性的弊端會降低識別精度(為了使圖像尺寸相同,一定會涉及到圖像的比例/非比例放縮,這就引入了尺度誤差和形變誤差)。何凱明師兄的這項工作主要是講多分辨率搜索的思想融入到了現(xiàn)有的深度網(wǎng)絡中,從而實現(xiàn)了多尺度網(wǎng)絡的訓練以及識別,進而提升了圖像分類和目標檢測的精度(核心思想在于生成固定長度Descriptor)。SPP(Spatial Pyramid Pooling,空間金字塔池化)是一種非常有效的多分辨策略,對目標形變非常魯邦。
2. 從目標檢測RCNN入手
RCNN(Region proposal with Convoluton Neural Network,RCNN)進行目標檢測的思路:CNN作為特征提取器,然后進行BoundingBox回歸。但是RCNN對于每一個區(qū)域候選(Region Proposed)都需要首先將圖片放縮(比例/非比例)到固定的尺寸(224*224),然后為每個區(qū)域候選提取CNN特征。整個過程是存在一些性能瓶頸:
- 速度瓶頸:重復為每個region proposal提取特征是極其費時的,Selective Search對于每幅圖片產(chǎn)生2K左右個region proposal,也就是意味著一幅圖片需要經(jīng)過2K次的完整的CNN計算得到最終的結果。
- 性能瓶頸:對于所有的region proposal防縮到固定的尺寸會導致我們不期望看到的幾何形變,而且由于速度瓶頸的存在,不可能采用多尺度或者是大量的數(shù)據(jù)增強去訓練模型。
這里面實際到一個核心問題:大多數(shù)基于CNN的分類檢測網(wǎng)絡為什么需要固定的Descriptor輸入呢?
CNN網(wǎng)絡可以分解為卷積網(wǎng)絡部分以及全連接網(wǎng)絡部分。卷積網(wǎng)絡的參數(shù)主要是卷積核,完全能夠適用任意大小的輸入,并且能夠產(chǎn)生任意大小的輸出。但是全連接層網(wǎng)絡不同,全連接層部分的參數(shù)是神經(jīng)元對于所有輸入的連接權重,也就是說輸入尺寸不固定的話,全連接層參數(shù)的個數(shù)都不能固定。
SPPNet給出的解決方案是,既然只有全連接層需要固定的輸入,那么我們在全連接層前加入一個網(wǎng)絡層,讓他對任意的輸入產(chǎn)生固定的輸出不就好了嗎?一種常見的想法是對于最后一層卷積層的輸出pooling一下,但是這個pooling窗口(slide window)的尺寸及步伐(stride)設置為相對值,也就是特征圖相對于期望輸出固定Descriptor的一個比例值,這樣對于任意輸入經(jīng)過這層后都能得到一個固定的輸出。SPPnet在這個想法上繼續(xù)加入SPM的思路,SPM其實在傳統(tǒng)的機器學習特征提取中很常用,主要思路就是對于一副圖像分成若干尺度的一些塊,比如一幅圖像分成1份,4份,8份等。然后對于每一塊提取特征然后融合在一起,這樣就可以兼容多個尺度的特征(所以從本質(zhì)上講,這種創(chuàng)新還是源于傳統(tǒng)的機器學習:尺度金字塔+特征融合)。SPPNet首次將這種思想應用在CNN中,對于卷積層特征我們首先對他分成不同的尺寸,然后每個尺寸提取一個固定維度的特征,最后拼接這些特征成一個固定維度。上面這個圖可以看出SPPnet和RCNN的區(qū)別,首先是輸入不需要放縮到指定大小。其次是增加了一個空間金字塔池化層,還有最重要的一點是每幅圖片只需要提取一次特征。
SPPnet雖然解決了CNN輸入任意大小圖片的問題,但是還是需要重復為每個region proposal提取特征啊,能不能我們直接根據(jù)region proposal定位到他在卷積層特征的位置,然后直接對于這部分特征處理呢?答案是肯定的。
3.SPPNet的網(wǎng)絡細節(jié)
通過可視化Conv5層特征,發(fā)現(xiàn)卷積特征其實保存了空間位置信息(數(shù)學推理中更容易發(fā)現(xiàn)這點),并且每一個卷積核負責提取不同的特征,比如C圖175、55卷積核的特征,其中175負責提取窗口特征,55負責提取圓形的類似于車輪的特征。其實我們也可以通過傳統(tǒng)的方法聚集這些特征,例如詞袋模型或是空間金字塔的方法。
4.關于空間金字塔池化層SPP
空間金字塔池化層是SPPNet的核心,其主要目的是對于任意尺寸的輸入產(chǎn)生固定大小的輸出。思路是對于任意大小的feature map首先分成16、4、1個塊,然后在每個塊上最大池化,池化后的特征拼接得到一個固定維度的輸出。以滿足全連接層的需要。在研究圖像分類的時候可以這么干(輸入的圖像為一整副圖像),然而在研究目標檢測和跟蹤的時候,我們實際輸入的應該是region proposal。
SPPNet理論上可以改進任何CNN網(wǎng)絡,通過空間金字塔池化,使得CNN的特征不再是單一尺度的。但是SPPNet更適用于處理目標檢測問題,首先是網(wǎng)絡可以介紹任意大小的輸入,也就是說能夠很方便地多尺寸訓練。其次是空間金字塔池化能夠?qū)τ谌我獯笮〉妮斎氘a(chǎn)生固定的輸出,這樣使得一幅圖片的多個region proposal提取一次特征成為可能。
SPPNet的做法是:
1. 首先通過selective search產(chǎn)生一系列的region proposal
2. 然后訓練多尺寸識別網(wǎng)絡用以提取區(qū)域特征,其中處理方法是每個尺寸的最短邊大小在尺寸集合中:
訓練的時候通過上面提到的多尺寸訓練方法,也就是在每個epoch中首先訓練一個尺寸產(chǎn)生一個model,然后加載這個model并訓練第二個尺寸,直到訓練完所有的尺寸。空間金字塔池化使用的尺度為:1*1,2*2,3*3,6*6,一共是50個bins。
3. 在測試時,每個region proposal選擇能使其包含的像素個數(shù)最接近224*224的尺寸,提取相應特征。
由于我們的空間金字塔池化可以接受任意大小的輸入,因此對于每個region proposal將其映射到feature map上,然后僅對這一塊feature map進行空間金字塔池化就可以得到固定維度的特征用以訓練CNN了。
4. 訓練SVM,BoundingBox回歸
5. 該方法的不足之處
和RCNN一樣,SPP也需要訓練CNN提取特征,然后訓練SVM分類這些特征。需要巨大的存儲空間,并且分開訓練也很復雜。而且selective search的方法提取特征是在CPU上進行的,相對于GPU來說還是比較慢的。Fast RCNN以及Faster RCNN對這個兩個問題進行了深入的研究,取得了不錯的效果。
6. 參考文獻
[1] 論文:He K, Zhang X, Ren S, et al. Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition[C]. european conference on computer vision, 2014: 346-361.
[2] 文章:https://zhuanlan.zhihu.com/p/34357444
[3] 源碼:http://research.microsoft.com/en-us/um/people/kahe/
總結
以上是生活随笔為你收集整理的Spatial Pyramid Pooling(空间金字塔池化)-变尺度CNN训练的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++常类型(const)
- 下一篇: 异常的使用心得