簡介
在ImageNet資料集上,PeleeNet隻有MobileNet模型的66%,并且比MobileNet精度更高。PeleeNet作為backbone實作SSD能夠在VOC2007資料集上達到76.4%的mAP。文章總體上參考DenseNet的設計思路,提出了三個核心子產品進行改進,有一定參考價值。
核心
PeleeNet實際上是DenseNet的變體,使用的依然是DenseNet的連接配接方法,核心的設計原則也和DenseNet相仿(特征重用)。
核心子產品:
- Two-Way Dense Layer
上邊左邊(a)圖是DenseNet中設計的基本子產品,其中k、4k代表filter的個數。右邊(b)圖代表PeleeNet中設計的基本子產品,除了将原本的主幹分支的filter減半(主幹分支感受野為3x3),還添加了一個新的分支,在新的分支中使用了兩個3x3的卷積,這個分支感受野為5x5。這樣就提取得到的特征就不隻是單一尺度,能夠同時兼顧小目标和大目标。
這種設計和人臉檢測算法SSH很像,隻不過多了一個跨層連接配接,下圖是SSH context Module:
思想相似,實作略有不同。
- Stem Block
這個子產品設計受Inceptionv4和DSOD的啟發,想要設計一個計算代價比較小的子產品。ResNet和DenseNet在第一層都是用的是一個7x7、stride為2的卷積層,淺層網絡的作用是提取圖像的邊緣、紋理等資訊,一般。Stem Block的設計就是打算以比較小的代價取代7x7的卷積。
這個子產品可以在幾乎不增加計算量的情況下提升特征的表達能力。這部分感受野計算可以參考這篇文章中的公式目标檢測和感受野的總結和想法。
仔細看看上圖展示的結構,先使用strided 3x3卷積進行快速降維,然後用了兩分支的結構,一個分支用strided 3x3卷積, 另一個分支使用了一個maxpool。
這一部分群組合池化非常相似,stem block使用了strided 3x3卷積和最大值池化兩種的優勢引申而來的池化政策(組合池化使用的是最大值池化和均值池化),可以豐富特征層。
- 瓶頸層設定動态變化的通道數
在DenseNet中,有一個超參數k-growth rate, 用于控制各個卷積層通道個數,在DenseNet的瓶頸層中,将其固定為4k,也就是說瓶頸層是增加了模型的計算量,而不是減小模型的計算量。在PeleeNet中,将瓶頸層的通道個數根據輸入的形狀動态調整,節約了28.5%的計算消耗。
- 過渡層
在DenseNet中,過渡層是用于将特征圖空間分辨率縮小的,并且過渡層中通道數會小于前一層的通道數。在PeleeNet中将過渡層和前一層通道數設定為一樣的數值。
- 複合功能
為了提高速度,采用了conv+bn+relu的組合(而不是DenseNet中的預激活組合(conv+relu+bn)), 這樣做是為了友善進行卷積和BN的合并計算,加速推理階段的速度。
用PeleeNet做backbone優化SSD
- 特征圖選擇:選取了五個尺度的特征圖(19x19,10x10,5x5,3x3,1x1),沒有使用38x38大小的特征圖
- 殘差預測子產品:residual prediction block, 該子產品是用于對以上選取的幾個特征圖進行進一步的特征提取
- ResBlock子產品中使用1x1卷積相比直接用3x3卷積,可以減少21.5%的計算量。
PeleeNet是按照以下結構進行組織的。
實驗
消融實驗:
訓練政策采用的是餘弦學習率變化,在Standford Dog和ImageNet資料集上進行的訓練。
總結
PeleeNet相當于是避開了深度可分離卷積的使用,僅僅使用普通的卷積,就讓模型能在移動端裝置上實時運作。
核心創新點主要是Two-way Dense layer、Stem Block、ResBlock。各種對比實驗做得比較充分,代碼也開源了,官方代碼大部分是基于caffe的,也有少部分是用pytorch建構的。
總體來說,PeleeNet創新程度一般,但是作者團隊工程能力很強,實驗非常豐富。PeleeNet将很多細碎的點融合到一起,最終在移動端裝置上的表現還不錯,也被很多研究輕量化網絡的文章用來對比。
參考
https://github.com/Robert-JunWang/Pelee
https://github.com/Robert-JunWang/PeleeNet
https://arxiv.org/pdf/1804.06882.pdf
代碼改變世界