目标检测--Spatial pyramid pooling in deep convolutional networks for visual recognition(PAMI, 2015)
Spatial pyramid pooling in deep convolutional networks for visual recognition
作者:?Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun
引用:?He, Kaiming, et al. "Spatial pyramid pooling in deep convolutional networks for visual recognition."?IEEE transactions on pattern analysis and machine intelligence,37(9) (2015): 1904-1916.
引用次數:?399+120(Google Scholar, By 2016/11/24).
項目地址:
1 介紹
這是何凱明大神2015年在PAMI上發表的論文,在2014年時候已經在ECCV會議上發表過.?
原AlexNet中(如圖1所示),conv5生成的特征maps數目為256個,大小為13*13,后面緊接著是max-pooling層(pool5層),然后是fc6,fc7的全連接層.對于AlexNet而言,輸入圖像的大小為224*224,實驗的時候無論你圖像的大小是多大,都要resize到這個設定的值,這樣才能保證后面的一致性.但是這樣做有個問題就是有些圖像可能與224*224相差很大,強行resize到這個尺寸會有問題,原因有兩個: (1)這個值(224*224)的設定是人為的,不一定是最好的;(2)將圖像強行resize到這個尺寸可能會破壞圖像原本的結構.于是就有了現在這篇文章.
?
?圖1?AlexNet網絡的結構圖
2 SPP-net網絡結構
2.1 SPP-net思路介紹
OK,那我們就不對每張輸入圖像都進行resize,這樣保持了圖像的原有結構,這是個優點! 但是這樣也會帶來問題,輸入圖像什么大小的都有,這樣不同尺寸的圖像前向傳播到pool5層之后(將要進入全連接層時),輸出的向量的維度不相同.全連接層的神經元節點數目是固定的,如果pool5之后輸出的向量維度不確定,況會使得網絡沒有辦法訓練.圖像大小雖然不同,但是不影響卷積層和池化層,影響的就是全連接層與最后一個池化層之間的連接,所以我們如果想解決這個問題,就要在pool5這里下功夫(因為它的下一層就是全連接層,如果這一層能對任何尺寸圖像都能輸出固定長度的特征向量,那全連接層參數不需要改變,其他的啥也都不需要改變)
圖2 SPP-net結構?
為了解決這個問題,作者提出了使用SPP層來代替網絡最后的池化層pool5,使得對于任意尺寸的conv5特征圖(輸入圖像尺寸的不同表現在conv5特征maps大小的不同)經過它之后都能得到固定長度的輸出.下面我們來看看是怎么做到的.
其實做法很簡單: 輸入圖像的尺寸不同,導致conv5輸出的map尺寸也不同,比如224x224的輸出圖像的conv5輸出map尺寸為13x13,180x180尺寸的輸入圖像的conv5輸出map尺寸為10x10,如何在13x13的map和10x10的map上進行池化,使得池化后得到的向量維度相同呢? 首先:設置3種bin(3種只是舉例,你可以設置任意多種),分別是1x1,2x2,4x4,對于1x1的bin,無論對14x14還是10x10,池化后的輸出數據維度都是1(它們不同的是前者的池化核大小為14x14,后者為10x10),對于2x2的bin,池化后輸出數據維度都是4(它們不同的也是池化核),對于4x4的bin,池化后輸出數據的維度都是16(它們不同的也是池化核大小),所以無論你conv5后的map大小是多少,在一張map上池化后得到的向量維度都是1+4+16=21,這就得到了我們的目的:對不同大小的輸入圖像得到定長輸出!!!
雖然對不同尺寸的輸入圖像,多級池化后的輸出向量維度是相同的,但是池化的時候對不同的圖像采用的池化核大小和步長卻是要自適應改變的,這點很重要,否則無法進行下去,下面來講述如何根據map尺寸來計算池化核大小與步長來滿足要求:
bin的size(在一張map上等距劃分的網格的數目)可以設置為n*n: 1*1,2*2,3*3,4*4,...
conv5的map大小為a*a,比如13*13,map數目為256個
這樣:?
(1) n=1 --> win=ceil(a/n)=ceil(13/1)=13,str=floor(13/1)=13 --> 輸出256*1*1維度的向量
(2) n=2 --> win=ceil(a/n)=ceil(13/2)=7,str=floor(13/2)=6 ?--> 輸出256*2*2維度的向量
(3) n=3 --> win=ceil(a/n)=ceil(13/3)=5,str=floor(13/3)=4 ?--> 輸出256*3*3維度的向量
(3) n=4 --> win=ceil(a/n)=ceil(13/4)=4,str=floor(13/4)=3 ?--> 輸出256*4*4維度的向量
其中: ceil(1/3)=1; ceil(2/3)=1;?floor(1/3)=0; floor(2/3)=0;
下圖展示了一個三級的金字塔池化(3x3,2x2,1x1),sizeX為池化核大小,stride為池化時的步長;
可以設置多種bin,每個bin的大小可以設置為1x1或2x2或3x3或4x4,...,
2.2 多尺寸輸入圖像情況下的訓練
面對多尺寸問題時,采用交替訓練的方式,比如第一個epoch采用224x224大小的訓練圖像對Net1進行訓練,第二個epoch的時候改用180x180大小的圖像對Net2進行訓練! 依次類推.這里要問,問什么會有兩個Net? 其實它們可以看做是一個,兩者的差別很小,Net2的初始權重會使用上一次epoch得到的Net1的權重(同樣,再下一次迭代Net1也要使用上次epoch得到的Net2的權重作為初始權重),這些權重包括SPP之前的那些卷積層的kernel權重值,以及SPP之后的全連接層的權重值!那么Net1和Net2有什么區別呢? 還是有點小小的區別的,假設金字塔級數設置為3級,就有3種bin,分別是1x1,2x2,4x4,那么有:
(1) 當224x224大小的圖像進來后,conv5之后的map大小為13x13,這時程序會根據這個map大小以及設置的三種bin來計算每種bin下對應的卷積核大小和步長,假設寫成(sizeX,stride),那么對于這種圖像尺寸,計算出來的池化卷積核大小和步長對就是(13,13),(7,6),(5,4),用這三個對conv5層的卷積maps進行三種池化,得到輸出向量長度為256*(1*1+2*2+4*4)=5376(其中256為conv5后得到的map數目);
(2)?當180x180大小的圖像進來后,conv5之后的map大小為10x10,這時程序會根據這個map大小以及設置的三種bin來計算每種bin下對應的卷積核大小和步長,假設寫成(sizeX,stride),那么對于這種圖像尺寸,計算出來的池化卷積核大小和步長對就是(10,10),(5,5),(4,3),用這三個對conv5層的卷積maps進行三種池化,得到輸出向量長度為256*(1*1+2*2+4*4)=5376(其中256為conv5后得到的map數目);
每次迭代的時候用一種不同大小的輸入圖像,Net1和Net2唯一的不同就是SPP層的三個池化核的尺寸和步長的不同,其他的都是繼承了上次迭代的權重參數作為初始參數,由于池化核本身是不帶學習參數的,因此這種方式對訓練沒有影響(還是按照一般的方式進行訓練).實際訓練時,其實也只是訓練一個網絡,只是在SPP層的時候,要根據當前迭代時的輸入圖像大小實時調整三種池化核尺寸和步長罷了.
2.3 SPP-net用于目標檢測?
SPP-net還可以用于目標檢測,具體見原文中的第四章.
2.3.1 SPP-net訓練集構造
輸入樣本:?20個目標的訓練圖像(對于VOC數據集而言)
正樣本: 采用的是圖像上待檢測目標的GT boxes.
負樣本: 用Selective Search的方法在每張圖像上生成2000個候選區域,考量每個候選區域與GT box之間的IoU,IoU最多為30%的區域標定為負樣本.同時,如果兩個負樣本之間的IoU超過了70%,則要把其中的一個去掉(很像Selective Search論文里面的做法)
對網絡進行微調:
對CNN網絡進行微調的時候,僅僅對SPP-net后面的全連接層進行微調,微調時候的正樣本為: IoU≥0.5的候選區域;?負樣本為: IoU介于[0.1,0.5]之間的候選區域;每個mini-batch里面的正負樣本比例為1:3,共訓練了250K個mini-batches.
?
我這里為什么把訓練集分割三部分,這個下面會講到!
?
?
2.3.2 模型訓練和測試過程
訓練SPP-net
輸入20個類別的訓練圖像(以VOC為例,為輸入樣本) --> 每張圖像都resize到min(w,h)=s (resize之后圖像的最短邊等于s) --> 前向傳播,得到conv5后的卷積maps為256*13*13(假設) -->?將正樣本和負樣本的候選區域都映射到conv5的特征maps上?--> 提取每個映射后區域的多級池化特征 --> 送入全連接層, 再接Softmax --> 反向傳播,迭代多次進行訓練,得到一個SPP-net.
訓練多個二分類SVM
在conv5的特征maps上,所有正樣本和負樣本都映射過來了 --> 的每一類的特征 --> 訓練20個二分類SVM?
?
?
參考文獻:
[1] RCNN學習筆記(3): From RCNN to SPP-net:?http://blog.csdn.net/smf0504/article/details/52744971
總結
以上是生活随笔為你收集整理的目标检测--Spatial pyramid pooling in deep convolutional networks for visual recognition(PAMI, 2015)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 目标检测--Rich feature h
- 下一篇: BlowFish