
简介本资源是一套完整的遥感图像语义分割毕设实践方案面向计算机、人工智能、遥感与自动化等专业的本科生及初阶研究者聚焦U-Net网络在遥感影像地物识别中的落地应用适用于毕业设计、课程大作业与算法入门实战。压缩包共68个文件46.93MB包含6个核心Python训练/预测脚本train.py、predict.py等、32张标注样本与可视化结果PNG图、6个Jupyter Notebook含数据构建、训练与推理全流程演示、5个LaTeX论文源码.tex及配套PDF终稿另有SVG图表、字体、Bib参考文献等学术支撑文件。已有110人学习下载项目经实际调试验证可直接运行答辩获98分高分附带清晰目录结构与模块化代码如data.py数据加载、model.py网络定义、utils.py工具函数便于理解U-Net编码器-解码器机制、遥感数据预处理流程及端到端训练调优逻辑为后续模型改进或跨场景迁移提供坚实基础。1. 遥感图像语义分割不是“调个模型跑张图”而是空间特征与地物结构的双重建模你用 PyTorch 加载一个预训练 ResNet 做分类输入一张遥感图输出“耕地”或“建筑”——这叫图像分类。但当你需要把整幅 512×512 的 Sentinel-2 多光谱影像逐像素标记为道路1、水体2、林地3、裸土4、建成区5且边界必须贴合真实地块轮廓、小路不断连、池塘不漏填——这才是遥感图像语义分割的真实战场。U-Net 在这里不是“又一个 CNN 架构”而是专为小样本、高分辨率、强空间依赖的遥感任务设计的编码器-解码器结构它用下采样捕获全局光谱模式如 NDVI 值分布再通过跳跃连接把浅层位置信息如边缘、纹理精准回传让解码端在恢复分辨率时“知道该在哪画线”。本项目不是玩具 Demo而是答辩得分 98 分的完整毕设系统含可直接运行的 U-Net 实现非 torchvision.models 简单封装、适配遥感多通道4 波段近红外红绿蓝的数据加载逻辑、带地理坐标对齐的训练/验证/测试集划分、以及论文中第 5 章实测的 IoU 对比表格。适合计算机、遥感、地信专业学生复现核心流程也适合工程师快速切入遥感 AI 工程化环节——尤其当你手头只有 200 张标注图、GPU 显存 ≤12GB 时这套轻量级 U-Net 比 DeepLabv3 更可控。2. U-Net 架构设计与遥感数据适配为什么跳过 Encoder 的 conv1_2 层反而提升道路分割精度2.1 U-Net 的遥感特化改造从医学图像到多光谱影像的通道与尺度适配原始 U-Net 为 512×512 医学图像设计输入为单通道灰度图而本项目处理的是 Landsat-8 或 Sentinel-2 遥感影像典型输入为 4 波段B2/B3/B4/B8蓝/绿/红/近红外或 6 波段增加短波红外 SWIR。model.py中UNet类的__init__方法明确声明了in_channels4而非默认的 1class UNet(nn.Module): def __init__(self, n_classes5, in_channels4, bilinearTrue): super(UNet, self).__init__() self.n_classes n_classes self.in_channels in_channels self.bilinear bilinear # ... 后续层定义提示若你使用 6 波段数据如添加 SWIR1 和 SWIR2需将in_channels改为 6并同步修改data.py中__getitem__的img img[:6, ...]切片逻辑否则会触发RuntimeError: Expected 4D tensor as input。更关键的是下采样路径的卷积核尺寸调整。医学图像中conv1_1使用 3×3 卷积已足够但遥感影像中道路、田埂等线性地物宽度常仅 2–3 像素在连续两次 2×2 最大池化后易丢失。cnn.py中DoubleConv模块采用kernel_size3, padding1保证尺寸不变但Down模块在maxpool后额外插入一层3×3卷积非原始 U-Net 的2×2以增强局部特征保留class Down(nn.Module): def __init__(self, in_ch, out_ch): super(Down, self).__init__() self.mpconv nn.Sequential( nn.MaxPool2d(2), DoubleConv(in_ch, out_ch) # 此处 DoubleConv 内含两个 3×3 卷积 )2.1.1 跳跃连接的通道对齐策略为何crop操作不可省略U-Net 解码端需将编码器对应层的特征图如enc2输出 128 通道与上采样后的特征如up2输出 64 通道拼接。但直接torch.cat([x_enc, x_up], dim1)会因尺寸不匹配报错。utils.py中crop函数执行中心裁剪def crop(img, target): _, _, h, w target.shape diff_h (img.size()[2] - h) // 2 diff_w (img.size()[3] - w) // 2 return img[:, :, diff_h:diff_h h, diff_w:diff_w w]此操作本质是解决“上采样插值导致尺寸略大于目标”的问题。例如enc2输出尺寸为 128×128up2上采样后为 130×130crop(enc2, up2)返回 128×128 子区域。若跳过此步直接cat模型训练会因size mismatch中断且即使强制pad也会引入无效边界噪声降低道路细线分割精度。2.2 遥感数据加载器如何让 DataLoader 不因.tif标签图的 16-bit 深度崩溃遥感标注图常用 GeoTIFF 格式标签值常为uint16如水体1001建筑2002而 PyTorch 默认torch.nn.CrossEntropyLoss要求标签为long类型且值域为[0, n_classes-1]。data.py中BasicDataset类的__getitem__方法对此做了三重处理读取与归一化使用rasterio读取多光谱影像对每个波段独立除以该波段最大值非全局归一化保留光谱对比度标签映射构建label_map {1001: 0, 2002: 1, 3003: 2, 4004: 3, 5005: 4}字典将原始遥感 ID 映射为连续整数类型转换mask torch.as_tensor(mask.astype(np.long), dtypetorch.long)强制转为long。# data.py 片段 def __getitem__(self, i): idx self.ids[i] img_file self.images_dir / f{idx}.tif mask_file self.masks_dir / f{idx}_mask.tif with rasterio.open(img_file) as src: img src.read() # shape: (C, H, W) img img.astype(np.float32) for c in range(img.shape[0]): max_val img[c].max() if max_val 0: img[c] / max_val # 逐波段归一化 with rasterio.open(mask_file) as src: mask src.read(1) # 单波段标签图 # 映射原始ID到0~4 mask_mapped np.zeros_like(mask) for orig_id, new_id in self.label_map.items(): mask_mapped[mask orig_id] new_id return { image: torch.from_numpy(img), mask: torch.from_numpy(mask_mapped).long() }注意若你的标注图使用uint8且值域已是0–4可删除label_map映射逻辑但必须保留astype(np.long)否则CrossEntropyLoss会报expected dtype long错误。2.3 训练配置参数表batch_size4 与 lr1e-4 的实测依据本项目在 GTX 1080Ti11GB 显存上验证的超参组合并非随意设定而是基于显存占用与收敛稳定性权衡参数取值依据说明batch_size4输入 4 波段 × 512×512 图像U-Net 全连接前最大特征图尺寸为 64×64×512单 batch 显存占用 ≈ 8.2GB设为 8 会 OOMlearning_rate1e-4使用 Adam 优化器lr 5e-4 时 loss 曲线震荡剧烈验证集 IoU 波动 3%1e-4 则收敛缓慢50 epoch 后 IoU 72%num_workers2数据加载瓶颈在.tif文件 I/O设为 4 无加速效果且增加 CPU 负载val_percent0.15遥感标注成本高训练集需 ≥170 张才能稳定收敛按 200 张总样本计验证集 30 张可覆盖主要地物类型train.py中train_net函数调用torch.cuda.amp.GradScaler()启用混合精度训练使batch_size4下单 epoch 训练时间从 142s 降至 98s且未观察到精度损失验证 IoU 差异 0.3%。3. 从零启动训练三步完成数据集准备、模型训练与 TensorBoard 可视化3.1 数据集结构标准化create_dataset.ipynb中的地理配准与裁剪逻辑项目提供的数据集需满足严格目录结构create_dataset.ipynb是生成合规数据的第一道关卡。其核心逻辑不是简单复制文件而是确保影像与标签的空间一致性地理配准检查使用rasterio读取影像和标签的transform属性验证二者affine.Affine矩阵是否完全相同即同一坐标系、相同像素大小、相同左上角坐标尺寸对齐若标签图尺寸小于影像常见于人工标注未覆盖全图则用rasterio.warp.reproject将标签重采样至影像尺寸裁剪为 512×512 子图调用rasterio.windows.Window按步长 256 进行滑动窗口裁剪避免边缘信息丢失# create_dataset.ipynb 片段 for i in range(0, height - 512 1, 256): for j in range(0, width - 512 1, 256): window Window(j, i, 512, 512) img_crop src.read(windowwindow) mask_crop mask_src.read(windowwindow) # 保存为 train/images/xxx.tif 和 train/masks/xxx_mask.tif提示若你的原始影像为 10000×10000此逻辑生成约(10000-512)/256 ≈ 37行 × 37 列 1369 张子图。实际训练时train.py会随机采样无需手动删减。3.2 启动训练train.ipynb与train.py的协作机制项目提供两种启动方式Jupyter Notebook适合调试与命令行脚本适合批量训练。二者均调用同一train.py但入口参数不同train.ipynb中执行%run train.py --epochs 100 --batch-size 4 --lr 0.0001 --load checkpoints/unet_best.pth命令行执行python train.py --epochs 100 --batch-size 4 --lr 0.0001 --load checkpoints/unet_best.pthtrain.py的get_args()函数解析参数后关键流程如下数据集实例化dataset BasicDataset(dir_img, dir_mask, label_map)自动识别images/和masks/目录模型加载若--load存在则model.load_state_dict(torch.load(args.load))否则初始化新 U-Net损失函数选择默认nn.CrossEntropyLoss()但代码预留DiceLoss接口注释掉的from utils import dice_lossCheckpoint 保存每 epoch 结束后若验证 IoU 提升则torch.save(model.state_dict(), checkpoints/unet_best.pth)。3.2.1 TensorBoard 实时监控start_tensorboard.ps1的 PowerShell 脚本细节Windows 用户需运行start_tensorboard.ps1启动日志服务。该脚本本质是 PowerShell 封装# start_tensorboard.ps1 $ErrorActionPreference Stop try { tensorboard --logdirruns --port6006 --bind_all } catch { Write-Host TensorBoard 启动失败请确认已安装pip install tensorboard }启动后访问http://localhost:6006可查看SCALARS标签页Loss/train,Loss/val,IoU/val曲线IMAGES标签页每 10 epoch 保存的input,mask,pred三联图直观判断道路断裂、水体溢出等问题。注意若提示tensorboard : 无法加载文件...需在 PowerShell 中执行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser解除脚本执行限制。3.3 预测与结果导出predict.ipynb中的后处理技巧预测阶段需解决两个遥感特有问题大图拼接与概率阈值校准。predict.ipynb提供完整 pipeline分块预测对 2000×2000 大图按 512×512 滑动窗口预测重叠区域取平均值overlap128CRF 后处理调用pydensecrf对 softmax 输出进行条件随机场优化平滑边缘噪点# predict.ipynb 片段 import pydensecrf.densecrf as dcrf from pydensecrf.utils import unary_from_softmax # pred_softmax shape: (5, H, W) —— 5类概率 d dcrf.DenseCRF2D(H, W, 5) U unary_from_softmax(pred_softmax) d.setUnaryEnergy(U) # 添加双边滤波 pairwise 项 d.addPairwiseGaussian(sxy(3,3), compat3) d.addPairwiseBilateral(sxy(8,8), srgb(13,13,13), rgbimimg, compat10) Q d.inference(10) # 10次迭代 pred_crf np.argmax(Q, axis0).reshape(H, W)GeoTIFF 导出使用rasterio将pred_crf保存为带地理坐标的 TIFF支持 GIS 软件直接加载with rasterio.open( output/prediction.tif, w, driverGTiff, heightH, widthW, count1, dtyperasterio.uint16, crssrc.crs, # 复用原图 CRS transformsrc.transform # 复用原图仿射变换 ) as dst: dst.write(pred_crf.astype(rasterio.uint16), 1)4. 高分毕设的关键验证IoU 计算、混淆矩阵可视化与论文图表复现技巧4.1 验证集 IoU 计算utils.py中eval_metrics的逐类统计逻辑毕业论文第 5 章的定量分析依赖精确的指标计算。utils.py的eval_metrics函数不依赖sklearn.metrics而是手动实现混淆矩阵确保与遥感地物类别严格对应def eval_metrics(pred, mask, n_classes5): # pred: (H, W), mask: (H, W), 值域 0~4 hist np.zeros((n_classes, n_classes)) for l_true, l_pred in zip(mask.flatten(), pred.flatten()): if l_true n_classes and l_pred n_classes: hist[l_true, l_pred] 1 # 计算每类 IoU: TP / (TP FP FN) ious [] for i in range(n_classes): tp hist[i, i] fp hist[:, i].sum() - tp fn hist[i, :].sum() - tp iou tp / (tp fp fn 1e-8) ious.append(iou) return np.array(ious), hist此函数返回ious数组长度 5和hist矩阵可直接用于绘制论文中的 Table 5-2各类 IoU 对比和 Figure 5-3混淆矩阵热力图。4.1.1 混淆矩阵热力图生成适配遥感地物名称的 Matplotlib 配置demo/plot_confusion_matrix.py提供论文图表级可视化import matplotlib.pyplot as plt import seaborn as sns # 地物类别名称按 0~4 顺序 class_names [Water, Building, Road, Farmland, Forest] plt.figure(figsize(8, 6)) sns.heatmap(hist, annotTrue, fmt.0f, cmapBlues, xticklabelsclass_names, yticklabelsclass_names) plt.xlabel(Predicted) plt.ylabel(Ground Truth) plt.title(Confusion Matrix (Validation Set)) plt.savefig(figures/confusion_matrix.pdf, bbox_inchestight)提示若论文要求 EPS 格式矢量图将savefig改为plt.savefig(confusion_matrix.eps, formateps, bbox_inchestight)LaTeX 编译时可无损嵌入。4.2 论文图表复现chap5.tex中的 LaTeX 表格与 TikZ 插图规范项目论文chap5.tex采用标准 IEEE 模板关键技巧在于表格跨页使用longtable宏包避免表格被截断模型结构图Figures/unet_architecture.tikz用 TikZ 手绘非截图确保缩放不失真结果对比图Figures/result_comparison.pdf由predict.ipynb导出包含原始影像、真值掩膜、U-Net 预测、CRF 后处理四栏宽度设为\linewidth自适应。LaTeX 中插入表格的典型代码\begin{longtable}{lcccc} \caption{IoU (\%) comparison on validation set} \\ \hline \textbf{Class} \textbf{Water} \textbf{Building} \textbf{Road} \textbf{Mean} \\ \hline \endfirsthead \multicolumn{5}{c}{{\bfseries \tablename\ \thetable{} -- continued}} \\ \hline \textbf{Class} \textbf{Water} \textbf{Building} \textbf{Road} \textbf{Mean} \\ \hline \endhead \hline \multicolumn{5}{r}{{Continued on next page}} \\ \endfoot \hline \endlastfoot U-Net 89.2 82.5 76.3 82.7 \\ U-NetCRF 91.5 84.8 79.6 85.3 \\ \hline \end{longtable}4.3 毕业答辩加分项如何用start_jupyter.ps1快速演示交互式预测答辩现场常需实时演示模型效果。start_jupyter.ps1封装了 Jupyter 启动命令# start_jupyter.ps1 jupyter notebook --no-browser --port8888 --ip0.0.0.0运行后在浏览器打开http://localhost:8888进入demo/目录执行predict_interactive.ipynb上传任意.tif遥感图支持拖拽滑动条调节CRF的compat参数3~15实时观察道路边缘平滑度变化点击 “Export GeoTIFF” 按钮自动生成带坐标的预测图并下载。此交互能力远超静态 PPT能直观体现工程落地能力是答辩评分中“系统实现”维度的高分保障。本文还有配套的精品资源点击获取