SSD 學習與研究
目標檢測–SSD
論文地址:https://arxiv.org/abs/1512.02325
project:https://github.com/apache/incubator-mxnet/tree/master/example/ssd
其他參考連結:
1、https://blog.csdn.net/a8039974/article/details/77592395
2、https://www.cnblogs.com/fariver/p/7347197.html
3、https://www.sohu.com/a/168738025_717210
4、https://www.cnblogs.com/lillylin/p/6207292.html
5、https://cloud.tencent.com/developer/article/1052779
一、理解
1、對比
SSD的提出,為了解決實時性和準確性的問題。下面這種圖給出了對比,SSD有兩種模型,300和512代表不同size的輸入影象。
SSD的主要思想就以下幾點:
- 提出類似faster rcnn中的anchor機制,default box(與faster rcnn的區別:每個位置的default box一般是4~6個,Faster rcnn預設9個anchor;同時default box是設定在不同尺度的feature maps上的,且大小不同);
- 使用特徵金字塔的方式,類似FPN,取多個feature map的預測結果,可以同時監測大目標和小目標;
- 同樣是one-stage訓練,採用迴歸的思想;
- 使用多種size的輸入資料;
優缺點:
- 速度比YOLO快,準確率比faster rcnn高;
- 但是需要人工設定default box的min_size,max_size和aspect_ratio值,且每一層feature map下的值都不一樣;
- 對小目標的召回仍然不理想,作者認為,這是由於SSD使用conv4_3低階feature去檢測小目標,而低階特徵卷積層數少,存在特徵提取不充分的問題;
2、核心思想
2.0 特徵金字塔
與YOLO直接在卷積層後加全連線不同,SSD使用多個卷積層進行預測,即不同size的feature map結果。SSD使用conv4_3、conv7(fc7)、conv8_2、conv9_2、conv10_2和conv11_2來預測定位和confidence,如下圖所示。
特徵金字塔的意思如下圖所示。
2.1 default box
SSD中引入了default box,類似於faster rcnn中的anchor。但是不同於faster rcnn中,faster rcnn的預設anchor是9個,且只有最後特徵層進行anchor提取。
下面介紹SSD中的default box。其優點就是default box在不同的feature層有不同的scale,在同一個feature層又有不同的aspect ratio,基本上可以覆蓋輸入影象中的各種形狀和大小的object。
- 以feature map的每個location,都會生成多個同心的default box;
- 寬高比為1,2,3,1/2,1/3;
- 當寬高比為1時,方形box,最小邊長為min_size,最大邊長為根號下(min_size*max_size);
- 長方形的長和寬分別為根號下(aspect_ratio)*min_size、1/根號下(aspect_ratio)*min_size;
- 每個feature map的min_size、max_size都不一樣。
第一層feature map對應的min_size=S1,max_size=S2;第二層min_size=S2,max_size=S3;其他類推。在原文中,Smin=0.2,Smax=0.9,m是feature map的數量,SSD-300中m=6。
多個feature map生成的default box後,還經過 PriorBox 層生成 prior box(生成的是座標)。每個feature map中每一層的default box的數量是給定的(8732個)。最後將前面三個計算結果分別合併然後傳給loss層。
假定有8×8和4×4兩種不同的feature map。假設每個feature map cell有k個default box,那麼對於每個default box都需要預測c個類別score和4個offset,如果一個feature map的大小是m×n,則這個feature map就一共有(c+4)k * mn 個輸出。
prior box,是指實際中選擇的default box(每一個feature map cell 不是k個default box都取)。也就是說default box是一種概念,prior box則是實際的選取。
如果是圖中的5層feature map,最後會得到(38384 + 19196 + 10106 + 556 + 334 + 114)= 8732個prior box。
2.2 匹配策略
- 正樣本:與每一個groundtruth box有最大交併比的default box;或者default box與任意有一個groundtruth box的交併比超過了閾值;
- 負樣本:正樣本剩下的
由於負樣本數量遠大於正樣本數量,所以在訓練時,會挑選confidence高的box進行匹配,正負樣本比為1:3;
2.3 損失函式
損失函式仍然分為兩部分,confidence損失和location損失,如下面公式,其中N是所有default box的數量。
location損失採用smooth-L1損失,如下所示:
confidence損失使用softmax損失,如下,
其中
表示第i個default box匹配到了第j個groundtruth box,類別是p。
粘來別人的具體解釋:
2.4 訓練
- 使用資料增強:有6.7%的mAP提升;包括隨機裁剪,使得裁剪部分與目標重疊為0.1, 0.3, 0.5, 0.7, 0.9,剪裁完resize到固定尺寸;以0.5的概率進行水平翻轉;
- 使用基礎網路中的conv4_3進行檢測,提升小目標的召回率;增加這一部分大概會提示4%mAP;
- 使用不同寬高比的default box會提升2.9%mAP;
- 使用atrous卷積,預訓練模型VGG-16採用了atrous卷積,可以保持感受野不變的條件下,減少padding噪聲。使用這種預訓練模型會提高0.7mAP;
2.5 網路結構
SSD的結構在VGG16網路的基礎上進行修改,
針對conv4_3(4),fc7(6),conv6_2(6),conv7_2(6) ,conv8_2(4),conv9_2(4)(括號裡數字是每一層選取的default box種類)中的每一個再分別採用兩個3*3大小的卷積核進行卷積,這兩個卷積核是並列的,
- 這兩個33的卷積核一個是用來做localization的(迴歸用,如果prior box是6個,那麼就有64=24個這樣的卷積核,卷積後map的大小和卷積前一樣,因為pad=1,下同),
- 另一個是用來做confidence的(分類用,如果prior box是6個,VOC的object類別有20個,那麼就有6*(20+1)=126個這樣的卷積核)。
假設,conv6_2的localizaiton的33卷積核操作,卷積核個數是24(64=24,由於pad=1,所以卷積結果的map大小不變,下同),
這裡的permute層就是交換的作用,比如你卷積後的維度是32×24×19×19,那麼經過交換層後就變成32×19×19×24,順序變了而已。
而flatten層的作用就是將32×19×19×24變成32*8664,32是batchsize的大小。
另一方面結合conv4_3(4),fc7(6),conv6_2(6),conv7_2(6),conv8_2(4),conv9_2(4)中的每一個和資料層(ground truth boxes)經過priorBox層生成prior box。
經過上述兩個操作後,對每一層feature的處理就結束了。對前面所列的5個卷積層輸出都執行上述的操作後,就將得到的結果合併:採用Concat,類似googleNet的Inception操作,是通道合併而不是數值相加。
二、論文翻譯
1、摘要
提出一個比較小的深度神經網路用做影象中的目標檢測。本文的方法稱為SSD,對於每個feature map定位,將bounding box的輸出空間描述為一組default box,有不同的寬高比、大小。在預測時,這個網路對每個default box,生成每個目標類別可能存在的分數,然後調整box以適合目標的shape。此外,這個網路結合了多種解析度的feature map的預測,可以自然地處理各種大小的目標。SSD相對於那些需要目標proposal的方法來說要簡單,因為它完全消除了proposal的產生和隨後畫素或特徵的重取樣步驟,將所有計算都壓縮在一個簡單網路中。這使得SSD很容易訓練,並且可以直接整合到需要檢測成分的系統中。在PASCAL VOC、COCO、ILSVR資料集上的實驗結果證明,SSD對比那些使用額外目標proposal的方法具有可競爭性的準確率,並且比這些方法更快,為訓練和推斷提供了一個統一的框架。使用英偉達Titan X,對於300x300的輸入,SSD在VOC2007測試資料集上,74.3%mAP,59FPS,對於512x512的輸入,SSD是76.7%mAP,超過了faster RCNN。相對其他single-stage方法,SSD使用更小size的輸入影象有更高的準確率。原始碼見: https://github.com/weiliu89/caffe/tree/ssd .
2、介紹
前面巴拉巴拉一堆廢話。這篇論文提出第一個基於目標檢測器的深度網路,而不依賴於對bounding box假設的畫素或特徵衝取樣,並且同樣準確。這個結果又很大的提升。在VOC2007測試集上,59FPS,74.3%mAP,而faster RCNN的7 FS,73.2%mAO,YOLO 45FPS,63.4%mAP。速度上的提高主要是消除了bounding box proposal和畫素、特徵的重取樣步驟。本文並不是第一個做這些的,但是通過新增一系列的提高,我們比先前的嘗試準確率有明顯的提高。我們的提高包括,使用小的卷積核來預測目標類別和bounding box定位的偏移。分別使用不同比例的檢測器預測,在網路的最後階段,在多層feature map上應用這些filter,以實現多種scale的檢測。這些修改,特別是使用不同scale的多層預測,我們可以實現相對低解析度的輸入的高準確率,進一步提高檢測速度。儘管這些貢獻似乎每個單獨來說都比較小,但是對於在PASCAL VOC的實時檢測上,YOLO只有63.4%mAP,而SSD有74.3%mAP。從最近有著高收益的殘差網路來說,相對於檢測正確來說,這個相對來說提升更大。進一步,高質量檢測的速度顯著提升可以擴充套件應用範圍,計算機視覺是有用的。
本文的貢獻點如下:
- 我們介紹了SSD,一個針對多目標的single-shot的檢測器。比之前state-of-the-art的single-shot的檢測器YOLO要快,並且準確率更高。事實上,相同準確率更慢的技術,使用明確的region proposals和池化(包括faster RCNN)
- SSD的核心是,對於一組default bounding box的修正集合,預測類別分數和box offset,對feature map使用小的卷積核。
- 為了實現高的檢測準確率,我們對不同scale的feature map產生預測,然後通過寬高比分別採用這些預測。
- 這些設計的特徵導致簡單的端到端訓練和高準確率,甚至是在低解析度的輸入影象上。進一步提高了速度。
- 實驗包括模型在PASCAL VOC, COCO, and ILSVRC資料集上,不同輸入大小之間關於時間和準確率的分析。並且於最近的state-of-the-art方法進行了比較。
3、The Single Shot Detector (SSD)
這一部分介紹提出的SSD框架和相關的訓練方法。然後給出具體資料集的模型細節和實驗結果。
3.1 model
SSD方法是基於前饋卷積神經網路,該網路產生固定大小的bounding box的集合,和這些box是否存在目標類別例項的分數,然後使用非極大值一直產生最終的檢測。早期的網路層是基於標準架構,使用高質量影象分類(在任何分類層中刪除頂端),我們稱之為基礎網路,然後將輔助功能新增到網路中以產生檢測,具有以下關鍵特徵:
多尺度feature map檢測. 我們在截斷基礎網路後添加了卷積層,這些層的尺寸逐漸減小,並允許在多個尺度上預測檢測。用於預測檢測的卷積層對每個特徵層(操作在單個尺度的feature map)是不一樣的(參見overfeat、YOLO)。
針對檢測的卷積預測器. 每一個新增的feature層(或者是從基礎網路中選擇已存在的一組),使用一組卷積核,都可以產生一組固定的檢測預測集合。這些可以在圖2中,SSD網路架構的頂端看到。對於一個feature層,其size為mnp通道,潛在檢測的預測引數的基礎元素是33p的卷積核,用來生成類別的分數或者相對於default box座標的shape偏移。對m*n的每一個位置採用卷積核,將產生一個輸出值。對於每個feature map的location,bounding box偏移輸出值是相對於default box的位置計算的(參加YOLO的結構,直接使用全連線層的而不是卷積濾波器用於這一步)
default box和寬高比. 對網路頂層的多個feature map,我們將一組default bounding box的集合與每一個feature map cell相關聯。default box以卷積的方式平鋪feature map,因此每一個box的位置與其相對的cell是固定的。對每一個feature map cell,我們預測每個cell相對default box的shape的偏移,同樣,也預測每一個類別分數,表明在每個box中這個類別例項的存在可能性。特別地,對給定location的k個box的每一個,我們計算c個類別分數和4個相對於原始default box shape的偏移。在feature map的每個location,有(c+4)k個濾波器,因此,對m*n的feature map,有(c+4)kmn個輸出。有關default box的說明,可以參見圖1.我們的default box相對於faster rcnn中使用的anchor box要小,但是我們在不同解析度的幾個feature map上使用。在幾個feature map上允許不同的default box shape使得我們可以有效地離散可能的輸出輸出box shape空間。
3.2 training
在訓練SSD和訓練使用region proposal的典型檢測器來說,其關鍵區別就是,在固定檢測器輸出集合上,groundtruth資訊需要指定特定的輸出。一些版本訓練時也需要指定,如YOLO,還有faster-rcnn、multibox中的region proposal階段。一旦配置決定,損失函式和反向傳播就可以端到端。訓練時也涉及到選擇檢測的default box和scale的集合,同樣需要困難負樣本的挖掘的資料增強策略。
匹配策略. 在訓練時,我們需要確認,哪個default box與groundtruth檢測相關聯,並且進行相關地訓練。對每個groundtruth box,我們從default box中選擇,這些box的寬高比、尺寸都不一樣。通過將每個groundtruth box與default box進行最佳jaccard重疊(如multibox)匹配。但不同於multibox,我們然後將default box與所有groundtruth進行了jaccard重疊超過0.5的進行了匹配。這簡化了學習問題,允許網路對預測多個重疊的default 認box的高分,而不是隻選取最大重疊的那個。
訓練目標. SSD的訓練目標源自multibox,但是擴充套件為處理多個目標類別。
可以認為是類別p的第i的default box和第j個groundtruth box的匹配。在以上的匹配策略中,可以使得
整個目標損失是定位損失的加權和confidence損失,如下:
其中,N是匹配到的default box的數量。如果N=0,則損失設為0。定位損失採用預測box(l)和groundtruth box(g)引數之間的smooth l1損失。類似faster-rcnn,我們迴歸default bounding box(d)的中心偏置(cx, cy)和寬(w)、高(h)。
confidence損失是多個類別confidence©的softmax損失,其中權重引數α在交叉驗證時設定為1。
為default box選擇尺度和寬高比. 為了處理不同尺度的目標,一些方法建議處理不同size的影象,然後再結合結果。然而,通過利用一個網路中的不同層的feature map來做預測,可以模仿相同的效果,且共享了所有尺度的目標的引數。先前的工作展示出,使用低層的feature map可以提到語義分割質量,因為低層捕捉到了輸入目標更細節的東西。類似的,xx論文展示出,從一個feature map上新增全域性環境池化可以幫助平滑分割結果。受這些方法啟發,我們使用了高層和低層的feature map用來檢測。圖1中,兩個feature map(8x8和4x4)用在了這個框架中。事實上,我們可以用一點小的開銷,使用更多的feature map。
一個網路中不同層的feature map已知是不同感受野大小的。幸運的是,SSD框架,default box不需要與每一層的實際感受野相關聯。我們設計了default box的平鋪,因此指定feature map學習相應的特定尺度的目標。假設我們想要使用feature map來預測,每個feature map default box的尺度如下計算:
其中,s_min=0.2,s_max=0.9,意味著最低層的scale是0.2,最高層是0.9,中間所有層都是規律間隔。我們對default box施以不同寬高比,表示
我們可以為每一個default box計算其寬和高
對於寬高比為1,我們新增一個default box,其scale是
這樣可以造成每個feature map location有6個default 認box。我們設定每個default box的中心是
其中|f_k|是第k個feature map的大小,切i,j屬於[0, [f_k]]。事實上,也可以設計成default box的分佈以最好的擬合特定資料集。如何設計最好tiling是一個開放的問題。
通過結果來自很多featuremap的所有location的不同scale和寬高比的所有default box的預測,我們有了大量預測集合。覆蓋了不同size和shape的輸入目標。例如,圖一中,狗與4x4的feature map中的一個default 認box匹配,但是與8x8的feature map的所有default box都不匹配。這是因為這些不同scale的box不匹配狗的box,因此在訓練中被認為是負樣本。
hard negative挖掘. 在結束匹配後,大多數default box都是負的,特別是當可能的default box比較大的時候。這裡介紹了一個明顯的正負訓練樣本不均衡的例子。我們不使用所有的負樣本,而是將這些負樣本,按照每個default box的最高confidence 損失進行排序,並且選擇最高的一個,因此正負樣本的比例是1:3。我們發現,這可以導致更快的優化和更穩定的訓練。
資料增強. 為了使得模型對於不同size和shape的輸入更具有魯棒性,每一個訓練影象都使用下列方法進行隨機採用:
- 使用整個原始的輸入影象
- 取樣一個影象塊,使得與目標的最小jaccard重疊分別是 0.1, 0.3,0.5, 0.7, or 0.9.
- 隨機取樣影象塊
每一個取樣的影象塊的發現都是原來影象size的[0.1, 1],並且寬高比在12與2之間。如果groundtruth box的中心在取樣影象塊中,我們保留與groundtruth box重疊的部分。在上述提到的取樣之後,每一個取樣的影象塊被resize為固定的size,並且以0.5的概率進行水平翻轉,此外還新增一些測光扭曲等。
4、Experimental Results
基礎網路. 我們的網路是基於VGG-16的,並且在ILSVRC CLS-LOC資料集上進行了預訓練。類似於DeepLab-LargeFOV,我們將fc6和fc7轉換成了卷積層,下采樣fc6和fc7的引數,改變pool5的池化核,將2x2改為3x3,然後使用 `a trous 演算法來充滿”holes”。我們去除了所有的dropout層和fc8層。使用SGD,初始學習率為0.001,momentum=0.9,weight decay=0.0005,batch size=32,進行微調結果。學習率衰減策略每個資料集都略有不同,細節稍後給出。開原始碼見:https://github.com/weiliu89/caffe/tree/ssd
4.1 PASCAL VOC2007
在PASCAL VOC2007資料集上與fast rcnn、faster rcnn方法進行了比較,測試集是4952張影象。所有方法都是在預訓練的VGG-16模型上微調的。
圖2是SSD-300模型的網路細節。我們使用conv4_3、conv7(fc7)、conv8_2、conv9_2、conv10_2和conv11_2來預測定位和confidence。設定conv4_3的default box,scale=0.1。
4.2 Model analysis
4.3 PASCAL VOC2012
4.4 COCO
4.5 Preliminary ILSVRC results
4.6 Data Augmentation for Small Object Accuracy
4.7 Inference time
5、結論
這篇論文介紹了SSD,一個基於多類別的快的single-shot的檢測器。我們這個模型的關鍵特徵是使用與網路頂層多個feature map匹配的mult-scale的卷積bounding box的輸出。這種表示允許我們有效地訓練可能的box的shape空間。我們進行實驗驗證了給定的合理的訓練策略,一組數目很大的經過仔細選擇的default box結果可以提高效能。與現有方法相比,我們建立的SSD模型,至少有一個數量級的box預測取樣位置、scale、寬高比。我們表明,在給定相同的VGG-16基礎架構,SSD相比之前的state-of-the-art目標檢測器在準確率和速度上都實現了超越。我們的SSD-512明顯地比state-of-the-art faster rcnn在PASCAL VOC 和 COCO資料集上的準確率要高,並且有3倍快。我們的實時SSD-300速度是59FPS,比目前的實時YOLO要快,且檢測準確率更高很多。
除了這些獨立的實用性,我們相信,我們的單片和相對簡單的SSD模型為更大的需要目標檢測的系統提供了有用的building block。一個充滿希望的未來方向是探索使用RNN來檢測,並同時跟蹤視訊目標,來作為系統的一部分使用。