SSD目標檢測演算法改進DSSD(反捲積)
轉自: https://blog.csdn.net/u010725283/article/details/79115477
論文:DSSD : Deconvolutional Single Shot Detector
DSSD是2017年的CVPR,二作就是SSD的一作Wei Liu。另外值得一提的是,一作Cheng Yang Fu和Wei Liu大神已經合作發表
好幾篇文章。
SSD的作者們對其做的改進肯定會有些方向性,畢竟他們可是深知SSD的優點和缺點啊!
個人的一些見解:
對state of the art的演算法進行改進的時候最主要的是找準方向。
大家最常用的思路就是找缺點,比如ssd演算法一個比較大的缺點是對小目標不夠魯棒。
但是這種缺點在目前基於CNN的目標檢測演算法都很常見。無非是有些演算法相對好一些而已。
那麼,知道了缺點了,如何去改進吶?改進的方法是不是具有普遍性?能不能擴充套件這種改進方法?
如果能回答了以上這些問題的改進方法,是具有方向性的,就是在此基礎上,再做一些工作就可以更進一步的去改進演算法。
或者這類改進演算法並不是只適應一種演算法,比如Faster RCNN中的RPN網路和Anchor 的思想,SPPNet中的SPP layer等等,
這些改進同樣適應其他演算法,Fast RCNN使用了SPP layer,改進成為了ROI Pooling。
DSSD的貢獻:
本文最大的貢獻,在常用的目標檢測演算法中加入上下文資訊。通俗點理解就是,基於CNN的目標檢測演算法基本都是利用一層的
資訊(feature map),比如YOLO,Faster RCNN等。還有利用多層的feature map 來進行預測的,比如ssd演算法。那麼各層之間的資訊的結合並沒有充分的利用。
DSSD演算法就是為了解決這個問題的。
DSSD演算法的由來:
既然是SSD演算法的改進演算法,我們先看看SSD演算法的一些缺點。
SSD演算法的缺點眾所周知了,就是對小目標不夠魯棒。我們先分析一下為什麼會對小目標不夠魯棒的。
先回憶一下YOLO演算法,把檢測的圖片劃分成14*14的格子,在每一個格子中都會提取出目標檢測框,最初的時候每一個格子
只會提取出一個目標框,這時問題就很大,因為可能會有兩個目標落入一個格子中,那麼就會出現漏檢。
順理成章的是,在一個格子中提取出多個檢測框來匹配目標,這時我們可以使用Anchor的思路,一個格子中加上6到9個不同的
檢測框。這樣就可以匹配大部分目標了。這也算解決了漏檢問題了。
但是還是會有問題的,比如我們的9個Anchor比較大的話,比較小的目標就又無法匹配到了。那怎麼解決吶?
SSD的思路就是我可以在更潛的一些層(feature map)上,來更好的匹配小目標。換句話說就是把圖片分成的格子更小了,
一張圖片分成的格子的數目變多了。那麼這樣再在這些格子中使用Anchor ,這樣漏檢的概率就會大大減小了。
所以SSD的mAP比YOLO提高了不少。
但是!
在淺層提取的feature map表徵能力不夠強,也就是淺層的feature map中每個格子也可以判斷這個格子中包含的是哪一個
類,但是不夠那麼確定!
可能會出現混淆。就是框是標對了,但是分類有可能出錯,或者置信度不夠高,不確定框裡面的東西是什麼?(有可能是分錯
類,也有可能是背景誤認為成目標)。
這樣同樣會出現誤檢和漏檢。這種情況對於小目標出現的概率更高。所以SSD演算法對小目標還是不夠魯棒。
那怎麼辦?
DSSD的網路結構:
經過以上的分析我們知道,SSD演算法對小目標不夠魯棒的最主要的原因是淺層feature map的表徵能力不夠強。
DSSD就使用了更好的基礎網路(ResNet)和Deconvolution層,skip連線來給淺層feature map更好的表徵能力。
這也是DSSD演算法的核心思想。
具體怎麼做?
既然DSSD演算法的核心思想就是提高淺層的表徵能力,首先想到的肯定是將基礎網路由VGG換成ResNet,
更深的網路表徵能力就更強這基本成為了大家的共識了。
上表說明了在VGG和ResNet上哪些層作為最後的預測feature layer。如果不明白這張表的話,再仔細看一下SSD的網路結構圖
就知道怎麼回事了。
另外值得一提的是,這些層可不是隨便選的,大致要和VGG對應,且感受野也要對應,這樣才能保證效果會提高,要不然反而會
變差也不好說。
看看加上ResNet的SSD的效果。
實驗結果很明顯,圖片大小不夠的時候,ResNet的SSD和VGG的SSD效果其實相當,整體甚至還會稍微差一些。
(這裡作者沒有分析,我對這塊也是不明白,為什麼吶?歡迎討論)。
到了512*512的尺度上時,ResNet的下過就明顯要好了。尤其是標粗的小目標(bird)。
這也印證了之前的分析,淺層更具有表徵能力時,對小目標效果就會更好。
基於ResNet的實驗,還沒有完,在預測階段作者同樣做了一些工作就是修改一下預測模組。這個靈感作者說是來自MS-CNN指
出改善每個任務的分支網路同樣可以提高準確率。
作者使用了四種不同的預測模組。如下圖:
Prediction Module :
這四個不同的預測模組就不細講了,其實就是將ResNet進行到底,預測階段同樣是用這個思路。
效果確實得到了提高,如下表:
基於ResNet的實驗基本做完了,下面就看這篇文章的最重要的點,Deconvolution模組的使用。
Deconvolution Module:
在第一張圖片中的這個小圓就是代表了 Deconvolution Module 。它的結構如下圖所示:
被紅色框部分圈住的可以有兩種連線方式,Eltw Product其實就是矩陣的點積,還有sum的形式就是求和。
在caffe中的可以用下面的prototxt檔案來描述。
- layer {
- name: "fuse"
- type: "Eltwise"
- bottom: "A"
- bottom: "B"
- top: "C"
- eltwise_param {
- operation: SUM
- }
- }
operation引數表明使用哪種操作,SUM是預設操作,就是將A和B相加減。PROD表示點積,MAX求最大值。
如上表,結果是使用prod的效果會更好一點。
將ResNet,Deconvolution Module,Prediction Module結合在一起就是最終的DSSD演算法了。
所有新的網路的提出,如果沒有講是如何訓練的,我覺得都是在耍流氓。
訓練部分作者基本沿用SSD的訓練方法。
當然,ResNet要比VGG的收斂速度要快很多。
總結:提高淺層的表徵能力,是可以提高類似檢測器對小目標的檢測能力。按照這個方向走是正確的。
參考:
SSD
MS-CNN: