ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

航空卫星图像数据集:1366张YOLO标签与YOLOv8训练实战

航空卫星图像数据集:1366张YOLO标签与YOLOv8训练实战 简介本资源为面向YOLO系列目标检测算法的航空卫星图像数据集适合从事遥感图像识别、土地利用分类与目标检测的开发者、学生及研究人员使用可直接用于模型训练与验证测试。数据集共包含1366张带标签图像覆盖森林、公路、作物、河流、住宅、工业、果园、牧场及贫瘠土地等九类地物目标已按训练与验证需求划分完毕并附带data.yaml配置文件兼容yolov5、yolov8、yolov9、yolov7、yolov10及yolo11等主流版本。压缩包内共2000个文件其中1230个xml文件对应VOC格式标注770个txt文件对应YOLO格式标注两种标签分别存放于独立文件夹文件名末尾标注部分类别名称便于快速区分与调用YOLO格式采用类别索引与归一化中心点、宽高坐标可直接投入训练流程。资源包整体约60.51MB结构清晰、开箱即用。目前已有42人学习关注适合需要快速搭建遥感目标检测实验、验证算法效果或进行多类别地物识别研究的读者参考使用。1. 航空卫星图像数据集1366 张带标签的 YOLO 训练资源到底能干什么拿到一份遥感图像数据集第一反应往往不是兴奋而是怀疑——图像分辨率够不够、标签是不是糊的、类别划分有没有重叠、能不能直接喂给 YOLOv8 跑起来。这份 1366 张航空卫星图像数据集覆盖森林、公路、作物、河流、住宅、工业、果园、牧场、贫瘠土地九类地物每张图都配了 YOLO 格式的 txt 标签和 VOC 格式的 xml 标签data.yaml 已经写好目录也按训练/验证切分完毕。说白了它解决的是「想跑通遥感目标检测但不想从零标注」这个最耗时的环节。适合两类人一是刚接触 YOLO 系列算法、需要一个完整数据集练手的新手二是做土地利用分类、地表覆盖监测、遥感变化检测的从业者需要一个能快速验证模型结构的基线数据。1366 张不算大但九类地物的分布足够让你把训练流程、评估指标、推理效果完整走一遍。2. 数据集结构与标签格式先搞清楚目录里到底有什么2.1 目录组织与文件命名逻辑拿到压缩包解压后第一件事是确认目录结构。这类遥感数据集常见的组织方式是 images 和 labels 平行存放data.yaml 放在根目录。文件名末尾带类别名称比如 img_091_1074.txt 这种命名方便你快速定位某张图对应的标签文件。VOC 格式的 xml 文件单独放在另一个文件夹里和 YOLO 格式的 txt 分开管理。我一般会先跑一遍目录统计确认图像数量和标签数量是否一一对应# 统计图像文件数量 find ./images -type f \( -name *.jpg -o -name *.png \) | wc -l # 统计 YOLO 标签文件数量 find ./labels -type f -name *.txt | wc -l # 统计 VOC 标签文件数量 find ./voc_labels -type f -name *.xml | wc -l三个数字应该一致如果标签数少于图像数说明有图没标训练时要么剔除要么补标。文件名末尾的类别名称是辅助信息真正决定类别的是 txt 文件里第一列的类别索引别搞混了。2.2 YOLO 格式标签的坐标含义YOLO 格式的标签每行五个值class x_center y_center width height。类别索引从 0 开始后面四个都是归一化到 0 到 1 之间的比例值不是像素坐标。这一点新手最容易翻车——直接把像素坐标写进去训练时 loss 不降反升模型完全学不到东西。举个例子一张 1024×1024 的遥感图某个森林区域中心点在像素坐标 (512, 300)框宽 200 像素、高 150 像素那么 YOLO 格式应该是0 0.500000 0.292969 0.195313 0.146484计算方式x_center 512/1024 0.5y_center 300/1024 0.292969width 200/1024 0.195313height 150/1024 0.146484。遥感图像里小目标多框的宽高经常只有零点零几这是正常的别觉得数值太小就手动放大。2.3 data.yaml 配置与类别映射data.yaml 是 YOLO 训练的核心配置文件里面定义了训练集、验证集路径和类别名称列表。这份数据集已经划分好你只需要确认路径写对就行。典型内容如下train: ./images/train val: ./images/val nc: 9 names: [forest, road, crop, river, residential, industrial, orchard, pasture, barren]nc 是类别数量names 的顺序必须和标签里的类别索引严格对应。如果你自己重新划分了数据集记得同步改 train 和 val 的路径。常见做法是把 data.yaml 里的路径写成绝对路径避免因为工作目录不同导致找不到文件。提示修改 data.yaml 后用python -c import yaml; print(yaml.safe_load(open(data.yaml)))快速验证 YAML 语法是否正确缩进错误在 YAML 里是致命问题。3. 用 YOLOv8 跑通训练从环境配置到第一轮验证3.1 环境搭建与依赖安装YOLOv8 是目前遥感目标检测里最常用的基线之一安装不算复杂但 CUDA 版本和 PyTorch 版本对不上是血泪经验里排第一的坑。我一般先用 conda 建一个干净环境再装 ultralyticsconda create -n yolo_sat python3.10 -y conda activate yolo_sat # 根据你的 CUDA 版本选择对应的 PyTorch pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 ultralytics pip install ultralytics装完后跑一句yolo checks确认 CUDA 可用、版本匹配。如果显示 CPU only说明 PyTorch 装成了 CPU 版训练速度会慢到让你怀疑人生。遥感图像分辨率高1366 张图在 CPU 上跑一轮可能要几个小时GPU 上通常几分钟到十几分钟。3.2 启动训练与关键参数设置训练命令本身不复杂关键是参数怎么设。遥感图像里小目标密集imgsz 设太小会丢失细节设太大显存扛不住。我一般从 640 起步显存够就上 1024yolo detect train \ data./data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ project./runs/sat_detect \ nameexp1model 参数可以用 yolov8n.pt 做轻量基线也可以换 yolov8s.pt 或 yolov8m.pt 看精度提升。epochs 设 100 是保守值patience20 表示 20 轮没提升就早停。lr0 是初始学习率0.01 是 YOLOv8 的默认值数据集小的时候可以降到 0.001 避免震荡。batch 根据显存调16 是 8GB 显存的安全值。3.3 训练过程监控与指标解读训练启动后终端会输出每轮的 box_loss、cls_loss、dfl_loss 和 mAP 指标。box_loss 下降说明框回归在收敛cls_loss 下降说明分类在学mAP50 和 mAP50-95 是最终评估指标。遥感数据集里森林、河流这种大面积地物 mAP 通常很高公路、果园这种细长或密集目标 mAP 会低一些这是数据本身的特点不一定是模型问题。如果 box_loss 一直不降先检查标签坐标是不是归一化过的如果 cls_loss 震荡看看类别是不是有混淆比如作物和果园在遥感图里光谱特征接近模型容易分错。常见做法是跑一次混淆矩阵看哪两类互相误判最多再决定要不要合并类别或加数据。# 训练结束后在验证集上评估 yolo detect val \ model./runs/sat_detect/exp1/weights/best.pt \ data./data.yaml \ imgsz640验证命令会输出每类的 precision、recall 和 mAP重点看 recall 低的类别说明漏检多可能是小目标太多或者标注框偏小。4. 避坑与排查遥感数据集训练中最容易翻车的五个点4.1 标签坐标没归一化导致 loss 不收敛现象训练前几轮 box_loss 直接飙到几百甚至上千mAP 始终为 0。原因标签文件里写的是像素坐标不是 0 到 1 的归一化值。YOLO 的损失函数假设坐标在 0 到 1 之间超出范围会导致梯度爆炸。解决写个脚本批量检查所有 txt 文件发现任何坐标值大于 1 就说明没归一化。重新用图像宽高做除法或者直接用 VOC 格式的 xml 转一遍。4.2 类别索引与 data.yaml 的 names 顺序不一致现象训练能跑但推理时把森林框成河流或者置信度普遍偏低。原因标签里的类别索引和 data.yaml 里 names 列表的顺序对不上。比如标签里 0 是森林但 names 里第一个写的是 road。解决打开几个标签文件看第一列的数值分布再对照 names 列表。如果不一致要么改 names 顺序要么批量改标签索引。我一般写个映射字典一次性替换。4.3 图像和标签文件名不匹配导致漏读现象训练日志显示找到了 1366 张图但实际参与训练的只有 1200 张loss 曲线抖动大。原因图像文件名和标签文件名不完全对应比如图像是 img_091_1074.jpg标签却是 img_091_1074.txt 但放在错误子目录或者大小写不一致。解决用脚本遍历 images 目录对每个图像文件检查对应的 labels 路径下是否存在同名 txt。缺失的要么补标要么从训练集剔除。import os img_dir ./images/train label_dir ./labels/train missing [] for fname in os.listdir(img_dir): stem os.path.splitext(fname)[0] label_path os.path.join(label_dir, stem .txt) if not os.path.exists(label_path): missing.append(fname) print(f缺失标签的图像数量: {len(missing)}) for m in missing[:10]: print(m)4.4 显存不足导致 batch 被迫降到 1现象训练启动就报 CUDA out of memory只能把 batch 改成 1训练速度极慢。原因imgsz 设太大或者模型选了 yolov8l 这种大参数量版本显存不够。解决优先降 imgsz 而不是降 batchbatch 太小会导致 BN 层统计不稳定。640 不够就试 512再不够换 yolov8n。如果必须用大模型开启梯度累积模拟大 batch。4.5 验证集 mAP 高但推理效果差现象验证集 mAP50 到了 0.85但拿新图推理时漏检严重。原因训练集和验证集划分不合理验证集和训练集图像来自同一区域分布太接近模型过拟合了。遥感图像尤其要注意按地理区域划分不能随机切。解决重新按区域划分训练/验证集确保验证集的图像在空间上和训练集不重叠。如果数据集本身已经划分好检查一下是不是随机切的随机切在遥感任务里是常见错误。5. 从 VOC 标签转 YOLO 格式一个脚本搞定两种格式互转5.1 VOC 与 YOLO 格式的差异VOC 格式的 xml 文件里标注框用的是绝对像素坐标xmin ymin xmax ymax类别名是字符串。YOLO 格式用的是归一化中心点坐标加宽高类别是索引。两种格式各有用途VOC 方便人工查看和编辑YOLO 直接喂给训练框架。这份数据集两种都给了但如果你自己新增了标注可能只有 VOC 格式需要转成 YOLO 才能训练。5.2 转换脚本与参数说明下面这个脚本把 VOC 的 xml 批量转成 YOLO 的 txt核心是读图像宽高做归一化再把类别名映射成索引import os import xml.etree.ElementTree as ET from PIL import Image # 类别名到索引的映射必须和 data.yaml 的 names 顺序一致 class_map { forest: 0, road: 1, crop: 2, river: 3, residential: 4, industrial: 5, orchard: 6, pasture: 7, barren: 8 } def voc_to_yolo(xml_path, img_dir, out_dir): tree ET.parse(xml_path) root tree.getroot() # 从 xml 里读图像文件名和尺寸 fname root.find(filename).text size root.find(size) img_w int(size.find(width).text) img_h int(size.find(height).text) lines [] for obj in root.findall(object): cls_name obj.find(name).text if cls_name not in class_map: continue cls_id class_map[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) # 转成归一化中心点坐标和宽高 x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h width (xmax - xmin) / img_w height (ymax - ymin) / img_h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}) # 写入同名 txt stem os.path.splitext(fname)[0] out_path os.path.join(out_dir, stem .txt) with open(out_path, w) as f: f.write(\n.join(lines)) # 批量转换 xml_dir ./voc_labels img_dir ./images out_dir ./labels_converted os.makedirs(out_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if xml_file.endswith(.xml): voc_to_yolo(os.path.join(xml_dir, xml_file), img_dir, out_dir)class_map 的键是 xml 里的类别名值是对应的索引必须和 data.yaml 的 names 顺序完全一致。img_w 和 img_h 从 xml 的 size 节点读如果 xml 里没写尺寸就得用 PIL 打开对应图像获取。输出保留六位小数精度足够。转换完随机抽几个文件对比原始 xml确认坐标换算没错。5.3 转换后的验证方法转完不能直接开训先做一轮抽查。我一般随机选五张图用 Python 把 YOLO 标签画回图像上肉眼确认框的位置和类别对不对import cv2 def draw_yolo_label(img_path, label_path, class_names): img cv2.imread(img_path) h, w img.shape[:2] with open(label_path) as f: for line in f: parts line.strip().split() cls_id int(parts[0]) xc, yc, bw, bh map(float, parts[1:]) # 反归一化回像素坐标 x1 int((xc - bw / 2) * w) y1 int((yc - bh / 2) * h) x2 int((xc bw / 2) * w) y2 int((yc bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, class_names[cls_id], (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1) cv2.imwrite(check_output.jpg, img) class_names [forest, road, crop, river, residential, industrial, orchard, pasture, barren] draw_yolo_label(./images/train/img_091_1074.jpg, ./labels/train/img_091_1074.txt, class_names)画出来的框如果和地物对不上说明转换有问题重点检查 xml 里的尺寸和实际图像尺寸是否一致。遥感图像有时候 xml 记录的尺寸和实际文件尺寸不同这种情况要以实际图像为准重新算。5.4 训练自己的增量数据时的注意事项如果你在这份数据集基础上新增了标注建议统一用 VOC 格式标注再用上面的脚本转 YOLO。原因是 VOC 格式可读性好标注工具支持广出错了容易排查。转完后把新增的 txt 和原有的合并更新 data.yaml 的路径重新跑训练。注意类别索引不要冲突新增类别要么追加到末尾要么重新映射所有标签。从那以后我每次拿到新数据集都强制先跑一遍标签可视化确认框和类别没问题再开训。这个习惯帮我省了至少几十个小时的无效训练时间。希望帮到你。本文还有配套的精品资源点击获取
返回列表