據(jù)采集、YOLOv8優(yōu)化與邊緣部署實戰(zhàn))
簡介RoboMaster雷達站數(shù)據(jù)集與開源項目匯總包面向參賽戰(zhàn)隊、雷達感知方向開發(fā)者及機器人愛好者旨在解決雷達站數(shù)據(jù)分散、開源方案難找的問題。包內(nèi)共3個文件以index.html導航頁為核心搭配.inscode與.gitignore工程配置整包僅6KB輕巧易用。匯總內(nèi)容覆蓋大疆官方數(shù)據(jù)集、Damon2019/RM-DATASET、華農(nóng)數(shù)據(jù)集并整理了上海交通大學、沈陽航空航天大學、中國石油大學華東、華中科技大學等高校的開源雷達站程序涉及YOLOv5模型剪枝、高性能推理加速等關(guān)鍵模塊還引入2024賽季廈門理工和遼寧科技的最新開源項目展示規(guī)則化降本與工程提效思路。通過這個索引包讀者可快速對比不同數(shù)據(jù)集的視角與噪聲特性評估各高校源碼的框架和部署方式再按需跳轉(zhuǎn)學習。已有211人學習下載適合需要系統(tǒng)摸底雷達站數(shù)據(jù)來源、開源方案選型與算法優(yōu)化路徑的讀者。 折騰了快半年終于把RM雷達站這套目標檢測數(shù)據(jù)集和整套開源源碼整理出來了。說實話雷達站在隊里的存在感一直很微妙——它不像步兵那樣能直接打出血量優(yōu)勢也不像哨兵那樣全場焦點但它決定了你的隊伍到底是“睜著眼打仗”還是“蒙著眼亂打”。這套數(shù)據(jù)集的構(gòu)建過程、模型選型思路、包括訓練時踩過的那些坑我覺得值得好好寫一篇給以后想認真做雷達站的隊伍留個參考。如果你正準備接手隊里的雷達站或者正在為“怎么識別得又遠又穩(wěn)”發(fā)愁這篇應該能幫你省下不少時間。我會把從數(shù)據(jù)采集、標注規(guī)范、模型選型、訓練調(diào)參到邊緣端部署的完整鏈路都聊一遍也會把開源倉庫里哪些東西可以直接用、哪些東西需要按自己隊伍情況改全都講清楚。1. 雷達站任務到底難在哪一個固定視角下的高速小目標檢測問題1.1 雷達站和裝甲板識別的本質(zhì)差異RoboMaster比賽里雷達站是固定在場地外的設(shè)備以一個較遠的俯視視角觀察整個戰(zhàn)場。它要做的事情很純粹持續(xù)檢測場上對方機器人的位置通過裁判系統(tǒng)或者自建的通信鏈路把坐標發(fā)給己方機器人讓己方?jīng)Q策系統(tǒng)知道“對面步兵在哪、哨兵在沒在基地位、有沒有人繞后”。很多隊伍的誤區(qū)是直接照搬步兵機器人上的裝甲板識別方案。裝甲板識別相對容易因為近距離、特征明顯顏色和燈條在畫面里占比大。但雷達站的視角完全不同一輛步兵車在長邊場地對面的時候畫面上可能只有幾十個像素高車體細節(jié)完全丟失看到的更像是一個移動的色塊。而且場上還有煙幕、燈光頻閃、草叢、障礙物遮擋機器人還會小陀螺旋轉(zhuǎn)導致外形實時變化。所以雷達站的目標檢測不是簡單的“目標識別”它其實是一個小目標、遠距離、高動態(tài)范圍的實時檢測問題。目標尺度小、運動速度快、背景干擾強這三座大山疊在一起決定了我們在模型選型和數(shù)據(jù)采集上必須走一條和步兵機器人完全不同的路。1.2 為什么不能只靠官方小地圖信息有人會問裁判系統(tǒng)本身不就有位置信息嗎我直接讀小地圖不就行了這里要說明一下雷達站獲取到的先驗信息確實可以輔助定位但它的更新頻率、精度尤其是延遲都很難滿足實時決策的需求。比賽中的對抗節(jié)奏到了后期非常快等你看小地圖上的點再反應對方的走位早就變了。而且雷達站還有一個很重要的作用是識別對方機器人的狀態(tài)是正在回血、卡在草叢里還是在飛坡這些信息通過官方小地圖是拿不到的只能靠視覺去推測。所以視覺檢測模型是整個雷達站的感知底座只有先把位置信息以足夠高的幀率穩(wěn)定輸出后面的軌跡預測和決策才有意義。我們的目標定得很明確在Jetson級別的邊緣設(shè)備上單幀推理時間控制在10ms左右對中近距離的機器人檢測準確率達到99%以上對遠程小目標也能保持足夠的檢出率不能出現(xiàn)“時有時無”的不穩(wěn)定情況。2. 數(shù)據(jù)集是怎么一幀一幀攢出來的采集、標注與清洗的完整鏈路2.1 視頻采集的場地布置與車輛配置很多隊伍開源的數(shù)據(jù)集最大的問題不是數(shù)量不夠而是場景太單一。我們最開始也犯了同樣的錯誤在實驗室里固定場地、固定燈光、固定角度拍了兩個星期數(shù)據(jù)看著不少拿到比賽場地一試模型直接退化。后來才反應過來數(shù)據(jù)集好不好看的是場景覆蓋度不是圖片總數(shù)。正式采集時我們在三個不同場地各布置了一整套采集方案。場地選型上盡量拉開差異一個接近正式比賽的標準場地有草叢、飛坡、障礙塊一個是開闊的純色地面一個是有大量燈光干擾的場館環(huán)境。每個場地架設(shè)兩臺不同高度的固定相機模擬雷達站的高位視角另外用一臺手持相機在不同位置模擬異常機位防止模型過擬合到固定透視角度。車輛配置上我們把隊伍里的步兵、英雄、哨兵、工程都拉出來跑并安排不同的運動模式勻速巡航、急停急轉(zhuǎn)、小陀螺還有故意跑到場地邊緣貼邊的情況。這一塊特別重要因為雷達站最怕的就是“目標突然從視野里消失”而邊緣場景恰恰是消失高發(fā)區(qū)數(shù)據(jù)里沒有足夠樣本的話模型學不會“邊緣其實也有人”。2.2 抽幀策略關(guān)鍵幀和模糊樣本的平衡有了原始視頻下一步是抽幀。這一步看著簡單其實直接影響了數(shù)據(jù)集的整體質(zhì)量。我們最開始用固定間隔抽幀結(jié)果發(fā)現(xiàn)相鄰幀高度相似算下來等效有效數(shù)據(jù)其實很少還浪費了大量標注時間。后來改用動態(tài)策略先用一個輕量級的運動檢測算法對視頻做預處理把畫面變化幅度大的片段標記出來在這些片段里多抽幀靜止或幾乎不動的片段少抽幀。這么做的道理很直白——比賽里對模型挑戰(zhàn)最大的永遠是快速運動場景運動越大目標越模糊越難識別也就越需要多喂給模型。另外我們專門保留了一部分運動模糊嚴重的幀。一開始我打算把模糊幀全部清洗掉后來看了一些自動駕駛數(shù)據(jù)集的做法意識到完全去掉模糊樣本是錯的。雷達站實戰(zhàn)場景里機器人高速轉(zhuǎn)向的瞬間就是模糊的模型必須見過這種輸入才能穩(wěn)定輸出。保留大約10%左右的中度模糊幀最終驗證下來對實戰(zhàn)魯棒性提升很明顯。2.3 標注規(guī)范類別定義與難例處理方式標注是整個流程里最枯燥但最關(guān)鍵的一環(huán)。我們用的是LabelImg工具輸出YOLO格式的標注文件。類別定義經(jīng)過兩次調(diào)整最初的版本按機器人型號分為步兵、英雄、哨兵、工程——大而全但實戰(zhàn)中雷達站畫面上遠程小目標根本分不清具體型號模型學得也很痛苦。最終壓縮成三類目標機器人為一類未上電/靜止的機器人為一類人操作手偶爾出現(xiàn)在雷達站畫面里為一類。其中第一類打底負責絕大部分訓練第二類用來輔助模型理解“靜止不代表消失”避免漏檢第三類純屬為了排除干擾模型見到人形目標時不能把它當機器人報警。難例的處理我們單獨強調(diào)兩點一是遮擋目標機器人被草叢或障礙物擋住一半的仍然要畫完整的包圍框讓模型學會“即使看不到整輛車也知道它在哪”二是極小目標在畫面上小于20個像素的我們不會簡單刪除而是保留一部分并單獨標注防止模型對這些超遠程目標徹底失明。2.4 數(shù)據(jù)清洗去掉自坑數(shù)據(jù)而不是堆量數(shù)據(jù)清洗這個環(huán)節(jié)我強烈建議每個隊伍都重視起來。早期我們模型出現(xiàn)過一個詭異的問題對某個場地角落的背景老有誤檢排查了很久才發(fā)現(xiàn)是采集時有一輛已經(jīng)損壞的備用機器人被放在了那個角落模型看到的不是“目標”而是“一個靜止的藍色形狀”。清洗流程我分三步走先人工抽檢刪除明顯無效的幀比如相機抖動到畫面完全模糊的再用腳本統(tǒng)計每張圖的標注框面積和數(shù)量把標注框面積異常小或數(shù)量異常多的圖挑出來重點復查最后用初版模型跑一遍全部數(shù)據(jù)把預測置信度異常高的圖和漏檢率最高的圖調(diào)出來看是不是標注質(zhì)量出了問題。這三步跑完數(shù)據(jù)集的整體噪聲水平才降到一個可接受的范圍。開源時我們最終放出了一萬五千多張有效圖像覆蓋六類典型場景包含約八萬個目標實例。這個體量不能算大但對雷達站這個垂直場景來說因為類內(nèi)差異相對集中配合規(guī)范的數(shù)據(jù)增強已經(jīng)足以訓練出一個實戰(zhàn)可用的模型。3. 模型選型與訓練策略為什么是YOLOv8加自定義小目標層3.1 從傳統(tǒng)視覺到深度學習的遷移過程雷達站目標檢測不是一開始就上深度學習的。很多老隊伍的第一版方案用的是基于顏色閾值和形態(tài)學處理的傳統(tǒng)視覺方法先按隊伍顏色提取色塊再算輪廓和質(zhì)心。這個方案的好處是算力開銷極小部署簡單但問題也很致命——對光照極其敏感場地燈光一變閾值就得重新調(diào)機器人被遮擋時色塊斷裂檢測直接失敗小陀螺旋轉(zhuǎn)時顏色沒變但外形變了又容易和目標丟失混在一起。我們的結(jié)論很明確傳統(tǒng)視覺可以用于輔助校準但作為主檢測方案完全不夠用。后來切到深度學習路線在幾個主流檢測框架里做了一次橫向評測最終把目光鎖定在YOLOv8上。原因有三點第一推理速度快YOLO系列在邊緣設(shè)備上的效率是出了名的好第二訓練生態(tài)成熟數(shù)據(jù)格式簡單標注完直接就能訓練不需要過多的預處理流程第三模型結(jié)構(gòu)上有不錯的小目標處理基礎(chǔ)尤其是配合自定義檢測頭之后完全可以滿足雷達站的場景需求。3.2 P2層加入針對遠程小目標的結(jié)構(gòu)改動YOLOv8默認使用P3、P4、P5三層特征圖做檢測分別負責不同尺度的目標。P3對應淺層特征感受野小理論上適合小目標但雷達站場景里的遠程目標太小了在P3層上的特征已經(jīng)非常稀疏模型很難有效學習。我們做的第一個關(guān)鍵改動是增加一個P2檢測頭。P2層來自網(wǎng)絡(luò)更淺的階段分辨率更高能保留更多細節(jié)信息對小目標更友善。這個改動在遠程目標的檢出率上提升非常明顯但也帶來一個副作用計算量和內(nèi)存占用都上去了推理時間變長這對邊緣端的實時性是個大威脅。解決思路是給P2層單獨瘦身不直接復用默認的backbone結(jié)構(gòu)而是用一個輕量級的特征融合分支來生成P2特征控制這部分額外的算力開銷。最終在Jetson Orin NX上推理時間僅增加了約3ms但遠程小目標的AP提升超過了10個百分點這筆賬是完全劃算的。3.3 訓練細節(jié)尺度擾動、Mosaic和類別不平衡處理訓練策略上我們沒有用什么花哨的新算法真正決定上限的是幾個細節(jié)。第一是尺度擾動雷達站畫面的特殊性在于目標尺寸跨極大同一個機器人近距離占滿屏幕的一半遠程可能只有幾個像素。我們把訓練輸入分辨率定在1280x1280并在訓練過程中對輸入做隨機縮放模擬不同距離下的目標尺寸分布讓模型見過各種尺度的特征。第二是Mosaic增強和Copy-Paste增強的合理配比。Mosaic把四張圖拼成一張能顯著豐富背景和上下文但Mosaic占比太高會讓模型對小目標的位置學習產(chǎn)生偏差因為我們實測發(fā)現(xiàn)純Mosaic訓練出來的模型在對遠程小目標定位時存在系統(tǒng)性偏移。最終我們把Mosaic開啟概率設(shè)為0.5并配合一部分Copy-Paste增強單獨把Robotroid實例粘貼到其他背景圖上增加目標密集場景。第三是類別不平衡。前面說了類別分成三類其中“機器人目標”占了超過90%的樣本“人”和“靜止機器人”加起來不到10%。直接訓練的話模型會嚴重偏向第一類。我們沒有采用復雜的采樣策略只是把后面兩類的損失權(quán)重調(diào)高并在輸入采樣時對包含這兩類的圖像做了輕微的上采樣訓練過程中觀察驗證集上的分類準確率逐步微調(diào)權(quán)重比例。3.4 蒸餾訓練大模型帶路小模型上場上面的模型結(jié)構(gòu)改動完成之后訓練完的模型尺寸和參數(shù)量在邊緣設(shè)備上其實屬于“能跑但不輕松”的狀態(tài)特別是在比賽后期需要同時跑檢測、匹配、預測多個模塊的時候算力很容易吃緊。為了進一步壓縮推理耗時我們做了一次知識蒸餾。方案是先訓練一個YOLOv8-Medium版本作為教師模型它不需要考慮部署實時性只追求盡可能高的精度。之后用蒸餾損失把教師模型的暗知識遷移到學生模型一個極致輕量的YOLOv8-Nano實例上。蒸餾過程中特別關(guān)注了遠程小目標區(qū)域的響應一致性因為教師模型學到的很多細節(jié)特征恰恰是小目標檢測的關(guān)鍵。蒸餾后的學生模型在精度上相比直接從零訓練或只從預訓練權(quán)重微調(diào)的Nano版本mAP提升了約5個百分點但推理速度幾乎快了一倍。最終部署時的方案就是Nano蒸餾版加上TensorRT FP16量化在邊緣設(shè)備上穩(wěn)定跑到了接近100FPS。4. 開源源碼的項目結(jié)構(gòu)與部署細節(jié)從訓練到裁判系統(tǒng)通信4.1 倉庫模塊劃分與使用方式開源倉庫的代碼組織成了幾個獨立的模塊盡量做到每一塊都能單獨用不用非得全套跑起來才能看效果。rm-radar-detect/ ├── configs/ # 模型和訓練超參數(shù)配置 ├── dataset/ # 數(shù)據(jù)集接口、標注預處理腳本 ├── models/ # 檢測模型定義含P2層改動 ├── tools/ # 訓練、驗證、導出腳本 ├── deploy/ # TensorRT部署和推理代碼 ├── communication/ # 裁判系統(tǒng)/機器人通信模塊 └── docs/ # 使用文檔和性能評測報告訓練入口在tools/train.py參數(shù)通過configs目錄下的YAML文件控制換數(shù)據(jù)集只需要改data_root、train_ann、val_ann三個字段。如果你用的是自己的數(shù)據(jù)按照YOLO格式組織好目錄結(jié)構(gòu)理論上幾行配置就能跑起來不需要改動模型代碼。推理模塊單獨抽到了deploy文件夾里不依賴訓練框架只依賴TensorRT的Python綁定。這個設(shè)計是為了方便在比賽現(xiàn)場快速替換模型每次重新訓練完只需要導出engine文件比賽的時候加載進去就行不需要在部署機上裝一套完整的深度學習訓練環(huán)境。4.2 推理鏈路把檢測結(jié)果變成機器人能用的信息檢測只是起點雷達站最終要給機器人提供的是“前方的哪個坐標有敵方機器人”。這里有一個很容易坑到新隊伍的問題相機畫面上的像素坐標怎么換算成場地平面上的世界坐標我們的做法是假設(shè)場地為平面通過場地角點和已知尺寸做單應性變換標定出像素坐標到場地坐標的映射矩陣。整個推理鏈路是圖像輸入到模型得到每輛車的包圍框和類別對每個包圍框取底部中心點作為“接觸面點”因為機器人是放在地面上的底部中心點的投影誤差遠小于絕對中心點再配合卡爾曼濾波對連續(xù)幀的檢測結(jié)果做跟蹤平滑掉單幀誤檢和漏檢導致的坐標抖動。通信模塊也做了抽象默認提供基于UDP的坐標廣播方式廣播內(nèi)容包括目標ID、類別、世界坐標和置信度。不同隊伍如果使用的是裁判系統(tǒng)的自定義協(xié)議只需要替換communication目錄下的編碼器實現(xiàn)不需要動上層邏輯。4.3 從PyTorch到TensorRT的模型導出步驟導出這一步值得單獨拿出來說因為很多人卡在“訓練好了但上不了設(shè)備”這道坎上。我們整理了一個標準的導出流程按這個順序走基本不會出問題。第一步用訓練好的PyTorch權(quán)重導出ONNX格式導出時注意把opset版本號設(shè)到13以上否則部分算子會因為版本舊而轉(zhuǎn)換失敗。第二步用TensorRT的trtexec工具把ONNX轉(zhuǎn)為FP16 engine文件轉(zhuǎn)換命令里需要顯式指定maxBatch和maxWorkspaceSize因為默認值對邊緣設(shè)備不友好。第三步在設(shè)備上加載engine文件做推理測試這一步要重點檢查輸入圖像的預處理方式是否和訓練時完全一致比如圖像歸一化的mean/std值、輸入尺寸、通道順序任何一個不一致都會導致精度暴跌。有一個細節(jié)提醒一下在Jetson設(shè)備上建議直接用JetPack自帶的TensorRT版本不要自己用pip安裝也不是說跑不起來而是版本匹配問題會讓你花掉大量本來不需要花的時間。我們最開始自己裝了一套折騰了一整天才意識到自帶的明顯更合適而且自帶的版本在設(shè)備上做過充分的性能調(diào)優(yōu)。5. 實測性能與踩坑記錄那些文檔里不會寫的經(jīng)驗5.1 不同場景下的實測數(shù)據(jù)開源之前我們把模型拉到各個場景下做了一輪完整的壓力測試。為了直觀說明問題整理了一張對比表格列出不同場景下的核心指標場景輸入分辨率平均推理耗時中近距離檢出率遠程小目標檢出率誤檢率標準場地白天燈光1280x128010.2ms99.4%91.0%0.3%低照度/夜間場地1280x128010.5ms97.1%84.5%0.8%強煙幕干擾1280x128010.1ms92.7%71.2%1.5%高速運動/急轉(zhuǎn)場景1280x128010.6ms94.3%82.3%0.6%整體來看日常比賽場景是夠用的真正的短板在煙幕和低照度場景這也是我們下一步打算重點補數(shù)據(jù)的方向。如果你是在比較極限的場地使用我建議先跑一遍自己的數(shù)據(jù)測一下再決定要不要加訓練樣本。5.2 坑一燈光頻閃讓模型學會了“眨眼”這個坑是最早踩的也非常有代表性。我們在一個場館里測試時發(fā)現(xiàn)模型檢測結(jié)果每隔幾幀就會突然消失一下像是“眨眼睛”。一開始懷疑是推理線程的問題排查了很久最后把逐幀畫面打印出來才發(fā)現(xiàn)那個場館使用的是50Hz交流電供電的燈光亮度的頻閃周期剛好和相機的自動曝光產(chǎn)生耦合導致每隔幾幀就出現(xiàn)一張整體偏暗的幀模型在這種幀上漏檢率很高。解決方案分兩步。第一步在相機設(shè)置里固定曝光時間和增益關(guān)閉自動曝光從源頭上消除幀與幀之間的亮度突變。第二步在訓練數(shù)據(jù)里專門加入了一批模擬頻閃暗幀的樣本通過隨機降低亮度實現(xiàn)讓模型對整體偏暗的輸入不再那么敏感。這個坑告訴我們雷達站的部署環(huán)境遠比實驗室復雜采集數(shù)據(jù)時的光照條件必須盡可能貼近真實比賽場景。5.3 坑二模型過擬合到了訓練場地特征有一段時間我們自信滿滿地帶著模型去外場實測結(jié)果發(fā)現(xiàn)模型在訓練過的實驗室場地表現(xiàn)接近滿分一到外場就頻繁漏檢。后來分析發(fā)現(xiàn)問題出在訓練數(shù)據(jù)里大部分圖片的背景都是同一塊綠色的地面模型學到的不完全是“機器人長什么樣”還有一部分是“綠色背景上有一個孤獨的機器人”稍微復雜一點的背景一來模型就懵了。解決辦法是在數(shù)據(jù)增強階段引入大量的背景替換和色彩擾動把訓練圖里的地面顏色隨機偏移甚至把一整類背景換掉。同時在采集階段就盡量多覆蓋幾種地面材質(zhì)塑膠地、水泥地、木質(zhì)地板、草地。經(jīng)過這一輪調(diào)整外場實測的掉點幅度從接近20個百分點縮小到了5個百分點以內(nèi)。經(jīng)驗很簡單雷達站的泛化性全靠數(shù)據(jù)多樣性撐模型結(jié)構(gòu)再復雜也救不了分布外場景。5.4 坑三遠程小目標標注框的偏移遠程小目標本身就小標注時鼠標稍微偏差幾個像素反映到模型訓練上就是持續(xù)的定位偏差。這個坑最隱蔽因為它不會讓模型“漏檢”或“誤檢”但會讓輸出坐標精度變差對雷達站這種需要精確坐標推導的場景來說影響是很直接的。我們的排查過程是這樣的模型在遠程目標上坐標抖動異常平均誤差明顯大于近處目標。先用標定板驗證了單應性變換矩陣沒有大問題然后調(diào)出遠程目標的訓練標注逐張檢查才發(fā)現(xiàn)部分標注框中心點普遍偏左幾個像素。原因是小目標標注時人會傾向于把框的中心點落在目標的視覺重心上而視覺重心和幾何中心在低分辨率下是有偏差的。解決方法是制定了更嚴格的標注規(guī)則對于遠程目標要求標注時放大到合適倍數(shù)再畫框并且以目標底部中心作為定位錨點而不是用視覺感受上的中心。校正后遠程目標的坐標精度明顯提升。5.5 開源協(xié)議與后續(xù)擴展方向開源數(shù)據(jù)集的協(xié)議我們選了CC BY-NC-SA 4.0也就是非商用、署名、相同方式共享。不希望這份數(shù)據(jù)集被拿去直接商用但很歡迎比賽隊伍、科研團隊用來做非商業(yè)的算法研究和比賽實踐。源碼部分則采用MIT協(xié)議方便大家在項目里自由使用和二次開發(fā)。在開源的過程中有很多人問我們接下來還有什么計劃。我的想法是這套數(shù)據(jù)集的視覺檢測能力目前只是第一步下一個階段更想做的是雷達站的多目標跟蹤與軌跡預測模塊把檢測結(jié)果和比賽決策系統(tǒng)更好地聯(lián)動起來。如果你們隊伍做了類似方向歡迎在GitHub上提交issue或者PR一起把這條小眾但不冷門的工程鏈路做扎實。最后說點實在的雷達站這個崗位在RoboMaster里天然不顯眼但它對整個隊伍的感知能力來說是質(zhì)的改變。如果你正準備開始做我的建議是先別急著調(diào)模型把數(shù)據(jù)采集和標注流程跑通你再回頭看會發(fā)現(xiàn)后面所有事情都順了。這套開源倉庫就是按這個思路設(shè)計的希望能幫你們少走一點我們走過的彎路。本文還有配套的精品資源點擊獲取