目標(biāo)檢測、實例分割、旋轉(zhuǎn)框樣樣精通!詳解高性能檢測算法 RTMDet(1)
因此,我們對目前的單階段目標(biāo)檢測器進(jìn)行了全面的改進(jìn):從增強模型的特征提取能力和對各個組件的計算量進(jìn)行均衡化,到使用動態(tài)的軟標(biāo)簽來優(yōu)化訓(xùn)練策略,再到對數(shù)據(jù)增強的效率和性能進(jìn)行改進(jìn),我們對算法的各個方面都提出了新的優(yōu)化方案。
通過這些改進(jìn),我們得到了從 tiny 到 extra-large 大小的一系列高性能檢測模型,我們將這套實時目標(biāo)檢測模型(Real-Time Models for object Detection)命名為 RTMDet。
其中,RTMDet-x 取得了 52.8 mAP 的精度和 300+FPS 的運行速度,同時,RTMDet-tiny 在僅有 4M 參數(shù)量的情況下達(dá)到了 41.1 mAP 的精度,超越了同級別的所有模型。RTMDet 不僅僅在目標(biāo)檢測這一任務(wù)上性能優(yōu)異,在實時實例分割以及旋轉(zhuǎn)目標(biāo)檢測這兩個任務(wù)中也同樣達(dá)到了 SOTA 的水平!
除了擁有超高的精度,RTMDet 的工程優(yōu)化也非常全面:基于 MMDeploy,RTMDet 全系列已經(jīng)支持了 ONNXRuntime 以及 TensorRT 等推理框架的部署。同時,為了節(jié)約廣大煉丹師的寶貴時間,RTMDet 的訓(xùn)練效率也同樣進(jìn)行了大幅的優(yōu)化,我們在 MMYOLO 中提供了高效訓(xùn)練版本的代碼,RTMDet-s 訓(xùn)練 300 epoch 僅需 14 × 8GPU 時!
檢測和實例分割模型代碼已開源至:
https://github.com/open-mmlab/mmdetection/tree/3.x/configs/rtmdet
基于 MMYOLO 的高效訓(xùn)練版本:
https://github.com/open-mmlab/mmyolo/tree/dev/configs/rtmdet
基于 MMRotate 的旋轉(zhuǎn)框檢測模型:
https://github.com/open-mmlab/mmrotate/tree/1.x/configs/rotated_rtmdet
技術(shù)報告鏈接:
https://arxiv.org/abs/2212.07784
話不多說,接下來就讓我們來詳細(xì)了解 RTMDet 在各方面的改進(jìn)吧~算法和工程優(yōu)化詳解
模型結(jié)構(gòu)設(shè)計
擁有一個高效的模型結(jié)構(gòu)是設(shè)計實時目標(biāo)檢測器最關(guān)鍵的問題之一。自 YOLOv4 將 Cross Stage Partial Network 的結(jié)構(gòu)引入 DarkNet 之后,CSPDarkNet 因其簡潔高效而被廣泛應(yīng)用于 YOLO 系列的各個改進(jìn)版中。而 RTMDet 也將 CSPDarkNet 作為基線,并使用同樣構(gòu)建單元組成的 CSPPAFPN 進(jìn)行多尺度的特征融合,最后將特征輸入給不同的檢測頭,進(jìn)行目標(biāo)檢測、實例分割和旋轉(zhuǎn)框檢測等任務(wù)。整體的模型結(jié)構(gòu)如下圖所示:圖 1. RTMDet 模型結(jié)構(gòu)圖整體的宏觀架構(gòu)與 YOLO 系列并沒有太大區(qū)別,RTMDet 對模型的修改主要聚焦于兩點:增加基本構(gòu)建單元的特征提取能力,以及探索模型不同組件間的計算效率和精度的平衡。
首先讓我們回顧一下 DarkNet 基本的構(gòu)建單元,如圖 2.(a) 所示,它由 1 個 1x1 的卷積和 1 個 3x3 的卷積組成,以及殘差連接組成。為了提升基本單元的特征提取能力,我們選擇引入更大的卷積核來增大感受野。
在經(jīng)過對不同 kernel size 的消融實驗(表 1)后我們發(fā)現(xiàn),在基本單元中加入一個 5x5 的深度可分離卷積,取得了最好的計算效率與精度的平衡。新的基礎(chǔ)單元結(jié)構(gòu)如 圖 2.(b) 所示。表 1. 不同 kernel size 的精度與速度的對比實驗值得注意的是,最近提出的 YOLO 的不同改進(jìn)版,如 YOLOv6,v7,以及 PPYOLO-E,都選擇在基本單元中加入 RepVGG 的重參數(shù)化卷積模塊,如圖 2.(c),圖 2.(d) 所示。圖 2. CSPDarknet、RTMDet 、PPYOLOE、YOLOv6 的基本構(gòu)建單元重參數(shù)化通過訓(xùn)練時使用多分支的結(jié)構(gòu),然后再在推理時融合成單分支的方式,在不增加推理計算量的情況下提升性能。
然而,重參數(shù)化也有其弊端,比如會明顯增加訓(xùn)練的顯存開銷,同時也會導(dǎo)致使用低精度對模型進(jìn)行量化時產(chǎn)生較大的性能下降。盡管可以通過 QAT 等方式解決量化掉點的問題,但這也使得從模型訓(xùn)練到部署的流程變得更為復(fù)雜。
因此,我們認(rèn)為引入大卷積核增加感受野的方式相比引入重參數(shù)化來說,不論是從訓(xùn)練還是部署都能夠提供更好的效果。
除了基本構(gòu)建單元的修改之外,RTMDet 還對整個模型的不同分辨率層級之間、以及 backbone 和 neck 之間的計算量分配上進(jìn)行了全面的調(diào)整。
由于在基本單元中引入了深度可分離卷積,使得模型整體的層數(shù)相比于 CSPDarkNet 來說變得更深,從而導(dǎo)致推理速度的減慢。
為了解決這一問題,我們對模型不同分辨率層級的基本單元數(shù)量進(jìn)行了調(diào)整,從原本 C2~C5 分別為 3-9-9-3 個 block,調(diào)整為了 3-6-6-3 個 block
圖 3. Backbone 結(jié)構(gòu)改進(jìn)同時為了保持模型的整體計算量不變,我們略微增大了模型的寬度,并且在每個 stage 之后增加一個 ChannelAttention 模塊來提供通道注意力(如圖 4)。圖 4. 增加通道注意力前后的 C5 stage 特征對比如表 2 所示,在經(jīng)過調(diào)整之后,模型的推理速度更快,并且能夠保持相似的精度。表 2. Backbone 結(jié)構(gòu)對比實驗而對于用來進(jìn)行多尺度特征融合的 neck 模塊來說,以往的方法,如 EfficientDet、GiraffeDet 等,都是通過增加更多的特征融合次數(shù),也就是加入更多的連接來提升性能。
然而,過多的特征層之間的連接會顯著增加顯存的占用,也會因為訪存問題而增加推理耗時。因此,我們選擇僅通過增加 neck 模塊的計算量占比來提升其性能,當(dāng) backbone 與 neck 的參數(shù)量調(diào)整至相似時,整個檢測器的推理速度更快,性能也更高:表 3. Backbone neck 參數(shù)量分配對比實驗除了 backbone 和 neck 之外,我們對模型的檢測頭也進(jìn)行了調(diào)整。YOLO 系列往往在不同的特征層級上分別使用獨立的檢測頭,這就導(dǎo)致了模型參數(shù)的利用率低下。因為對于不同的特征層級來說,其檢測出的物體的特征,在相對的尺度大小下應(yīng)當(dāng)是相近的,而學(xué)術(shù)界常用的檢測器(如 RetinaNet、FCOS)使用共享參數(shù)的檢測頭也正印證了這一點。
但是,由于不同層級之間特征的統(tǒng)計量仍存在差異,Normalization layer 依然是必須的,由于直接在共享參數(shù)的檢測頭中引入 BN 會導(dǎo)致其滑動平均值產(chǎn)生誤差,而引入 GN 又會增加推理時的開銷,因此我們參考 NASFPN 的做法,讓檢測頭共享卷積層,而 BN 則分別獨立計算。
在使用共享的檢測頭后,模型的參數(shù)量得到了減少,而且性能非但沒有下降,反而還得到了略微的提升:
表 4. Head 結(jié)構(gòu)對比通過采用以上這些策略,我們又對通道和深度的超參數(shù)進(jìn)行縮放,得到了 tiny、s、m、l、x 五種不同大小的模型,其參數(shù)量分別從 4M 到 90M 遞增,以提供給不同的應(yīng)用場景。
訓(xùn)練策略優(yōu)化
正負(fù)樣本的標(biāo)簽分配策略是目標(biāo)檢測訓(xùn)練過程中最重要的一環(huán),近幾年來,標(biāo)簽分配策略從最初的基于 anchor IoU 的靜態(tài)匹配方式,逐漸演進(jìn)為使用代價函數(shù)進(jìn)行動態(tài)標(biāo)簽分配。然而,目前主流的動態(tài)標(biāo)簽分配策略,如匈牙利匹配、OTA 等均使用與損失函數(shù)一致的函數(shù)計算代價矩陣。
我們經(jīng)過實驗發(fā)現(xiàn),與損失函數(shù)完全一致的代價矩陣計算方式并不是最優(yōu)的。因此,RTMDet 基于 YOLOX 的 SimOTA 進(jìn)行改進(jìn),使用了動態(tài)的軟標(biāo)簽分配策略,其代價矩陣計算公式如下:它由三個代價函數(shù)組成,首先是分類代價函數(shù),傳統(tǒng)的分類代價往往使用 0-1 分布的二值化標(biāo)簽進(jìn)行損失計算,這很容易導(dǎo)致,一個擁有很高分類置信度但是擁有錯誤檢測框的低質(zhì)量預(yù)測結(jié)果得到一個很低的分類代價,反之也是如此。
因此我們參考 GFL,將預(yù)測框與 Ground Truth 的 IoU 得分作為軟標(biāo)簽,并對不同得分的匹配進(jìn)行了重新加權(quán),使得分類代價的匹配結(jié)果更為準(zhǔn)確和穩(wěn)定,其公式如下:而對于回歸代價,使用與損失函數(shù)一致的 GIoU,很容易導(dǎo)致一個低質(zhì)量的匹配和一個高質(zhì)量的匹配區(qū)分度不夠高,這是因為對于 GIoU 函數(shù)來說,一個完全正確的檢測框和一個完全錯誤的檢測框,他們之間的 IoU 得分也只相差了 1 而已。因此,我們選擇取對數(shù)來增大低質(zhì)量與高質(zhì)量匹配之間的差異:最后,我們還引入了一個“軟化”的中心先驗代價。與之前的眾多方法使用固定的先驗區(qū)域(如 ATSS,SimOTA)不同,中心先驗代價將位置先驗也引入代價矩陣的計算之中,一方面能夠穩(wěn)定收斂,另一方面也能夠使匹配的正樣本區(qū)域更為靈活。為了公平比較,我們在標(biāo)準(zhǔn)的 ResNet-50 12 epoch 的 setting 下與其他標(biāo)簽分配策略進(jìn)行了對比,結(jié)果顯示我們的方法取得了最優(yōu)的精度:表 5. R50 1x setting 下的標(biāo)簽分配策略性能對比為了驗證這套方法的通用性,我們也在 300 epoch 和強數(shù)據(jù)增強的情況下與 YOLOX 的 SimOTA 進(jìn)行了對比,結(jié)果顯示,我們的方法也同樣得到了更高的精度:表 6. 使用 RTMDet-s 訓(xùn)練 300 epoch 的標(biāo)簽分配策略性能對比我們使用 MMYOLO 中提供的 GradCAM++ 可視化工具(demo/boxam_vis_demo.py)可視化了 neck 部分的特征圖,從下圖中可以看出,與 YOLOv6 相比,使用了動態(tài)軟標(biāo)簽分配策略的 RTMDet 的檢測目標(biāo)的特征響應(yīng)非常集中,且沒有誤檢:圖 5. 使用 GradCAM++ 對 neck 部分特征響應(yīng)的可視化(左:RTMDet-l,右:YOLOv6-l)
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。