在前一篇文章中,我們討論了 SSD 演算法的運作方式、涵蓋其實作細節,並介紹了其訓練流程。如果您尚未閱讀前一篇部落格文章,我建議您先閱讀該文章再繼續。
在本系列的第 2 部分中,我們將重點介紹 SSD 的行動裝置友善變體,稱為 SSDlite。我們的計畫是先瀏覽演算法的主要組件,重點介紹與原始 SSD 不同的部分,然後討論已發佈模型的訓練方式,最後針對我們探索的所有新物件偵測模型提供詳細的基準測試。
SSDlite 網路架構
SSDlite 是 SSD 的改編版本,最初在 MobileNetV2 論文中簡要介紹,後來在 MobileNetV3 論文中重複使用。由於這兩篇論文的主要重點是介紹新型 CNN 架構,因此 SSDlite 的大多數實作細節並未釐清。我們的程式碼遵循這兩篇論文中呈現的所有細節,並在必要時填補了來自 官方實作的缺口。
如前所述,SSD 是一個模型系列,因為可以使用不同的骨幹網路(例如 VGG、MobileNetV3 等)和不同的 Head(例如使用常規卷積、可分離卷積等)來配置它。因此,許多 SSD 組件在 SSDlite 中保持不變。以下我們僅討論不同的組件
分類和迴歸 Head
根據 MobileNetV2 論文的第 6.2 節,SSDlite 將原始 Head 上使用的常規卷積替換為可分離卷積。因此,我們的實作引入了新的 Head,這些 Head 使用3x3 深度可分離卷積和 1x1 投影。由於 SSD 方法的所有其他組件保持不變,為了建立 SSDlite 模型,我們的實作初始化 SSDlite Head並將其直接傳遞給 SSD 建構函式。
骨幹網路特徵提取器
我們的實作引入了一個新類別,用於建構 MobileNet 特徵提取器。根據 MobileNetV3 論文的第 6.3 節,骨幹網路傳回輸出步幅為 16 的反向殘差塊的擴展層的輸出,以及輸出步幅為 32 的池化層之前的圖層輸出。此外,骨幹網路的所有額外區塊都替換為輕量級等效區塊,這些區塊使用 1x1 壓縮、步幅為 2 的可分離 3x3 卷積和 1x1 擴展。最後,為了確保即使在使用小型寬度乘數時,Head 也具有足夠的預測能力,所有卷積的最小深度大小由 min_depth
超參數控制。
SSDlite320 MobileNetV3-Large 模型

本節討論提供的SSDlite 預訓練模型的配置,以及為了盡可能重現論文結果而遵循的訓練流程。
訓練流程
用於在 COCO 資料集上訓練模型的所有超參數和腳本都可以在我們的references資料夾中找到。在這裡,我們討論訓練流程中最值得注意的細節。
調整後的超參數
雖然論文沒有提供任何關於用於訓練模型的超參數資訊(例如正規化、學習率和批次大小),但 官方儲存庫上的設定檔中列出的參數是良好的起點,並且我們使用交叉驗證將它們調整到最佳值。以上所有操作都使我們比基準 SSD 配置有了顯著提升。
資料擴增
SSDlite 與 SSD 相比的主要重要差異在於,前者的骨幹網路權重僅為後者的一小部分。這就是為什麼在 SSDlite 中,資料擴增更著重於使模型對可變大小的物件具有穩健性,而不是嘗試避免過度擬合。因此,SSDlite 僅使用 SSD 轉換的子集,這樣可以避免模型的過度正規化。
LR 方案
由於依賴資料擴增來使模型對小型和中型物件具有穩健性,我們發現使用大量 epoch 對訓練配方特別有利。更具體地說,透過使用大約比 SSD 多 3 倍的 epoch,我們可以將精確度提高 4.2mAP 點,而使用 6 倍乘數,我們可以提高 4.9mAP。進一步增加 epoch 似乎會產生遞減的回報,並使訓練過於緩慢且不切實際,但根據模型配置,論文作者似乎使用了相當於16 倍乘數。
權重初始化和輸入縮放與 ReLU6
一組最終優化使我們的實作非常接近官方實作,並幫助我們彌合了準確性差距,這些優化包括從頭開始訓練骨幹網路,而不是從 ImageNet 初始化,調整我們的權重初始化方案,更改我們的輸入縮放,並將 SSDlite Head 上添加的所有標準 ReLU 替換為 ReLU6。請注意,由於我們從隨機權重訓練模型,因此我們還應用了論文中描述的速度優化,即在骨幹網路上使用縮減的尾部。
實作差異
將上述實作與官方儲存庫中的實作進行比較,我們發現了一些差異。它們大多數是次要的,並且與我們如何初始化權重有關(例如常態初始化與截斷常態)、我們如何參數化 LR 排程(例如較小與較大的預熱率、較短與較長的訓練)等。最大的已知差異在於我們計算分類損失的方式。更具體地說,官方儲存庫上使用 MobileNetV3 骨幹網路的 SSDlite 實作未使用 SSD 的 Multibox 損失,而是使用了 RetinaNet 的 focal loss。這與論文有相當大的偏差,由於 TorchVision 已經提供了 RetinaNet 的完整實作,因此我們決定使用常規 Multi-box SSD 損失來實作 SSDlite。
關鍵準確性改進的細分
如之前的文章中所討論,重現研究論文並將其移植到程式碼並非一帆風順,尤其是在不清楚完整的訓練和實作細節的情況下。通常,此過程涉及大量回溯,因為需要識別對準確性有重大影響的實作細節和參數,以及沒有影響的實作細節和參數。以下我們嘗試視覺化最重要的迭代,這些迭代將我們的準確性從基準線提高。

迭代 | mAP |
---|---|
具有「SSD 風格」超參數的基準線 | 10.6 |
+ 調整後的超參數 | 14.2 |
+ SSDlite 資料擴增 | 15.2 |
+ 3 倍 LR 方案 | 19.4 |
+ 6 倍 LR 方案 | 20.1 |
+ 權重初始化和輸入縮放與 ReLU6 | 21.3 |
上面呈現的優化順序是準確的,但在某些情況下有點理想化。例如,雖然在超參數調整階段測試了不同的排程器,但它們都沒有提供顯著的改進,因此我們保留了基準線中使用的 MultiStepLR。然而,在稍後嘗試不同的 LR 方案時,我們發現切換到 CosineAnnealingLR 很有益,因為它需要的配置較少。因此,我們認為上述摘要的主要重點應該是,即使從正確的實作和來自同系列模型的最佳超參數集開始,始終可以透過最佳化訓練配方和調整實作來找到準確性點。誠然,以上是一個相當極端的例子,準確性翻了一番,但仍然在許多情況下,有大量優化可以幫助我們顯著提高準確性。
基準測試
以下說明如何初始化兩個預訓練模型
ssdlite = torchvision.models.detection.ssdlite320_mobilenet_v3_large(pretrained=True)
ssd = torchvision.models.detection.ssd300_vgg16(pretrained=True)
以下是新偵測模型與選定的先前偵測模型之間的基準測試
模型 | mAP | CPU 推論時間(秒) | # 參數(M) |
---|---|---|---|
SSDlite320 MobileNetV3-Large | 21.3 | 0.0911 | 3.44 |
SSD300 VGG16 | 25.1 | 0.8303 | 35.64 |
SSD512 VGG16(未發佈) | 28.8 | 2.2494 | 37.08 |
SSD512 ResNet50(未發佈) | 30.2 | 1.1137 | 42.70 |
Faster R-CNN MobileNetV3-Large 320 FPN(低解析度) | 22.8 | 0.1679 | 19.39 |
Faster R-CNN MobileNetV3-Large FPN(高解析度) | 32.8 | 0.8409 | 19.39 |
正如我們所看到的,SSDlite320 MobileNetV3-Large 模型是迄今為止最快且最小的模型,因此它是真實世界行動應用程式的絕佳候選者。雖然其準確性低於預訓練的低解析度 Faster R-CNN 等效模型,但 SSDlite 框架具有適應性,並且可以透過引入具有更多卷積的更重型 Head 來提高其準確性。
另一方面,SSD300 VGG16 模型相當慢且準確性較低。這主要是因為其 VGG16 骨幹網路。雖然 VGG 架構非常重要且具有影響力,但如今已相當過時。因此,雖然特定模型具有歷史和研究價值,因此包含在 TorchVision 中,但我們建議想要用於真實世界應用程式的高解析度偵測器的使用者,將 SSD 與其他骨幹網路結合使用(請參閱此範例,瞭解如何建立一個)或使用其中一個 Faster R-CNN 預訓練模型。
我們希望您喜歡 SSD 系列的第 2 部分也是最後一部分。我們期待您的回饋。