简介:本资源为面向卫星遥感图像目标检测任务的YOLO系列算法数据集,适合从事遥感图像识别、地理信息分析及深度学习目标检测的开发者与研究人员使用,可解决遥感场景下样本获取难、标注格式不统一的问题。压缩包共2000个文件,包含1280个xml标注文件与720个txt标注文件,整体约59.44MB,同时提供YOLO格式与VOC格式两种标签,并附带data.yaml配置文件,可直接用于yolov5、yolov8、yolov9、yolov7、yolov10及yolo11等算法的模型训练与验证测试。数据集已按训练与验证需求划分完毕,YOLO格式采用类别索引与归一化中心点、宽高坐标,便于直接读取训练。目前已有110人学习下载,读者可快速搭建遥感目标检测实验流程,省去数据清洗与格式转换环节,将精力集中于模型调参与效果对比,适合作为课程设计、科研实验或算法入门的实战数据支撑。
1. 遥感图像目标检测数据集:1825 张带标签的 YOLO 落地资源
拿到一份遥感图像数据集,最怕的不是图像不够多,而是标签格式对不上、划分没做好、配置文件缺字段。这份 1825 张卫星遥感图像物体检测数据集,把 YOLO 格式的 txt 标签和 VOC 格式的 xml 标签分文件夹放好,连data.yaml都配齐了,解压完改个路径就能直接喂给 YOLOv5 到 YOLO11 这一串模型。它适合两类人:一类是想快速验证某个改进模块在遥感场景下有没有效果的算法工程师,另一类是刚接触 YOLO 训练、需要一个干净数据集跑通全流程的新手。遥感图像里的目标普遍偏小、方向任意、背景复杂,拿通用 COCO 预训练权重直接推理往往漏检严重,这份数据正好用来做微调。下面按「先看清结构、再动手训练、最后避坑」的顺序拆一遍。
2. 数据集结构与标签格式:先搞懂 txt 和 xml 怎么对应
2.1 目录布局与文件命名规律
解压后你会看到图像和标签是分开存放的,标签文件夹里同时存在 txt 和 xml 两套。从项目正文给出的文件名片段看,标签文件以img_0907_1148.txt这种「图像名 + 序号」的形式命名,文件名末尾还带了部分类别名称,方便你肉眼核对类别是否标错。常见做法是把结构组织成下面这样:
dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ # YOLO 格式 txt │ └── val/ ├── annotations/ # VOC 格式 xml │ ├── train/ │ └── val/ └── data.yaml图像和标签必须同名同层级,YOLO 训练时是按文件名去labels/下找对应 txt 的,少一个文件就会在训练日志里报missing label。xml 那套是给你做格式转换或交叉校验用的,训练本身不读它。
2.2 YOLO 格式每一列到底代表什么
YOLO 的 txt 每行是一个目标,格式为<class> <x_center> <y_center> <width> <height>。这里有个新手最容易翻车的点:后四个值全是归一化到 0 到 1 的比例值,不是像素坐标。x_center、y_center是框中心点相对整幅图宽高的比例,width、height是框宽高相对整幅图宽高的比例。class是从 0 开始的类别索引,和data.yaml里names列表的顺序严格对应,顺序错一位,模型学到的就是错的类别。
# 校验一行 YOLO 标签是否合法 def check_yolo_line(line, img_w, img_h): parts = line.strip().split() if len(parts) != 5: return False, "字段数不是5" cls, xc, yc, w, h = parts vals = list(map(float, parts[1:])) # 归一化值必须落在 0~1 if not all(0.0 <= v <= 1.0 for v in vals): return False, "存在越界的归一化坐标" # 还原成像素框,检查是否超出图像边界 x1 = (float(xc) - float(w) / 2) * img_w y1 = (float(yc) - float(h) / 2) * img_h x2 = (float(xc) + float(w) / 2) * img_w y2 = (float(yc) + float(h) / 2) * img_h if x1 < 0 or y1 < 0 or x2 > img_w or y2 > img_h: return False, "框超出图像边界" return True, "ok"这段逻辑说明:先卡字段数,再卡归一化范围,最后还原像素框看有没有越界。参数img_w、img_h用 PIL 或 OpenCV 读原图拿到。批量跑一遍,把返回 False 的文件名记下来,这些就是需要返工的样本。
2.3 VOC 格式与 YOLO 格式的换算关系
VOC 的 xml 里存的是绝对像素坐标xmin, ymin, xmax, ymax,转成 YOLO 需要做归一化。换算公式是:x_center = (xmin + xmax) / 2 / img_w,y_center = (ymin + ymax) / 2 / img_h,width = (xmax - xmin) / img_w,height = (ymax - ymin) / img_h。数据集同时给两套格式,好处是你可以用 xml 做人工复核,再用脚本批量转成 txt,避免手写标签时算错比例。
import xml.etree.ElementTree as ET from PIL import Image def voc_to_yolo(xml_path, classes): tree = ET.parse(xml_path) root = tree.getroot() size = root.find("size") img_w = int(size.find("width").text) img_h = int(size.find("height").text) lines = [] for obj in root.iter("object"): cls_name = obj.find("name").text cls_id = classes.index(cls_name) bbox = obj.find("bndbox") xmin = float(bbox.find("xmin").text) ymin = float(bbox.find("ymin").text) xmax = float(bbox.find("xmax").text) ymax = float(bbox.find("ymax").text) xc = (xmin + xmax) / 2 / img_w yc = (ymin + ymax) / 2 / img_h w = (xmax - xmin) / img_w h = (ymax - ymin) / img_h lines.append(f"{cls_id} {xc:.6f} {yc:.6f} {w:.6f} {h:.6f}") return linesclasses列表要和data.yaml的names完全一致,否则类别索引会错位。保留 6 位小数是常见做法,精度够用又不会让文件过大。
3. data.yaml 配置与训练启动:从 YOLOv5 到 YOLO11 的通用接法
3.1 data.yaml 关键字段逐个说清
data.yaml是数据集和训练框架之间的契约,字段写错训练直接起不来。核心字段有四个:path是数据集根目录,train和val是相对path的训练集和验证集图像路径,nc是类别数量,names是类别名列表。常见写法:
path: /home/user/dataset train: images/train val: images/val nc: 2 names: 0: ship 1: plane注意nc必须等于names的长度,names的索引必须从 0 连续排。如果你的类别名里有中文或空格,建议改成英文短名,部分框架在解析 yaml 时对特殊字符处理不一致,容易出玄学问题。
3.2 用 YOLOv8 起一次训练验证数据可用
先拿 YOLOv8 跑通,因为它的命令行最简洁,报错信息也清楚。装好环境后:
# 安装 ultralytics pip install ultralytics # 从预训练权重开始微调,遥感小目标建议 imgsz 调大 yolo detect train \ data=/home/user/dataset/data.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=1024 \ batch=8 \ project=runs/remote_sense \ name=exp1参数说明:imgsz=1024是因为遥感图像目标小,输入分辨率太低会直接丢目标,但显存占用会涨,batch要相应调小;epochs=100是微调的常见起点,数据量 1825 张不算大,太多容易过拟合;model=yolov8n.pt是轻量版,想追精度换yolov8m.pt或yolov8l.pt。训练日志里重点看mAP50和mAP50-95两条曲线,如果mAP50一直上不去,先回去查标签,别急着调超参。
3.3 YOLOv5 与 YOLO11 的差异点
YOLOv5 用的是train.py脚本加--data参数,配置项名字和 v8 略有不同,比如--img对应 v8 的imgsz,--weights对应model。YOLO11 沿用了 ultralytics 的统一接口,命令和 v8 基本一致,把model换成yolo11n.pt即可。YOLOv7、v9、v10 各有自己的仓库,接这份数据时统一认data.yaml的字段,但要注意 v5 老版本对path字段支持不完整,可能需要把train、val写成绝对路径。切换框架时先跑 1 个 epoch 看能不能正常读数据,别一上来就挂 300 epoch。
# YOLOv5 接同一份数据 python train.py --data data.yaml --weights yolov5s.pt --img 1024 --batch-size 8 --epochs 1004. 避坑与排查:遥感数据集训练最容易翻车的五件事
4.1 训练报 missing labels 或 labels empty
现象:启动训练后日志刷No labels found或大量missing label。原因通常是图像和标签没同名,或者train路径指向了图像文件夹但标签在另一个平行目录,框架按约定去同级labels找却没找到。解决:确认images/train和labels/train是同级目录,文件名(不含扩展名)一一对应,用脚本比对两个文件夹的文件名集合差集。
4.2 类别索引错位导致 mAP 极低
现象:loss 能降,但mAP50长期低于 0.1,混淆矩阵里类别全乱。原因多半是data.yaml的names顺序和 txt 里class索引不一致,或者 VOC 转 YOLO 时classes列表顺序和 yaml 不同。解决:打印 yaml 的names和标签里出现过的所有class值做比对,确保 0 到 nc-1 每个值都有对应名字。
4.3 小目标漏检严重
现象:大目标检测正常,小目标几乎检不到。原因是遥感图像目标像素占比小,默认imgsz=640下采样后目标只剩几个像素。解决:把imgsz提到 1024 甚至 1280,同时检查标签里小目标框的宽高归一化值是不是小于 0.01,过小的框可以考虑合并或过滤,避免引入噪声。
4.4 验证集指标虚高
现象:mAP很高但实际推理效果差。原因是训练集和验证集划分时同一区域或同一目标的近邻图像被分到了两边,造成数据泄漏。解决:按图像来源或地理区域划分,而不是随机按文件划分,确保验证集和训练集在空间上不重叠。
4.5 显存溢出中断训练
现象:训练到一半报 CUDA out of memory。原因是imgsz和batch组合超出显存。解决:优先降batch,再考虑降imgsz,或者开启梯度累积模拟大 batch。遥感任务里imgsz对精度影响比batch大,所以先动 batch。
5. 进阶技巧:用标签统计反推数据质量与训练策略
跑通训练只是第一步,真正决定模型上限的是数据本身。我一般会在训练前先做一轮标签统计,用数据说话。下面这段脚本统计每个类别的框数量、框的宽高分布,以及每张图的平均目标数。
import os import glob import numpy as np def dataset_stats(label_dir, nc): cls_count = np.zeros(nc) wh_list = [] per_img = [] for txt in glob.glob(os.path.join(label_dir, "*.txt")): with open(txt) as f: lines = [l for l in f.readlines() if l.strip()] per_img.append(len(lines)) for l in lines: p = l.split() cls_count[int(p[0])] += 1 wh_list.append((float(p[3]), float(p[4]))) wh = np.array(wh_list) print("每类框数:", cls_count) print("框宽均值/中位数:", wh[:, 0].mean(), np.median(wh[:, 0])) print("框高均值/中位数:", wh[:, 1].mean(), np.median(wh[:, 1])) print("每图平均目标数:", np.mean(per_img)) print("小目标占比(宽<0.02):", (wh[:, 0] < 0.02).mean()) dataset_stats("/home/user/dataset/labels/train", nc=2)看几个关键指标:如果某类框数远少于其他类,训练时考虑用类别权重或过采样;如果小目标占比超过一半,imgsz必须往上提,同时可以试试在数据增强里关掉随机缩放,避免小目标被进一步缩小;如果每图平均目标数很低(比如小于 2),说明图像里目标稀疏,anchor 或损失函数里的正样本分配策略要相应调整。这些判断比盲目调学习率有用得多。
还有一个习惯:训练前先用labelimg或vscode yolo labeling插件随机抽 20 张图把框画出来肉眼过一遍,重点看有没有框偏、框漏、类别标错。遥感图像里云层遮挡、阴影、相似地物很容易标错,这一步花十分钟,能省掉后面几小时的无效训练。从那以后我每次拿到新数据集,都强制先跑一遍标签统计加随机抽检,确认干净了再开训练。希望帮到你。
本文还有配套的精品资源,点击获取