SSD目標檢測演算法改進:DSOD(不需要預訓練的目標檢測演算法)

SSD目標檢測演算法改進:DSOD(不需要預訓練的目標檢測演算法)
論文的題目:DSOD: Learning Deeply Supervised Object Detectors from Scratch
論文下載連結:http://openaccess.thecvf.com/content_ICCV_2017/papers/Shen_DSOD_Learning_Deeply_ICCV_2017_paper.pdf
程式碼地址:https://github.com/szq0214/DSOD
ICCV2017的文章,有人說這篇文章並沒有太多的創新點,也有人說這篇文章很有意思。為什麼分歧那麼大?
提示:如果想了解DSOD的所有細節,要先理解SSD演算法,畢竟是對SSD的演算法進行的改進。
DSOD解決的主要問題:
不追求速度,不追求精確度(當然準確度還是有所提高的),而是DSOD演算法可以從零開始訓練(start form scratch),不需要預訓練。
自己的一些看法:
剛開始接觸的時候,覺得這沒什麼啊?從零訓練網路和預訓練的有什麼區別吶?而且有時候預訓練還能更快的收斂,節省訓練時間。
但是,預訓練也是有壞處的,比如Faster RCNN,就是與訓練的VGG,那麼VGG前面的幾層的網路結構就要固定了,是不能改變的。
這樣我們就不能知道前面幾層到底適不適合檢測問題吶?
整體思路:
DSOD的整個網路結構看下錶,
其實整個網路結構可以看成 Stem Block,Dense Block,Transition w/o Pooling Layer和最後的DSOD Prediction Layer組合而成。
分別來看這四個層的作用。
Stem Block:
    顧名思義,骨幹結構,由一個3*3stride為2的卷積核和兩個3*3stride為1的卷積核還有一個2*2的max pooling組成。有別於DenseNet的
一個7*7stride為2後接一個3*3 max pooling stride 為2的結構。
這個思路其實很常見,早在VGG中就開始使用了,Inception 系列使用的更多。另外這也是壓縮網路的
一個重要思路,就是將大的卷積核換成較小的卷積核的組合。
為什麼可以這樣設計?
因為一個兩個3*3的的卷積核和一個7*7的卷積核的感受野是一樣的,這樣的話,才能保證CNN看到的資訊不會變少。
3*3stride為1的卷積加上一個2*2的stride為2的pooling也可以做到3*3stride為2的pooling。所以這樣設計是可行的。
對感受野不清楚的話,可以參考這篇:http://blog.csdn.net/u010725283/article/details/78593410
那麼這樣做有什麼好處吶?
作者說是可以獲得更多的資訊(這個就需要看實驗結果了)。
Dense Block:
這個也是DenseNet的dense layer-wise connection。先說這個Dense Block能做什麼?
其實就是將前面層的feature map可以連線到現在層上,這樣就可以更好的利用前面層的資訊了。當然如何連線,可以參考DenseNet。
Transition w/o Pooling Layer
這個更簡單了,其實就是一個1*1卷積,這個在VGG也使用了。把1*1卷積擴充套件加上合理解釋的是NetWork in Net Work。其中好處就是feature map通道間的融合,
加上可以變換卷積核的數量。減少引數量等等好處。這個1*1找時間要好好研究一下。
DSOD Prediction Layer
    DSOD Prediction Layer層如下圖的結構。
左邊就是SSD演算法的檢測部分,右邊是DSOD的,整個其實還是DenseNet的思想,即將前面層的feature map和後面層的feature map連線到一起。
這個過程並沒有什麼新意。
以上就是DSOD,如果看過R-FCN的話就會有所感悟,R-FCN其實就是將Faster RCNN的主網路換成了ResNet,但是吶,作者發現使用全卷積網路結構的ResNet並不適合Faster RCNN,就進行了改進。
那麼DSOD我的理解就是,把SSD的主幹網路換成了DenseNet,那麼既然主幹網路都換了,為什麼最後的檢測層不能使用DenseNet的思想吶!這樣就有了DSOD的網路結構。
所以看到這,有些人就認為了,這個DSOD並沒有什麼新東西,都是拿先有的來組合一下,得到一個the state of art。
但是,作者卻有意外之喜,就是DSOD可以從零開始訓練,擺脫了在ImageNet大資料集上進行預訓練。這樣的檢測網路可是獨此一家。
這也是DenseNet有意思的地方。
另外又證明了DenseNet的思想是有效的,除了大家都在追求的更深的網路,更多的資料,還有一種思路是挖掘網路的能力,
充分挖掘網路各層蘊含的資訊,同樣可以提高網路能力。
換句話說就是對於一個資料集,並不是越深的網路就越好,還可以尋找更適合這個資料集的模型。
另外,DSOD的最大賣點就是可以從零開始訓練,這個從零開始訓練又有什麼好的吶?
這個可以分兩點來看,
  1. 在ImageNet上做預訓練,然後遷移到其他領域,有些情況這種遷移是不合適的,比如醫療中的影象,多光譜影象,sar影象。
  2. 另外就是會預訓練會限制網路的結構,比如常見的SSD,Faster RCNN等網路,他們的前幾層是不能動的。這樣就不能調整網路結構去適應更多計算有限的場景。比如在手機上部署這些網路。
參考:
DSOD:http://openaccess.thecvf.com/content_ICCV_2017/papers/Shen_DSOD_Learning_Deeply_ICCV_2017_paper.pdf
DenseNet:http://www.cs.cornell.edu/~gaohuang/papers/DenseNet-CVPR-Slides.pdf
感受野的計算:http://blog.csdn.net/u010725283/article/details/78593410