目標檢測、實例分割、旋轉框樣樣精通!詳解高性能檢測算法 RTMDet(2)
數據增強改進
數據增強不僅關乎模型的精度,也對訓練的效率有著巨大的影響。隨著 GPU 計算性能的不斷增加,模型前向和反向傳播的速度在不斷提升。
然而,當我們在訓練工業級的模型時,由于引入大量的數據增強,CPU 的計算能力以及存儲的 IO 往往成為了制約模型訓練速度的瓶頸。尤其是當使用了 YOLO 系列中廣泛使用的 Mosaic 和 MixUp 這樣涉及到多張圖片混合的數據增強,由于需要讀取和處理的圖片數量成倍增加,數據增強的耗時也大幅增加。圖 6. Mosaic MixUp 數據增強效果圖為了解決多圖混合數據增強的耗時問題,我們在這些數據增強中引入了緩存機制。我們使用一個緩存隊列將歷史的圖片保存下來,當需要進行圖片混合操作時,不再通過 dataset 重新加載圖片,而是從緩存隊列中隨機選取歷史的圖片進行混合。
通過實驗發現,當緩存隊列足夠大,且使用隨機出隊的方式時,訓練得到的模型精度與傳統的 Mosaic & MixUp 并無區別。由于引入了緩存機制,兩種數據增強的運行效率得到了大幅提升。
通過使用 MMDetection 中的 benchmark 工具 tools/analysis_tools/benchmark.py,我們將 RTMDet 與以高效訓練著稱的 YOLOv5 的數據增強進行了對比:
YOLOv5 的數據增強(MixUp 概率僅為 0.1)的吞吐量:Overall fps: 30.2 img/s, times per img: 33.1 ms/img;RTMDet 的數據增強(MixUp 全程開啟)的吞吐量:Overall fps: 52.4 img/s, times per img: 19.1 ms/img。
除了優化數據增強的運行效率,我們也對數據增強的邏輯進行了優化。我們分析了 YOLOX 的數據增強后發現了其中的問題:YOLOX 使用強弱兩個階段的數據增強,但其第一個訓練階段引入了旋轉和切變等操作,導致標注框產生了比較大的誤差,使其第二個訓練階段需要對回歸分支額外增加一個 L1 loss 來對回歸任務進行修正。這就造成了數據增強與模型的損失函數設計產生了耦合。
為了使數據增強和模型解耦,得到更通用的增強策略,我們選擇在第一個訓練階段不引入導致標注誤差的數據增強,而是通過增加 Mosaic MixUp 混合圖片的數量來提升強度,我們將總體混合的圖片數量從 YOLOX 使用的 5 張增加至 8 張。
得益于上文提到的緩存機制,增加混合圖片的數量并不會導致訓練速度變慢。在第二個訓練階段,我們關閉 Mosaic 和 MixUp,轉而使用 Large Scale Jitter(LSJ),使模型在更符合原數據集特征分布的狀態下微調。通過對比實驗可以看出,我們的數據增強顯著優于之前的方法:
最終效果
通過上文的種種改進,我們最終得到了 RTMDet 系列模型,我們可以將實驗拆解,并逐個應用在我們的對照組模型 YOLOX 之上,來解析如何從 YOLOX 一步一步修改為 RTMDet:
然后我們使用新的基礎單元構建而成的 backbone 和 neck 替換了原有的模型結構,這一改進又提升了 1.2% 的 AP,并且推理速度只減慢了 0.02ms。在使用共享權重的檢測頭后,參數量過大的問題得到了解決,而模型精度和推理速度都沒有下降。在此基礎之上,我們又增加了動態軟標簽分配策略以及改進后的數據增強,分別帶來了 1.1% 和 1.3% 的精度提升。
最后,錦上添花的一點,我們又將 backbone 在 imagenet 上進行了預訓練,也使精度得到了略微的提升。不過預訓練模型僅在 tiny 和 s 模型上有精度提升的效果,在更大的模型結構上則體現不出優勢。
綜合以上這些修改,RTMDet 相比于 YOLOX 在相似的模型大小以及推理速度上提升了 4.3% AP!
通過調整深度以及寬度的系數進行模型縮放,我們最終得到了 tiny/s/m/l/x 五種不同大小的模型,在不同量級上均超越了同級別的模型:
Model | latency(ms) | FPS |
RTMDet-tiny | 2.34 | 427.35 |
RTMDet-s | 2.96 | 337.84 |
RTMDet-m | 6.41 | 156.01 |
RTMDet-l | 10.32 | 96.90 |
RTMDet-x | 18.80 | 53.19 |
多項任務取得 SOTA
為了驗證 RTMDet 算法的通用性,我們通過僅增加任務頭的方式,對模型進行了最小限度的修改,將其拓展至了實例分割以及旋轉目標檢測任務上。在僅進行了非常簡單的修改的情況下,RTMDet 也依然取得了 SOTA 的效果!
實例分割
傳統的實例分割往往采用雙階段的方式來預測 mask,但近兩年來,基于 kernel 的方法正逐漸興起。為了保持單階段檢測器的簡潔高效和易于部署的特性,我們參考 CondInst 為 RTMDet 增加了 mask head 以及 kernel head。
mask head 由 4 個卷積層組成,通過 neck 輸出的多尺度特征預測出維度為 8 的 mask prototype feature。而 kernel head 則為每個 instance 預測 169 維的向量,從而組成 3 個動態卷積的卷積核,與 mask feature 進行交互,最終得到每個 instance 的 mask。
實驗結果表明,我們的方法在標準 setting 下,不僅超越了 CondInst,SOLOv2 等單階段模型,也超越了 Cascade Mask R-CNN 這樣的多階段模型。在使用與 RTMDet 一致的模型結構以及訓練策略后,得到的 RTMDet-Ins 模型,精度不僅大幅超越 YOLOv5-seg,也超越了前幾天剛剛推出的 YOLOv8,取得了實時實例分割的 SOTA。
旋轉目標檢測
旋轉目標檢測是遙感領域使用最廣泛的方法,而將 RTMDet 拓展至此任務也非常簡單,得益于 MMDetection 3.0 版本,我們只需要增加回歸分支的輸出特征維度,增加角度分量,同時更換 box 的編****,便能讓 RTMDet 支持預測旋轉框。由于旋轉框與普通目標檢測任務僅有回歸分支有差異,因此旋轉框的模型也能夠加載目標檢測的預訓練模型并從中受益。
我們在遙感領域最常用的 DOTA 數據集上驗證了我們的方法,結果表明,我們的模型不僅超越了眾多的多階段方法,也超越了之前最優的算法 PPYOLOE-R,成為了 SOTA。
為了驗證模型的泛化能力,我們還在 DOTA 1.5 以及 HRSC 兩個數據集上進行了訓練,也同樣取得了最優的結果。
總結
通過在模型結構的基本單元引入大 kernel 深度可分離卷積增大感受野,并平衡不同分辨率層級間以及 backbone 和 neck 間的計算量、參數量平衡,改進標簽分配以及數據增強策略,RTMDet 不論是在目標檢測任務上,還是在實例分割以及旋轉目標檢測任務上,均取得了優異的性能。
我們希望我們探索出的這些改進方案能夠對設計實時的目標檢測模型有所啟發,也希望我們在工程及算法上的優化能夠在實際的工業場景中有所應用。
最后,別忘了給 MMDetection、MMYOLO、MMRotate 點個 Star 哦~
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。
傳感器相關文章:傳感器工作原理
風速傳感器相關文章:風速傳感器原理 全息投影相關文章:全息投影原理