文章《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》是在RCNN之后,是對(duì)RCNN的改進(jìn)(關(guān)于RCNN可以查看R-CNN文章詳細(xì)解讀),先給出SPP-net總的框架圖如下

該文章主要改進(jìn)兩點(diǎn):
1. CNN需要固定輸入圖像的尺寸,導(dǎo)致不必要的精度損失
2. R-CNN對(duì)候選區(qū)域進(jìn)行重復(fù)卷積計(jì)算,造成計(jì)算冗余
1.為什么CNNs要固定輸入圖像的尺寸?
CNN主要有兩部分組成:卷積層和全連接層。卷積層以滑動(dòng)窗口方式操作并輸出表示各個(gè)響應(yīng)激活空間分布的特征圖。實(shí)際上,卷積層不需要輸入的圖像尺寸固定,并且可以產(chǎn)生任意尺寸的特征圖。但另一方面,完全連接層需要具有固定大小/長度的輸入。 因此,固定輸入大小的約束只是來自存在于網(wǎng)絡(luò)更深層階段的全連接層。
解決辦法(對(duì)比R-CNN, SPP-net):
| R-CNN | SPP-net |
|---|---|
| 固定輸入圖像的尺寸,在將圖像輸入CNN前,進(jìn)行圖片的縮放(詳細(xì)情況查看R-CNN文章詳細(xì)解讀),這樣會(huì)導(dǎo)致裁剪區(qū)域可能不包含整個(gè)對(duì)象,或者縮放時(shí)候產(chǎn)生的扭曲可能會(huì)導(dǎo)致不必要的幾何失真 | 提出空間金字塔池化層簡稱SPP層,在最后一個(gè)卷積層的頂部添加一個(gè)SPP層。 SPP層對(duì)這些特征進(jìn)行池化并生成固定長度的輸出,然后將其輸入到完全連接層(或其他分類器)。 |
如下圖所示
第一行中的圖像即為要求固定尺寸輸入的CNN對(duì)圖像的處理方式
第二行為要求固定尺寸輸入的CNN (如R-CNN)的處理流程,先將圖片按照類似第一行中的方式進(jìn)行處理,然后輸入卷積以及全連接層,最后輸出結(jié)果
第三行為SPP-net的處理方式,不固定圖像的大小,直接輸入給卷積層處理,卷積出來的特征并不是直接輸入給全連接層,而是先給SPP層處理,然后得到一個(gè)固定長度的輸出傳給全連接層,最后輸出結(jié)果。

2.R-CNN為什么會(huì)有計(jì)算冗余?
如下圖所示
R-CNN對(duì)于一張圖片,先使用segment seletive方法提取出約2000個(gè)候選區(qū)域,然后將這兩千個(gè)候選區(qū)域分別送入網(wǎng)絡(luò)中,即一張圖片要經(jīng)歷2000次前向傳播,這樣會(huì)造成大量冗余。
SPP-net則提出了一種從候選區(qū)域到全圖的特征(feature map)之間的對(duì)應(yīng)映射關(guān)系,通過此種映射關(guān)系可以直接獲取到候選區(qū)域的特征向量,不需要重復(fù)使用CNN提取特征,從而大幅度縮短訓(xùn)練時(shí)間。每張圖片只需進(jìn)行一次前向傳播即可。

下面來詳細(xì)講解一下改進(jìn)的方法:
1.SPP層(spatial pyramid pooling)
首先要明確的是這一層的位置,這一層加在最后一個(gè)卷積層與全連接層之間,目的就是為了輸出固定長度的特征傳給要求固定輸入的全連接層
SPP層的結(jié)構(gòu)如下圖所示

SPP層的輸入:
如下圖灰色框所示
最后一層卷積輸出的特征(我們稱為feature map),feature map為下圖的黑色部分表示,SPP層的輸入為與候選區(qū)域?qū)?yīng)的在feature map上的一塊區(qū)域
上面這句話可能有點(diǎn)繞,我們可以理解為一張圖有約2000個(gè)候選區(qū)域,而對(duì)一張圖做完卷積后得到feature map,在這個(gè)feature map上也有約2000個(gè)與候選區(qū)域?qū)?yīng)的區(qū)域(這里的對(duì)應(yīng)關(guān)系下面會(huì)詳細(xì)講解)

SPP層的輸出:
SPP layer分成1x1,2x2,4x4三個(gè)pooling結(jié)構(gòu)(這部分結(jié)構(gòu)如下圖所示),對(duì)每個(gè)輸入(這里每個(gè)輸入大小是不一樣的)都作max pooling(論文使用的),出來的特征再連接到一起,就是(16+4+1)x256的特征向量。

無論輸入圖像大小如何,出來的特征固定是(16+4+1)x256維度。這樣就實(shí)現(xiàn)了不管圖像中候選區(qū)域尺寸如何,SPP層的輸出永遠(yuǎn)是(16+4+1)x256特征向量。
2.候選區(qū)域在原圖與feature map之間的映射關(guān)系
這部分的計(jì)算其實(shí)就是感受野大小的計(jì)算。
在CNN中感受野(receptive fields)是指某一層輸出結(jié)果中一個(gè)元素所對(duì)應(yīng)的上一層的區(qū)域大小,如下圖所示。

先定義幾個(gè)參數(shù),參數(shù)的定義參考吳恩達(dá)在cousera講解中對(duì)符號(hào)的定義,然后再講解怎么計(jì)算
| 類型 | 大小 |
|---|---|
| 第 |
|
| 第 |
|
| 第 |
|
| 第 |
|
| 第 |
輸入的尺寸大小與輸出的尺寸大小有如下關(guān)系:
上面是區(qū)域尺寸大小的對(duì)應(yīng)關(guān)系,下面看一下坐標(biāo)點(diǎn)之間的對(duì)應(yīng)關(guān)系
| 含義 | 符號(hào) |
|---|---|
| 在i層的坐標(biāo)值 | |
| i層的步長 | |
| i層的卷積核大小 | |
| i層填充的大小 | padding |
SPP-net對(duì)上面的坐標(biāo)對(duì)應(yīng)關(guān)系作了一定的簡化,簡化過程如下:
- 令每一層的padding都為
- 當(dāng) k_i 為奇數(shù)
所以
- 當(dāng)k_i 為偶數(shù)
所以
而是坐標(biāo)值,不可能取小數(shù) 所以基本上可以認(rèn)為
。公式得到了化簡:感受野中心點(diǎn)的坐標(biāo)
只跟前一層
有關(guān)。
那么對(duì)于下圖的做法,就是SPP-net的映射方法,SPP-net 是把原始ROI的左上角和右下角 映射到 feature map上的兩個(gè)對(duì)應(yīng)點(diǎn)。 有了feature map上的兩隊(duì)角點(diǎn)就確定了 對(duì)應(yīng)的 feature map 區(qū)域(下圖中橙色)。

從原圖坐標(biāo)到特征圖中坐標(biāo)
的映射關(guān)系為
- 前面每層都填充padding/2 得到的簡化公式 :
- 需要把上面公式進(jìn)行級(jí)聯(lián)得到
其中
- 對(duì)于feature map 上的
它在原始圖的對(duì)應(yīng)點(diǎn)為
- 論文中的最后做法:把原始圖片中的ROI映射為 feature map中的映射區(qū)域(上圖橙色區(qū)域)其中 左上角取:
右下角的點(diǎn)取:界取
的
值:
。
到這里就把SPPNet的核心思想講完了,SPPNet網(wǎng)絡(luò)后面和R-CNN類似,詳細(xì)參考R-CNN文章詳細(xì)解讀。該文章還用這些思想做了圖像分類的實(shí)驗(yàn),感興趣可以細(xì)讀原文的分類部分。
參考:
- http://www.robots.ox.ac.uk/~tvg/publications/talks/fast-rcnn-slides.pdf
- http://kaiminghe.com/iccv15tutorial/iccv2015_tutorial_convolutional_feature_maps_kaiminghe.pdf
- http://kaiminghe.com/eccv14sppnet/sppnet_ilsvrc2014.pdf
- https://zhuanlan.zhihu.com/p/24780433
- https://blog.csdn.net/u011974639/article/details/78053203#sppnet