今天准備再更新一篇博客,加油呀~~~
系列博客鏈接:
(一)目標檢測概述 https://www.cnblogs.com/kongweisi/p/10894415.html
(二)目標檢測算法之R-CNN https://www.cnblogs.com/kongweisi/p/10895055.html
本篇博客概述:
1、SPPNet的特點
1.1、映射(減少卷積計算、防止圖片內容變形)
1.2、spp層:空間金字塔層(將大小不同的圖片轉換成固定大小的圖片)
2、SPPNet總結
完整結構+優缺點總結
引言:
前面介紹的R-CNN的速度慢在哪里?
答:每個候選區都要進行卷積操作提取特征。因此,SPPnet孕育而生。

1、 SPPNet
SPPNet提出了SPP層,主要改進了以下兩個方面:
- 減少卷積計算
- 防止圖片內容變形

圖1 R-CNN與SPPNet
圖1中第一行代表R-CNN的檢測過程,第二行是SPPNet的。輸入進R-CNN卷積層的圖像必須固定大小,因此要進過crop/warp,這會使原圖片變形。
而SPPNet直接將原圖片輸入CNN中,獲其特征,使得原圖片內容得以保真。
| R-CNN模型 | SPPNet模型 |
|---|---|
| 1、R-CNN是讓每個候選區域經過crop/wrap等操作變換成固定大小的圖像 2、固定大小的圖像塞給CNN 傳給后面的層做訓練回歸分類操作 | 1、SPPNet把全圖塞給CNN得到全圖的feature map 2、讓候選區域與feature map直接映射,得到候選區域的映射特征向量 3、映射過來的特征向量大小不固定,這些特征向量塞給SPP層(空間金字塔變換層),SPP層接收任何大小的輸入,輸出固定大小的特征向量,再塞給FC層 |
1.1 映射
原始圖片經過CNN變成了feature map,原始圖片通過選擇性搜索(SS)得到了候選區域,現在需要將基於原始圖片的候選區域映射到feature map中的特征向量。
映射過程圖參考如下:

整個映射過程有具體的公式,如下
假設(x′,y′)(x′,y′)表示特征圖上的坐標點,坐標點(x,y)表示原輸入圖片上的點,那么它們之間有如下轉換關系,這種映射關系與網絡結構有關:(x,y)=(S∗x′,S∗y′),即
-
左上角的點:
- x′=[x/S]+1
-
右下角的點:
- x′=[x/S]−1
其中 SS 就是CNN中所有的strides的乘積,包含了池化、卷積的stride。論文中使用S的計算出來為=16
原論文鏈接,其中有公式的推導過程 http://kaiminghe.com/iccv15tutorial/iccv2015_tutorial_convolutional_feature_maps_kaiminghe.pdf
1.2 spatial pyramid pooling (空間金字塔變換層)
通過spatial pyramid pooling 將任意大小的特征圖轉換成固定大小的特征向量
示例:假設原圖輸入是224x224,對於conv出來后的輸出是13x13x256的,可以理解成有256個這樣的Filter,每個Filter對應一張13x13的feature map。
接着在這個特征圖中找到每一個候選區域映射的區域,spp層會將每一個候選區域分成1x1,2x2,4x4三張子圖,對每個子圖的每個區域作max pooling,
得出的特征再連接到一起,就是(16+4+1)x256的特征向量,接着給全連接層做進一步處理,如下圖:

2、 SPPNet總結
來看下SPPNet的完整結構

- 優點
- SPPNet在R-CNN的基礎上提出了改進,通過候選區域和feature map的映射,配合SPP層的使用,從而達到了CNN層的共享計算,減少了運算時間, 后面的Fast R-CNN等也是受SPPNet的啟發
- 缺點
- 訓練依然過慢、效率低,特征需要寫入磁盤(因為SVM的存在)
- 分階段訓練網絡:選取候選區域、訓練CNN、訓練SVM、訓練bbox回歸器, SPP-Net在fine-tuning階段無法使用反向傳播微調SPP-Net前面的Conv層
