简介本资源为遥感地物语义分割数据集面向遥感图像处理、深度学习方向的研究人员与开发者用于建筑、水体、植被等地物类别的像素级精细划分可支撑环境监测、城市规划与灾害响应等场景的算法实验。压缩包共2610个文件以2595个tif遥感影像为主体另含txt划分列表、xml标注、py预处理脚本及工程配置文件整体约267.4MB。数据集已按训练集、测试集、验证集三部分组织并配套train_list、val_list、test_list路径清单便于直接接入VGG、ResNet或U-Net等模型开展迁移学习。包内还提供裁剪脚本与label_128系列标签文件可完成尺寸调整、归一化与像素类别映射等预处理帮助读者快速搭建从数据读取到模型评估的完整流程并借助IoU、mIoU指标验证分割效果。目前已有3182人学习下载适合作为语义分割入门与进阶实践的参考数据。1. 1500 张 tif 遥感语义分割数据集拿到手之后先别急着喂给模型遥感地物语义分割数据集数据格式为 tif共 1500 张遥感图像包含训练集、测试集、验证集——这个标题看起来像一句平淡的数据集描述但真正做过遥感分割的人都知道坑几乎全藏在「tif」和「1500 张」这两个词里。tif 不是普通图片格式它可能带地理坐标、多波段、16 位深度、NoData 值甚至每张影像的尺寸都不一样1500 张听起来不少但如果类别极不均衡、空间分布集中训出来的模型换一片区域就崩。这篇笔记面向已经拿到或准备找这类数据集、想跑通遥感地物语义分割的从业者从数据体检、格式转换、划分校验一路讲到训练参数和踩坑排查目标是让你拿到一份 tif 遥感数据集后能判断它能不能用、怎么用、哪里会翻车。遥感图像标注和语义分割算法这两件事最终都要落到数据本身的质量上。2. 先给 tif 数据集做一次体检波段、位深、坐标与标签对齐遥感 tif 和普通 jpg/png 最大的区别是它承载的信息维度更多处理链路也更长。很多人拿到数据集直接写个 Dataset 类就开始训结果 loss 不降或者预测全黑回头查才发现是位深没归一化、标签和影像没对齐、或者 NoData 被当成有效值参与了统计。这一章先把体检流程讲清楚再给可执行的检查脚本。2.1 遥感 tif 的四个关键属性波段数、位深、投影、NoData普通 RGB 图像是 3 波段 8 位而遥感 tif 常见的有单波段灰度、4 波段RGB近红外、8 波段多光谱甚至上百波段的高光谱。位深上8 位取值范围 0-25516 位是 0-65535还有浮点型反射率数据。如果你按 8 位的方式去归一化 16 位影像像素值会被压到接近 0模型看到的基本是一片黑。投影和地理变换决定了影像能不能和标签逐像素对齐。语义分割的标签通常也是 tif值域是类别索引0、1、2…但有些数据集标签是调色板模式直接读出来是 RGB 三通道需要转成单通道索引图。NoData 值更隐蔽它表示无效区域常见取值是 0、-9999 或 65535如果不做掩膜这些区域会被当成真实地物参与训练直接污染损失。属性常见取值处理不当的后果波段数1 / 3 / 4 / 8通道数不匹配模型输入报错位深uint8 / uint16 / float32归一化错误影像全黑或过曝投影地理坐标 / 无投影标签与影像错位NoData0 / -9999 / 65535无效区域污染训练2.2 用 rasterio 批量体检 1500 张 tif 的最小脚本体检不需要把 1500 张全部可视化写个脚本统计元信息就够了。下面这段代码遍历数据集目录输出每张影像的尺寸、波段、数据类型和值域分布帮你快速判断数据是否整齐。import rasterio import numpy as np from pathlib import Path def inspect_tif(img_dir, label_dir, sample_n20): img_paths sorted(Path(img_dir).glob(*.tif)) print(f影像总数: {len(img_paths)}) stats [] for p in img_paths[:sample_n]: with rasterio.open(p) as src: arr src.read() # (C, H, W) stats.append({ name: p.name, shape: arr.shape, dtype: arr.dtype, min: float(arr.min()), max: float(arr.max()), nodata: src.nodata, crs: src.crs is not None, }) for s in stats: print(s) # 检查标签是否为单通道索引图 lbl_paths sorted(Path(label_dir).glob(*.tif)) if lbl_paths: with rasterio.open(lbl_paths[0]) as src: lbl src.read() print(标签通道数:, lbl.shape[0], 唯一值:, np.unique(lbl)[:20]) inspect_tif(data/train/images, data/train/labels)这段脚本的核心是src.read()读出的数组形状是(通道, 高, 宽)和 PyTorch 期望的(通道, 高, 宽)一致但和 PIL 读图的(高, 宽, 通道)不同转换时要注意。src.nodata返回该影像声明的无效值如果为 None 说明数据集没标注 NoData需要你自己根据值域判断。标签部分重点看通道数和唯一值如果唯一值是一堆连续整数且通道数为 1说明是标准索引图如果通道数为 3 且值域 0-255大概率是调色板或 RGB 标签需要额外转换。参数上sample_n控制抽样数量1500 张全读一遍也能跑但抽样 20 张足够发现系统性问题。如果发现尺寸不一致说明数据集没有统一裁剪后续要么统一 resize会破坏地物形状要么用滑动窗口切 patch这是两个完全不同的训练策略必须在体检阶段就定下来。2.3 标签对齐校验影像和 mask 必须逐像素对应遥感数据集最常见的翻车点之一是影像和标签文件名对不上或空间范围有偏移。文件名对不上好查空间偏移则很隐蔽。校验方法是读一张影像和对应标签检查两者的transform和shape是否一致。def check_alignment(img_path, lbl_path): with rasterio.open(img_path) as img, rasterio.open(lbl_path) as lbl: same_shape img.shape lbl.shape same_transform img.transform lbl.transform print(f尺寸一致: {same_shape}, 地理变换一致: {same_transform}) if not same_shape: print(f影像: {img.shape}, 标签: {lbl.shape})如果transform不一致说明标签在制作时被重采样或裁剪过直接训练会导致边界错位。这种情况要么用 GDAL 重新对齐要么放弃这批数据。我一般会在体检阶段随机抽 5 对做这个检查只要有一对不一致整批数据都要重新核对。3. 从 tif 到训练张量归一化、切片与数据增强的落地参数体检通过之后下一步是把 tif 变成模型能吃的张量。这一步的每个参数都会影响最终精度尤其是归一化方式和切片策略。遥感影像和自然图像不同它的值域分布、空间分辨率、地物尺度都有自己的特点照搬 ImageNet 那套均值方差往往效果一般。3.1 归一化策略按位深选 min-max 还是按波段算均值方差归一化的目的是把像素值映射到模型容易学习的范围。对于 8 位影像除以 255 是最简单的做法对于 16 位影像常见做法是先除以 65535 再减均值除方差或者直接用 min-max 归一化到 [0,1]。但遥感影像的直方图往往有长尾少数极亮或极暗像素会拉偏 min-max 的边界这时候用百分位裁剪更稳。def normalize_16bit(arr, p_low2, p_high98): # arr: (C, H, W) uint16 arr arr.astype(np.float32) out np.zeros_like(arr) for c in range(arr.shape[0]): band arr[c] valid band[band 0] # 排除 NoData if valid.size 0: continue lo, hi np.percentile(valid, [p_low, p_high]) band np.clip(band, lo, hi) out[c] (band - lo) / (hi - lo 1e-6) return out这段代码按波段做百分位裁剪再归一化p_low和p_high控制裁剪范围默认 2% 和 98% 能去掉极端值又不丢太多信息。注意band 0这行是在排除 NoData如果你的 NoData 是 -9999条件要改成band ! -9999。归一化后的数组是 float32范围约在 [0,1]可以直接送进模型。如果数据集是多光谱且波段间量纲差异大建议按波段分别算均值和方差做标准化而不是全局一个值。我一般会先在训练集上统计每个波段的均值和标准差存成配置文件训练和推理时都用同一套参数避免数据泄露。3.2 大图切片滑动窗口的尺寸、重叠率与边缘处理遥感影像往往很大比如 5000×5000 像素直接 resize 到 512×512 会丢失大量细节。常见做法是滑动窗口切 patch窗口大小取 256 或 512重叠率取 0.25 到 0.5。重叠的作用是减少边缘效应推理时再把重叠区域做加权融合。def slide_crop(img, label, patch_size512, stride384): # img: (C, H, W), label: (H, W) C, H, W img.shape patches [] for y in range(0, H - patch_size 1, stride): for x in range(0, W - patch_size 1, stride): img_p img[:, y:ypatch_size, x:xpatch_size] lbl_p label[y:ypatch_size, x:xpatch_size] patches.append((img_p, lbl_p)) return patchespatch_size和stride的关系决定重叠率stride patch_size * (1 - overlap)。重叠率 0.25 对应 stride 384512 的 75%。如果影像尺寸不能被 stride 整除边缘会剩一条需要单独处理或 padding。切片数量会显著增加1500 张大图切完可能变成几万个小 patch训练时用 Dataset 动态切比一次性全切更省内存。注意切片时影像和标签必须用同一组坐标否则会出现影像和 mask 错位。建议把切片逻辑封装成一个函数同时接收影像和标签返回成对的 patch。3.3 数据增强几何变换和光谱变换要分开做遥感语义分割的增强分两类几何变换翻转、旋转、缩放和光谱变换亮度、对比度、波段扰动。几何变换必须同时作用于影像和标签且标签要用最近邻插值否则类别索引会被插值成小数。光谱变换只作用于影像不影响标签。import albumentations as A geo_aug A.Compose([ A.HorizontalFlip(p0.5), A.VerticalFlip(p0.5), A.RandomRotate90(p0.5), ], additional_targets{mask: mask}) spec_aug A.Compose([ A.RandomBrightnessContrast(p0.3), A.GaussNoise(p0.2), ])additional_targets把 mask 注册成和 image 同步变换的目标这是 albumentations 处理分割任务的标准做法。光谱增强不要用会改变像素空间位置的算子否则标签对不上。增强强度不宜过大遥感地物的纹理和光谱特征比较敏感过度增强反而让模型学不到稳定特征。4. 训练集/验证集/测试集划分1500 张怎么分才不泄露数据集标题里写了包含训练集、测试集、验证集但很多人拿到手发现划分是随机的同一片区域的 patch 同时出现在训练和验证里导致验证精度虚高。遥感数据的空间自相关性很强相邻像素几乎一样随机划分等于变相泄露。这一章讲清楚划分原则和校验方法。4.1 随机划分 vs 空间划分为什么按区域分更可信随机划分是把所有 patch 打乱后按比例分简单但有问题如果两个相邻 patch 一个进训练一个进验证模型在训练时已经见过几乎相同的场景验证精度会偏高。空间划分是按地理区域分比如用几景完整影像做验证其余做训练这样验证集和训练集在空间上不重叠更能反映模型在新区域的泛化能力。判断数据集是否已经做了空间划分可以看文件名或目录结构。如果训练集和验证集的影像来自不同景或不同区域编号说明是空间划分如果文件名是连续编号且随机打散大概率是随机划分。对于 1500 张这个量级如果原始影像只有几景建议按景划分如果已经是切好的 patch至少按影像来源分组划分。划分方式优点缺点适用场景随机划分实现简单类别分布均匀空间泄露精度虚高影像间独立性强的场景空间划分反映真实泛化能力类别分布可能不均遥感、医学等空间相关数据4.2 划分比例与类别均衡检查脚本常见比例是 7:1.5:1.5 或 8:1:1但遥感数据类别极不均衡划分后要检查每个类别的像素占比。下面脚本统计各集合的类别分布。def class_distribution(label_paths, num_classes): counts np.zeros(num_classes, dtypenp.int64) for p in label_paths: with rasterio.open(p) as src: lbl src.read(1) for c in range(num_classes): counts[c] np.sum(lbl c) total counts.sum() for c in range(num_classes): print(f类别 {c}: {counts[c]} 像素, 占比 {counts[c]/total:.4f}) return counts如果某个类别在验证集里占比接近 0说明划分不均衡需要重新划分或对少数类做重采样。num_classes要按数据集实际类别数填不要多算背景类。我一般会要求每个类别在验证集里至少有几百个像素否则验证指标波动会很大。4.3 用哈希或分组 ID 保证可复现划分划分一旦定了就不要每次训练重新随机否则实验结果无法对比。做法是给每个样本算一个稳定 ID比如文件名哈希按 ID 排序后取前 N 个做验证或者按影像来源分组后固定分组。这样换机器、换时间跑划分结果一致。import hashlib def stable_split(paths, val_ratio0.15): def h(p): return int(hashlib.md5(str(p).encode()).hexdigest(), 16) paths sorted(paths, keyh) n_val int(len(paths) * val_ratio) return paths[n_val:], paths[:n_val]哈希划分的优点是稳定且不依赖随机种子缺点是划分结果看起来随机但实际固定。如果数据集本身有分组信息比如影像 ID优先按分组划分哈希只用于组内样本。5. 避坑与排查遥感语义分割数据集最常见的 5 个翻车现场这一章记录我在处理 tif 遥感数据集时踩过的坑每条按现象、原因、解决写。这些问题在 1500 张量级的数据集上尤其容易暴露因为数据来源多、格式杂。5.1 训练 loss 不降预测全黑或全白现象模型训了几个 epochloss 几乎不动推理输出要么全黑要么全白。原因通常是归一化错误或标签值域不对。16 位影像没归一化直接送进模型像素值几千几万梯度爆炸或消失标签如果是 0/255 二值图但按多类处理类别索引对不上。解决先跑体检脚本确认位深和值域归一化到 [0,1]标签转成 0 到 N-1 的连续整数。5.2 验证精度很高换一片区域就崩现象验证集 mIoU 0.8实际部署到新区域掉到 0.3。原因是随机划分导致空间泄露模型记住了训练区域的纹理而不是学到了地物特征。解决改成按区域或按景划分确保验证集和训练集空间不重叠。如果数据量不够至少按影像来源分组。5.3 标签边缘有锯齿或类别错位现象预测结果在边界处明显偏移或者某些类别整体错位几个像素。原因是影像和标签的 transform 不一致或者标签在制作时被重采样过。解决用check_alignment逐对检查 transform 和 shape不一致的用 GDAL 重新对齐或剔除。切片时确保影像和标签用同一坐标。5.4 显存爆了但 batch size 已经调到 1现象batch size 设为 1 还是 OOM。原因是输入尺寸太大比如直接送 1024×1024 甚至原图。解决减小 patch size 到 256 或 512或者用梯度累积模拟大 batch。另外检查是否用了混合精度fp16 能省不少显存。5.5 类别极不均衡导致少数类完全学不到现象背景类 IoU 0.9少数类 IoU 接近 0。原因是少数类像素占比太低损失被背景主导。解决用加权交叉熵或 Dice Loss给少数类更高权重或者在采样时对含少数类的 patch 过采样。权重不要设得太极端否则背景类会崩。提示排查顺序建议从数据体检开始确认位深、值域、对齐没问题再看划分和增强最后调模型和损失。大部分翻车都在数据侧不在模型侧。6. 进阶技巧用滑动窗口推理和类别权重把 mIoU 再提一截训练跑通之后想再提精度有两个性价比很高的方向推理阶段的滑动窗口融合和训练阶段的类别权重调优。这两个技巧不需要换模型结构改几十行代码就能见效。滑动窗口推理的做法是对一张大图按固定步长切 patch每个 patch 单独推理然后把所有 patch 的预测概率图按位置拼回原图重叠区域做平均或加权平均。这样比直接 resize 整图推理精度高因为模型始终在它训练时的尺度上工作。def sliding_inference(model, img, patch_size512, stride384, num_classes5): C, H, W img.shape prob_map np.zeros((num_classes, H, W), dtypenp.float32) count_map np.zeros((H, W), dtypenp.float32) for y in range(0, H - patch_size 1, stride): for x in range(0, W - patch_size 1, stride): patch img[:, y:ypatch_size, x:xpatch_size] with torch.no_grad(): logits model(torch.from_numpy(patch).unsqueeze(0).float()) prob torch.softmax(logits, dim1).squeeze(0).numpy() prob_map[:, y:ypatch_size, x:xpatch_size] prob count_map[y:ypatch_size, x:xpatch_size] 1 prob_map / np.maximum(count_map, 1) return prob_map.argmax(axis0)stride越小重叠越多精度越高但推理越慢。实际用的时候patch_size要和训练时一致stride取 patch_size 的 0.5 到 0.75 倍。count_map处理边缘 patch 不足的情况避免除零。类别权重方面我一般先用逆频率权重跑一版看少数类 IoU 是否提升如果提升不明显再试 Dice Loss 或 Focal Loss。权重公式是w_c total / (num_classes * count_c)但要对权重做裁剪比如上限设 10避免背景类被压得太狠。调完权重后重新跑验证对比每类的 IoU 变化不要只看 mIoU。还有一个容易被忽略的点是测试时增强TTA对影像做水平翻转、垂直翻转各推理一次把概率图平均后再取 argmax通常能涨 1 到 2 个点代价是推理时间翻几倍。如果部署对延迟不敏感值得加上。我自己处理遥感数据集的习惯是拿到数据先跑体检脚本把位深、值域、对齐、划分四件事确认完再写训练代码这四步花半天能省后面几天的排查时间。模型结构反而不用太纠结SegFormer、U-Net、DeepLab 在遥感分割上都能用数据质量才是天花板。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
CSP2026备赛指南:从初赛赛制到复赛上机全解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 1:48:10
Codex Desktop 新建会话无法发送消息:CLI 路径与版本排查指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 1:48:04
MacBook Pro A1278 Win10/11 声卡修复指南:CS4206 驱动兼容方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 1:48:04
RSUITE DateInput 日期输入框实战指南:键盘驱动的高效日期录入与格式化解析 前端UI组件 【免费下载链接】rsuite 🧱 A suite of React components . 项目地址: https://gitcode.com/gh_mirrors/rs/rsuite 点击查看 免费下载 本指南围绕 RSuite 组件库中的 DateInput 日期输入框展开,讲解如何通过键盘快速录入、逐段编… · 2026/9/26 2:30:12
从31个零散工具到10个结果导向工作流:AlphaGBM Skills v3.0 重构路线图完整解读 从31个零散工具到10个结果导向工作流:AlphaGBM Skills v3.0 重构路线图完整解读 【免费下载链接】skills Bring realtime market data and research workflows into Claude Code, Cursor & beyond — 29 open-source Skills for stocks, options and commoditie… · 2026/9/26 2:30:06
OpenCV手势识别控制小米智能家居:从肤色检测到Yeelight灯控 简介:基于OpenCV与机器学习的手势控制智能家居项目,面向计算机视觉、图像处理和物联网方向的开发者与学生,尤其适合作为毕业设计参考。项目通过摄像头捕捉实时画面,利用图像预处理增强手势特征,结合机器学习模型完成手… · 2026/9/26 2:30:06
DeskcommCRM落地实战:从客户数据混乱到销售流程自动化 1. 客户跟单乱到无法忍受时,我们决定全面切换到DeskcommCRM我一直记得那次销售周会让我的尴尬。运营同事拉了一张统计表,里面有47个客户被重复跟进,好几个客户名下同时挂着3个以上销售,商机阶段的标注各不相同,有人写“… · 2026/9/26 2:29:59
jianying-editor技能安装教程 我用AI自动剪了一条35秒短视频,全程没碰剪映时间线前几天有个朋友跟我吐槽:
“剪映是真好用,但每次导入素材、拖时间线、加字幕、配BGM,一套操作下来,比拍视频还累。”
我太懂这种感觉了。
直到我最近翻到一个开源小工… · 2026/9/26 2:29:59
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46