1. 程式人生 > 實用技巧 >Spatial Pyramid Pooling(SPP)原理簡介

Spatial Pyramid Pooling(SPP)原理簡介

b站這個Up主講的挺好,就是莫名其妙搞個背景音樂怪怪的。。。視訊講解
Spatial Pyramid Pooling(SPP)中文叫空間金字塔池化
SPP目的:這個原理要解決的是傳統CNN網路對輸入圖片尺寸要固定這個限制,比如AlexNet中的輸入圖片都有固定此村224×224,RCNN中為了講Proposals 做CNN卷積提取特徵也得先將不同大小的Proposal經過wrap縮放成同一大小。
為什麼CNN要求輸入的圖片尺寸固定呢?
因為CNN中的最後的全連線層的輸入尺寸是固定的(別問我全連線層為什麼輸入尺寸是固定的/狗頭),所以從全連線層倒推到前面的卷積層,卷積層的輸入也得是固定的了。

為什麼作者要解決這樣的限制呢,固定大小不行嗎?
那就得說到以R-CNN為代表的以深度學習來解決目標檢測的演算法模型了,RCNN首先用selective search的方法衝圖片中選出2000個region proposal,然後分別將這些proposal縮放為統一大小後傳入CNN進行前向傳播得到各個proposal的feature map,然後再使用全連線對這些feature map作分類處理。
這樣效率就非常低下,因為一張圖片就得經過2000次CNN的前向傳播,而且這些proposal中很多重疊的區域,十分浪費資源,雖然最終RCNN的精確度挺高,但是無論是空間還是時間都消耗很大。
所以為了解決這個問題,我們首先就得解決CNN對圖片大小輸入固定的要求!這樣我們就可以先提取整個圖片的特徵,然後將各個proposal對映到這個feature map上,對應每個proposal擷取feature map上對應的一部分,得到若干小的feature map,然後將這些大小各異的feature map輸入全連線層進行接下來的操作。
解決CNN對圖片大小的輸入實際上的切入點就是在最後一個卷積層和第一個全連線層之間的轉換處,在這裡加上我們本文的主角Spatial Pyramid Pooling層,它能夠不管輸入的feature map 多大,都提取出一個固定大小的feature vector出來傳給全連線層。

那麼Spatial Pyramid Pooling是如何做到的呢?
Spatial Pyramid Pooling結構:
在這裡插入圖片描述

可以看見,我們的輸入是最後一層卷積層得到的feature maps上每個proposal對映下來對應的個各自的feature map,大小不一。
這裡我們的Spatial Pyramid Pooling用三個尺寸不同的pooling 核來做池化操作,分別是44,2

2,11大小,但是這裡的三個pooling核的大小指的是他們會將被pooling的那層分成多少部分,然後每個部分進行pooling操作,例如44就是指不管上層大小多大,分成44個小格子大小,然後對這每個格子大小內的feature做pooling,如果是max pooling則是分別取這44個區域內各自的最大值,然後組成16個特徵(所以可以理解為這裡的pooling大小是指的輸出的尺寸大小 )。然後44+22+1*1=21,於是不管你的輸入是多大,SPP在每個channel上都會提取到21維的特徵向量!

池化操作對於每個feature map channel都是獨立進行的。.

這樣就使得我們的效率大大提升,每個region proposal不用單獨提取特徵,而是在已經提取的整張圖片的特徵上通過對映找到自己對應的那部分特徵,然後通過SPP層提取統一大小的特徵向量給全連線層進行接下來的操作!