[人工智能-深度学习-72]:卷积神经网络 - 空间金字塔池化SPP-Net网络与Pytorch代码实现
作者主頁(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文網址:https://blog.csdn.net/HiWangWenBing/article/details/122249302
目錄
第1章?SPP-Net網絡概述
1.1 什么是SPP-Net?
1.2 SPP-Net的基本思想
1.3?SPP-Net的好處與優點
第2章?SPP網絡結構
2.1 SPP?金字塔池化層的位置
2.2 SPP的特征提取
第3章 包含SPN結構的網絡的訓練
3.1?Multi-size training
3.2?single-size
第4章 SPP網絡的pytorch實現
第1章?SPP-Net網絡概述
1.1 什么是SPP-Net?
SPP-Net是一種可以不用考慮圖像大小,輸出圖像固定長度網絡結構,并且可以做到在圖像變形情況下表現穩定。SPP-Net是出自論文《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》。
在SPP-Net之前,所有的神經網絡都是需要輸入固定尺寸的圖片,比如224*224(ImageNet)、32*32(LenNet)、96*96等。這樣對于我們希望檢測各種大小的圖片的時候,需要經過resize、crop,或者warp等一系列操作,這都在一定程度上導致圖片信息的丟失和變形,限制了識別精確度。而且,從生理學角度出發,人眼看到一個圖片時,大腦會首先認為這是一個整體,而不會進行crop和warp,所以更有可能的是,我們的大腦通過搜集一些淺層的信息,在更深層才識別出這些任意形狀的目標。
1.2 SPP-Net的基本思想
SPP-Net對這些網絡中存在的缺點進行了改進,基本思想是:輸入整張圖像,提取出整張圖像的特征圖,然后利用空間關系從整張圖像的特征圖中,在spatial pyramid pooling layer提取各個region proposal的特征。
?一個正常的深度網絡由兩部分組成,卷積部分和全連接部分,要求輸入圖像需要固定size的原因并不是卷積部分而是全連接部分。所以SPP層就作用在最后一層卷積之后,SPP層的輸出就是固定大小。
1.3?SPP-Net的好處與優點
- SPP-net不僅允許測試的時候輸入不同大小的圖片,
- 訓練的時候也允許輸入不同大小的圖片,
- 通過不同尺度的圖片同時可以防止overfit(過擬合)
- SPP-net的效果已經在不同的數據集上面得到驗證,速度上比R-CNN快24-102倍。在ImageNet 2014的比賽中,此方法檢測中第二,分類中第三。
第2章?SPP網絡結構
2.1 SPP?金字塔池化層的位置
卷積層的參數和輸入大小無關,它僅僅是一個卷積核在圖像上滑動,不管輸入圖像多大都沒關系,只是對不同大小的圖片卷積出不同大小的特征圖。
但是全連接層的參數就和輸入圖像大小有關,因為它要把輸入的所有像素點連接起來,需要指定輸入層神經元個數和輸出層神經元個數,所以需要規定輸入的feature的大小。因此,固定長度的約束僅限于全連接層。
SPP-Net在最后一個卷積層后,接入了金字塔池化層,使用這種方式,可以讓網絡輸入任意的圖片,而且還會生成固定大小的輸出。因此,SPP網絡的核心就是金字塔池化層。
2.2 SPP的特征提取
我們先從空間金字塔特征提取說起(這邊先不考慮“池化”),空間金字塔是很久以前的一種特征提取方法,跟Sift、Hog等特征息息相關。為了簡單起見,我們假設一個很簡單兩層網絡:
輸入層:一張任意大小的圖片,假設其大小為(w,h)。
輸出層:21個神經元。
也就是我們輸入一張任意大小的特征圖的時候,我們希望提取出21個特征。
空間金字塔特征提取的過程如下:
(1)圖片輸入
黑色圖片代表卷積之后的特征圖,其尺寸是任意的,該特征作為SPP網絡的輸入。
(2)特征提取網格的定義(SPP池化層網格的定義)
生成三個SPP池化核,每個SPP池化核代表的是輸出特征的網格,網格的大小,不同的應用,大小不同,這里假設為:4*4, 2*2, 1*1。
SPP池化核網格的個數,決定了輸出的大小,而不是輸入的大小。
SPP池化核網格的作用是均分任意長度尺寸圖片的像素,如:
4 * 4的網絡,就是把輸入圖片均分成 4 * 4 = 16個塊,而不管輸入圖片的尺寸到底是多少。
1 * 1的網絡,就是把輸入圖片均分成 1 * 1 = 01個塊,而不管輸入圖片的尺寸到底是多少。
這樣可以得到16+4+1=21種不同的固定長度的輸出塊(Spatial bins)。
注意:SPP的池化層與CNN網絡中的池化層的定義是不同的。
- CNN的池化層:定義的是池化核的大小和stride的大小。
- SPP的池化層: 首先, SPP定義三個池化核。其二,SPP池化核網格的大小,如4 * 4,不是池化核的大小,而是輸出特征的大小。
(3)對任何長度的輸入圖片的重新切分/劃分
?如上圖所示,當我們輸入一張任意尺寸的圖片的時候,我們利用不同網格大小的池化核,對一張圖片進行了劃分。
第1個SPP池化核=(4 * 4),? 把一張完整的任意長度的輸入圖片,分成了16個塊,也就是每個塊的大小就是(w/4,h/4);
第2個SPP池化核=(2 * 2),?,? 把一張完整的任意長度的輸入圖片,分成了4個塊,也就是每個塊的大小就是(w/2,h/2);
第3個SPP池化核=(1 * 1),?,? 把一張完整的任意長度的輸入圖片,分成了1個塊,也就是每個塊的大小就是(w,h);
經過上述的切分,可以得到最后總共可以得到16+4+1=21個塊,即一個固定長度的特殊輸出。
(4)最大池化特征提取
對每個網格,按照各自占用輸入特征的范圍,各自獨立的進行池化,支持的算法算法有:
- 最大池化
- 最小池化
- 平均池化
(5)固定長度的特征輸出
最大池化后,每個網格輸出一個最大池化值,一共輸出21個最大特征值,這21個輸出特征值組成了最終的輸出。這樣就可以把任意長度的特征值,轉化為一個固定大小的特征值了,由于SPP采用了三層不同的池化核,因此轉化后的特征值,既包含了高層抽象特征,也包含了低層的具體特征。
當然你可以設計其它維數的輸出,增加金字塔的層數,或者改變劃分網格的大小)。
上面的三種不同刻度的劃分,每一種刻度我們稱之為:金字塔的一層。
空間金字塔池化,使得任意大小的特征圖都能夠轉換成固定大小的特征向量,這就是空間金字塔池化的奧義(多尺度特征提取出固定大小的特征向量)。
備注:空間金字塔池化,與其他池化一樣,對channel維度沒有影響。?
第3章 包含SPN結構的網絡的訓練
3.1?Multi-size training
使用兩個尺度進行訓練:比如,224*224 和180*180。
訓練的時候,224x224的圖片通過crop原始圖片得到,180x180的圖片通過進一步縮放224x224的圖片得到。
之后,迭代訓練,即用224*224的圖片訓練一個epoch,然后在用180*180的圖片訓練一個epoch,交替地進行。
兩種尺度下,在SPP結構后,輸出的特征維度都是(9+4+1)x256,參數是共享的,之后接全連接層即可。
3.2?single-size
理論上說,SPP-net支持直接以多尺度的原始圖片作為輸入。
實際上,深度學習框架,為了計算的方便,GPU,CUDA等比較適合固定尺寸的輸入,所以訓練的時候輸入是固定了尺度了的。
第4章 SPP網絡的pytorch實現
待續。。。。。。。參考:
https://blog.csdn.net/hjimce/article/details/50187655
作者主頁(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文網址:https://blog.csdn.net/HiWangWenBing/article/details/122249302
總結
以上是生活随笔為你收集整理的[人工智能-深度学习-72]:卷积神经网络 - 空间金字塔池化SPP-Net网络与Pytorch代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 经典算法题-----猴子吃桃的问题
- 下一篇: 类似win7系统泡泡屏保