Torchvision SSD 實(shí)施
在 TorchVision v0.10 中,我們發(fā)布了兩個(gè)基于 SSD 架構(gòu)的新對(duì)象檢測模型。我們的計(jì)劃是在一篇由兩部分組成的文章中介紹算法的關(guān)鍵實(shí)現(xiàn)細(xì)節(jié)以及有關(guān)如何訓(xùn)練它們的信息。
在本系列的第 1 部分中,我們將重點(diǎn)介紹Single Shot MultiBox Detector 論文中描述的 SSD 算法的原始實(shí)現(xiàn)。我們將簡要介紹該算法的工作原理,然后介紹其主要組件,突出顯示其代碼的關(guān)鍵部分,最后討論我們?nèi)绾斡?xùn)練已發(fā)布的模型。我們的目標(biāo)是涵蓋重現(xiàn)模型所需的所有細(xì)節(jié),包括論文中未涵蓋但屬于原始實(shí)現(xiàn)部分的優(yōu)化。
固態(tài)硬盤如何工作?
強(qiáng)烈建議閱讀上述論文,但這里有一個(gè)簡單的快速復(fù)習(xí)。我們的目標(biāo)是檢測圖像中對(duì)象的位置及其類別。這是SSD 論文中的圖 5,其中包含模型的預(yù)測示例:

SSD 算法使用 CNN 主干,將輸入圖像通過它并從網(wǎng)絡(luò)的不同級(jí)別獲取卷積輸出。這些輸出的列表稱為特征圖。然后將這些特征圖通過負(fù)責(zé)預(yù)測類別和框位置的分類和回歸頭。
由于每張圖像的特征圖包含來自網(wǎng)絡(luò)不同層次的輸出,它們的大小各不相同,因此它們可以捕獲不同維度的對(duì)象。在每個(gè)頂部,我們平鋪了幾個(gè)默認(rèn)框,可以將其視為我們粗略的先驗(yàn)猜測。對(duì)于每個(gè)默認(rèn)框,我們預(yù)測是否有一個(gè)對(duì)象(連同它的類)和它的偏移量(對(duì)原始位置的校正)。在訓(xùn)練期間,我們需要首先將地面實(shí)況與默認(rèn)框匹配,然后我們使用這些匹配來估計(jì)我們的損失。在推理過程中,組合相似的預(yù)測框來估計(jì)最終的預(yù)測。
SSD 網(wǎng)絡(luò)架構(gòu)
在本節(jié)中,我們將討論 SSD 的關(guān)鍵組件。我們的代碼緊跟論文,并利用了官方實(shí)現(xiàn)中包含的許多未記錄的優(yōu)化。
默認(rèn)框生成器
該DefaultBoxGenerator類是負(fù)責(zé)產(chǎn)生SSD的默認(rèn)框和功能類似AnchorGenerator(上分歧看到4-6的紙頁了解更多信息)FasterRCNN的。它生成一組特定寬度和高度的預(yù)定義框,這些框在圖像上平鋪,并作為對(duì)對(duì)象可能位于何處的第一個(gè)粗略的先驗(yàn)猜測。這是 SSD 論文中的圖 1,其中顯示了基本事實(shí)和默認(rèn)框:

該類由一組控制其形狀和平鋪的超參數(shù)參數(shù)化。該實(shí)現(xiàn)將自動(dòng)為那些想要嘗試新的主干/數(shù)據(jù)集但也可以傳遞優(yōu)化的自定義值的人提供默認(rèn)參數(shù)的良好猜測。
SSD匹配器
該SSDMatcher類擴(kuò)展了標(biāo)準(zhǔn)的匹配器通過FasterRCNN使用,它負(fù)責(zé)默認(rèn)盒匹配的地面實(shí)況。在估計(jì)所有組合的IoU之后,我們使用匹配器為每個(gè)默認(rèn)框找到重疊高于IoU 閾值的最佳候選ground truth 。SSD 版本的 matcher 有一個(gè)額外的步驟,以確保每個(gè) ground truth 與具有最高重疊的默認(rèn)框匹配。匹配器的結(jié)果用于模型訓(xùn)練過程中的損失估計(jì)。
分類和回歸頭
該SSDHead類負(fù)責(zé)初始化網(wǎng)絡(luò)的分類和回歸的部分。以下是有關(guān)其代碼的一些值得注意的細(xì)節(jié):
無論是分類和回歸從頭部繼承同一個(gè)類是負(fù)責(zé)使每個(gè)特征圖的預(yù)測。
特征圖的每一層都使用單獨(dú)的 3x3 卷積來估計(jì)類對(duì)數(shù)和框位置。
該預(yù)測數(shù),每頭每次水平使得取決于默認(rèn)的箱數(shù)和特征地圖的大小。
骨干特征提取器
該特征提取器重新配置和增強(qiáng)了標(biāo)準(zhǔn)VGG骨架與如所描述的在SSD紙的圖2額外層:

該類支持 TorchVision 的所有 VGG 模型,并且可以為其他類型的 CNN 創(chuàng)建一個(gè)類似的提取器類(請(qǐng)參閱此示例以了解 ResNet)。以下是該類的一些實(shí)現(xiàn)細(xì)節(jié):
修補(bǔ)的
ceil_mode parameter第三Maxpool層是必要的,以獲得相同的功能,地圖大小為紙。這是因?yàn)?PyTorch 與模型的原始 Caffe 實(shí)現(xiàn)之間存在細(xì)微差異。它在 VGG 之上添加了一系列額外的特征層。如果 highres 參數(shù)
True在其構(gòu)建期間,它將附加一個(gè)額外的卷積。這對(duì)于模型的 SSD512 版本很有用。正如論文第 3 節(jié)所述,原始 VGG 的全連接層使用 Atrous轉(zhuǎn)換為卷積。此外maxpool5的步幅和內(nèi)核大小修改。
如第 3.1 節(jié)所述,L2 歸一化用于conv4_3的輸出,并引入一組可學(xué)習(xí)的權(quán)重來控制其縮放。
SSD 算法
實(shí)現(xiàn)的最后一個(gè)關(guān)鍵部分是SSD 類。以下是一些值得注意的細(xì)節(jié):
該算法參數(shù)由一組類似于其他檢測模型參數(shù)。強(qiáng)制性的參數(shù)是:它負(fù)責(zé)骨干估計(jì)特征地圖中,
anchor_generator這應(yīng)該是一個(gè)配置實(shí)例的的DefaultBoxGenerator類,大小到的輸入圖像將被調(diào)整和num_classes用于分類剔除的背景。如果未提供head,則構(gòu)造函數(shù)將初始化默認(rèn)
SSDHead. 為此,我們需要知道主干生成的每個(gè)特征圖的輸出通道數(shù)。最初我們嘗試從主干中檢索此信息,但如果不可用,我們將動(dòng)態(tài)估計(jì)它。該算法重用了其他檢測模型使用的標(biāo)準(zhǔn)BoxCoder 類。該類負(fù)責(zé)對(duì)邊界框進(jìn)行編碼和解碼,并配置為使用與原始實(shí)現(xiàn)相同的先驗(yàn)方差。
雖然我們重用標(biāo)準(zhǔn)的GeneralizedRCNNTransform 類來調(diào)整輸入圖像的大小和歸一化,但 SSD 算法對(duì)其進(jìn)行配置以確保圖像大小保持固定。
下面是實(shí)現(xiàn)的兩個(gè)核心方法:
該
compute_loss方法估計(jì)標(biāo)準(zhǔn)的 Multi-box 損失,如 SSD 論文第 5 頁所述。它使用平滑 L1 損失進(jìn)行回歸,使用標(biāo)準(zhǔn)交叉熵?fù)p失與硬負(fù)采樣進(jìn)行分類。與所有檢測模型一樣,forward 方法目前具有不同的行為,具體取決于模型是處于訓(xùn)練模式還是評(píng)估模式。它首先調(diào)整輸入圖像的大小和標(biāo)準(zhǔn)化,然后將它們傳遞到主干以獲得特征圖。然后通過頭部傳遞特征圖以獲得預(yù)測,然后該方法生成默認(rèn)框。
如果模型是訓(xùn)練模式,遠(yuǎn)期將估計(jì)欠條與地面真相默認(rèn)盒,使用
SSDmatcher來產(chǎn)生比賽最后估計(jì)損失調(diào)用compute_loss method。如果模型處于eval 模式,我們首先通過僅保留通過分?jǐn)?shù)閾值的那些來選擇最佳檢測,選擇最有希望的框并運(yùn)行 NMS 以清理并選擇最佳預(yù)測。最后,我們對(duì)預(yù)測進(jìn)行后處理以將它們調(diào)整為原始圖像大小。
SSD300 VGG16 型號(hào)
SSD 是一個(gè)型號(hào)家族,因?yàn)樗梢耘渲貌煌闹鞲珊筒煌?Head 配置。在本節(jié)中,我們將重點(diǎn)介紹所提供的SSD 預(yù)訓(xùn)練模型。我們將討論其配置的詳細(xì)信息以及用于重現(xiàn)報(bào)告結(jié)果的訓(xùn)練過程。
培訓(xùn)流程
該模型是使用 COCO 數(shù)據(jù)集訓(xùn)練的,其所有超參數(shù)和腳本都可以在我們的參考文件夾中找到。下面我們提供有關(guān)培訓(xùn)過程中最顯著方面的詳細(xì)信息。
論文超參數(shù)
為了在 COCO 上獲得最佳結(jié)果,我們采用了論文第 3 節(jié)中描述的關(guān)于優(yōu)化器配置、權(quán)重正則化等的超參數(shù)。此外,我們發(fā)現(xiàn)采用官方實(shí)現(xiàn)中出現(xiàn)的有關(guān)優(yōu)化的優(yōu)化很有用DefaultBox 生成器的平鋪配置。論文中沒有描述這種優(yōu)化,但它對(duì)于提高較小物體的檢測精度至關(guān)重要。
數(shù)據(jù)增強(qiáng)
實(shí)施本文第 6 頁和第 12 頁所述的SSD 數(shù)據(jù)增強(qiáng)策略對(duì)于重現(xiàn)結(jié)果至關(guān)重要。更具體地說,隨機(jī)“放大”和“縮小”變換的使用使模型對(duì)各種輸入大小具有魯棒性,并提高了對(duì)中小型對(duì)象的精度。最后,由于 VGG16 有相當(dāng)多的參數(shù),包含在增強(qiáng)中的光度失真具有正則化效果,有助于避免過度擬合。
權(quán)重初始化和輸入縮放
我們發(fā)現(xiàn)有益的另一個(gè)方面是遵循論文提出的權(quán)重初始化方案。為此,我們必須通過取消由 0-1執(zhí)行的縮放ToTensor()并使用符合此縮放的預(yù)訓(xùn)練 ImageNet 權(quán)重來調(diào)整我們的輸入縮放方法(感謝 Max deGroot在他的 repo 中提供它們)。新卷積的所有權(quán)重都使用 Xavier 初始化,并且它們的偏差設(shè)置為零。初始化后,網(wǎng)絡(luò)進(jìn)行端到端的訓(xùn)練。
LR計(jì)劃
正如論文中所報(bào)道的那樣,在應(yīng)用積極的數(shù)據(jù)增強(qiáng)之后,有必要對(duì)模型進(jìn)行更長時(shí)間的訓(xùn)練。我們的實(shí)驗(yàn)證實(shí)了這一點(diǎn),我們必須調(diào)整學(xué)習(xí)率、批量大小和總體步驟以達(dá)到最佳結(jié)果。我們提出的學(xué)習(xí)方案被配置為相當(dāng)安全,在步驟之間顯示出穩(wěn)定的跡象,因此一個(gè)人可能能夠通過僅執(zhí)行我們 66% 的 epoch 來訓(xùn)練類似的模型。
關(guān)鍵精度改進(jìn)的細(xì)分
重要的是要注意,直接從論文中實(shí)現(xiàn)模型是一個(gè)迭代過程,在編碼、訓(xùn)練、錯(cuò)誤修復(fù)和調(diào)整配置之間循環(huán),直到我們匹配論文中報(bào)告的準(zhǔn)確性。通常,它還涉及簡化訓(xùn)練配方或使用更新的方法對(duì)其進(jìn)行增強(qiáng)。這絕對(duì)不是一個(gè)線性過程,通過一次改進(jìn)單個(gè)方向來實(shí)現(xiàn)增量精度改進(jìn),而是涉及探索不同的假設(shè),在不同方面進(jìn)行增量改進(jìn)并進(jìn)行大量回溯。
考慮到這一點(diǎn),下面我們嘗試總結(jié)對(duì)我們的準(zhǔn)確性影響最大的優(yōu)化。我們通過將各種實(shí)驗(yàn)分為 4 個(gè)主要組并將實(shí)驗(yàn)改進(jìn)歸因于最接近的匹配來做到這一點(diǎn)。請(qǐng)注意,圖形的 Y 軸從 18 開始而不是從 0 開始,以使優(yōu)化之間的差異更加明顯:

| 模型配置 | 地圖增量 | 地圖 |
|---|---|---|
| 使用“FasterRCNN 風(fēng)格”超參數(shù)的基線 | —— | 19.5 |
| + 紙超參數(shù) | 1.6 | 21.1 |
| + 數(shù)據(jù)增強(qiáng) | 1.8 | 22.9 |
| + 權(quán)重初始化和輸入縮放 | 1 | 23.9 |
| + LR 方案 | 1.2 | 25.1 |
我們的最終模型實(shí)現(xiàn)了 25.1 的 mAP,并準(zhǔn)確再現(xiàn)了論文中報(bào)告的 COCO 結(jié)果。以下是準(zhǔn)確度指標(biāo)的詳細(xì)分類。
