尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

遥感图像目标检测实战:YOLOv8训练航空卫星数据集全解析

遥感图像目标检测实战:YOLOv8训练航空卫星数据集全解析 简介面向航空卫星图像场景的目标检测数据集包含1366张带精细标注的图像覆盖森林、公路、作物、河流、住宅、工业、果园、牧场、贫瘠土地等多类地物目标适用于YOLOv5、YOLOv7、YOLOv8、YOLOv9、YOLOv10和YOLO11等主流算法满足遥感识别与土地覆盖分类等任务需求。压缩包共2000个文件770个txt为YOLO格式标注记录类别索引及归一化中心坐标和宽高1230个xml为VOC格式标注两种标签分目录存放并附带data.yaml配置文件数据集已划分好训练与验证集可直接进行模型训练和测试。整包大小约60.51MB已有42人学习下载轻量实用。对于目标检测初学者或遥感影像研究者而言这份数据集免去了标注格式转换的额外工作可顺利开展YOLO系列模型的实验对比和调优快速验证算法效果。1. 遥感图像目标检测先想清楚它和自然图像哪里不一样做目标检测的同行拿到这套航空卫星图像数据集第一反应往往是又是一批标注好的图扔进YOLO训练就行。但如果真这么干很快会撞上一面墙遥感场景下的目标特征、尺度分布、类别语义和日常的COCO、VOC数据集完全是两套逻辑。森林、公路、作物、河流这类地物目标边界往往呈大尺度连续分布一辆车那样的小目标标注策略在这里根本套不上。这套数据集一共1366张带标签的航空卫星图像覆盖森林、公路、作物、河流、住宅、工业、果园、牧场、贫瘠土地九个类别标签同时给了YOLO格式txt和VOC格式xml并且预置了data.yaml配置可以直接喂给YOLOv5、YOLOv7、YOLOv8、YOLOv9、YOLOv10、YOLO11这几个主流版本训练。对做遥感解译、土地覆盖分类、城市规划辅助识别的人来说这是拿来即用的现成起点。第1章先不急着贴代码把这类数据集的特点和训练时的坑说透后面几章的配置、命令和调参才有依据。2. 双格式标签解析TXT与XML坐标换算的底层逻辑2.1 先看数据集内部目录长什么样zip压缩包解压之后目录结构大致是下面这样。注意标签文件不是集中堆在一个文件夹而是按格式分开存放. ├── images/ │ └── train/ │ ├── img_091_632.jpg │ └── ... ├── labels/ │ ├── yolo_format/ │ ├── img_091_632.txt │ └── ... │ └── voc_format/ │ ├── img_091_632.xml │ └── ... ├── data.yaml └── train_test_split/ ├── train.txt ├── val.txt └── test.txt很多YOLO新手拿到数据集后第一步就栽在目录匹配上。YOLO训练时默认按data.yaml里指定的路径去寻找images和labels并且约定同名jpg和txt放在对应目录下才能完成匹配。这个数据集把两种标签分开放如果你直接把labels/yolo_format改成labels使用需要确认train.txt里写的绝对路径或者相对路径是否能和代码里拼出来的路径对齐。常见做法是训练前先跑一次简单的文件存在性检查确保每一张训练图像都能找到同名txt。提示解压后先核对路径层级不要把images目录和labels目录搞成兄弟关系YOLO默认期望的是images/xxx.jpg和labels/xxx.txt这种并排结构。2.2 逐行解析YOLO格式TXT归一化坐标不再模糊YOLO标签文件中每一行代表一个目标框格式固定为class x_center y_center width height其中x_center和y_center是目标框中心点的坐标width和height是框的宽和高四个浮点数全部相对于图像宽度和高度做了归一化范围在0到1之间。这样做的好处是不论输入图像尺寸是640还是1280标签都不需要跟着改。下面用一段Python代码读取一个txt文件把归一化坐标还原成像素坐标并叠加显示import cv2 def parse_yolo_txt(txt_path, img_w, img_h): boxes [] with open(txt_path, r) as f: lines f.readlines() for line in lines: parts line.strip().split() cls_id int(parts[0]) x_center, y_center, w, h map(float, parts[1:]) # 还原像素坐标 x1 int((x_center - w / 2) * img_w) y1 int((y_center - h / 2) * img_h) x2 int((x_center w / 2) * img_w) y2 int((y_center h / 2) * img_h) boxes.append((cls_id, x1, y1, x2, y2)) return boxes # 假设图像尺寸 img_w, img_h 1024, 1024 boxes parse_yolo_txt(img_091_632.txt, img_w, img_h) for cls_id, x1, y1, x2, y2 in boxes: print(f类别索引{cls_id}, 像素框({x1},{y1})-({x2},{y2}))代码逻辑比较直接先读入每一行把字符串拆出来第一个字段转成整数类别索引后面四个字段转成浮点数再用中心点加减宽高一半的方式得到左上角和右下角坐标最后乘以图像宽高还原成像素值。这里最容易出错的是忘记乘图像宽高直接把归一化坐标当像素坐标画框画出来的框全部挤在左上角这种低级错误会让训练数据完全不可用。2.3 类别索引映射关系是双格式转换的基准YOLO格式只存类别索引不存类别名称因此类别名称到索引的映射必须全局一致比如约定为class_id类别名称0forest1road2crop3river4residential5industrial6orchard7pasture8barren_landdata.yaml里配置的类别顺序必须和txt文件中的索引严格对齐。如果训练时data.yaml的类别顺序和标注用的顺序不一致模型学到的类别就会整体错乱。2.4 从VOC XML到YOLO TXT的坐标转换推演VOC格式的XML文件存储的是像素坐标核心段落如下annotation filenameimg_091_632.jpg/filename size width1024/width height1024/height /size object nameforest/name bndbox xmin123/xmin ymin200/ymin xmax500/xmax ymax680/ymax /bndbox /object /annotation转换成YOLO格式时要经过下面的变换公式x_center (xmin xmax) / 2 / img_width y_center (ymin ymax) / 2 / img_height box_width (xmax - xmin) / img_width box_height (ymax - ymin) / img_height写转换脚本时我一般会用内置的xml.etree来解析XML逐object读取name和bndbox再把name映射成索引。一个容易忽略的细节是XML里的width/height是否和实际图像尺寸一致。如果XML里写的是640x640而实际图像是1024x1024转换出来的归一化坐标全部错位。建议在转换脚本里用PIL或cv2读取真实图像尺寸覆盖XML里的size字段。3. data.yaml与数据划分让YOLOv8/YOLO11无缝接住数据集3.1 data.yaml的字段逐个拆解YOLOv8和更新的YOLO11版本沿用了几乎相同的data.yaml约定这个文件一般长这样path: /absolute/path/to/dataset train: images/train val: images/val test: images/test nc: 9 names: 0: forest 1: road 2: crop 3: river 4: residential 5: industrial 6: orchard 7: pasture 8: barren_landpath是数据集的绝对路径train、val、test指向相对于path的图像子目录。训练时YOLO会在path同级找一个labels目录再按train的值拼出labels/train去找txt文件。因此这个数据集里labels/yolo_format需要软链接或直接改名为labels让目录结构回归YOLO的默认预期。3.2 两种标签保留方式的选择策略同时保留YOLO tx和VOC xml两种格式本质上是为了兼顾不同的工具链。YOLO格式是训练的直接输入数据读取效率高VOC xml的语义可读性更强适合在LabelImg里回看、二次修改或者转成COCO格式做Mask R-CNN之类的模型。如果你暂时只跑YOLO直接用yolo_format即可如果后续要做实例分割或语义分割VOC格式的还原路径更完整。两边标签内容是一致的类别顺序也统一。3.3 训练前用一段脚本做完整性校验参加过真实项目训练的人都知道样本缺失或标签格式错误往往在训练跑到一半才暴露浪费大量时间。因此建议训练前先跑一个快速校验脚本import os from pathlib import Path def validate_dataset(images_dir, labels_dir): img_files list(Path(images_dir).glob(*.jpg)) missing [] empty [] for img in img_files: label_path Path(labels_dir) / (img.stem .txt) if not label_path.exists(): missing.append(img.name) elif label_path.stat().st_size 0: empty.append(img.name) print(f图像总数: {len(img_files)}) print(f缺少标签: {len(missing)} - {missing[:10]}) print(f空标签文件: {len(empty)} - {empty[:5]}) return len(missing), len(empty) validate_dataset(images/train, labels/train)这个脚本做的事很简单遍历所有jpg图像找同名txt是否存在同时把0字节的标签文件列出来。空标签在YOLO训练里会直接跳过该图像数量多的话等于变相减少了训练样本还会让类别分布的统计失真。注意遥感图像分辨率高有些航拍图是几千像素乘几千像素。虽然这块数据集已经是适配通用训练的尺寸但如果你要补充自己的图像先统一缩放到1024或1280再训练不然容易显存溢出。3.4 数据划分文件的用法zip里预置的train.txt、val.txt、test.txt直接记录了参与训练的图像路径常见格式是每行一个图片完整路径或者相对路径。YOLOv8训练时可以不依赖这些txt文件因为data.yaml里的train/val路径已经解决了数据加载但在YOLOv5里这些txt文件可以直接作为--data的补充传入。如果你的场景需要自定义划分比例也可以直接基于这三个文件做增删比如把test.txt里的部分样本挪到val.txt做更充分验证。划分文件还有一层作用就是保证不同模型、不同版本对比实验时使用同一份数据实验结果才可复现。这个细节在实际工程项目里远比想象中重要。4. 用YOLOv8训练航空卫星数据集命令、参数与调优实战4.1 环境准备与数据目录对齐训练前先把目录结构调整到位。因为这个数据集自带的labels目录下分了yolo_format和voc_format两个子目录而YOLOv8的默认逻辑是找labels/train/xxx.txt所以需要把yolo格式的标签提升到labels根目录下让最终结构满足如下约定dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamlYOLOv8的模型文件、数据集路径、训练参数全部通过命令行拼接结构比较清晰。验证环境时先确认torch和cuda可用再确认ultralytics版本。以下是标准训练命令yolo detect train \ data/path/to/dataset/data.yaml \ modelyolov8s.pt \ epochs150 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.01 \ seed42 \ optimizerauto \ device0参数说明data指定data.yaml路径里面已经包含了train/val划分和9个类别名。modelyolov8s.pt是从预训练权重开始微调航拍图像和COCO自然图像分布差异较大但仍然可以从底层特征迁移中获益。imgsz640是初始训练尺寸。遥感图像上的地物目标有大有小如果想兼顾小目标可以训练到一半使用更大尺寸微调。batch16取决于显存大小。如果训练时显存溢出优先把batch降到8同时检查imgsz是否过大。lr0是初始学习率YOLOv8默认0.01数据量不算大的情况下保持默认即可。优化器如果设成auto会自动选择合适的优化器。4.2 训练过程中的日志怎么看训练启动后终端会每隔一段时间输出一轮日志。重点看三个指标box_loss、cls_loss、dfl_loss。box_loss表示预测框和真实框的回归误差cls_loss表示分类误差dfl_loss是分布焦点损失与框形状的精细程度有关。如果box_loss下降很慢可能是数据标注框不够紧或者遥感目标边界模糊导致回归困难。如果cls_loss出现震荡优先确认类别索引是否错乱比对一下loss曲线和类别分布。训练结束后runs/detect/train/目录下会生成weights/best.pt和weights/last.pt。best.pt是根据验证集mAP选出的最优权重last.pt是最后一轮权重两者频率可能不一致通常优先用best.pt做后续推理。data.yaml中类别顺序是否和训练时的类别定义严格一致直接影响类别名映射但对模型的AP影响不大。如果最终推理出串类别可以考虑是这里的索引问题。4.3 在验证集上评估用具体指标说话训练完成后立即跑一次验证得到这个数据集上的精确数值yolo detect val \ data/path/to/dataset/data.yaml \ model/path/to/runs/detect/train/weights/best.pt \ imgsz640 \ batch16 \ conf0.25 \ iou0.5输出结果中mAP0.5代表IoU阈值为0.5时的平均精度mAP0.5:0.95是更严格的综合指标。对于土地覆盖这种大目标场景mAP0.5较容易达到不错的水准但如果mAP0.5:0.95明显偏低说明预测框和真实框的重合精度不足后续应该考虑调整回归损失的权重或训练尺寸。结果目录下会生成混淆矩阵和F1曲线。混淆矩阵里的对角线数值越高越好如果某些类别的样本经常被混淆比如作物和牧场、贫瘠土地和裸地就要从类别定义和标注一致性入手而不只是盲目加数据。4.4 遥感数据训练中的高频踩坑点第一小目标漏检。航空卫星图像中住宅和工业建筑的尺度相对较小且密集排列。640的训练尺寸下小目标只有几十个像素特征提取非常吃力。常见做法是训练时把imgsz提升到1024要么用YOLOv8的PSA注意力模块增强小目标特征表达。第二类别不均衡。如果森林和牧场样本特别多而工业、果园样本少模型会偏向高频类别。最简单的处理是在data.yaml里配置class weights或者用mosaic0.5配合mixup0.2做在线增强提升少样本类别的鲁棒性。第三背景误检。遥感图像背景复杂有些地方和作物、贫瘠土地纹理非常接近。可以适当调高conf阈值到0.3或0.35减少置信度不高的误检框。还有一个容易被忽略的问题就是标签坐标越界。如果原始标注时框超出了图像边界YOLO在计算loss时会报错或忽略这部分框。跑训练前用脚本检查是否有坐标大于1或者小于0的情况出现时按边界裁剪到0到1区间内。5. 小目标检测与类别混淆评估报告里藏着提升空间最终模型效果好不好不只是看总体mAP还要逐类看报告。以YOLOv8的验证输出为准会产生一个类别级别的Precision、Recall、mAP0.5表格。假如住宅类漏检率高最常见的两个原因是目标太小和密集遮挡。提升住宅类检测能力最直接的做法是把训练尺寸从640提到1024配合Rectangular训练让batch内图像按长宽比拼接显存压力相对均衡。另一个思路是使用YOLO11的C3k2模块和C2PSA注意力这类新结构在高分辨率输入下的特征下采样次数少对小目标保留更多细节信息。从混淆矩阵中通常能看到几组典型错误作物和牧场互相误判贫瘠土地和公路误判。这背后往往是类别语义边界本身模糊标注人员在勾框时尺度不统一。如果误判集中在这些类可以整理一个语义区分列表把类似作物有规律纹理、牧场颜色偏黄绿这类先验信息补充到标注规范里然后重新修正一部分标签同时用置信度阈值把低置信度预测过滤掉。推理阶段可以通过如下命令控制。yolo detect predict \ modelruns/detect/train/weights/best.pt \ source/path/to/test/images \ imgsz1024 \ conf0.3 \ iou0.45 \ save_txtTrue \ save_confTruesave_txtTrue会把预测结果保存为YOLO格式的txtsave_confTrue在每行末尾追加置信度分数后续可以直接读txt文件按置信度过滤。当验证集上的各类mAP趋于稳定后使用TTATest-Time Augmentation还能压榨出最后一点精度命令上追加augmentTrue即可但推理耗时大约会多出三倍只推荐在离线评估或对速度不敏感的线上环境中使用。针对航空卫星图像里的密集小目标另一个实验方向是把NMS的IoU阈值从0.45调低到0.35减少密集目标之间互相抑制造成的漏检。每调整一个关键参数重新跑一次验证集输出mAP对比找出在当前数据和模型组合下收益最大的一组配置作为最终版本。本文还有配套的精品资源点击获取
返回列表