SPP-Net是一種可以不用考慮圖像大小,輸出圖像固定長(zhǎng)度網(wǎng)絡(luò)結(jié)構(gòu),并且可以做到在圖像變形情況下表現(xiàn)穩(wěn)定。SSP-net的效果已經(jīng)在不同的數(shù)據(jù)集上面得到驗(yàn)證,速度上比R-CNN快24-102倍。在ImageNet 2014的比賽中,此方法檢測(cè)中第二,分類中第三。
簡(jiǎn)介SPP-Net是出自論文《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》。
在此之前,所有的神經(jīng)網(wǎng)絡(luò)都是需要輸入固定尺寸的圖片,比如224*224(ImageNet)、32*32(LenNet)、96*96等。這樣對(duì)于我們希望檢測(cè)各種大小的圖片的時(shí)候,需要經(jīng)過(guò)crop,或者warp等一系列操作,這都在一定程度上導(dǎo)致圖片信息的丟失和變形,限制了識(shí)別精確度。而且,從生理學(xué)角度出發(fā),人眼看到一個(gè)圖片時(shí),大腦會(huì)首先認(rèn)為這是一個(gè)整體,而不會(huì)進(jìn)行crop和warp,所以更有可能的是,我們的大腦通過(guò)搜集一些淺層的信息,在更深層才識(shí)別出這些任意形狀的目標(biāo)。
SPP-Net對(duì)這些網(wǎng)絡(luò)中存在的缺點(diǎn)進(jìn)行了改進(jìn),基本思想是,輸入整張圖像,提取出整張圖像的特征圖,然后利用空間關(guān)系從整張圖像的特征圖中,在spatial pyramid pooling layer提取各個(gè)region proposal的特征。
一個(gè)正常的深度網(wǎng)絡(luò)由兩部分組成,卷積部分和全連接部分,要求輸入圖像需要固定size的原因并不是卷積部分而是全連接部分。所以SPP層就作用在最后一層卷積之后,SPP層的輸出就是固定大小。
SPP-net不僅允許測(cè)試的時(shí)候輸入不同大小的圖片,訓(xùn)練的時(shí)候也允許輸入不同大小的圖片,通過(guò)不同尺度的圖片同時(shí)可以防止overfit。
相比于R-CNN提取2000個(gè)proposal,SPP-net只需要將整個(gè)圖扔進(jìn)去獲取特征,這樣操作速度提升了100倍左右。1
SPP Layer介紹
卷積層的參數(shù)和輸入大小無(wú)關(guān),它僅僅是一個(gè)卷積核在圖像上滑動(dòng),不管輸入圖像多大都沒(méi)關(guān)系,只是對(duì)不同大小的圖片卷積出不同大小的特征圖,但是全連接層的參數(shù)就和輸入圖像大小有關(guān),因?yàn)樗演斎氲乃邢袼攸c(diǎn)連接起來(lái),需要指定輸入層神經(jīng)元個(gè)數(shù)和輸出層神經(jīng)元個(gè)數(shù),所以需要規(guī)定輸入的feature的大小。因此,固定長(zhǎng)度的約束僅限于全連接層。 SPP-Net在最后一個(gè)卷積層后,接入了金字塔池化層,使用這種方式,可以讓網(wǎng)絡(luò)輸入任意的圖片,而且還會(huì)生成固定大小的輸出。
從整體過(guò)程來(lái)看,就是如圖二所示。黑色圖片代表卷積之后的特征圖,接著我們以不同大小的塊來(lái)提取特征,分別是4*4,2*2,1*1,將這三張網(wǎng)格放到下面這張?zhí)卣鲌D上,就可以得到16+4+1=21種不同的塊(Spatial bins),我們從這21個(gè)塊中,每個(gè)塊提取出一個(gè)特征,這樣剛好就是我們要提取的21維特征向量。這種以不同的大小格子的組合方式來(lái)池化的過(guò)程就是空間金字塔池化(SPP)。比如,要進(jìn)行空間金字塔最大池化,其實(shí)就是從這21個(gè)圖片塊中,分別計(jì)算每個(gè)塊的最大值,從而得到一個(gè)輸出單元,最終得到一個(gè)21維特征的輸出。所以Conv5計(jì)算出的feature map也是任意大小的,經(jīng)過(guò)SPP之后,就可以變成固定大小的輸出了,以上圖為例,一共可以輸出(16+4+1)*256的特征。
總結(jié)而言,當(dāng)網(wǎng)絡(luò)輸入的是一張任意大小的圖片,這個(gè)時(shí)候我們可以一直進(jìn)行卷積、池化,直到網(wǎng)絡(luò)的倒數(shù)幾層的時(shí)候,也就是我們即將與全連接層連接的時(shí)候,就要使用金字塔池化,使得任意大小的特征圖都能夠轉(zhuǎn)換成固定大小的特征向量,這就是空間金字塔池化的意義(多尺度特征提取出固定大小的特征向量)。
訓(xùn)練過(guò)程作者提出兩種訓(xùn)練方式:一種是single-size,一種是Multi-size。
single-size理論上說(shuō),SPP-net支持直接以多尺度的原始圖片作為輸入后直接BP即可。實(shí)際上,caffe等實(shí)現(xiàn)中,為了計(jì)算的方便,GPU,CUDA等比較適合固定尺寸的輸入,所以訓(xùn)練的時(shí)候輸入是固定了尺度了的。以224*224的輸入為例:在conv5之后的特征圖為:13x13(a*a),金字塔層bins:n*n,將pooling層作為slidingwindow pooling。
windows_size=[a/n]向上取整 ,stride_size=[a/n]向下取整。
Multi-size training使用兩個(gè)尺度進(jìn)行訓(xùn)練:224*224 和180*180。訓(xùn)練的時(shí)候,224x224的圖片通過(guò)crop得到,180x180的圖片通過(guò)縮放224x224的圖片得到。之后,迭代訓(xùn)練,即用224的圖片訓(xùn)練一個(gè)epoch,之后180的圖片訓(xùn)練一個(gè)epoch,交替地進(jìn)行。
兩種尺度下,在SSP后,輸出的特征維度都是(9+4+1)x256,參數(shù)是共享的,之后接全連接層即可。
SPP層代碼分析代碼中存放的是spp layer中的目標(biāo)輸出大小,代碼中bins=[1,2,3],經(jīng)過(guò)處理之后就可以得到對(duì)應(yīng)的(1*1+2*2+3*3)*256=14*256=3584個(gè)神經(jīng)元,即無(wú)論前面的feature map是多大的,經(jīng)過(guò)spp layer處理之后得到固定大小的神經(jīng)元,然后就可以和全連接層進(jìn)行矩陣運(yùn)算了。
import tensorflow as tfimport math class SPPLayer(): def __init__(self,bins,feature_map_size): self.strides = [] self.filters = []# print(type(feature_map_size)) self.a = float(feature_map_size) self.bins = bins self.n = len(bins) def spatial_pyramid_pooling(self,data): self.input = data self.batch_size = self.input.get_shape().as_list()[0] for i in range(self.n): x = int(math.floor(self.a/float(self.bins[i]))) self.strides.append(x) x = int (math.ceil(self.a/float(self.bins[i]))) self.filters.append(x) self.pooled_out = [] for i in range(self.n): self.pooled_out.append(tf.nn.max_pool(self.input, ksize=[1, self.filters[i], self.filters[i], 1], strides=[1, self.strides[i], self.strides[i], 1], padding='VALID')) for i in range(self.n): self.pooled_out[i] = tf.reshape(self.pooled_out[i], [self.batch_size, -1]) self.output = tf.concat(1, [self.pooled_out[0], self.pooled_out[1], self.pooled_out[2]]) return self.output測(cè)試階段作者將SPP-Net測(cè)試效果與R-CNN對(duì)比。
對(duì)于R-CNN,整個(gè)過(guò)程是:
首先通過(guò)選擇性搜索,對(duì)待檢測(cè)的圖片進(jìn)行搜索出~2000個(gè)候選窗口。
把這2k個(gè)候選窗口的圖片都縮放到227*227,然后分別輸入CNN中,每個(gè)proposal提取出一個(gè)特征向量,也就是說(shuō)利用CNN對(duì)每個(gè)proposal進(jìn)行提取特征向量。
把上面每個(gè)候選窗口的對(duì)應(yīng)特征向量,利用SVM算法進(jìn)行分類識(shí)別。
可以看出R-CNN的計(jì)算量是非常大的,因?yàn)?k個(gè)候選窗口都要輸入到CNN中,分別進(jìn)行特征提取。
而對(duì)于SPP-Net,整個(gè)過(guò)程是:
首先通過(guò)選擇性搜索,對(duì)待檢測(cè)的圖片進(jìn)行搜索出2000個(gè)候選窗口。這一步和R-CNN一樣。
特征提取階段。這一步就是和R-CNN最大的區(qū)別了,這一步驟的具體操作如下:把整張待檢測(cè)的圖片,輸入CNN中,進(jìn)行一次性特征提取,得到feature maps,然后在feature maps中找到各個(gè)候選框的區(qū)域,再對(duì)各個(gè)候選框采用金字塔空間池化,提取出固定長(zhǎng)度的特征向量。而R-CNN輸入的是每個(gè)候選框,然后在進(jìn)入CNN,因?yàn)镾PP-Net只需要一次對(duì)整張圖片進(jìn)行特征提取,速度會(huì)大大提升。
最后一步也是和R-CNN一樣,采用SVM算法進(jìn)行特征向量分類識(shí)別。
檢測(cè)算法對(duì)于檢測(cè)算法,論文中是這樣做到:使用ss生成~2k個(gè)候選框,縮放圖像之后提取特征,每個(gè)候選框使用一個(gè)4層的空間金字塔池化特征,網(wǎng)絡(luò)使用的是ZF-5的SPPNet形式。之后將12800d的特征輸入全連接層,SVM的輸入為全連接層的輸出。
這個(gè)算法可以應(yīng)用到多尺度的特征提?。合葘D片resize到五個(gè)尺度:480,576,688,864,1200,加自己6個(gè)。然后在map window to feature map一步中,選擇ROI框尺度在{6個(gè)尺度}中大小最接近224x224的那個(gè)尺度下的feature maps中提取對(duì)應(yīng)的roi feature。這樣做可以提高系統(tǒng)的準(zhǔn)確率。
本詞條內(nèi)容貢獻(xiàn)者為:
王慧維 - 副研究員 - 西南大學(xué)