简介面向无人机射频信号检测与目标识别场景的高质量标注数据集适用人群为低空安防、无人机反制、智慧城市等方向的研究人员与算法工程师可解决无人机监测中样本稀缺、标注成本高等现实问题。资源包含364张原始图片及一一对应的txt格式标注文件可直接用于YOLOv8系列模型的训练、验证与推理测试数据集平均正确识别率达到94.3%具备良好的工程落地基础。整个压缩包共729个文件由364个jpg图像、364个txt标注文件以及1个yaml数据集配置文件组成整体体积约136.82MB其中txt文件记录每个目标的类别与边界框坐标yaml文件预设类别名称与数据路径导入ultralytics框架即可快速启动训练流程。样本素材覆盖kong、Mini3Pro等多种无人机机型可用于开展目标检测模型对比实验、射频特征分析及识别算法验证。目前已有600人学习下载兼顾数据完整性与格式规范性适合作为入门与进阶研究的基准确数据集。1. 用 YOLOv8 做无人机射频信号检测这份 364 张图的数据集能复现 94.3% 的识别率做无人机频射信号检测最卡人的不是模型选型而是数据集。目标检测要喂图片但射频RF信号本身是波形极少有人把频谱瀑布图整理成带标注框的图片集就算整理出来标注格式也未必是 YOLOv8 能直接读的。这份数据集正好卡在实用点364 张原始图片已经导出成 YOLOv8 的 txt 标注格式用 YOLOv8 跑一遍平均正确识别率能到 94.3%。对想快速验证“RF 信号能不能用目标检测来做”的朋友这就是现成的训练原料。适合两种人一是刚接触 RF 检测、想熟悉 YOLOv8 全流程的入门者二是手头有射频采集设备、急需一份干净数据集做原型验证的工程师。下面我从标注格式讲到训练参数最后把坑都给你蹚一遍。2. 拆开数据集364 张 jpg 里的射频信号到底是什么2.1 文件名里的信息kong、Mini3Pro 和 5-8GHZ 的真实含义解压数据集后你会看到一批类似kong-29-_jpg.rf.9cd17aec...jpg和Mini3Pro_5-8GHZ-6-_jpg.rf.c9651ebb...jpg的文件。文件名里.rf.后面那串哈希是 Roboflow 导出图片时自动生成的唯一编号不用管。真正有用的是前半段kong和Mini3Pro。Mini3Pro指大疆 Mini 3 Pro 无人机5-8GHZ对应它图传和遥控常用的 5.8 GHz 频段。kong在中文资源里常写作“空”表示没有目标信号的背景样本或者指空旷环境下的低噪底采集。也就是说这份数据集的检测目标是“无人机射频信号”而不是无人机本体。图片内容大概率是时频谱图、瀑布图或 IQ 幅度图标注框框住的不是飞机轮廓而是信号在时间-频率平面上出现的区域。建议拿到数据先别急着训练用下面命令看一遍文件结构find . -name *.jpg | head -n 20 find . -name *.txt | wc -l我在本地跑这类数据集时通常把 jpg 和 txt 的名字一一对一下确保每张图都有对应标注。364 张图如果 txt 数量明显偏少说明部分背景图故意不带标注这种负样本在 YOLOv8 里可以当作图片级背景参与训练但不能作为目标框使用。2.2 YOLOv8 标注文件的结构一行 txt 对应一个信号目标YOLOv8 的标注不是 XML而是纯文本每行对应一个目标框。打开任意一个.txt典型的记录长这样0 0.532031 0.446875 0.231250 0.059375这五个数字的含义从左到右分别是类别编号、归一化中心点 x、归一化中心点 y、归一化宽度、归一化高度。归一化指的是除以图片宽高取值都在 0 到 1 之间。0.532031表示目标中心的横向位置在图片 53.2% 处0.446875表示纵向位置在 44.7% 处0.231250是框宽占整张图的 23.1%0.059375是框高占 5.9%。放在射频信号图像里这个框往往不是“框住一架飞机”而是框住信号在频谱图上隆起的那一段能量带。框的高度通常对应频率跨度框的宽度对应时间持续长度所以你会看到大量瘦长型标注框。这也是后续训练时要格外注意小目标问题的原因。2.3 数据集规模评估364 张图够训练一个可用模型吗从规模上说364 张不算大。常规 YOLOv8 目标检测入门数据集通常在 1000 张以上但射频信号图像有自己的特点背景相对单一目标纹理结构简单信号斑块在时频谱上的形状比较稳定。这种场景下364 张图搭配适度数据增强完全可以训练出能用的模型94.3% 的平均识别率也验证了这一点。需要注意的隐患是类别平衡。如果kong和Mini3Pro两类图数量相差悬殊训练时模型会偏向数量多的一类。我的习惯是先统计一下每个类别在 labels 中的分布for f in labels/*.txt; do awk {print $1} $f; done | sort | uniq -c如果统计结果只有0一个类别编号说明这是单类别检测任务如果出现1说明把kong单独标成了一个类别。单类别场景下我们只需要关心“有没有信号”多类别场景则要区分“是无人机信号还是背景干扰”两种任务训练参数差异很大后续章节会展开。3. 训练前的准备目录重排、数据划分和增强参数3.1 按 YOLOv8 要求重排目录images 与 labels 必须严格配对YOLOv8 默认的数据组织方式是images/train、images/val、labels/train、labels/val四件套图片和标注文件同名同前缀。Roboflow 导出包通常是全部图片在一个目录、全部 txt 在另一个目录需要手工重组。常见做法是写一段 bash 脚本完成重排mkdir -p dataset/images/train dataset/images/val mkdir -p dataset/labels/train dataset/labels/val # 先把所有 jpg 和 txt 按同名配对移动 mv 原始图片目录/*.jpg dataset/images/train/ mv 原始标注目录/*.txt dataset/labels/train/ # 后续划分时再抽一部分到 val重排的关键是文件名完全一致。Roboflow 导出的图片名类似kong-29-_jpg.rf.9cd17aec4f296710e6d97856d96ce807.jpg对应标注文件名是kong-29-_jpg.rf.9cd17aec4f296710e6d97856d96ce807.txt它把原扩展名jpg也并入了文件名。如果你用脚本批量修改文件名记得不要只改前缀后缀也要同步处理。我一般用 Python 做配对检验看到文件名不匹配直接报错避免训练时 yolov8 静默跳过样本。3.2 划分 train/val 时怎么避免同源帧泄漏射频信号数据经常是从一段连续录制视频里抽帧得到的相邻帧高度相似。如果随机划分 train/val同一段信号源可能既出现在训练集又出现在验证集mAP 虚高部署时立刻现原形。文件名里的kong-29、kong-41这些编号如果代表视频片段序号按片段划分才是稳妥的。import random from pathlib import Path images list(Path(dataset/images/train).glob(*.jpg)) random.Random(42).shuffle(images) val_count max(1, int(len(images) * 0.15)) val_files images[:val_count] for img in val_files: label Path(dataset/labels/train) / (img.stem .txt) img.rename(img.parent / val / img.name) label.rename(label.parent.parent / val / label.name)这段代码先把图片列表按固定随机种子打乱保证每次执行结果一致再取出前 15% 作为验证集。img.stem取文件名主体部分与 txt 的命名规则严格对应。如果你需要更精细地按片段划分可以在文件名里提取kong-29这样的片段前缀按前缀分组而不是按单张图片划分这一步对射频信号数据集尤其重要。3.3 数据增强参数怎么调才不破坏射频信号特征YOLOv8 自带 mosaic、HSV 变换、随机翻转等增强策略但射频信号图不是自然图像增强参数不能照抄 COCO 配置。色相和饱和度变换对灰度频谱图毫无意义还可能把信号的明暗对比拉乱垂直翻转等于颠倒频率轴在真实频谱中频率高低有物理含义不建议使用。水平翻转可以保留因为时间轴正序倒序对检测信号存在性影响不大。我常用的改动是把hsv_h、hsv_s、hsv_v都调低甚至归零保留fliplr0.5开启轻度尺度缩放和错切。mosaic 要谨慎射频信号的小目标本身对比度就低mosaic 拼接出的马赛克区域容易让信号斑块更模糊。建议mosaic0.5起步如果训练 loss 波动大再降到 0.3。4. 用 YOLOv8 训练射频信号检测模型命令、参数与结果解读4.1 环境准备CPU 也能跑的极简安装这份数据集的检测任务属于小目标检测但背景简单用 YOLOv8n 或 YOLOv8s 就能跑参数量小CPU 也能完成训练。安装依赖就三行命令pip install ultralytics pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu第一行安装目标检测工具库第二行显式安装 CPU 版 PyTorch。如果你有 Nvidia 显卡把第二行换成pip install torch torchvision即可会自动匹配 CUDA 版本。这里建议先用 CPU 版跑通流程确认 loss 在下降再换 GPU 调参而不是一开始就把时间和算力耗在环境配置上。4.2 训练命令与核心参数释义进入数据集根目录后先创建data.yaml内容示例如下path: ./dataset train: images/train val: images/val nc: 1 names: [drone_rf]path指定数据集根目录train和val是相对路径nc是类别数量names是类别名列表。如果你的数据有多个类别nc改成实际类别数names按顺序对应 txt 里的类 id。之后执行训练命令yolo detect train datadata.yaml modelyolov8n.pt epochs100 imgsz640 batch16 patience20 devicecpu拆开解释几个关键参数。imgsz640是图片缩放尺寸射频信号的小目标在 640 下可能只有十几个像素如果漏检严重可以升到 1024。patience20是早停轮数连续 20 个 epoch 验证集指标不再提升就自动停止364 张图通常到不了 100 轮就收敛了。batch16在 CPU 上如果内存不足先调到 8。modelyolov8n.pt表示加载预训练权重虽然预训练模型是在 COCO 上训练的但对特征提取层仍有帮助能明显缩短收敛时间。4.3 从输出日志判断收敛P、R、mAP 怎么读训练过程中你会看到类似这样的日志Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 79/100 0.187G 0.8123 0.6542 1.0342 2 640 Class Images Instances Box(P R mAP50) all 55 120 0.952 0.934 0.943box_loss是边界框回归损失cls_loss是分类损失这两个数值随训练轮次波动下降是正常现象。最后一行mAP500.943对应的就是标题里说的 94.3% 平均正确识别率P0.952是精确率R0.934是召回率。在只有 364 张图的情况下这个指标分布比较健康说明不是靠阈值硬压出来的。如果你的日志里P高但R低说明模型偏保守宁可漏检也不误检后续推理时可以把置信度阈值调低一点。反过来R高P低则是误检太多需要提高置信度阈值。射频信号检测场景里我一般更关心R因为漏掉一架无人机比误报一个噪声严重得多。5. 避坑与常见问题射频信号数据集最容易翻车的四个地方5.1 现象训练 loss 前面下降后面反复横跳mAP 始终上不去原因多半是标注框偏移。射频信号图像的标注框边界不像自然图像那么清晰信号能量从强到弱是渐变过程标注人员对“信号从哪里开始”的主观判断不一致同一个信号在不同图上标注框位置可能偏差十几像素。YOLOv8 的 box_loss 对框中心坐标变化极敏感框偏移大loss 自然震荡。解决方法是先做标注清洗。我一般用脚本计算所有标注框的宽度和高度分布把宽高比超过 1:10 的特别极端的框单独抽出来检查。kong和Mini3Pro两类目标如果框宽分布有明显双峰说明有一类标注标准不统一。另一个补救办法是开启box7.5损失权重降低 box_loss 在总损失中的占比让网络更关注分类任务等 mAP 稳定后再调回默认值。5.2 现象小目标漏检严重尤其是距离远、信号弱的目标框射频信号检测里大量目标是时频谱上的一条细窄亮带宽度可能只有 5 到 10 个像素。imgsz640把原图缩放后这类小目标被压成 3 到 4 个像素特征提取层根本看不出来。解决办法是提高输入分辨率。把imgsz提升到 1024 或 1280对 mAP 的提升非常明显。代价是训练和推理速度变慢但射频信号检测通常是离线分析或边缘端小模型部署分辨率提升带来的收益大于算力开销。如果显存不够优先用 YOLOv8n它的小参数设计在小目标检测场景下和大模型差距不大。5.3 现象训练集太小验证集 mAP 很高但推理时完全认不出新场景364 张图意味着模型容易记住训练集里有限的信号形态换一批不同 SNR 的射频信号就泛化失效。我从经验上判断训练 loss 远低于验证 loss、且验证 loss 最后几个 epoch 持续上升基本就是过拟合。处理方案分两步。第一步是增强策略收紧确认没开过强的 HSV 变换mosaic 不超过 0.5。第二步是冻结骨干网络训练先跑 20 轮让检测头收敛再解冻全部层微调。命令是yolo detect train datadata.yaml modelyolov8n.pt freeze10 epochs30freeze10表示冻结前 10 层骨干网络骨架特征保留预训练模型学到的通用表达只训练后面的检测头。这样能显著降低过拟合风险。5.4 现象推理时把环境噪声毛刺误检成无人机信号这是射频信号检测特有的问题。频谱图中的尖峰噪声在形状上和弱信号很相似。原因有两层一是训练集里负样本太少kong背景图片虽然存在但在 YOLO 训练中图片级背景不参与损失计算模型没有见过足够的“假阳性样本”二是推理置信度阈值设得太低默认conf0.25对弱环境噪声太宽容。解决方法是把推理阈值提高到 0.4 到 0.5先保证精度再逐步降阈值看召回变化。如果必须保持低阈值给训练集额外补充一批只有噪声没有真实信号的负样本图片并在 yaml 里用background类别标记让模型学会区分真信号和毛刺。6. 部署与进阶把 RF 识别模型导出并跑通边缘设备6.1 导出 ONNX 并在 RK3588 上完成推理训练得到best.pt后最省事的部署方式是先导出 ONNX。Ultralytics 自带导出功能from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) model.export(formatonnx, imgsz640, dynamicFalse)formatonnx导出标准深度学习交换格式imgsz640要和训练时一致dynamicFalse固定输入尺寸便于 RK3588 上做 NPU 加速。导出完成后用 onnxruntime 加载模型推理import cv2 import numpy as np import onnxruntime as ort sess ort.InferenceSession(best.onnx) img cv2.imread(test.jpg) img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) resized cv2.resize(img_rgb, (640, 640)) input_data resized.astype(np.float32) / 255.0 input_data input_data.transpose(2, 0, 1)[None, ...] outputs sess.run(None, {sess.get_inputs()[0].name: input_data})这段代码把图片缩放到 640x640归一化后转成 NCHW 格式传给 ONNX 模型。outputs里包含检测框坐标、置信度和类别需要后处理做 NMS 过滤。实测在 RK3588 上跑 YOLOv8n单帧推理时间能控制在几十毫秒内基本满足实时检测需求。6.2 把识别率从 94.3% 再往上抠的两个技巧数据集 v1 版指标已经到 94.3%想继续提升我会优先做一个思路按频率区间裁图。射频信号不可能均匀分布在整个频谱宽度里把原始频谱图按频段切成几段把不同频带的信号拆到不同图片里让模型学习频带专属的特征。配合提升imgsz1280小信号斑块的清晰度会明显改善。另一个技巧是置信度阈值和 NMS 参数的后处理调校。训练结束时用验证集跑一遍val.py把 P、R 曲线的拐点找出来选择 Precision 和 Recall 交叉处的置信度作为部署阈值而不是直接用默认的 0.25。这个交叉点往往比默认阈值高不少误检率能降一半以上。从那以后我每跑一个射频数据集都会强制走一遍“按频段切图 验证集定阈值”的流程基本成了我的习惯动作。希望这份数据集的解析和踩坑记录能帮你的无人机射频检测项目少走几步弯路拿去直接把流程跑通剩下的优化就都是量变到质变的事了。本文还有配套的精品资源点击获取