1. 程式人生 > >SSD目標檢測演算法改進DSSD(反捲積)

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檔案來描述。

  1. layer {  
  2.   name: "fuse"  
  3.   type: "Eltwise"  
  4.   bottom: "A"  
  5.   bottom: "B"  
  6.   top: "C"  
  7.   eltwise_param {  
  8.     operation: SUM  
  9.   }  
  10. }  

operation引數表明使用哪種操作,SUM是預設操作,就是將A和B相加減。PROD表示點積,MAX求最大值。

如上表,結果是使用prod的效果會更好一點。

將ResNet,Deconvolution Module,Prediction Module結合在一起就是最終的DSSD演算法了。

所有新的網路的提出,如果沒有講是如何訓練的,我覺得都是在耍流氓。

訓練部分作者基本沿用SSD的訓練方法。

當然,ResNet要比VGG的收斂速度要快很多。

總結:提高淺層的表徵能力,是可以提高類似檢測器對小目標的檢測能力。按照這個方向走是正確的。

參考:

SSD

MS-CNN: