一. 導論
SPP-Net是何凱明在基於R-CNN的基礎上提出來的目標檢測模型,使用SPP-Net可以大幅度提升目標檢測的速度,檢測同樣一張圖片當中的所有目標,SPP-Net所花費的時間僅僅是RCNN的百分之一,而且檢測的準確率甚至會更高。那麼SPP-Net是怎麼設計的呢?我們要想理解SPP-Net,先來回顧一下RCNN當中的知識吧。下圖為SPP-Net的結構:
二. RCNN
rcnn進行目標檢測的框架如下:
因此RCNN的步驟如下:
1.將影像輸入計算機當中
2.利用selective search演算法找到圖片當中屬於同一個物體的區域,並使用Bounding Box圈起來。這個演算法不屬於深度學習的演算法,而是一種傳統演算法,這個演算法不能夠在GPU上執行,只能在CPU上執行,因此相比於SPP-Net具有一定的侷限性。它是根據影像當中的各個部位的顏色,輪廓,紋理等將影像當中的事物進行分類。一共篩選出1-2k個候選區域,用region proposal來表示。
3. 將得到的候選區域全部進行剪裁或者縮放將其變為統一的大小,這樣才可以使用影像分類神經網路(AlexNet/Google InceptionNet/VGG)對每一個候選區域進行影像識別。因此這一步我們需要進行1-2k次卷積運算,對於時間而言非常不划算。
4.最後使用SVM分類器將候選區域當中的所有圖片通過全連線層進行分類,檢視看是否為我們所需要檢測的目標,並且輸出其名稱,如:人,飛機,電視機等等。同時進行bounding box的迴歸,這樣可以使得預測的bounding box的大小和位置更加準確。在論文當中bounding-box的迴歸公式如下:
最後使用SVM分類器而沒有使用softmax分類器的原因是在RCNN當中使用SVM後分類結果的準確率會更高(根據實驗得知),論文當中的說明如下:
mAP的大小表示的是目標檢測的準確率,是目標檢測領域中一種重要的評價指標。整體而言R-CNN的實現還是頗為簡單的,也很容易被人們所想到,這個演算法在當時也是非常優越的,使用selective search的方法代替了之前做目標檢測所使用的滑動視窗法來生成候選區域,不然的話使用滑動視窗法針對每個影像進行卷積運算我們可能不僅僅要進行1-2K次運算,最後運算的次數很可能是10k-50k次,這在時間上來說太不划算了,而且使用滑動視窗法還可能滑動的視窗沒有框到目標,因此會丟失掉準確率。SVM分類最後的輸出是每個影像bounding box的形狀大小,位置以及每一個bounding box內影像分類的結果以及概率。
那麼我們的SPP-Net在這之上做了哪些改進呢?
三. SPP-Net
SPP-Net發現在RCNN當中使用selective search的方法生成候選區域實在是太耗費時間了,因為所有生成的候選區域都要進行一次卷積運算來進行影像分類,那麼我們能不能夠直接只計算一次卷積而非1-2k次卷積呢?因此在SPP-Net當中我們省略掉了生成候選區域這一步,直接將影像做一次卷積運算,並且在卷積神經網路CNN之後增加了影像空間金字塔池化(SSP-Spatial Pyramid Pooling)的結構,這樣就可以根據影像的特徵將影像當中的目標區域進行分類。SPP-Net和RCNN的區別如下圖所示:
可以從上看出,影像輸入到網路中之後,RCNN將候選區域進行了剪裁和縮放,然後再把剪裁好的區域“喂”入到CNN當中,而spp-net則直接將整張圖片放入了卷積神經網路當中,然後使用spatial pytamid pooling(空間金字塔池化)提取卷積之後的特徵,最後使用全連線神經網路連同最後的輸出和空間金字塔池化層。在整個spp-net當中最為重要的結構則是我們用紅色字型標註出的spatial pytamid pooling(空間金字塔池化層)了。那麼整個結構是如何實現的呢?
四.空間金字塔池化結構
空間金字塔池化層的結構如上所示,Image經過一次卷積之後會得到256個特徵圖,也就是上面圖中最下面的一連串黑色堆疊圖,這是整個卷積神經網路的第五層嗎,因此稱為conv5。然後我們使用SSP結構對這256個特徵圖進行處理,將這256張特徵圖分別進行1*1,2*2,4*4的最大池化,也就是分別選取這256個特徵圖當中的最大值,然後最後的輸出也是256個每一層特徵圖的最大值。比如我們做空間金字塔池化最右邊的那個1*1池化,計算機僅僅會選取這256個特徵圖當中最大的值作為輸出的結果作為影像的語義特徵,這也就是最大池化,2*2的最大池化同理,但我們會做完2*2的最大池化之後會得到4個數值,每一個數值都代表這影像某一區域的特徵。因此最後我們會得到21(21=4*4+1*1+2*2)*256=5376個數值作為影像高度抽象的特徵。之後將這5376個特徵送入全連線神經網路(fc6和fc7,一共兩層全連線神經網路,這個完全看研究員自己的喜好來設定了,可以沒有,也可以多層),最後用SVM分類器輸出bounding box的x,y,w,h以及每一個bounding box的圖象分類的結果。小編在網上檢視了很多教程都沒有把空間金字塔池化結構解釋清楚,也是自己想了很久認真研讀了論文好幾遍才明白,畢竟論文上這一點其實也沒講得多清楚。最後輸出的結果如下圖所示:
那麼為什麼我們可以作這樣的處理呢?我們來看看論文當中是怎麼說的,下圖來自於spp-net的論文:
在圖的左邊,(a)代表了我們進行目標檢測的影像,(b)上面的那張圖是卷積神經網路的第175層輸出的結果,我們將其視覺化了,下面的那張特徵圖是卷積神經網路第55層的輸出結果,我們也將其視覺化了。我們發現汽車的窗戶正好在第175層的conv layer發現了這個特徵,並且高亮的了出來是白色,在影像上表示為這個區域的灰度是很大的(有0-255個數字,因此這個高亮的地方數值可能在200以上)。這個時候第55層的特徵圖發現了汽車的輪胎這一個特徵,在特徵圖當中也高亮了出來。這也是最後我們在金字塔池化層做最大池化的原因,因為最大池化就會將高亮的地方的特徵提取出來,我們只提取影像當中具有物體的特徵,從而忽略掉其他沒有無體的地方的特徵,最後再全連線神經網路當中進行特徵融合並歸類,就可以得到目標檢測的結果了!是不是很神奇呢?
終於寫完啦,如果覺得讀了小編的文章您有收穫的話,不要忘記了點選下方的“推薦”哦!您的支援就是對小編創作最大的動力!