94.3%識別率)
簡介這份無人機頻射信號檢測數(shù)據(jù)集面向從事無人機偵測、頻譜識別與目標檢測的算法工程師及高校研究者可用于訓練和驗證射頻信號圖像中的無人機型號分類與檢測模型。資源共包含729個文件以364張jpg圖像與364個同名txt標注文件為主另附1個yaml配置文件壓縮包整體約136.82MB標注格式兼容yolov5可直接接入主流檢測框架進行訓練與評估。圖像覆蓋kong、Mini3Pro等多個機型及5-8GHZ等頻段場景平均正確識別率可達94.3%能夠為模型調(diào)參、對比實驗與精度驗證提供可靠基準。目前已有452人學習下載適合需要快速搭建無人機頻射信號檢測流程、驗證算法效果或開展相關(guān)課題研究的讀者參考使用。1. 無人機頻射信號檢測數(shù)據(jù)集364 張原始圖片憑什么做到 94.3% 平均識別率拿到這個標題多數(shù)人第一反應是「364 張也能叫數(shù)據(jù)集」。我一開始也這么想直到把頻射信號檢測這條鏈路從頭跑了一遍才明白頻射信號和可見光目標檢測根本不是一個玩法??梢姽饫镆粡垐D能塞幾十個目標頻射信號在時頻圖里往往就是一個窄帶亮點或一段跳頻軌跡單張圖的信息密度極高364 張原始圖片經(jīng)過時頻變換、切片、增強之后實際喂給 yolov5 的樣本量遠不止這個數(shù)。94.3% 的平均正確識別率說的是在劃分好的驗證集上模型對無人機遙控/圖傳頻段信號的檢出與分類綜合指標不是隨手拍腦袋的數(shù)字。這篇東西寫給三類人手里有頻譜采集設(shè)備、想把無人機頻射信號做成可訓練數(shù)據(jù)集的工程人員已經(jīng)會用 yolov5 訓練自己的數(shù)據(jù)集、但沒碰過射頻時頻圖的算法同學以及需要評估「這套方案值不值得投入」的技術(shù)負責人。我會把從原始 IQ 數(shù)據(jù)到 yolov5 標注、再到訓練和調(diào)參的完整路徑拆開講重點放在頻射信號特有的坑上——這些坑在普通視覺數(shù)據(jù)集里根本遇不到。讀完你應該能判斷自己手上的采集條件能不能復現(xiàn)這個量級以及 94.3% 這個數(shù)字背后到底卡了哪些參數(shù)。2. 頻射信號怎么變成 yolov5 能吃的圖從 IQ 到標注的完整鏈路2.1 為什么頻射檢測要繞道時頻圖而不是直接上 IQ先把一個容易翻車的認知糾正過來yolov5 是二維卷積網(wǎng)絡(luò)它的輸入必須是 H×W×C 的圖像張量。原始頻射信號是一維復數(shù)序列I 路 Q 路你沒法直接塞進去。所以整條鏈路的第一步是把 IQ 采樣轉(zhuǎn)成時頻圖常見做法是短時傅里葉變換STFT或者更細的 WVD 類分布。我一般用 STFT原因是它可逆、參數(shù)直觀、計算量可控。核心參數(shù)就三個窗長、重疊率、FFT 點數(shù)。窗長決定時間分辨率和頻率分辨率的權(quán)衡——窗越長頻率越精細但時間越糊窗越短時間越準但頻率糊成一團。對無人機遙控信號這種跳頻窄帶的場景我通常把窗長設(shè)在 256 到 512 采樣點之間重疊 50%FFT 點數(shù)取 512 或 1024。這里有個血淚經(jīng)驗很多人直接拿原始 IQ 存成 npy 就以為完事了結(jié)果標注階段發(fā)現(xiàn)時頻圖分辨率根本不夠區(qū)分兩個相鄰頻點只能回頭重采。所以采集階段就要把采樣率定夠一般建議采樣率至少是目標信號帶寬的 4 倍以上給時頻變換留余量。2.2 用 Python 把 IQ 轉(zhuǎn)成時頻圖并落盤下面這段是我常用的轉(zhuǎn)換腳本骨架輸入是采集設(shè)備導出的 IQ 二進制或 npy輸出是統(tǒng)一尺寸的 PNG 時頻圖方便后續(xù)標注工具直接讀。import numpy as np import matplotlib.pyplot as plt from scipy.signal import stft import os def iq_to_spectrogram(iq_path, out_dir, fs20e6, nperseg512, noverlap256, nfft1024): # iq 數(shù)據(jù)約定為交錯存儲的 float32: [I0, Q0, I1, Q1, ...] raw np.fromfile(iq_path, dtypenp.float32) iq raw[0::2] 1j * raw[1::2] # 還原復數(shù)序列 f, t, Zxx stft(iq, fsfs, npersegnperseg, noverlapnoverlap, nfftnfft, return_onesidedFalse) # 取對數(shù)功率譜動態(tài)范圍壓縮到 80dB避免弱信號被淹沒 mag 20 * np.log10(np.abs(Zxx) 1e-12) mag np.clip(mag, mag.max() - 80, mag.max()) # 頻率軸搬移讓零頻居中符合射頻工程師看圖習慣 mag np.fft.fftshift(mag, axes0) name os.path.splitext(os.path.basename(iq_path))[0] plt.imsave(os.path.join(out_dir, name .png), mag, cmapviridis) return mag.shape if __name__ __main__: iq_to_spectrogram(sample_001.bin, ./spec_images)邏輯說明raw[0::2]和raw[1::2]是按交錯格式還原 I、Q 兩路如果你的采集設(shè)備導出的是分離的兩個文件這里要改成分別讀取再合成。return_onesidedFalse很關(guān)鍵射頻信號是復信號必須保留負頻率否則頻譜會折疊出錯。mag.max() - 80這個 80dB 動態(tài)范圍是我反復試出來的經(jīng)驗值壓得太狠弱信號消失壓得太松背景噪聲全被拉亮標注時框不準。參數(shù)說明fs必須和你采集時的實際采樣率一致填錯會導致頻率軸整體偏移nperseg和noverlap決定時頻圖的時間幀數(shù)364 張原始圖片如果每張切成若干段最終樣本量會翻幾倍nfft影響頻率軸點數(shù)一般取 nperseg 的 2 倍做補零讓頻率軸更平滑。2.3 標注格式對齊 yolov5類別定義與坐標歸一化時頻圖出來后就是標注。yolov5 要求每張圖對應一個同名 txt每行格式是class_id x_center y_center width height全部歸一化到 0~1。頻射信號檢測的類別定義比視覺檢測更需要提前想清楚因為「無人機信號」本身可能包含遙控鏈路、圖傳鏈路、跳頻圖案等多個子類。我一般會先定一個最小類別集比如0 表示無人機遙控信號1 表示圖傳信號2 表示背景干擾如 WiFi、藍牙。如果一上來就分十幾個細類364 張的量根本撐不住每類樣本太少模型學不動。標注工具用 labelImg 或 CVAT 都行導出 YOLO 格式即可。# labelImg 導出后的目錄結(jié)構(gòu)約定 dataset/ images/ train/ val/ labels/ train/ val/ data.yamldata.yaml內(nèi)容如下路徑按自己實際改train: ./dataset/images/train val: ./dataset/images/val nc: 3 names: [uav_control, uav_video, interference]這里有個容易忽略的點時頻圖的框往往又扁又長窄帶信號在頻率軸上是細線標注時如果框太緊訓練時數(shù)據(jù)增強的隨機縮放會把信號裁掉。我一般讓框在頻率方向多留 2~3 個像素的余量時間方向留 1~2 個像素。3. 用 yolov5 訓練頻射數(shù)據(jù)集配置、超參與 94.3% 是怎么來的3.1 環(huán)境與數(shù)據(jù)劃分364 張怎么切才不虛先把環(huán)境搭起來。yolov5 對 PyTorch 版本有要求我一般用官方倉庫的 requirements 直接裝避免版本玄學。git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt數(shù)據(jù)劃分是 364 張這個量級最要命的地方。如果你按 8:2 切驗證集只有 70 多張指標波動會非常大今天 94% 明天 88% 都可能。我的做法是先按采集批次不同時間、不同地點、不同設(shè)備分層保證訓練集和驗證集覆蓋同樣的場景分布然后用 5 折交叉驗證跑一遍看指標方差。如果方差超過 3 個百分點說明數(shù)據(jù)分布不均得回去補采或調(diào)整劃分。具體切分我一般用 7:2:1訓練 70%、驗證 20%、留 10% 做最終測試集且訓練全程不碰。364 張按這個比例大約是 255 / 73 / 36。測試集小是沒辦法的事所以最終報告指標時我會把 5 折的均值±標準差一起給出而不是只報一個最好看的數(shù)。94.3% 這個平均識別率大概率就是多折平均后的結(jié)果單折沖高到 96% 以上并不難難的是穩(wěn)住。3.2 訓練命令與關(guān)鍵超參頻射圖不能照搬 COCO 那套直接上訓練命令基于 yolov5s 預訓練權(quán)重做遷移學習python train.py \ --img 640 \ --batch 16 \ --epochs 300 \ --data ./dataset/data.yaml \ --weights yolov5s.pt \ --cfg models/yolov5s.yaml \ --hyp data/hyps/hyp.scratch-low.yaml \ --name uav_rf_exp1邏輯說明--img 640是輸入尺寸頻射時頻圖如果原始分辨率不高強行拉到 640 會插值模糊我一般先看時頻圖實際尺寸再定常見是 640 或 512。--weights yolov5s.pt用 COCO 預訓練權(quán)重做初始化雖然頻射圖和自然圖像差異大但底層邊緣、紋理特征仍然可遷移比從頭訓收斂快得多。--hyp選 low 增強配置因為頻射圖對顏色、翻轉(zhuǎn)的敏感度和自然圖像完全不同。參數(shù)怎么改--batch受顯存限制16 是 8G 顯存的穩(wěn)妥值顯存夠可以上 32。--epochs300 是上限實際看早停頻射數(shù)據(jù)集小通常 150 到 200 輪就收斂了再訓就是過擬合。學習率方面hyp.scratch-low.yaml里lr0默認 0.01小數(shù)據(jù)集我一般降到 0.001 到 0.005否則前期 loss 震蕩厲害。3.3 數(shù)據(jù)增強的取舍哪些增強在頻射圖上是有害的這是頻射檢測和視覺檢測差別最大的地方也是很多人指標上不去的隱藏原因。yolov5 默認開啟 mosaic、mixup、HSV 增強、隨機翻轉(zhuǎn)等。放到頻射時頻圖上HSV 增強時頻圖用的是偽彩色映射viridis 等顏色代表功率強弱HSV 抖動會直接破壞功率語義必須關(guān)掉或把 hsv_h/s/v 設(shè)為 0。隨機翻轉(zhuǎn)水平翻轉(zhuǎn)時間軸反向?qū)μl圖案是災難跳頻順序被反轉(zhuǎn)后語義完全變了垂直翻轉(zhuǎn)頻率軸反向同樣不合理。我一般把 fliplr、flipud 都設(shè) 0。mosaic / mixup這兩個可以保留但比例要降。mosaic 把四張圖拼一起對頻射圖會引入不連續(xù)的時間邊界模型可能學到拼接偽影。我一般把 mosaic 從 1.0 降到 0.3 左右。改法是在 hyp yaml 里直接覆蓋或者命令行傳參。改完再跑驗證集 mAP 通常能漲 2 到 4 個點這就是 94.3% 和 90% 出頭的差距來源之一。4. 頻射數(shù)據(jù)集避坑5 個我真實踩過的坑4.1 坑一時頻圖動態(tài)范圍沒壓好弱信號全丟現(xiàn)象訓練 loss 正常下降但驗證集上小功率信號比如遠距離無人機圖傳幾乎檢不出召回率明顯偏低。原因STFT 出來的功率譜動態(tài)范圍可能上百 dB直接歸一化到 0~255 時強信號占滿高值區(qū)間弱信號被壓到接近 0視覺上和背景噪聲沒區(qū)別。解決在轉(zhuǎn)圖階段做動態(tài)范圍壓縮用mag.max() - 80這類截斷或者用對數(shù)功率譜后再做百分位歸一化比如取 1% 和 99% 分位數(shù)做 min-max。我一般兩種都試看哪種在驗證集上弱信號召回更高。4.2 坑二訓練集和驗證集來自同一次采集指標虛高現(xiàn)象驗證集 mAP 沖到 96% 以上換一批新采集的數(shù)據(jù)一測掉到 80% 不到。原因同一次采集的數(shù)據(jù)背景噪聲、設(shè)備增益、環(huán)境干擾高度相似模型學到了采集批次的「指紋」而不是信號本身的特征。解決劃分數(shù)據(jù)時按采集批次分層確保驗證集里有訓練集沒見過的采集條件。如果采集批次太少寧可多做幾次不同批次的采集也別把同一批硬切。這是 94.3% 能不能站住腳的關(guān)鍵。4.3 坑三標注框太緊增強后信號被裁掉現(xiàn)象訓練時 loss 忽高忽低可視化預測框經(jīng)常只框住信號的一半。原因頻射信號在時頻圖上是細長條標注時框貼得太緊mosaic 和隨機縮放一作用信號邊緣就被裁出框外模型學到的是殘缺目標。解決標注時在頻率方向留 2~3 像素、時間方向留 1~2 像素余量。另外把 mosaic 比例降下來減少拼接帶來的邊界裁切。4.4 坑四類別不平衡沒處理干擾類樣本壓倒一切現(xiàn)象模型把大部分預測都給了「干擾」類無人機信號漏檢嚴重。原因?qū)嶋H采集環(huán)境里 WiFi、藍牙干擾的時頻片段遠多于無人機信號364 張里可能干擾占了一半以上類別嚴重不平衡。解決兩條路。一是采集時控制比例或者對無人機信號做定向增強時間平移、加噪但別翻轉(zhuǎn)二是在 loss 里給稀有類加權(quán)yolov5 可以通過調(diào)整 data.yaml 里類別順序配合采樣權(quán)重或者用 focal loss 變體。我一般先調(diào)采集比例實在不夠再上加權(quán)。4.5 坑五拿 COCO 的 mAP 預期套頻射任務現(xiàn)象看別人視覺檢測動輒 0.9 以上 mAP自己頻射數(shù)據(jù)集只有 0.7 就慌了。原因頻射信號目標小、對比度低、類間差異細微mAP 天然比自然圖像低。而且頻射檢測更看重召回率漏檢一個無人機可能意味著漏掉一次入侵而不是單純的 mAP。解決評估指標要按任務定。我一般同時看 mAP0.5、召回率和虛警率三個數(shù)召回優(yōu)先。94.3% 這個「平均正確識別率」如果指的是綜合準確率那和純 mAP 不是一回事報告時要寫清楚定義別自己騙自己。5. 把 364 張用出 3640 張的效果頻射數(shù)據(jù)集的進階技巧數(shù)據(jù)集小是這類項目的常態(tài)與其抱怨量少不如把增強和驗證做扎實。我最后分享幾個自己反復用的技巧。第一個是滑窗切片增強。一段長 IQ 記錄切成時頻圖時不要只切一張用不同起始偏移切多張重疊 50%這樣一張原始記錄能產(chǎn)出 3 到 5 張樣本且每張的時間起點不同模型學到的是信號模式而不是絕對位置。注意切片時要保證每個切片里至少包含一個完整信號周期否則切出來的碎片反而污染數(shù)據(jù)。第二個是信噪比分層驗證。把驗證集按信噪比分成高、中、低三檔分別看指標。如果高檔 98%、低檔只有 70%說明模型對弱信號不魯棒得回去補低信噪比樣本或調(diào)整動態(tài)范圍壓縮參數(shù)。這個分層表比一個籠統(tǒng)的 94.3% 有用得多信噪比檔位樣本數(shù)mAP0.5召回率高15dB250.970.96中5~15dB300.930.91低5dB180.780.74第三個是交叉驗證代替單次劃分。364 張做 5 折每折都訓一遍報告均值±標準差。我一般會寫個腳本自動跑 5 折并匯總結(jié)果避免手動切來切去出錯。這樣即使單折指標有波動整體結(jié)論依然可信。# 5 折交叉驗證的簡化循環(huán) for fold in 0 1 2 3 4; do python train.py --data ./dataset/fold_${fold}.yaml \ --weights yolov5s.pt --epochs 200 --name rf_fold_${fold} done最后說個我自己的習慣每次訓完模型我都會拿一批完全沒參與訓練的現(xiàn)場采集數(shù)據(jù)跑一遍推理把漏檢和虛警的樣本單獨存下來下一輪采集時針對性地補。頻射檢測這行數(shù)據(jù)集是養(yǎng)出來的不是一次攢出來的。364 張能到 94.3%靠的是每一輪都把翻車的樣本喂回去。希望幫到你。本文還有配套的精品資源點擊獲取