
很多人学遥感图像分类第一步就卡在“教程太多、不知道跟哪个走”。传统的遥感原理教材只讲理论深度学习的视频课又拿自然图像当例子等你想把方法迁移到遥感影像上才发现波段怎么处理、标签怎么对齐、模型怎么选、显存怎么分配全是坑。这次我们来看一套把“原理 实战”串成完整链路的深度学习遥感图像分类教程方案。它不是简单贴一段分类代码而是覆盖了遥感图像分类从数据准备、标注、模型选型、训练调参到精度评估、批量推理的完整流程。无论你是做毕设、课程设计还是第一次接触遥感深度学习的工作者这套思路都能直接落到项目里。文章会按照一套可复现的实操顺序展开先说清楚遥感图像分类到底需要掌握哪些底层知识再讲环境怎么装、数据怎么整理、模型怎么选、训练代码怎么写、精度指标怎么算最后补上显存优化、批量预测和常见报错排查。看完你可以直接照着搭出一套能跑的实验环境而不是停留在“看了很多理论、依然写不出代码”的状态。1. 遥感图像分类教程核心能力速览先给一个整体判断这是一套偏向“工程落地”的遥感深度学习教程不是那种只讲原理的科普文也不是只放训练代码的“快餐教程”。它适合作为 AI 遥感的入门体系也适合用来快速搭建毕设基线。能力项说明教程定位遥感图像分类原理 深度学习实战覆盖内容数据获取、图像预处理、标注、模型选型、训练、评估、批量预测技术栈Python、PyTorch、rasterio、OpenCV、scikit-learn、语义分割模型库模型方向以语义分割为主包括 U-Net、SegFormer、DeepLabV3 等常用架构硬件门槛CUDA 显卡优先小尺寸切片训练 8GB 显存可覆盖多数实验CPU 可跑通小数据是否支持批量任务支持按目录批量推理、大影像切片预测均可脚本化是否提供 API教程内主要包括离线训练与推理脚本可自行封装为服务适合场景毕业设计、遥感课程项目、地表覆盖分类、滑坡识别、水体提取、建筑物提取上手难度需要掌握 Python 基础理解图像数组和基本的深度学习训练流程从热搜词里也能看出来大家主要关心几个点遥感影像深度学习框架搭建具体步骤、遥感图像标注、高精度遥感、深度学习环境配置、SegFormer 遥感以及武汉大学 bijie-landslide-dataset 这类公开数据集。这套教程正好把这些点串了起来。2. 遥感图像分类的适用场景与使用边界遥感图像分类在现实里最常见的任务包括地表覆盖分类、土地利用变化分析、滑坡灾害识别、水体提取、建筑物提取、植被长势分类等。和自然图像分类不同遥感影像通常是多波段、高分辨率、大幅面一张图动辄几万乘几万像素不能直接整图塞进神经网络必须走“切片 训练 拼接推理”的路线。这套教程最适合三类人。第一类是毕设学生。遥感专业或相关专业的学生论文题目如果是“基于深度学习的某某地类提取”“基于语义分割的滑坡识别”那这套流程基本就是论文的实验框架。把数据换掉、模型调一下参数就能形成可展示的实验结果。第二类是刚入门遥感深度学习的研究者。很多做传统遥感图像处理的人会用 ENVI、eCognition但对深度学习不熟悉。教程的核心价值在于帮你搭好 Python 环境、理解遥感影像在代码里怎么表示、知道训练数据长什么样。第三类是工程实践者。需要周期性做地表覆盖制图或地物提取的人可以把教程里的训练流程沉淀成一套批处理脚本后续遇到新区域新数据重新训练或微调模型即可。但也要说清楚边界。遥感图像分类不是万能的训练数据标注质量直接影响模型上限标注错精度再高也是假的。遥感影像存在“同物异谱、异物同谱”现象单靠光谱信息很容易误分需要结合纹理、形状、上下文特征。深度学习模型的泛化能力依赖训练样本覆盖范围。在一个区域训练的模型直接拿到另一个时相、另一个传感器上精度往往会明显下降。数据合规必须注意。实验应该使用公开数据集、自有合规影像或已授权的数据集不要使用来源不明或可能涉及敏感区域的影像。涉及卫星影像、无人机航拍数据时要确认使用权和发布授权。3. 遥感图像分类本地部署环境准备深度学习遥感图像分类的开发环境本质上和通用深度学习环境区别不大只是额外需要几个遥感影像处理库。下面是实操中比较稳的一套组合。建议使用 Anaconda 创建一个独立环境避免不同项目依赖冲突conda create -n rs_seg python3.10 conda activate rs_seg核心依赖分为四类深度学习框架、遥感影像读写、数值与图像处理、模型库。# 深度学习框架按实际显卡驱动安装对应版本 pip install torch torchvision # 遥感影像读写与地理信息处理 pip install rasterio gdal # 常见数值计算与图像处理库 pip install numpy opencv-python Pillow scikit-learn matplotlib pandas tifffile # 语义分割模型库方便快速调用 U-Net 等模型 pip install segmentation-models-pytorch # SegFormer 等 Transformer 模型需要 timm pip install timm如果使用 NVIDIA 显卡先确认驱动和 CUDA 版本再安装配套的 PyTorch。直接装 CPU 版也可以跑小实验但遥感影像维度高、数据量大训练速度会慢很多。建议在安装前先确认 CUDA 可用import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else CPU only)磁盘空间也要提前规划。一套中等规模遥感数据集包含原始影像、切片、标注文件和模型权重几十 GB 很正常。建议项目目录按下述方式组织rs_project/ ├── data/ │ ├── raw/ # 原始遥感影像 │ ├── label/ # 标注文件 │ ├── train/ # 训练切片 │ └── val/ # 验证切片 ├── checkpoints/ # 模型权重 ├── scripts/ # 训练、评估、推理脚本 ├── outputs/ # 预测结果 └── config.yaml # 实验配置4. 遥感影像数据集整理与标注方法遥感图像分类的第一步是解决数据问题。公开数据集是起步阶段最好的选择比如用于滑坡识别研究的武汉大学 bijie-landslide-dataset或者常见的土地利用、地表覆盖语义分割数据集。使用公开数据集的优点是标签已经做好可以直接用来跑通训练流程。但如果你的课题针对特定区域或者毕设要求自己制作样本就需要走“影像获取 标注 切片”的流程。遥感影像的标注和自然图像不同。自然图像标注往往直接画矩形框或分割轮廓遥感影像标注则需要考虑“像素级地物类别”。小样本标注推荐的工具是 Labelme它支持多边形标注并导出 JSON后续转换成 mask 即可。也可以用 QGIS 直接基于矢量图层生成栅格标签。如果使用 ENVI 这类传统遥感软件可以先人工目视解译再导出分类结果作为深度学习标签。无论用哪种工具最终都要得到与影像像素一一对应的标签图。标签图建议使用 0, 1, 2 这样的整数类别编码不要使用 RGB 颜色直接当标签。输出标签图时注意保持地理参考一致避免影像和标签之间出现偏移。大影像不能直接训练需要切片。常规做法是按固定大小切块比如 256×256 或 512×512并根据任务重叠采样。切片的同时也要对标签图执行相同的切块操作保证影像块和标签块坐标对齐。import numpy as np import rasterio def split_image_and_label(image_path, label_path, patch_size512, stride256, out_dir./train): 将大幅遥感影像和标签图切成训练切片 with rasterio.open(image_path) as src: image src.read().transpose(1, 2, 0) # 转为 H, W, C with rasterio.open(label_path) as src: label src.read(1) # 单波段标签 h, w image.shape[:2] idx 0 for y in range(0, h - patch_size 1, stride): for x in range(0, w - patch_size 1, stride): img_patch image[y:y patch_size, x:x patch_size] label_patch label[y:y patch_size, x:x patch_size] np.save(f{out_dir}/img_{idx}.npy, img_patch) np.save(f{out_dir}/label_{idx}.npy, label_patch) idx 1切完后可以随机划分训练集和验证集。验证集不要和训练集重叠而且最好按区域划分避免同一区域的切片既进训练又进验证导致精度虚高。5. 遥感图像分类模型选型与原理要点遥感图像分类的模型经历了从传统机器学到深度学习的明显演进。传统方法包括最大似然法、支持向量机、随机森林等它们依赖人工设计的光谱特征或纹理特征在小样本、低分辨率任务里还有价值。但对于高分辨率遥感影像地物结构复杂、类别多变人工特征很难覆盖全部模式深度学习的优势就很明显。深度学习遥感图像分类目前主要走语义分割路线也就是对影像的每一个像素预测一个类别。核心模型有三类第一类是卷积网络系列代表是 U-Net。U-Net 的编码器逐层提取特征解码器恢复空间分辨率中间用跳连接保留细节。它在医学图像分割和遥感分割中都有很强的适应性尤其适合样本量不大的项目。第二类是空洞卷积系列代表是 DeepLabV3、DeepLabV3。通过空洞卷积扩大感受野在不降低特征图分辨率的情况下捕获多尺度上下文。对大面积水体、农田这类需要上下文信息的类别效果较好。第三类是 Transformer 系列代表是 SegFormer。它引入自注意力机制建模全局依赖能够处理长距离空间关系在高分辨率遥感影像中表现出较强的精度优势。代价是模型参数和显存占用更高。实际项目中不必追求“最新最强”。遥感图像分类的精度瓶颈通常在数据质量和类别定义上而不是模型结构差那一两个点。初学者优先把 U-Net 跑通再尝试 SegFormer 做精度提升是性价比最高的路线。下面是几种模型的直观对比模型结构特点显存需求适合场景U-Net编解码结构跳连接相对较低小样本、通用地物提取DeepLabV3空洞卷积多尺度模块中等大区域地表覆盖分类SegFormerTransformer 编码器相对较高高分辨率复杂地物精细分类传统机器学习光谱特征 分类器无 GPU 也可低分辨率、小数据集基线对比教程如果只是把模型代码跑通价值有限。真正值得花时间的是理解“为什么遥感影像不能直接套用自然图像的预处理流程”。比如 Sentinel-2 多光谱影像有 13 个波段U-Net 的输入通道数量要跟着调比如影像存在太阳高度角、大气条件造成的辐射差异简单的归一化可能不够再比如类别分布天然不平衡水体、裸地占比差异很大损失函数需要调整。这些才是项目里真正会卡住人的地方。6. 遥感图像分类训练流程与代码实现跑通一个遥感图像分类实验代码上需要完成四件事读取数据、定义模型、训练、保存权重。下面给出一套可以直接扩展的 PyTorch 训练流程。首先定义数据集类。遥感影像读取用 rasterio关键在于把多波段影像转成H, W, C格式同时把标签图转成H, W的单通道数组。import numpy as np import torch from torch.utils.data import Dataset import rasterio class RemoteSensingDataset(Dataset): def __init__(self, image_paths, label_paths, num_classes): self.image_paths image_paths self.label_paths label_paths self.num_classes num_classes def __len__(self): return len(self.image_paths) def __getitem__(self, idx): with rasterio.open(self.image_paths[idx]) as src: image src.read().transpose(1, 2, 0).astype(np.float32) with rasterio.open(self.label_paths[idx]) as src: label src.read(1).astype(np.int64) image torch.from_numpy(image).permute(2, 0, 1) label torch.from_numpy(label) return image, label训练前对数据进行归一化遥感影像常用均值标准差归一化或最大最小值归一化。如果只有单景影像直接用最大最小值归一化最简单稳定。接下来定义模型。用 segmentation-models-pytorch 可以快速创建 U-Net不必手写网络结构。import segmentation_models_pytorch as smp model smp.Unet( encoder_nameresnet34, encoder_weightsimagenet, in_channels3, # 多光谱数据要改成实际波段数 classesnum_classes )这里要注意in_channels参数。如果是多光谱影像比如 8 个波段而编码器预训练权重是基于 RGB 三通道的那就要处理通道不匹配的问题。常见做法是只取前 3 个波段做预训练迁移或者随机初始化输入层再整体训练。训练循环与通用语义分割代码一致。遥感分类损失函数常用交叉熵分类不均衡时可以换成 Focal Loss 或加类别权重。优化器推荐 AdamW配合 OneCycleLR 或余弦退火调度器。import torch.nn as nn from torch.utils.data import DataLoader from torch.optim import AdamW from torch.optim.lr_scheduler import CosineAnnealingLR train_loader DataLoader(train_dataset, batch_size8, shuffleTrue, num_workers4) val_loader DataLoader(val_dataset, batch_size8, shuffleFalse, num_workers4) criterion nn.CrossEntropyLoss() optimizer AdamW(model.parameters(), lr1e-4, weight_decay1e-4) scheduler CosineAnnealingLR(optimizer, T_max50) device torch.device(cuda if torch.cuda.is_available() else cpu) model.to(device) for epoch in range(50): model.train() train_loss 0.0 for images, labels in train_loader: images, labels images.to(device), labels.to(device) optimizer.zero_grad() outputs model(images) loss criterion(outputs, labels) loss.backward() optimizer.step() train_loss loss.item() scheduler.step() print(fEpoch {epoch 1}, Loss: {train_loss / len(train_loader):.4f}) torch.save(model.state_dict(), ./checkpoints/unet_rs.pth)训练过程中建议每个 epoch 结束保存一次模型并保留验证集上精度最高的权重。只保存最后一个 epoch 的模型可能在过拟合点之后保存了效果更差的权重。7. 遥感图像分类模型评估与精度验证深度学习遥感图像分类的精度评估不能只盯着训练集损失。核心指标是总体精度OA、Kappa 系数、类别 F1 和 mIoU。总体精度是分类正确的像素占总像素的比例直观但容易被占比大的类别主导。Kappa 系数衡量分类结果与随机分类相比的提升程度更稳健。mIoU 是语义分割最常用的指标计算每一类预测结果与真实标签的交并比再对所有类取平均。推理一次验证集统计混淆矩阵再计算各项指标import numpy as np from sklearn.metrics import confusion_matrix def compute_metrics(model, val_loader, num_classes, device): model.eval() all_pred [] all_label [] with torch.no_grad(): for images, labels in val_loader: images images.to(device) outputs model(images) preds torch.argmax(outputs, dim1).cpu().numpy() all_pred.extend(preds.flatten()) all_label.extend(labels.numpy().flatten()) cm confusion_matrix(all_label, all_pred, labelslist(range(num_classes))) oa np.sum(np.diag(cm)) / np.sum(cm) iou [] for c in range(num_classes): intersection cm[c, c] union cm[c, :].sum() cm[:, c].sum() - intersection iou.append(intersection / union if union 0 else 0) miou np.mean(iou) print(fOA: {oa:.4f}, mIoU: {miou:.4f}) return cm, oa, miou评估可视化也很重要。把预测结果与原图、标签放在一起对比能够直观发现模型在哪些地物上容易误分。输出结果建议转成 GeoTIFF方便后续在 GIS 软件里叠加分析。import rasterio from rasterio.transform import from_origin def save_pred_as_geotiff(pred, reference_path, output_path): with rasterio.open(reference_path) as src: transform src.transform crs src.crs with rasterio.open( output_path, w, driverGTiff, heightpred.shape[0], widthpred.shape[1], count1, dtypeuint8, crscrs, transformtransform ) as dst: dst.write(pred.astype(uint8), 1)写结果时保留地理参考是遥感分类和普通图像分类最大的区别。没有地理参考的预测图很难做后续变化检测和专题制图等于白做。8. 大影像切片预测与批量任务处理训练完成后实际使用往往不是预测几张切片而是对一整景遥感影像做全幅分类甚至对一个地区的几十景影像做批处理。这需要单独设计推理流程。整景推理的思路是先按训练时相同的切片大小切分影像逐块预测再按照坐标拼回完整结果。为保证边界连续性切片之间要设置重叠拼接时对重叠区域取平均或只取中心区域。def predict_full_image(model, image_path, patch_size512, overlap64, devicecuda): with rasterio.open(image_path) as src: image src.read().transpose(1, 2, 0).astype(np.float32) profile src.profile h, w image.shape[:2] result np.zeros((h, w), dtypenp.uint8) count np.zeros((h, w), dtypenp.uint8) model.eval() step patch_size - overlap for y in range(0, h - patch_size 1, step): for x in range(0, w - patch_size 1, step): patch image[y:y patch_size, x:x patch_size] patch_tensor torch.from_numpy(patch).permute(2, 0, 1).unsqueeze(0).float().to(device) with torch.no_grad(): output model(patch_tensor) pred torch.argmax(output, dim1).squeeze(0).cpu().numpy() result[y:y patch_size, x:x patch_size] pred count[y:y patch_size, x:x patch_size] 1 result np.divide(result, count, outnp.zeros_like(result, dtypenp.float32), wherecount 0).astype(np.uint8) return result批量预测时建议用文件目录组织好待预测影像循环处理每次处理完记录日志。因为整景高分影像预测耗时较长中途容易因为显存溢出或断电中断所以每个文件预测完立即保存输出结果避免后期重新计算。接口 API 方面如果要把训练好的模型接进业务系统可以基于 FastAPI 封装一个最简单的预测接口。遥感影像直接通过 HTTP 传输往往体积太大更适合的做法是传入影像文件路径服务端读取本地或共享存储中的文件。from fastapi import FastAPI from pydantic import BaseModel app FastAPI() class PredictRequest(BaseModel): image_path: str app.post(/predict) def predict(req: PredictRequest): # 调用整景预测函数实际项目中可按业务方式组织 result_path run_full_prediction(req.image_path) return {status: ok, result: result_path}封装 API 时要考虑多用户同时调用时的显存占用和排队问题。建议使用任务队列或单线程推理避免多个进程同时加载模型导致显存溢出。9. 遥感分类训练与推理的资源占用观察遥感图像分类的性能瓶颈通常在显存。一张 512×512 的影像块在 ResNet34 编码器的 U-Net 中单卡训练 batch size 8 的情况显存占用大致在 8GB 到 12GB 之间。这个数字会随着输入波段数、backbone 大小、batch size 变化实际情况下还是建议用自己的配置跑一次后观察。训练时最需要关注的三个参数是输入尺寸、batch size、backbone 复杂度。三者都直接推高显存占用。如果显存不足优先降低 batch size其次降低输入切片尺寸最后才换更轻量的 backbone。推理阶段显存占用通常比训练低得多。整景预测时因为每个 patch 只前向不反向显存占用相对稳定。但如果不做切片直接把整景影像送入模型再大的显存也会溢出。CPU 推理可行但速度会慢很多。在学术实验和小规模验证时 CPU 完全能用不过如果要跑整景高分影像CPU 推理时间可能从 GPU 的几分钟拉长到几十分钟甚至更久。入门阶段建议先把代码跑通再考虑升级设备。观察显存最简单的方式是使用nvidia-smi训练时每隔一段时间看一眼。nvidia-smiWindows 上也可以打开任务管理器查看 GPU 显存使用情况。深度学习框架通常会自动占用几乎全部可用显存这是正常现象不必惊慌。降低显存占用的常见手段包括减小 batch size、使用混合精度训练、开启梯度累积、降低输入分辨率、使用更小的 backbone。其中混合精度训练是性价比最高的优化手段。scaler torch.cuda.amp.GradScaler() with torch.cuda.amp.autocast(): outputs model(images) loss criterion(outputs, labels) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()Pytorch 的自动混合精度在语义分割训练中能显著降低显存占用同时保持精度基本不变。显存吃紧时优先尝试这一项。10. 遥感图像分类常见问题与排查方法遥感图像分类项目的报错和问题往往集中在数据读取、标签格式、显存不足和精度不达标这几类。下面整理一份高频问题排查表。问题现象可能原因排查方式解决方案训练时影像和标签对不上切片时影像与标签没有同步处理抽查切片可视化重新用同一套坐标和窗口切片报错 shape mismatch波段数不一致或标签通道数错误打印 images.shape 和 labels.shape检查读取时是否 transpose 和 squeezeCUDA out of memorybatch size 或输入尺寸过大nvidia-smi 查看占用降低 batch size、使用混合精度模型精度很低全预测为背景类类别极度不均衡统计训练集各类别像素占比使用类别权重损失或 Focal Loss多光谱数据预训练权重加载失败in_channels 与预训练权重不一致查看 encoder 第一层维度仅用 RGB 通道或自定初始化验证集精度高但新区域精度差模型过拟合训练区域特征分析数据分布差异增加数据多样性使用数据增强整景推理拼接边界明显切片重叠不足或后处理方式粗糙观察预测结果条带提高重叠率重叠区取平均标签图和影像坐标系不一致制作标签时未使用原图投影在 GIS 软件中叠加检查统一投影或配准后再切片还有一个容易忽略的问题RGB 可视化数据往往只取了多光谱影像的其中 3 个波段。如果你的分类任务依赖近红外波段只喂 RGB 信息等于主动丢弃了关键特征。建议先做波段分析再确定模型输入通道。11. 遥感图像分类项目最佳实践与使用建议实际操作下来一套稳健的遥感分类项目至少应该做到以下几点。第一次跑实验不要一上来就用大模型、大尺寸。先用 256×256 切片、小 backbone、少量 epoch 把流程跑通确认数据读取、训练、评估、保存全链路没问题再逐渐加大规模。这样遇到 bug 时更容易定位。数据层面训练集、验证集、测试集要严格分离。遥感影像空间自相关很强同一区域相邻切片特征高度相似如果随机划分验证集精度会虚高。更稳妥的做法是按区域或时相划分数据集。类别不均衡处理要放在模型调参之前。遥感地物天然不均衡比如建筑物分类里“非建筑”像素占了 90% 以上。如果不处理模型输出整体偏向大类mIoU 很低看起来准确率却很高。损失函数和评价指标要匹配任务。只在精度不够时优先尝试换损失函数、改学习率不要把精力都花在网络结构的细微调整上。Baseline 模型加上好的数据策略往往比盲目换强网络更有效。工程上建议每次实验都记录配置数据集版本、波段设置、patch size、batch size、学习率、模型权重路径、精度指标。记录不完整的实验结果后期几乎无法复现。一套简单的配置文件能省下大量重复劳动。data: train_dir: ./data/train val_dir: ./data/val in_channels: 3 num_classes: 5 model: name: unet encoder: resnet34 train: batch_size: 8 epochs: 50 lr: 0.0001 loss: cross_entropy合规方面需要特别强调不要用来源不明的遥感影像不要处理涉密或敏感区域数据公开数据集使用时注意引用和授权涉及无人机航拍或商业卫星影像时确认使用权。发布模型和预测结果前做好数据脱敏和效果复核。12. 总结与下一步这套“AI 遥感”的深度学习遥感图像分类教程体系最值得尝试的是它把离散的知识点串联成了完整闭环。从数据整理到模型训练再到整景预测每一步都有对应的代码思路。如果你正在做遥感分类方向的毕设可以先用 U-Net 跑通 baseline再用 SegFormer 尝试精度提升整个实验过程会非常顺畅。最容易踩的坑集中在数据环节标签错位、波段不匹配、验证集划分不合理。建议把时间重点花在数据检查和实验记录上而不是一味调网络。下一步可以往以下几个方向扩展引入多光谱 / 高光谱数据的波段选择与降维方法尝试 SegFormer、Swin Transformer 等新模型在遥感分类上的效果对比结合变化检测任务实现双时相遥感影像的联合分析把训练好的模型封装成 API 服务接入自动化制图流程。如果你是第一次接触遥感深度学习建议先把环境搭好找一份公开数据集完整跑一遍训练和评估。跑通一次完整流程后面再深入原理会比光看理论高效得多。如果这篇文章对你有帮助建议收藏备用。后面遇到环境配置、模型训练或者整景推理的问题可以随时回来对照排查。