1. 程式人生 > >SPP Net 空間金字塔池化原理

SPP Net 空間金字塔池化原理

首先對比一下RCNN和SPPNet的流程:

上面是RCNN流程,下面是SPPNet流程。

兩者的共同點:都要先使用selective search選取可能的區域。

兩者的不同點:RCNN對選擇出來的每個影象區域進行卷積,提取特徵,而SPPnet使用共享卷積,對輸入影象進行一次卷積即可,然後將選擇出來的每個影象區域通過座標對映,對應到特徵圖上。

這是SPPnet的改進之處了,原來RCNN是對每一個候選框都進行卷積,提特徵,SPPnet通過一次卷積的方式避免了重複計算問題。要一次卷積的話,就需要解決點與點之間的匹配,也就是說原影象的座標經過對映之後到特徵圖上的座標。這個其實是很容易想到的,對於卷積網路而言,只有stride才會改變網路的尺寸,所以對於左上角和右下角的座標計算的方法如下:

這裡的s是所有stride的乘積。

這樣一幅圖片經過卷積之後,對應的特徵位置就能夠找到,但是由於各個框的大小不一致,而神經網路則是要求輸入的大小要相同,為了解決這個問題RCNN通過裁剪縮放的辦法來解決這個問題,但是這樣會帶來精度的損失,你看,好好一幅圖,左右兩邊明顯看著就不一樣。於是作者就提出了空間池化層來改善這個問題。

這個空間池化層其實思想也分簡單,把每一個邊框,分成3個層次去池化,也就是說將圖片劃分為4*4的小格,每個小格取一個數,2*2的小格每個小格進行池化和對整張影象進行全域性池化,然後在合併起來,這樣得到的輸出就是固定的,具體見下圖

為了有助於理解,我重新畫了一下spp的處理過程:

如圖所示,對於選擇的不同大小的區域對應到卷積之後的特徵圖上,得到的也是大小不一致的特徵圖區域,厚度為256,對於每個區域(厚度為256),通過三種劃分方式進行池化:

(1)直接對整個區域池化,每層得到一個點,共256個點,構成一個1x256的向量

(2)將區域劃分成2x2的格子,每個格子池化,得到一個1x256的向量,共2x2=4個格子,最終得到4個1x256的向量

(3)將區域劃分成4x4的格子,每個格子池化,得到一個1x256的向量,共4x4=16個格子,最終得到16個1x256的向量

將三種劃分方式池化得到的結果進行拼接,得到(1+4+16)*256=21*256的特徵。

由圖中可以看出,整個過程對於輸入的尺寸大小完全無關,因此可以處理任意尺寸的候選框。

空間池化層實際就是一種自適應的層,這樣無論你的輸入是什麼尺寸,輸出都是固定的(21xchannel)。SPPNet改變了卷積的順序,提出了自適應的池化層,避免了預測框大小不一致所帶來的問題。從這個結構設計上來看,整體也非常巧妙,不像RCNN那樣蠻力求解。