# Object Detection - SSD > [name=謝朋諺(Adam Hsieh)] > [time=Fri, Dec 6, 2019 3:34 PM] ###### tags: `paper` --- ## Reference > [论文阅读:SSD: Single Shot MultiBox Detector](https://blog.csdn.net/u010167269/article/details/52563573) > [SSD算法详解default box](https://blog.csdn.net/wfei101/article/details/78176322) > [目标检测-SSD-Single Shot MultiBox Detector-论文笔记](https://arleyzhang.github.io/articles/786f1ca3/) > [目标检测算法之SSD](https://blog.csdn.net/xiaohu2022/article/details/79833786) > [Single Shot MultiBox Detector论文翻译——中文版](http://noahsnail.com/2017/12/11/2017-12-11-Single%20Shot%20MultiBox%20Detector%E8%AE%BA%E6%96%87%E7%BF%BB%E8%AF%91%E2%80%94%E2%80%94%E4%B8%AD%E6%96%87%E7%89%88/) > [deeplab hole algorithm](https://www.cnblogs.com/jianyingzhou/p/5386222.html) > [论文阅读笔记:图像分割方法deeplab以及Hole算法解析](https://blog.csdn.net/tangwei2014/article/details/50453334) > [深度學習: RPN (區域候選網絡)](https://blog.csdn.net/JNingWei/article/details/78847696) > [Faster RCNN之RPN理解](https://zhuanlan.zhihu.com/p/59186710) --- # SSD: Single Shot MultiBox Detector [論文連結](https://arxiv.org/pdf/1512.02325.pdf) {%pdf https://arxiv.org/pdf/1512.02325.pdf%} ## Outline > [TOC] ## 摘要重點 - 將檢測過程整合成一個 Single Deep Neural Network。 - SSD 輸出一系列離散化的 Bounding Boxes,這些 Bounding Boxes 是在不同 Layers 上的 Feature maps 中生成的,並且有著不同的分辨率,以自然地處理各種大小的物件。 - 消除了提出生成和像素或特徵重新採樣的階段,並將所有計算封裝到一個網路中。 - 速度很快準確性也很高。 - 對於 300x300 的輸入,SSD 在 VOC2007 測試中以 59FPS 的速度在 Nvidia Titan X 上達到 74.3% 的 mAP,512x512 的輸入 SSD 可達到 76.9% 的 mAP,優於當時最先進的 Faster R-CNN。 ## 本文貢獻 - 開發另一種多類別的 single-shot 檢測器,比 YOLO 更快,並且準確得多。 - SSD 的核心是預測固定的一系列默認邊界框的分類分數和邊界框偏移量,使用更小的卷積濾波器應用到特徵映射上。 - 為了實現高度檢測精度,我們根據不同尺度的特徵映射生成不同尺度的預測,並通過長寬比明確分開預測。 - 這些設計功能使得在低解析度輸入影像上也能實現簡單的端對端訓練和高精度,從而進一步提高速度與精度。 - 在 PASCAL VOC、COCO、ILSVRC 上評估具有不同輸入大小模型的時間和精度分析,並與最近的最新方法進行比較。 ## SSD 模型 ![](https://i.imgur.com/MJ201ty.png) ![](https://i.imgur.com/xwMWNLf.png) :::info :bulb: **兩個 single shot 檢測模型的比較:SSD、YOLO** * SSD 模型在基本 model 後面加了許多的 feature layers,它預測了不同尺寸和長寬比的默認邊界框偏移量以及其信心值。 * SSD 在 $300 \times 300$ 的輸入尺寸比起 YOLO 的 $448\times 448$ 的準確率在 VOC2007 test 資料集上明顯有改善速度也更快。 ::: - 網路模型如上圖,前面是一個 VGG pre-train model 用於特徵提取,並將 VGG 的 FC6、FC7 換成 CNN,SSD 在後面又加了 8 個 CNN。 - 最終用於預測的是從這些金字塔結構的層中選出的特定層,這些層分別對不同 ==scale==(scale 的平方是面積,這個參數是假設不考慮長寬比的時候,box 的邊長)和不同的 ==aspect ratios==(長寬比)的邊界框進行預測。 - bounding box 是 detector/classifier 對 default box 進行回歸生成的,而 default box 是由一定規則生成的,這裡可以認為 default box 比較像 Faster R-CNN 中的 RPN 生成的region proposal,也就是兩步檢測方案中候選框的作用。 實際上更精確的說 default box 是與 RPN 中的 anchor 機制類似的,而 anchor 實際上在RPN 中也就是起到了一種 region proposals 的作用。 - detector/classifier (圖中沒有顯示)對這些 default box 進行關於類別和位置的回歸,然後得出一個類別得分和位置坐標偏移量。根據坐標偏移量可以計算出 bounding box 的位置,根據得分確定此 bounding box 裡的物體類別(每個類別都包含 8732 個 bounding box,大部分都是背景或者說共有 8732 個 bounding box,每個 bounding box 都對一個 C 維的分數,C 為類別總數)。 - SSD 網路產生固定大小的邊界框集合,並對偵測到的物件進行類別評分,最後再進行==非極大值抑制 (Non-Maximum Suppression,NMS)== 過濾掉背景和分數不是很高的框 (為了避免重複預測)。 SSD 與 YOLO 兩種方案的不同主要有兩點: - SSD是在多個 feature map 上進行多尺度(multi-scale)預測(每個 feature map 預測一種 scale )。而 YOLO 是只在一個 feature map 上進行多尺度預測。兩種方案的對比還可以從下面兩張圖中對比,這圖是從 FPN 的論文裡找的。 - SSD 中用於預測的層也就是 detector/classifier 是全卷積的(上圖中沒有顯示 detector,後面有圖示),而 YOLO 中是全連接的。 | <img src='https://i.imgur.com/4D6Qjzs.png'> | <img src='https://i.imgur.com/37Z9JnY.png'> | | :--------: | :--------: | | YOLO | SSD | ![](https://i.imgur.com/nZ9klNk.png) 另外下圖是在 inference 時模型從一張圖片中提取物件的過程,可以看得出來是從不同 layer 下取出的物件的過程: ![](https://i.imgur.com/OVkSshm.png) - **Multi-scale feature maps for detection:** 基礎網路末端添加了額外的卷積層,每個卷基層的的尺寸都會逐漸減小,可以在多尺寸上進行預測。 - **Convolutional predictors for detection:** 每個額外添加的卷基層或者在基礎網路中的卷積特徵層,可以使用一組的卷積濾波產生固定的檢測預測集合。 - 從上圖可看到特徵層大小為 $m \times n$ 具有 *p* 通道的特徵層,使用卷積濾波就是 $3\times 3\times p$ 的 kernal 會產生類別的預測==分數==跟相對於預設框座標的==形狀偏移量==。 - 邊界框的偏移量(offset)是默認框與 Feature map location 之間的相對距離(YOLO 是用全連接層代替這裡的卷積層)。 - **Default boxes and aspect ratios:** 每一個被選中預測的 feature layer,其每個位置(cell)都關聯 $k$ 個 default box,對每個 default box 都要輸出 $C$ 個類別分數和 4 個坐標偏移量,因此每個 default box 有$(C+4)$ 個輸出,每個位置有 $(C+4)k$ 個輸出,對於 $m×n$ 大小的 feature map 輸出為 ==$(C+4)\times k\times m\times n$== 個輸出,這個機制跟 anchor 非常相似。 ![](https://i.imgur.com/Kf0ezxh.jpg) :::info :bulb: **SSD 的框架圖** - (a)在訓練期間,SSD 僅需要每個物件的輸入圖像和真實邊界框。 - 以卷積方式,我們評估具有不同尺寸(例如(b)和(c)中的 8×8 和 4×4 )的幾個特徵映射中每個位置處不同長寬比的默認框的小集合(例如 4 個)。 - 對於每個默認邊界框,我們預測所有目標類別 ($(c_1,c_2,…,c_p)$) 的形狀偏移量和信心度。 - 在訓練時,我們首先將這些默認邊界框與實際的邊界框進行匹配。例如,我們有兩個默認邊界框,已經與貓匹配與狗各匹配了一個,這兩者都被視為 positive,其餘的是 negative。 - 模型損失是定位 loss(例如,Smooth L1)和信心分數 loss(例如 Softmax )之間的加權和。 ::: ## 訓練 在訓練時,本文的 SSD 與那些用 ==region proposals + pooling== 方法的區別是,SSD 訓練圖像中的 groundtruth 需要賦予到那些固定輸出的 boxes 上。在前面也已經提到了,SSD 輸出的是事先定義好的,一系列固定大小的 bounding boxes。 如上圖狗狗的 groundtruth 是紅色的邊界框,但進行 label 標註時,要將紅色的 groundtruth box 賦予圖(c)中一系列固定輸出的 boxes 中的一個,即圖(c)中的紅色虛線框。 事實上,文章中指出,像這樣定義的 groundtruth boxes 不止在本文中用到。在 **YOLO**、**Faster R-CNN** 中的 region proposal 階段,以及在 **MultiBox** 中都用到了。 當這種將訓練圖像中的 groundtruth 與固定輸出的 boxes 對應之後,就可以 end-to-end 的進行loss function 的計算以及 back-propagation 的計算更新了。 訓練中會遇到一些問題: * 選擇一系列 default boxes * 選擇上文中提到的 scales 的問題 * Hard negative mining * Data augmentation ### Matching strategy 這個策略是為了定位問題引入的,由於 $檢測 = 分類+定位$,這裡的定位使用的是回歸方法。 在 SSD 中,通俗的說就是先產生一些預選的 default box(類似於 anchor box),然後 Label 是 ground truth box,預測的是 bounding box,現在有三種框,從 default box 到 ground truth 有個變換關係,從 default box 到 prediction bounding box 有一個變換關係,如果這兩個變換關係是相同的,那麼就會導致 prediction bounding box 與 ground truth 重合,如下圖: ![](https://i.imgur.com/jPdbJbu.png) 所以回歸就是這兩個變換關係: $l_*\ 與\ g_*$,只要兩者接近就可以使 Prediction bounding box 接近 ground truth box。 所以上面的 $g_*$ 是只在訓練的時候才有,inference 時就只有 $l_*$ 了,但是這時候 $l_*$ 已經相當精確了,所以就可以產生比較準確的定位效果。 做法是計算 default box 與任意的 ground truth box 之間的杰卡德係數(jaccard overlap ),其實就是 IOU,只要二者之間的閾值大於 0.5,就認為這是個正樣本。 值得注意的是這裡不光是給每個 groudtruth box 找到了最匹配的 prior box,而是給每個 prior box 都找到了匹配的 groundtruth box(如果有的話),這樣顯然大大增大了正樣本的數量。 ### Training objective ![](https://i.imgur.com/MxRijRB.png) * SSD 的 Loss 同樣跟 YOLO 一樣是 multi-task loss,即包含了定位和分類。 * 假設 $x^p_{ij}=1$ 表示==第 $i$ 個 default box== 與==類別 p== 的==第 $j$ 個 ground truth box== 相匹配,如果不匹配則 $x^p_{ij}=0$,根據上面這個匹配策略,一定有 $\displaystyle\sum_{i}x_{ij}^p\ge 1$,意味著對於==第 j 個 ground truth box== 有可能有多個 ==default box== 與其相匹配。 * 總物件偵測的 loss function 就是 ==localization loss (loc)== 和 ==confidence loss (conf)== 的加權和: ![](https://i.imgur.com/QcOG0VS.png) * 其中 N 是匹配成功的正樣本數量,如果 $N=0$,則令 $loss=0$ * $\alpha$ 是定位損失與分類損失之間的比重,這個值論文中提到是通過交叉驗證的方式設置為 1。 * **localization loss**:與 Fster R-CNN 是一樣的,都是用 Smooth L1 loss: ![](https://i.imgur.com/uPsPGTY.png) * $l$ 代表預測 bounding box 與 default box 之間的變換關係,$g$ 代表的 ground truth box 與 default box 之間的變換關係。 * 我們回歸邊界框 (d) 的中心偏移量 $(cx,cy)$ 和其寬度 ($w$)、高度 ($h$) 的偏移量。 * 代表第 $i$ 個 default box 與類別 $p$ 的第 $j$ 個 ground truth box 是否匹配,匹配為 1,否則為 0; $x^p_{ij}=\{0,1\}$ * **confidence loss**:是在多類別信心分數上的 softmax loss。 ![](https://i.imgur.com/vza6DKa.png) :::warning :fire: 注意一點: **localization loss** 中是只有正樣本的 loss,而 **confidence loss** 中是包含了正樣本和負樣本的。 因為對於定位問題來說,只要回歸出精確的變換關係,在預測的時候是不需要區分正負樣本的 (或者說是依靠分類來區分的),只需要將這個變換關係應用到所有的 default box ,最後使用 NMS 過濾掉得分少的樣本框即可。但是分類就不一樣了,分類是需要區分出正負樣本的。 ::: ### Choosing scales and aspect ratios for default boxes default box 是 bounding box 的初始參考,也就相當於 region proposals,那麼為了保證預測時對不同面積大小(等同於 scale)和不同縱橫比(aspect ratio)的物件進行預測,很明顯 default box 也應該是具有不同 scale 和 aspect ratio。 RPN 中,每個 feature map cell 所關聯的 9 種 anchor box 也是具有不同 scale 和 aspect ratio 的,他們的作用是類似的。 在其他一些目標檢測模型中比如 **overfeat** 和 **SPPNet** 中,為了達到對不同 scale 和 aspect ratio 的目標的預測效果,採用的方法是對原始圖片進行不同程度的縮放,以達到 Data augmentation。這種方式可以稱為 Featurized image pyramids,如下圖示,實際上每個尺度都是一個獨立的網絡和預測結果。 <img src='https://i.imgur.com/ROWmCpU.png' width='100%'> 這種方式輸入尺寸在變化,然而網絡中的全連接層要求固定的輸入,所以overfeat 和SPPNet 為了解決這個問題,分別使用了offset pooling和SPP pooling的結構,使得從卷積層輸入到全連接層的特徵維度固定。 SSD的解決方法比較新穎: ![](https://i.imgur.com/OVkSshm.png) 如上圖,每個 feature layer 預測一種 scale,feature layer 上每個位置(cell )的 k 個default box 的長寬比(aspect ratio)是不同的,這就實現了 multi-scale 預測的方式。 下面這個圖就很好的說明了這種方式,(b) 和 \(c\) 代表不同的預測 feature layer,其中的 default box 的 scale 是不一樣的,同一個 feature layer 中的同一個 cell 位置處的 default box 的 aspect ratio 也是不一樣的。 ![](https://i.imgur.com/Kf0ezxh.jpg) 假設模型在 $k$ 個 feature layer 上進行預測,那麼每個 feature layer 上的 default box 的 scale 怎麼選呢?如下式: ![](https://i.imgur.com/8BXa3zG.png) * $S_{min}=0.2, S_{max}=0.9$,也就是說最底層的 scale 是 0.2,最高層的 feature layer 的 scale 是 0.9 * 中間其它層的 scale 按照公式依次遞增。 * 每個 feature layer 都負責對不同面積大小的物件進行預測。 但是我們知道物件不僅有大小之分,長寬比也是有變化的,即便兩個物件大小是接近的,他們的長寬比(aspect ratio)也有可能是不同的,也即不可能也不應該把所有的物件都當成正方形的形狀。那 aspect ratio 怎麼確定呢? 這裡與 Faster R-CNN 中的解決方法是一樣的:也是==人為設定==幾種 aspect ratio,SSD 中設定的幾種 aspect ratio 用 $a_r$ 表示分別是 ==$a_r=\{1,2,3,\dfrac{1}{2},\dfrac{1}{3}\}$== 然後根據 **scale** 和 **aspect ratio** 就可以計算出 default box 真實的寬和高了,如下兩式: $$w_k^a=s_k\sqrt{a_r}$$ $$h_k^a=\dfrac{s_k}{\sqrt{a_r}}$$ 這樣對於 feature layer 上的每個 cell 都有 5 個不同比例的 default box,然後作者在$aspect\ \ ratio=1$ 時,又添加了一種 scale,即 ==$s'_k=\sqrt{s_ks_{k+1}}$==,這樣一來==每個 cell 就有 6 個不同的 default box==。 那麼 default box 的中心坐標怎麼確定呢?如下: $$(\dfrac{i+0.5}{|f_k|},\dfrac{j+0.5}{|f_k|})$$ * $|f_k|$ 是第 $k$ 個 square feature map 的大小。 * $i,j\in [0,|f_k|]$,這個公式是一個歸一化坐標,最終會映射到原圖上,以確定原圖上對應的區域。之所以加 0.5 是為了把 default box 的中心設在與之關聯的 cell 的中心,如下圖: ![](https://i.imgur.com/CI325Qa.png) 這樣生成一系列 default box 之後,就有了預測 bounding box 的初始參考,最終的 bounding box 會在 default box 的基礎上產生偏移,也就是說由於不同 scale 和 aspect ratio 的 default box 的存在會使網絡產生很多的預測 bounding box,這些預測包含了不同尺寸和形狀的目標物體,如上圖,在 $4\times4$ 的 feature map 中只有狗(紅色框)是正樣本,這是因為不同的 feature map 負責預測的 scale 和 aspect ratio 是不同的,所以在 $8\times8$ 的 feature map 中由於貓的 scale 不匹配,會被認為是負樣本。同理,在 $8\times8$ 的 feature map 中只有貓(藍色框)是正樣本。 ### Hard negative mining 由於存在大量的負樣本,所以導致嚴重的類別不平衡問題,訓練時難以收斂。 解決方法是:對負樣本根據 confidence loss(也就是分類損失)排序,選取損失最高的一部分保留 (也就是最不像目標的那些),使得負樣本和正樣本的比例保持在 ==3:1==,文章使用這個比例獲得了穩定的訓練性能加快了優化速度。 ### Data augmentation 為了使模型對於不同尺寸和長寬比的目標更加穩定性,使用了數據擴增。 每張訓練圖像隨機進行如下操作: * 使用原圖。 * 在原圖上採樣一個 patch,這些 patch 與目標的 IOU 為 0.1, 0.3, 0.5, 0.7, 0.9。 * 隨機採樣一個 patch。 採樣的 patch 與原圖的比例在 $[0.1-0.9]$ 之間,aspect ratio 在 $1/2$ 到 $2$ 之間。經過以上採樣之後,採樣的 patch 會被 resize 到固定大小並以 0.5 的機率進行==水平翻轉==。 這種擴充資料集的方式增強了模型對目標平移的敏感程度。 ## Experimental Results ### Base network ![](https://i.imgur.com/0EVUYXh.png) * Base network 是基于 ICLR 2015, VGG16 來做的,在 ILSVRC CLS-LOC 資料集上進行了預訓練。 * 本文將 VGG 中的 FC6 layer、FC7 layer 轉成為卷積層,並從模型的 FC6、FC7 上的參數,進行採樣得到這兩個卷積層的參數。 * 還將 Pool5 layer 的參數,從 $2\times 2-s2$ 轉變成 $3\times 3-s1$ 外加一個 pad(1),如下圖: ![](https://i.imgur.com/yDu1S9l.png) 但是這樣變化後,會改變 **receptive field** 的大小。因此,採用了 **atrous algorithm** 的技術,也就是 **hole filling algorithm**。 其實就是 conv6 採用擴展卷積或帶孔卷積 (Dilation Conv),其在不增加參數與模型複雜度的條件下指數級擴大卷積的視野,使用的是擴張率 (dilation rate) 參數,來表示擴張的大小,如下圖所示: ![](https://i.imgur.com/tHQqujT.png) (a) 是普通的 $3\times3$ 卷積,其視野就只有 $3\times3$ (b) 是擴張率為 2,此時是也變成 $7\times7$ \(c\) 擴張率為 4,視野擴大為 $15\times15$,但是視野的特徵更稀疏了。 而 Conv6 採用的就是 $3\times3$ 大小但 $dilation\ \ rate=6$ 的擴展卷積。 > From:[deeplab hole algorithm](https://www.cnblogs.com/jianyingzhou/p/5386222.html) > ![](https://i.imgur.com/WQPGCac.png) > > 最早用的就是deeplab 的文章了,Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFS 這篇文章和fcn 不同的是,在最後產生score map 時,不是進行upsampling,而是採用了hole algorithm,就是在pool4和pool 5層,步長由2 變成1,必然輸出的score map 變大了,但是receptive field 也變小了,為了不降低receptive field,怎麼做呢?利用hole algorithm,將捲積weights 膨脹擴大,即原來卷積核是3x3,膨脹後,可能變成7x7 了,這樣receptive field 變大了,而score map 也很大,即輸出變成dense 的了。 > > > 這麼做的好處是,輸出的score map 變大了,即是dense 的輸出了,而且receptive field 不會變小,而且可以變大。這對做分割、檢測等工作非常重要。 > From:[论文阅读笔记:图像分割方法deeplab以及Hole算法解析](https://blog.csdn.net/tangwei2014/article/details/50453334) > ![](https://i.imgur.com/CWb8K5x.png) > 既想利用已經訓練好的模型進行 fine-tuning,又想改變網絡結構得到更加 dense 的 score map. > > 這個解決辦法就是採用 Hole 算法。如圖 (a) (b) 所示,在以往的捲積或者 pooling 中,一個 filter 中相鄰的權重作用在 feature map 上的位置都是物理上連續的。如圖(c)所示,為了保證感受野不發生變化,某一層的 stride 由2 變為1 以後,後面的層需要採用 hole 算法,具體來講就是將連續的連接關係是根據 hole size 大小變成 skip 連接的(圖(c)為了顯示方便直接畫在本層上了)。不要被(c)中的 padding 為 2 嚇著了,其實 2 個 padding 不會同時和一個 filter 相連。 > > pool4 的 stride 由 2 變為 1,則緊接著的 conv5_1, conv5_2 和 conv5_3 中 hole size 為 2。接著 pool5 由 2 變為 1 , 則後面的 fc6 中hole size 為 4。 * 本文還將 VGG16 的所有 Dropout layers 跟 fc8 layer 移除掉。 * 本文使用預訓練的 VGG model 時初始為: * Learning Rate : $10^{-3}$ * momentum : $0.9$ * weight decay : 0.0005 * batch size : 32 * learning rate decay 的策略隨資料集不同而變化 ### Inference * 整體預測流程如下圖: ![](https://i.imgur.com/OYXvaaU.png) * 上面圖中被紅框框起來的 detector 和 classifier 的詳細結構如下圖: ![](https://i.imgur.com/LCMPgnm.png) * 這是其中一個 scale 的預測流程 * 可以看出分類和定位都是通過卷積層預測的,假設某個用於預測的 feature map 是 $5×5×256$ 的,default box=3,那麼用於定位的捲積層輸出是 $5×5×12$ 的($4×3=12$,每個通道代表一個位置因素(x,y,w,h)),用於分類的捲積層輸出是 $5×5×63$ 的($21×3=63$,每個通道代表一個類別) * 每個用於預測的 feature map 後面可以認為接了三個並行的層,一個 default box generator,一個 detector,一個 classifier。 * 上面圖中的 default box generator 如下圖: ![](https://i.imgur.com/fj7VP5w.png) * detector 和 classifier 對某個 bounding box 的回歸: ![](https://i.imgur.com/9Y256LA.png) * 所有的 bounding box 回歸之後,是很亂的,然後再通過 NMS 過濾掉一大部分 * 這只是其中某一個 feature map 的預測結果 ![](https://i.imgur.com/A6vV3Ti.png) * 當把所有用於預測的 feature map 進行預測之後(multi-scale),再通過一個 NMS,又過濾掉一部分,保留下來的即是最終的結果 ![](https://i.imgur.com/OVkSshm.png) ### PASCAL VOC2007 * 在這個數據集中,與 Fast R-CNN、Faster R-CNN 進行了比較,幾種檢測網絡都用相同的訓練數據集,以及預訓練模型(VGG16) * 本文訓練圖像是 VOC 2007 train + VOC 2007 validation + VOC 2012 train + VOC 2012 validation,共計 **16,551** 張圖像; * 測試集選取的是 VOC 2007 test,共計 **4,952** 張圖像。 * 我們用 ==conv4_3==、==conv7==(原先的 FC7)、==conv8_2==、==conv9_2==、==conv10_2==、以及 ==pool11==,這些層來預測 location、confidence。 * 因為 conv4_3 的尺寸比較大,尺寸為 $38×38$ 的大小,我們只在上面放置 4 個 default boxes,box 的 **scale** 為 0.1。 * 另外在 conv4_3、conv10_2 和 conv11_2 我們只在每個特徵映射位置上關聯 4 個 default boxes,忽略了 **aspect ratio** 為 $\dfrac{1}{3}$、$3$ 的框。但對於其他用來做預測的圖層都放了 $6$ 個 default boxes。 * 最後會得到 $(38*38*4+19*19*6+10*10*6+5*5*6+3*3*4+1*1*4)=8732$ 個 default box ![](https://i.imgur.com/TDfefYs.png) * 一開始使用的是 $10^{-3}$ 的學習率進行 40k 次的迭代訓練,然後再改成 $10^{-4}$ 學習率進行 10k 次 以及 $10^{-5}$ 學習率 10k 次的訓練。 ![](https://i.imgur.com/ee3Oqvs.png) :::info :bulb: PASCAL VOC2007 test 檢測結果 * Fast 和 Faster 都使用最小為度為 600 的輸入影像,兩個 SSD 模型使用完全相同的設置除了他們有不同的輸入大小 ($300\times300、512\times512$)。 * 資料集描述: * "07": VOC2007 train+val * "07+12": VOC2007+VOC2012 train+val * "07+12+COCO": 首先在 COCO train+val 135k 上訓練,然後才在 VOC2007+VOC2012 上微調 ::: * 上表顯示 SSD300 精度已經超過 Faster R-CNN 當我們用 SSD 在更大的影像尺寸上,$500\times 500$ 訓練得到的 model,甚至要比 Faster R-CNN 還要更高出 2.8% mAP。 ![](https://i.imgur.com/l2etDVi.png) :::info :bulb: SSD512 在 VOC2007 test 中的動物、車輛和傢俱上的性能比較 * 第一行顯示由於定位不佳(Loc),與相似類別(Sim)混淆,與其它(Oth)或背景(BG)相關的正確檢測(Cor)或 False Positive 的累積分數。 * 紅色的實線表示隨著檢測次數的增加,強標準(0.5 Jaccard 重疊)下的 recall 變化。紅色虛線是使用弱標準(0.1 Jaccard 重疊)。 * 最下面一行顯示了三個類別 False Positive 的分佈。 ::: ![](https://i.imgur.com/nTpcUBy.png) :::info :bulb: 左邊的圖顯示了 BBox Area 對每個類別的影響,右邊的圖顯示了長寬比的影響。 Key:BBox Area:XS=超小;S=小;M=中等;L=大;XL=超大 長寬比:XT=超高/窄;T=高;M=中等;W=寬;XW =超寬。 ::: * 上圖顯示 SSD 對邊界框大小非常敏感,也可以說他==對小物件比對大物件上的性能要差得多==。 ### 模型分析 ![](https://i.imgur.com/3ZIcUwZ.png) * **Data augmentation is crucial**:本文使用的數據擴增的方式對預測精度的提升特別明顯,使用比不使用提高了 8.8%。作者估計本文的數據擴增方式對 Fast R-CNN 和 Faster R-CNN 的預測效果提升不會太多,因為 Fast R-CNN 和 Faster R-CNN 中使用的 ROI 池化本來就對目標的平移很敏感,這比人為擴充數據集魯棒性更強。 * **More default box shapes is better**:更多樣性化的 default box 顯然會產生更好的結果。 * **Atrous is faster**:論文使用了 atrous algorithm,這是一種稱為帶孔卷積的捲積方式。 ![](https://i.imgur.com/uxkzSqg.png) * **Multiple output layers at different resolutions is better**:做這個對照實驗的時候,為了保證公平,刪掉某一層的時候,會把這一層的 default box 掛載在剩下的層上面並調整 scale,以保證總的 default box 數量不變(8732),堆疊 default box 時會有很多 box 是在圖像的邊緣位置,對這種 box 的處理方式跟 Faster R-CNN 的一樣,就是直接忽略。 * 結合高層的粗粒度的 feature map,比如 conv11_2(1×1),進行預測時,效果會下降,這是因為網絡越深,感受的區域越大,物件如果沒有那麼大的話,越到後面物件的資訊越少,甚至就缺失了。 ### PASCAL 2012 ![](https://i.imgur.com/qddiavf.png) :::info :bulb: PASCAL VOC2012 test上的檢測結果 * Fast 和 Faster R-CNN 使用最小維度 600 的圖像,而 YOLO 的圖像大小為 $448\times448$。 * "07+12":VOC2007 train+val+test 和 VOC2012 train+val 當作訓練資料。 * "07+12+COCO":先在 COCO train+val 135k 上訓練然後在 VOC 07+12 上微調。 ::: * 使用 VOC2012 的 train+val 和 VOC2007 的 train+val+test 共 (21503 張影像)做訓練,使用 VOC2012 test (10991 張影像) 做測試。 * 先以 $10^{-3}$ 的學習率進行 60k 的迭代訓練,然後再使用 $10^{-4}$ 的學習率進行 20k 的訓練。 ### COCO ![](https://i.imgur.com/kxwPVsO.png) * 使用 train+val 35k 進行訓練,使先用 $10^{-3}$ 的學習率對模型進行訓練,進行 160k 次的迭代,然後再以 $10^{-4}, 10^{-5}$ 各進行 40k 次。 ![](https://i.imgur.com/4H9ie4V.jpg) ![](https://i.imgur.com/NCj5Grm.jpg) ## Data Augmentation for Small Object Accuracy ![](https://i.imgur.com/mmT69nU.png) * 沒有使用特徵的 resampling 也就是在 feature layer 後面再進行特徵提取,這使得 SSD 對於小目標的預測很困難。 * 前面提到的數據擴增的方式小目標的預測效果有很大的提升作用,特別是對於 PASCAL 這種小數據集來說。 * 隨機剪裁相當於對圖片上某一部分進行了 zoom in(放大)操作,這使得目標可以變得比較大,也會產生較多的大目標樣例。 * 但是不能完全沒有小目標,為了產生一種 zoom out(縮小)的效果,文章還將原始圖片放置於 16 倍原圖大小的畫布上,周圍空間填充圖片均值,然後再進行隨機裁剪,使用這個方法之後就有了更多的訓練數據。 ![](https://i.imgur.com/2Yj7ZZZ.png) :::info :bulb: 做完 Data Augmentation 的 VOC2007 在 test 數據集上靈敏度及影響 * 第一行顯示原始 SSD300 和 SSD512 模型上每個類別的 BBOX 面積的影響。 * 最後一行顯示已做過 Data Augmentation 的結果。 ::: ## Inference time ![](https://i.imgur.com/46yvTST.png) :::info :bulb: Pascal VOC2007 test 上的結果。 * SSD300 是唯一可以取得 70% 以上 mAP 的實現檢測方法。 * 通過使用更大的輸入圖像,SSD512 在精度上超過了所有方法同時保持近似實時的速度。 ::: * 本文的方法一開始會生成大量的 bounding boxes,所以有必要用 Non-maximum suppression(NMS)來去除大量重複的 boxes。 * 通過設置 confidence 的閾值為 $0.01$,我們可以過濾掉大多數的 boxes。 * 然後使用每個類別 0.45 的 Jaccard 重疊,並保留每張影像的前 200 個檢測。 * 對於 SSD300、20 個 VOC 類別,這個步驟每張影像大概花費 1.7 毫秒,接近每新增一層花費的時間(2.4 毫秒)。 * 硬體規格:Titan X、cuDNN v4、Intel Xeon E5-2667v3@3.20GHz。