
简介本资源为面向无人机频射信号检测任务的标注数据集适合从事无线电信号识别、无人机侦测与目标检测的算法工程师及高校研究者使用可支撑基于YOLO系列的目标检测模型训练与验证。包内共729个文件以364张jpg原始图像与364个同名txt标注文件为主另含1个yaml配置文件压缩包整体约136.82MB标注格式兼容YOLOv11便于直接接入主流检测框架开展训练。数据集覆盖多类无人机频射信号样本官方给出的平均正确识别率可达94.3%可作为信号检测与分类任务的基准参考。目前已有633人学习下载读者可据此快速搭建训练与评估流程验证模型在频射信号场景下的检测效果并在此基础上进行数据增强、类别扩展与算法调优适合作为相关课题与工程实践的起步数据。1. 无人机频射信号检测数据集364 张原始图片怎么撑起 94.3% 的识别率拿到一份只有 364 张原始图片的无人机频射信号检测数据集第一反应多半是「这点量能训出什么」。但实测平均正确识别率能到 94.3%而且标注直接对齐 YOLOv11 格式这件事就值得拆开看了。频射信号检测和常规可见光目标检测不是一回事它处理的是遥控链路、图传链路在特定频段上的能量分布把信号转成时频图之后无人机的机型差异、跳频模式、带宽占用会变成图像上的纹理特征。这份资源解决的就是「没有射频采集条件、又想验证检测链路」的问题适合做无人机侦测、频谱监测、低空安防方向的算法验证和课程设计。364 张不算多但胜在标注规范、类别清晰能让你把从数据到推理的整条链路先跑通再决定要不要扩采。2. 频射信号转时频图为什么 364 张图片能训出可用模型2.1 射频数据集的图像化逻辑频射信号本身是一维时序直接喂给检测网络没有意义。常见做法是先做短时傅里叶变换STFT把时域信号切成短窗每个窗做 FFT得到时间-频率-能量三维矩阵再映射成灰度或伪彩图。这样无人机的遥控信号会表现为若干条随时间跳变的亮带图传信号则是较宽的连续能量块。数据集里的文件名带kong-和Mini3Pro_5-8GHZ前缀说明采集时已经按机型或频段做了分组5-8GHZ直接标出了频段范围。这种命名方式对后续做类别平衡很有用你可以按前缀统计各类样本数量避免某一类过少导致召回率塌陷。时频图的分辨率决定了小信号能不能被检测到。窗长选得大频率分辨率高但时间分辨率差跳频的瞬间会被抹平窗长选得小时间分辨率好但频率糊。我一般会先用 1024 点窗、256 点重叠做一版看信号在图上是否连续可辨再根据 YOLOv11 的输入尺寸做缩放。364 张图如果分辨率都在 640 左右直接 letterbox 到 640×640 即可不需要额外切图。2.2 YOLOv11 标注格式的字段含义YOLOv11 沿用 YOLO 系列的标注规范每张图对应一个同名.txt每行一个目标格式是class_id x_center y_center width height四个坐标都是归一化到 0~1 的相对值class_id从 0 开始。这份数据集支持 YOLOv11 格式意味着你不需要再做 VOC 到 YOLO 的转换直接配 data.yaml 就能开训。但要注意频射信号的目标框往往比较扁长宽高比可能到 5:1 甚至更大如果标注时框贴得太紧增强里的随机缩放容易把目标压没。建议在训练配置里把scale增强的幅度调小或者关掉 mosaic 的前几轮让模型先学到稳定的时频纹理。2.3 数据划分与类别统计脚本拿到数据先别急着训跑一遍统计脚本看清每类多少张、每张多少框。下面这段代码遍历 images 和 labels 目录输出类别分布和框的宽高比分布import os from collections import Counter import numpy as np img_dir datasets/images/train lbl_dir datasets/labels/train cls_counter Counter() ratios [] for name in os.listdir(lbl_dir): if not name.endswith(.txt): continue with open(os.path.join(lbl_dir, name)) as f: for line in f: parts line.strip().split() if len(parts) ! 5: continue cid int(parts[0]) w, h float(parts[3]), float(parts[4]) cls_counter[cid] 1 if h 0: ratios.append(w / h) print(类别分布:, dict(cls_counter)) print(宽高比 中位数:, np.median(ratios), 最大:, np.max(ratios))逻辑说明cls_counter统计每个类别的框数量用来判断有没有类别严重不均衡ratios收集宽高比中位数超过 3 就说明目标普遍扁长训练时 anchor 或输入尺寸要相应调整。参数上如果你的类别数超过 3 类建议在 data.yaml 里把nc写对类别名按实际信号类型填不要用默认的 person、car 之类。2.4 训练配置的关键参数YOLOv11 的训练入口和 YOLOv8 一致用 ultralytics 的 CLI 或 Python API 都行。下面是一个针对小数据集的配置片段from ultralytics import YOLO model YOLO(yolo11n.pt) # 小数据集先用 nano 版避免过拟合 model.train( datarf_data.yaml, epochs150, imgsz640, batch16, lr00.001, # 小数据集学习率调低 lrf0.01, mosaic0.5, # 降低 mosaic 强度保护扁长目标 scale0.3, # 缩放增强幅度减小 patience30, # 30 轮无提升就早停 device0 )逻辑说明yolo11n.pt是轻量版364 张图用大模型很容易过拟合lr00.001比默认的 0.01 低一个量级防止小数据集上梯度震荡mosaic0.5表示一半概率做马赛克增强比默认的 1.0 温和patience30是早停避免无效训练。如果你的显存够batch可以提到 32但小数据集上 batch 太大反而降低泛化16 是个稳妥值。3. 从原始图片到 YOLOv11 可训数据目录结构与 data.yaml 落地3.1 标准目录结构YOLOv11 对目录结构有约定images 和 labels 要平行放置train/val 各自成对。建议整理成下面这样rf_dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── rf_data.yaml原始图片文件名里的.rf.和长哈希是采集系统生成的不影响训练但建议批量重命名成短名避免某些系统下路径过长报错。重命名时保持 images 和 labels 同名对应即可。3.2 data.yaml 的字段与常见错误data.yaml 是训练入口字段写错会直接报Dataset not found或nc mismatch。一个可用的配置path: /home/user/rf_dataset train: images/train val: images/val nc: 2 names: 0: remote_control 1: video_link逻辑说明path是数据集根目录train和val是相对路径nc必须和标注里的最大 class_id 1 一致否则训练时类别索引越界names的顺序要和标注时的类别编号对应。常见错误是把train写成绝对路径又和path拼接导致路径重复或者nc写了 3 但标注里只有 0 和 1训练能跑但评估时多出的类永远是零召回。3.3 标注校验脚本标注文件里偶尔会有空行、坐标越界、类别号超范围的问题训练前跑一遍校验能省很多排查时间import os lbl_dir rf_dataset/labels/train nc 2 errors [] for name in os.listdir(lbl_dir): if not name.endswith(.txt): continue with open(os.path.join(lbl_dir, name)) as f: for i, line in enumerate(f, 1): parts line.strip().split() if len(parts) 0: continue if len(parts) ! 5: errors.append(f{name}:{i} 字段数 {len(parts)}) continue cid int(parts[0]) vals [float(x) for x in parts[1:]] if cid nc: errors.append(f{name}:{i} 类别 {cid} 超范围) if any(v 0 or v 1 for v in vals): errors.append(f{name}:{i} 坐标越界) print(错误数:, len(errors)) for e in errors[:20]: print(e)逻辑说明这段脚本检查字段数、类别号范围、坐标归一化范围三类问题。nc要和 data.yaml 一致坐标越界通常是标注工具导出时没做裁剪YOLOv11 训练时虽然会 clamp但越界框的梯度会异常最好提前修掉。如果错误集中在某几个文件直接删掉或重新标注那几张即可。3.4 小数据集的增强策略364 张图做训练增强是撑起泛化的关键。但频射时频图和自然图像不同水平翻转会改变时间轴方向垂直翻转会改变频率轴方向这两种翻转在物理上不一定成立。我一般只开亮度、对比度微调以及小幅度的平移和缩放。mosaic 可以开但强度降到 0.3~0.5mixup 在小数据集上容易让信号纹理糊在一起建议关掉。如果你发现验证集 loss 震荡大先把增强全关跑一版基线再逐项加回来看哪项导致掉点。4. 训练与推理避坑频射信号检测的常见问题排查4.1 现象训练 loss 正常但 mAP 极低原因标注类别号和 data.yaml 的 names 顺序错位模型学到的类别和评估时的类别对不上。频射数据集里 remote_control 和 video_link 的时频纹理差异不大错位后模型可能把两类混为一类mAP 直接腰斩。解决用 3.3 的校验脚本确认 class_id 分布再打印 data.yaml 的 names逐一对齐。如果标注里只有 0 和 1names 就写两行不要多写。4.2 现象验证集召回率远低于训练集原因小数据集上过拟合模型记住了训练图的噪声纹理而不是信号特征。364 张图如果 train/val 划分时同一采集批次的图被分到两边验证集就失去意义。解决按文件名前缀做划分同一前缀的图要么全在 train 要么全在 val避免同源泄漏。同时把patience调小早停保住泛化最好的权重。如果还不行把yolo11n换成更小的yolo11n并加 dropout但 ultralytics 默认没开 dropout需要改模型配置。4.3 现象推理时框大量重叠或漏检原因频射信号在时频图上可能连续出现多个能量块NMS 的 IoU 阈值默认 0.7扁长目标之间 IoU 容易偏高导致相邻框被误抑制。解决推理时把iou阈值调到 0.5~0.6conf阈值从 0.25 提到 0.4先保精度再调召回。如果漏检集中在弱信号检查输入图是否做了归一化时频图的能量值范围如果不在 0~255要手动拉伸到 8bit 再送模型。4.4 现象训练报显存不足原因imgsz640配合batch16在 8G 显存上可能吃紧尤其是开了 mosaic 之后中间特征图翻倍。解决先把batch降到 8或者用imgsz512跑一版看精度损失。YOLOv11 支持ampTrue混合精度默认开启如果关了记得打开。实在不够就换yolo11n参数量比 s 版小一半。4.5 现象验证集图片和标注数量对不上原因重命名或划分时 images 和 labels 没同步某个 split 下图片有 300 张但标注只有 298 个。解决写个脚本比对两个目录的文件名集合差集打印出来手动补。YOLOv11 训练时缺标注的图会被跳过不会报错但实际参与训练的样本变少评估指标会虚高。5. 把 94.3% 复现出来验证方法与调参技巧94.3% 这个数字是在特定划分和特定阈值下得到的直接拿你的划分去跑不一定一样。想复现先把评估口径对齐确认用的是 mAP0.5 还是 mAP0.5:0.95确认 val 集是不是同一批图。我一般会固定随机种子跑三次取平均避免单次划分的偶然性。下面这段代码用来固定种子并输出每次的指标import torch, random, numpy as np from ultralytics import YOLO def set_seed(s42): random.seed(s) np.random.seed(s) torch.manual_seed(s) torch.cuda.manual_seed_all(s) for seed in [42, 2024, 7]: set_seed(seed) model YOLO(yolo11n.pt) model.train(datarf_data.yaml, epochs150, imgsz640, batch16, lr00.001, seedseed, verboseFalse) metrics model.val() print(fseed{seed} mAP50{metrics.box.map50:.4f})逻辑说明set_seed固定 Python、NumPy、PyTorch 的随机源三次不同种子跑完看 mAP50 的波动范围如果标准差超过 2 个点说明数据划分不稳定需要扩大 val 集或做交叉验证。metrics.box.map50是 mAP0.5和 94.3% 对比时确认口径一致。调参上小数据集最敏感的是学习率和增强强度。我习惯先用lr00.001、mosaic0.5跑基线如果 mAP 低于 90%先把lr0降到 0.0005 再跑如果训练 loss 下降但 val loss 上升把mosaic关掉、scale降到 0.2。另一个技巧是冻结 backbone 前几轮让检测头先适应时频纹理再解冻全量微调。ultralytics 里可以用freeze10冻结前 10 层跑 20 轮后再正常训。验证时别只看 mAP把混淆矩阵和 PR 曲线导出来看。频射数据集里 remote_control 和 video_link 如果混淆严重说明时频图上的区分度不够可能需要回到 STFT 参数重新生成图像而不是继续调模型。我踩过的坑是模型指标看着不错但实际部署时换一批采集设备信号能量分布变了召回直接掉两成。从那以后我每次拿到新数据都强制先跑一遍类别分布和宽高比统计再决定增强和 anchor 策略。希望这份拆解能帮你把这条链路先跑通少走点弯路。本文还有配套的精品资源点击获取