
简介本资源为面向无人机频射信号检测任务的标注数据集适合从事无线电信号识别、无人机侦测与目标检测的算法工程师及研究生使用可解决频射信号样本稀缺、标注格式不统一的问题。压缩包共729个文件包含364张jpg原始图像、364个同名txt标注文件及1个yaml配置文件整体约136.82MB标注已适配yolov9格式可直接投入训练流程。数据集覆盖多类无人机频射信号样本图像命名区分了不同机型与频段便于按类别组织实验。据描述基于该数据集的平均正确识别率可达94.3%可作为基线参考帮助读者快速验证检测模型效果、对比不同网络结构的性能差异并在此基础上做数据增强与迁移学习。目前已有450人学习下载适合需要快速搭建频射信号检测实验环境的中高级读者参考使用。1. 364 张图、94.3% 识别率这份无人机频射信号数据集到底能干什么如果你正在做无人机频射信号检测大概率遇到过同一个尴尬公开的射频数据集要么是原始 IQ 采样动辄几十 GB要么是纯音频切片想直接喂给目标检测网络还得自己写一套时频转换加标注的流水线。这份数据集走的是另一条路——它已经把频射信号转成了图像并且用 YOLOv9 格式标注好了364 张原始图片官方给出的平均正确识别率在 94.3%。换句话说你拿到手就能直接开训不用再纠结 STFT 窗长怎么选、标注框怎么对齐。它适合三类人一是想快速验证无人机频射信号检测方案可行性的算法工程师二是需要一个小规模、标注干净的射频图像数据集做课程设计或论文实验的学生三是已经在做无人机视觉感知、想补一条射频信号检测链路的从业者。数据集里出现的kong-*、Mini3Pro_5-8GHZ-*这类文件名说明采集对象覆盖了不同机型、不同频段不是单一场景凑数。接下来我会把这份资源从格式、标注、训练到踩坑完整拆一遍让你判断它值不值得下、下了怎么用。2. 频射信号怎么变成 YOLOv9 能吃的图格式拆解与标注逻辑2.1 从射频到图像这份数据集替你省掉了哪一步无人机频射信号检测的常见链路是天线接收 → 下变频 → IQ 采样 → 时频分析STFT/小波 → 时频图 → 目标检测。前几步是信号处理最后一步才是深度学习。很多团队卡在中间——IQ 数据太大标注成本高而且时频图的质量直接决定检测上限。这份数据集的价值在于它把「时频图生成」这一步做完了。你拿到的.jpg文件本身就是频射信号的时频表示信号在图中表现为特定纹理或能量团标注框圈出的就是无人机信号出现的位置。文件名里的rf后缀也印证了这一点kong-29-_jpg.rf.*.jpg这种命名说明原始采集和转换是分开处理的rf标识射频来源。常见做法是如果你有自己的 IQ 数据可以用相同参数生成时频图再和这份数据集混合训练扩充样本。但要注意不同采集设备、不同 STFT 参数生成的时频图纹理分布差异很大直接混训可能掉点。我一般会先单独在这份数据集上跑一版 baseline确认模型能收敛再考虑迁移。2.2 YOLOv9 标注格式目录结构和 label 文件长什么样YOLOv9 的标注格式和 YOLOv5/v8 一脉相承每张图对应一个同名.txt文件每行一个目标格式是class_id x_center y_center width height其中坐标都是归一化到 0~1 的值。假设你的数据集目录是这样组织的drone_rf_dataset/ ├── images/ │ ├── train/ │ │ ├── kong-29-_jpg.rf.9cd17aec4f296710e6d97856d96ce807.jpg │ │ └── ... │ └── val/ │ └── ... ├── labels/ │ ├── train/ │ │ ├── kong-29-_jpg.rf.9cd17aec4f296710e6d97856d96ce807.txt │ │ └── ... │ └── val/ │ └── ... └── data.yamldata.yaml是训练入口内容大致如下path: ./drone_rf_dataset train: images/train val: images/val nc: 1 names: [drone_rf]这里nc是类别数。这份数据集如果只做「有无无人机信号」的二分类检测nc1就够如果标注里区分了不同机型或频段需要按实际类别数改。names的顺序必须和 label 文件里的class_id对应否则训练时类别全乱。提示拿到数据集后先别急着训用脚本统计一下每个类别的框数量和尺寸分布确认没有空 label 或越界坐标。2.3 标注质量自查三个必须跑的检查标注文件最容易出的问题是坐标越界、类别错位、图片和 label 不匹配。训练前跑一遍检查脚本能省掉后面几小时的无效等待import os import glob img_dir drone_rf_dataset/images/train lbl_dir drone_rf_dataset/labels/train img_files {os.path.splitext(os.path.basename(f))[0] for f in glob.glob(f{img_dir}/*.jpg)} lbl_files {os.path.splitext(os.path.basename(f))[0] for f in glob.glob(f{lbl_dir}/*.txt)} # 检查图片和 label 是否一一对应 missing_lbl img_files - lbl_files missing_img lbl_files - img_files print(f缺 label 的图片: {len(missing_lbl)}) print(f缺图片的 label: {len(missing_img)}) # 检查坐标越界和类别 id for lbl_path in glob.glob(f{lbl_dir}/*.txt): with open(lbl_path) as f: for line_no, line in enumerate(f, 1): parts line.strip().split() if len(parts) ! 5: print(f{lbl_path} 第 {line_no} 行字段数不对: {len(parts)}) continue cls_id int(parts[0]) coords list(map(float, parts[1:])) if cls_id 0 or cls_id 0: # 假设只有 1 类 print(f{lbl_path} 第 {line_no} 行类别 id 异常: {cls_id}) if any(c 0 or c 1 for c in coords): print(f{lbl_path} 第 {line_no} 行坐标越界: {coords})这段脚本做三件事比对图片和 label 文件名集合找出缺失配对逐行检查字段数是否为 5检查类别 id 和归一化坐标是否在合法范围。跑完如果输出全是 0 和空说明标注基本干净。如果有越界坐标YOLOv9 训练时可能直接报错或静默丢弃该框必须提前修。3. 从零跑通 YOLOv9 训练环境、配置与 94.3% 复现路径3.1 环境搭建版本对齐比装最新版更重要YOLOv9 官方仓库对 PyTorch 和 CUDA 版本有要求装错版本会出现torch.cuda.is_available()返回 False 或者编译算子失败。我一般用 conda 建独立环境避免和系统里的其他项目冲突conda create -n yolov9_rf python3.10 -y conda activate yolov9_rf # 安装 PyTorchCUDA 版本按自己显卡驱动选这里以 CUDA 12.1 为例 pip install torch2.2.0 torchvision0.17.0 --index-url https://download.pytorch.org/whl/cu121 # 克隆 YOLOv9 官方仓库 git clone https://github.com/WongKinYiu/yolov9.git cd yolov9 pip install -r requirements.txt关键参数说明python3.10是 YOLOv9 官方推荐版本3.11 以上部分依赖可能不兼容torch2.2.0对应 CUDA 12.1如果你的驱动只支持到 CUDA 11.8把 index-url 换成cu118torch 版本也要相应调整。装完跑一句python -c import torch; print(torch.cuda.is_available())输出 True 再往下走。3.2 训练配置小数据集怎么设 batch 和学习率364 张图属于小数据集直接套用 COCO 那套超参大概率过拟合。我一般会这样改python train_dual.py \ --workers 4 \ --device 0 \ --batch 16 \ --data data/drone_rf.yaml \ --img 640 \ --cfg models/detect/yolov9-c.yaml \ --weights \ --name drone_rf_exp \ --epochs 100 \ --lr0 0.001 \ --lrf 0.01 \ --close-mosaic 10逐项说明--batch 16在 8GB 显存上比较稳显存不够降到 8--img 640是 YOLOv9 默认输入尺寸如果你的时频图分辨率远高于 640可以提到 1280但 batch 要减半--lr0 0.001比默认的 0.01 低一个量级小数据集上更稳--close-mosaic 10表示最后 10 个 epoch 关闭 mosaic 增强让模型在真实分布上收敛。--weights 表示从零训练如果你有预训练权重填路径可以加速收敛。注意--close-mosaic这个参数在 YOLOv9 里叫法可能和 v5 不同跑之前用python train_dual.py --help确认一下当前仓库的实际参数名。3.3 训练过程看什么loss 曲线和 mAP 的合理区间训练启动后终端会打印每个 epoch 的 box_loss、cls_loss、dfl_loss 和 mAP0.5。小数据集上前 20 个 epoch loss 下降快是正常的如果 50 个 epoch 后 box_loss 还在 0.1 以上震荡大概率是学习率偏高或标注有问题。94.3% 这个识别率我理解是在验证集上的 mAP0.5 或 top-1 准确率。复现时不要只盯最终数字重点看验证集 mAP 是否稳定上升。如果训练集 mAP 到 0.98 而验证集卡在 0.7说明过拟合需要加数据增强或减模型容量。常见做法是先把--img降到 512 跑一版确认流程通再升到 640 精调。# 训练完成后用验证脚本单独跑一遍 python val.py \ --data data/drone_rf.yaml \ --weights runs/train/drone_rf_exp/weights/best.pt \ --img 640 \ --task val--task val会输出每类的 P、R、mAP0.5、mAP0.5:0.95。如果 mAP0.5 在 0.9 以上基本达到数据集宣称的水平如果明显偏低先查验证集图片是否和训练集同分布再查 label 有没有漏标。4. 避坑与排查射频图像训练里最容易翻车的五件事4.1 现象训练 loss 正常但 mAP 始终为 0原因通常是data.yaml里的names和 label 文件里的class_id对不上或者nc设成了 0。YOLOv9 在类别数不匹配时不一定报错但所有预测都会被判为背景。解决打开一个 label 文件看第一列的数字最大值是多少nc至少要比它大 1。names列表长度必须等于nc。改完重新训练不要接着上次的权重续。4.2 现象验证集 mAP 比训练集低 20 个点以上364 张图如果随机划分训练/验证可能出现验证集里某些机型或频段完全没在训练集出现。射频信号的类间差异本来就细分布偏移会放大过拟合。解决按文件名前缀分层划分保证kong-*和Mini3Pro_*在训练集和验证集里都有。如果某类样本太少考虑用旋转、加噪做增强但不要对时频图做水平翻转——频射信号的时频结构翻转后物理意义变了。4.3 现象训练到一半 CUDA out of memory--img 640加--batch 16在 6GB 显存上会爆。YOLOv9 的 dual 结构比 v8 更吃显存。解决优先降 batch 到 8再考虑降 img 到 512。如果还爆把--workers降到 2减少数据加载进程的显存占用。不要盲目开--amp小数据集上混合精度有时会让 loss 震荡。4.4 现象标注框看起来对但模型学出来的框总是偏大或偏小时频图里的信号能量团边界本身是模糊的不同人标注的框大小可能差 10~20 像素。如果标注框普遍偏大模型会学到「框大一点更安全」的策略。解决抽 20 张图可视化标注框和原图叠在一起看。如果框明显超出信号区域需要重新标注或收紧框。YOLOv9 对框的回归比较敏感标注质量比模型结构影响更大。4.5 现象换一台机器推理结果完全不对常见原因是推理时的预处理和训练时不一致比如训练用了 letterbox 填充推理时直接 resize导致长宽比失真。射频时频图的长宽比往往携带频率和时间分辨率信息失真会直接改变信号纹理。解决推理脚本里复用训练时的 letterbox 逻辑或者统一用--img相同的尺寸做 resize。如果部署到边缘设备先把一张训练集图片跑通确认输出和验证脚本一致再换真实数据。5. 把 94.3% 再往上推小数据集的增强策略与推理调优364 张图想再涨点靠换更大的模型往往不如把数据用透。我一般会从两个方向下手一是针对频射信号特点做定向增强二是调推理时的置信度和 NMS 参数。定向增强方面时频图对高斯白噪声、频率偏移、时间裁剪比较敏感。可以在训练时加轻微的高斯噪声σ0.01~0.03模拟不同信噪比做小范围频率轴平移±2%模拟载频漂移时间轴裁剪不超过 5%保留完整信号结构。这些增强在 YOLOv9 里可以通过自定义 dataloader 实现也可以离线生成增强样本混进训练集。注意不要同时叠加多种强增强小数据集容易学偏。推理调优方面默认conf0.25、iou0.45不一定适合射频图像。如果漏检多把 conf 降到 0.15 试试如果误检多升到 0.35。NMS 的 iou 阈值在信号密集场景下可以降到 0.3避免相邻信号被合并。下面这段脚本可以批量跑不同参数组合看哪个在验证集上 mAP 最高import subprocess for conf in [0.15, 0.25, 0.35]: for iou in [0.3, 0.45, 0.6]: cmd fpython val.py --data data/drone_rf.yaml \ --weights runs/train/drone_rf_exp/weights/best.pt \ --img 640 --conf {conf} --iou {iou} --task val print(f--- conf{conf}, iou{iou} ---) subprocess.run(cmd, shellTrue)跑完对比每组的 mAP0.5选最高的组合固化到推理配置里。这一步花不了多少时间但经常能捡回 1~2 个点。还有一个容易被忽略的点验证集本身要足够代表真实场景。如果 364 张图里大部分是同一机型、同一频段94.3% 这个数字的泛化意义有限。我习惯在训练前先按文件名前缀统计一下样本分布如果kong-*占 80% 以上说明机型多样性不足实际部署时对Mini3Pro这类样本的识别率可能明显低于平均值。这种情况下要么补充采集要么在损失函数里对少数类加权。从那以后我每次拿到小规模射频数据集都强制先跑一遍样本分布统计和标注可视化再决定训练参数。这份数据集的价值在于它把最耗时的时频转换和标注做完了让你能把精力放在模型调优和场景适配上。希望帮到你。本文还有配套的精品资源点击获取