航空卫星图像八类地物检测:YOLO实战与调优指南

发布时间:2026/10/5 9:27:32

航空卫星图像八类地物检测:YOLO实战与调优指南 简介本资源为面向YOLO系列目标检测算法的航空卫星图像数据集适用于遥感场景下的地物分类与目标检测任务可支撑森林、公路、作物、河流、住宅、工业、果园、牧场及贫瘠土地等多类地物的识别模型训练与验证。数据集已按训练与测试需求划分完毕并附带data.yaml配置文件兼容yolov5、yolov8、yolov9、yolov7、yolov10及yolo11等主流版本。压缩包共2000个文件包含1230个xml标注文件与770个txt标注文件分别对应VOC格式与YOLO格式其中YOLO格式采用归一化中心点与宽高比例记录目标框便于直接读取训练整体包体约60.51MB结构清晰、开箱即用。目前已有42人学习下载适合遥感图像分析、无人机巡检及地理信息相关方向的研究者与开发者快速开展实验也可作为算法对比与模型调优的基准数据。1. 航空卫星图像八类地物检测1366 张带标签数据集怎么用 YOLO 跑通拿到一份航空卫星图像数据集1366 张图、带标签、覆盖森林、公路、作物、河流、住宅、工业、果园、牧场、贫瘠土地这几类地物第一反应往往不是兴奋而是犯嘀咕这点量够不够训 YOLO标签是什么格式八类地物尺度差异那么大模型能不能同时吃下我一开始也这么想直到把数据摊开看了一遍才发现这类遥感地物检测的难点从来不在图片数量而在类别定义和标注粒度。这份数据集的价值在于它把「地物分类」这个遥感里的老问题翻译成了 YOLO 能直接吃的目标检测任务——每张图里框出地物块模型学的是「这块区域是什么」。适合谁用做遥感变化检测、土地覆盖分类、农业估产、城市扩张分析的人以及想拿真实卫星图练 YOLO 但苦于找不到带标签数据的人。下面按「先看懂数据、再跑通基线、最后调优避坑」的顺序讲清楚。2. 先搞懂这份数据集八类地物的标注逻辑与格式转换2.1 八类地物的定义边界与标注难点森林、公路、作物、河流、住宅、工业、果园、牧场、贫瘠土地——注意这里实际是九类标题里「贫瘠的土地」算一类。遥感地物检测和 COCO 那种日常物体检测最大的区别是类别之间没有硬边界。一片果园和一片作物在卫星图上可能只差种植密度和排列方式住宅和工业区区别在建筑密度和屋顶材质但低分辨率下几乎一样。标注的人如果没统一标准同一块地可能这张标成果园、那张标成作物。我一般拿到这类数据先做一件事抽 20 张图把每一类的框单独可视化出来看标注一致性。具体做法是用 Python 把标签读出来画到原图上按类别用不同颜色。如果发现某一类框的位置明显偏移或者大小异常说明标注规范有问题得先清洗再训练否则模型学到的就是噪声。import cv2 import os import numpy as np # 假设标签是 YOLO 格式class_id cx cy w h归一化 img_dir images/train lbl_dir labels/train class_names [forest, road, crop, river, residential, industrial, orchard, pasture, barren] colors [(0,255,0),(255,0,0),(0,0,255),(255,255,0),(255,0,255), (0,255,255),(128,0,128),(255,128,0),(128,128,128)] for fname in os.listdir(img_dir)[:20]: img cv2.imread(os.path.join(img_dir, fname)) h, w img.shape[:2] lbl_path os.path.join(lbl_dir, fname.replace(.jpg, .txt)) if not os.path.exists(lbl_path): continue with open(lbl_path) as f: for line in f: cid, cx, cy, bw, bh map(float, line.split()) x1 int((cx - bw/2) * w) y1 int((cy - bh/2) * h) x2 int((cx bw/2) * w) y2 int((cy bh/2) * h) cv2.rectangle(img, (x1,y1), (x2,y2), colors[int(cid)], 2) cv2.putText(img, class_names[int(cid)], (x1, y1-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, colors[int(cid)], 1) cv2.imwrite(fvis_{fname}, img)这段代码做的是「标签可视化校验」。关键参数cx cy w h是归一化到 0-1 的中心点和宽高这是 YOLO 的标准格式。如果数据集给的是 VOC 的 XML 或者 COCO 的 JSON得先转。转换时最容易翻车的地方是坐标归一化——VOC 的xmin ymin xmax ymax是绝对像素除以图像宽高才能变成 YOLO 要的格式除错了模型直接学废。2.2 从 VOC/COCO 转 YOLO 格式的脚本与边界处理很多遥感数据集原始标注是 VOC XML因为标注工具 LabelImg 默认输出这个。转 YOLO 格式的脚本网上一搜一大把但真正能用的没几个问题都出在边界处理上框超出图像边界怎么办宽高为 0 的框怎么办类别名和 ID 映射对不上怎么办import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_path, img_w, img_h, class_map): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.findall(object): name obj.find(name).text.strip() if name not in class_map: continue # 跳过未定义类别避免 ID 错乱 cid class_map[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) # 裁剪到图像边界内 xmin max(0, min(xmin, img_w)) xmax max(0, min(xmax, img_w)) ymin max(0, min(ymin, img_h)) ymax max(0, min(ymax, img_h)) bw xmax - xmin bh ymax - ymin if bw 2 or bh 2: continue # 过滤掉过小的无效框 cx (xmin xmax) / 2 / img_w cy (ymin ymax) / 2 / img_h nw bw / img_w nh bh / img_h lines.append(f{cid} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}) return lines class_map {forest:0, road:1, crop:2, river:3, residential:4, industrial:5, orchard:6, pasture:7, barren:8}逻辑说明先读 XML 里的 object 节点拿到类别名和 bbox 坐标。class_map是类别名到 ID 的映射必须和训练时的data.yaml里names顺序完全一致否则模型学出来的类别全是错的。边界裁剪用max(0, min(x, img_w))把坐标卡在图像范围内防止标注时手抖画出界。过滤bw 2 or bh 2是因为遥感图里经常有标注员把几个像素的噪声也框上这种框训进去只会让模型学偏。2.3 数据集划分与 data.yaml 配置1366 张图按 8:1:1 分训练、验证、测试大概 1093 训练、136 验证、137 测试。遥感数据划分有个坑如果同一区域的不同切片被分到训练和验证集验证指标会虚高因为模型见过相邻区域。正确做法是按地理区域划分同一块地的切片要么全在训练集要么全在验证集。如果数据集没给地理信息至少保证随机划分时用固定种子别每次跑结果都不一样。# data.yaml path: ./dataset train: images/train val: images/val test: images/test nc: 9 names: [forest, road, crop, river, residential, industrial, orchard, pasture, barren]nc是类别数这里 9 类。names的顺序必须和转换脚本里的class_map一致。path是数据集根目录下面train/val/test分别指向图片文件夹YOLO 会自动去找同名的labels文件夹。如果标签文件夹名不是labels得在代码里改或者建软链接。3. 用 YOLOv8 跑通基线从环境到第一轮训练3.1 环境搭建与依赖安装我一般用 conda 建环境Python 3.10 比较稳。YOLOv8 用 ultralytics 包一条命令装完。GPU 用 3090 或 4090 都行1366 张图不算大8G 显存够跑 640 分辨率、batch 16。conda create -n yolo_sat python3.10 -y conda activate yolo_sat pip install ultralytics opencv-python numpy # 验证 GPU 可用 python -c import torch; print(torch.cuda.is_available())如果输出True说明 GPU 正常。装完 ultralytics 会自动带 torch但版本可能不匹配你的 CUDA如果报错就手动指定 torch 版本。遥感图分辨率通常比 640 大但 YOLO 默认训练尺寸就是 640先按默认跑后面再调。3.2 第一轮训练命令与关键参数yolo detect train \ data./data.yaml \ modelyolov8s.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ device0 \ projectruns/sat \ namebaseline参数说明modelyolov8s.pt用预训练权重遥感数据和 COCO 差异大但底层特征边缘、纹理还是能迁移的比从头训快很多。epochs100先跑一轮看收敛情况patience20是早停20 轮验证指标不涨就停省时间。lr00.01是初始学习率YOLOv8 默认就是 0.01如果 loss 震荡厉害可以降到 0.001。imgsz640是输入尺寸遥感图里小目标多后面可以试 1024。训练开始后看控制台输出的box_loss和cls_loss。正常情况 box_loss 从 1.5 左右往下掉cls_loss 从 2.0 往下掉。如果 cls_loss 不降反升大概率是类别映射错了回去检查data.yaml的names和标签里的 class_id 对不对得上。3.3 训练过程监控与指标解读YOLOv8 训练完会在runs/sat/baseline下生成results.csv和一堆曲线图。重点看三个指标mAP50、mAP50-95、每类的 AP。mAP50 是 IoU 阈值 0.5 时的平均精度遥感地物检测里能到 0.6 以上就算不错。mAP50-95 更严格通常比 mAP50 低 0.2 左右。import pandas as pd df pd.read_csv(runs/sat/baseline/results.csv) # 看最后 10 轮的指标 print(df[[epoch, metrics/mAP50(B), metrics/mAP50-95(B)]].tail(10))如果某一类 AP 特别低比如「果园」只有 0.2而其他类都 0.7 以上说明这一类要么样本太少要么和「作物」混淆严重。解决办法先看混淆矩阵确认它被误判成了哪一类然后针对性补充这一类样本或者在损失函数里给这一类加权。4. 八类地物检测的调优小目标、类别不平衡与数据增强4.1 遥感小目标的检测策略航空卫星图里公路和河流是细长条住宅和工业区是密集小框这些在 640 分辨率下可能只有十几个像素。YOLO 的 P3 特征图 stride 是 8对应 80x80 的网格小目标容易漏。常见做法是提高输入分辨率到 1024 或 1280但显存和速度会涨。另一个做法是改模型结构加一个 P2 检测头stride 4专门抓小目标。# 提高分辨率重训 yolo detect train \ data./data.yaml \ modelyolov8s.pt \ epochs100 \ imgsz1024 \ batch8 \ lr00.005 \ device0 \ projectruns/sat \ nameimgsz1024imgsz1024时 batch 要降到 8否则显存爆。lr0也降到 0.005因为大图梯度更稳学习率大了容易震荡。跑完对比baseline和imgsz1024的 mAP50-95如果小目标类公路、河流的 AP 涨了 0.1 以上说明分辨率提升有效。4.2 类别不平衡的处理九类地物里森林和作物可能占了大半框而工业、果园、牧场可能只有几十个框。这种长尾分布会让模型偏向多数类。YOLOv8 默认的分类损失是 BCE对不平衡不敏感。我一般用两种办法一是过采样少数类把含少数类的图复制几份二是在data.yaml里给每类设权重但 ultralytics 不直接支持得改源码或者用自定义损失。更简单的做法是数据增强时对少数类做针对性增强。比如工业区通常有规则排列的白色屋顶可以用 HSV 扰动改变亮度和对比度让模型学到形状而不是颜色。果园是规则排列的树可以用随机旋转和缩放增加排列方向的多样性。# ultralytics 的增强参数在 data.yaml 同级配置 # 在 train 命令里加 # hsv_h0.015 hsv_s0.7 hsv_v0.4 degrees10 translate0.1 scale0.5hsv_h/s/v是色调、饱和度、亮度扰动遥感图受光照影响大这三个值可以适当调大。degrees10是随机旋转scale0.5是随机缩放对密集小目标有帮助。但注意旋转角度别太大遥感图有方向性转 180 度公路就反了。4.3 数据增强的边界与翻车点遥感数据增强和自然图像不一样。自然图像里翻转、裁剪随便用遥感图里翻转会导致地物方向错乱——河流的流向、公路的走向都是有意义的。我一般只用水平翻转不用垂直翻转旋转角度控制在 ±15 度以内。裁剪要小心裁到边缘可能把完整的地物块切成两半标签也得跟着裁否则模型学到半个框。另一个翻车点是 mosaic 增强。YOLOv8 默认开 mosaic把四张图拼成一张。遥感图拼起来后不同图的地物尺度差异大模型可能学混。如果发现训练 loss 震荡厉害可以关掉 mosaicmosaic0.0。但关掉后小目标检测会变差得权衡。5. 避坑与排查遥感 YOLO 训练里最容易翻车的五件事5.1 标签类别 ID 错位导致模型全学废现象训练 loss 正常下降但验证时 mAP 一直 0.01 左右混淆矩阵里所有类都混在一起。原因data.yaml的names顺序和标签文件里的 class_id 对不上。比如标签里 0 是森林但names里 0 写成了公路。解决用脚本统计标签里每个 class_id 出现的次数和names逐一对齐。最稳妥的办法是转换格式时就把class_map写死训练和转换用同一份。5.2 图像与标签文件名不匹配现象训练报错No labels found或者训练时某些图没有标签。原因YOLO 要求图片和标签同名只是扩展名不同。比如img_001.jpg对应img_001.txt。如果数据集里图片是img_001.jpg但标签是img_001_label.txt就对不上。解决写个脚本批量重命名把标签文件名里的_label去掉。或者建软链接。5.3 验证集指标虚高现象验证集 mAP 0.85但拿测试集一跑只有 0.5。原因训练集和验证集有重叠区域或者同一块地的切片被分到了两边。解决按地理区域划分如果数据集没给坐标信息至少用固定随机种子并且检查训练集和验证集的图片有没有重复。另一个可能是验证集太小136 张图里如果某一类只有 2 个框指标波动会很大。5.4 小目标漏检严重现象大块森林、作物检测很好但公路、河流这种细长条几乎检不到。原因640 分辨率下小目标特征太弱P3 特征图也抓不住。解决提高输入分辨率到 1024或者加 P2 检测头。另一个办法是把大图切成小图训练比如把 2000x2000 的图切成 640x640 的块每块单独训推理时再拼回去。切图时注意重叠 20%避免边缘目标被切掉。5.5 训练 loss 突然变 NaN现象训练到一半 loss 变成 NaN模型权重全废。原因学习率太大或者数据里有异常值比如某个框的宽高是负数。解决先检查标签文件用脚本扫一遍有没有w 0或h 0的行。然后把学习率降到 0.001加梯度裁剪clip_grad10.0。如果还不行换 AdamW 优化器比 SGD 稳。6. 进阶技巧用切片推理和 TTA 把 mAP 再提 5 个点训练完模型推理阶段还有提升空间。遥感图通常很大直接缩到 640 推理会丢细节。切片推理SAHI的思路是把大图切成重叠的小块每块单独推理再把结果拼回去。这个方法对小目标提升明显但速度会慢。我一般只在精度要求高的场景用比如变化检测。from sahi import AutoDetectionModel from sahi.predict import get_sliced_prediction model AutoDetectionModel.from_pretrained( model_typeyolov8, model_pathruns/sat/baseline/weights/best.pt, confidence_threshold0.3, devicecuda:0 ) result get_sliced_prediction( test_img.jpg, model, slice_height640, slice_width640, overlap_height_ratio0.2, overlap_width_ratio0.2 ) result.export_visuals(export_dirsahi_vis/)slice_height/width是切片大小overlap_ratio是重叠比例0.2 表示相邻切片重叠 20%。重叠是为了避免目标被切在边界上。confidence_threshold0.3比默认的 0.25 高一点因为切片后误检会增多阈值调高能压一压。另一个技巧是 TTA测试时增强把图翻转、缩放几次分别推理再融合结果。YOLOv8 自带augmentTrue参数推理时开一下就行yolo detect predict \ modelruns/sat/baseline/weights/best.pt \ sourcetest_images/ \ augmentTrue \ conf0.25 \ saveTrueaugmentTrue会做水平翻转和缩放速度慢 2-3 倍但 mAP 通常能涨 1-2 个点。如果对速度不敏感可以开。最后说个我自己的习惯每次训完模型不管指标多好我都会拿 10 张验证集里指标最差的图出来看分析是标注错了还是模型真的不行。十次里有三次是标注问题两次是类别定义模糊剩下五次才是模型需要改进。遥感地物检测这行数据质量比模型结构重要得多。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/5 9:27:32

Agent自进化工程闭环:评测、记忆分层与Skill更新实战

1. 为什么"能跑"的 Agent 离"越跑越强"还差一整套闭环我见过太多 Agent 项目卡在同一个地方:Demo 阶段惊艳,上线两周后开始退化。不是模型变笨了,而是它没有一套机制把"跑过的路"沉淀下来。你给它加个新工具&a…

2026/10/5 9:27:32

DeepSeek Harness桌面端:可视化AI工具编排框架的实操指南

DeepSeek Harness 这个工具,我盯着它的更新日志盯了大半年。之前一直是个在终端里敲命令的框架,功能确实强,但配置门槛摆在那,新手光是把环境跑起来就得折腾半天。现在官方桌面端终于落地了,安装、配置、插件管理、任务…

2026/10/5 9:27:32

智能排流器没在干活,怎么判断

智能排流器装在管道沿线,多数时候没人盯着。它不像泵和风机那样有动静,出了故障也不会有人立刻知道。排流器一旦停摆,管道上的杂散电流照样在走,干扰腐蚀一天不停,防腐层破损点就会一天天扩大。判断它有没有在干活&…

2026/10/5 10:27:36

Jev:快速、低成本的语义判断,用于 Agent 分流与文本分析

温馨提示:若页面不能正常显示数学公式和代码,请阅读原文获得更好的阅读体验。 作者: 赖得豪 (浙江工商大学) 邮箱: 932345207qq.com Title: Jev:快速、低成本的语义判断,用于 Agent 分流与文本分析Keywords…

2026/10/5 10:27:36

动态内存管理续(c++方向必看)

引言:上一篇文章主要介绍了动态内存的函数和基本用法。https://blog.csdn.net/2301_81479880/article/details/166902312?fromshareblogdetail&sharetypeblogdetail&sharerId166902312&sharereferPC&sharesource2301_81479880&sharefromfrom_l…

2026/10/5 10:27:36

46.大模型应用如何评估不要只看回答听起来像不像

大模型应用如何评估?不要只看“回答听起来像不像” 码海寻道 大模型、智能体与 RAG 工程组件系列第 46 篇 大模型回答流畅、语气自然,不代表它是正确的。企业 AI 应用更应该回答:资料找对了吗?答案有依据吗?权限是否正…

2026/10/5 10:27:36

元宝 LeetCode 227. 基本计算器 II Java实现

LeetCode 227. 基本计算器 II — Java 题解 题目 计算一个字符串表达式的值,表达式包含: 非负整数运算符 “” “-” “*” “/”(无括号)整数除法向零截断 输入: “32*2” → 7 输入: " 3/2 " → 1 输入: &quo…

2026/10/5 10:27:36

Python 中 类变量 vs 全局变量

Python:类变量 vs 全局变量一、定义 & 存放位置全局变量定义在函数、类外部,属于模块对象,保存在模块的 __dict__。g_val 100 # 全局变量,模块级别def test():print(g_val)类变量写在 class 内部、方法外面,属于…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/4 0:01:02

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/4 1:01:05

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑