首页/新闻资讯/正文详情

遥感语义分割实战:SegNet与UNet双模型毕设源码解析

发布时间:2026/9/28 2:11:17 来源:云帆数科 栏目:资讯中心
遥感语义分割实战:SegNet与UNet双模型毕设源码解析
简介这份资源面向计算机、人工智能、遥感等方向的在校学生与教师提供基于Segnet与Unet两种深度学习算法实现遥感图像语义分割的完整项目源码可用于毕业设计、课程大作业或项目立项演示。压缩包共15个文件以11个Python脚本为主涵盖Segnet与Unet网络定义、训练主函数、推理预测脚本及数据预处理模块另含3张png效果图与1份项目说明md文档整体约190KB结构清晰便于按模块查阅。项目配套数据增强脚本可对大图进行256×256切割、旋转与加噪处理并附有数据集下载地址与已处理数据网盘链接同时给出Windows10、Anaconda3、PyTorch1.0及TensorBoard可视化环境下的运行方式。目前已有376人学习浏览适合希望快速上手遥感图像分割、对比两种经典网络结构并在此基础上扩展创新的读者参考借鉴。1. 遥感语义分割双模型实战SegNet 与 UNet 这套毕设源码能跑出什么遥感图像语义分割这件事真正上手做过的都知道难的不是把 UNet 的编码器-解码器结构背下来而是拿到一份能直接跑通的工程代码。我见过太多人卡在数据格式对不上、标签图是彩色还是灰度、训练时 loss 不降这些环节上。这套资源给的是一个完整的遥感图像语义分割项目包含 SegNet 和 UNet 两个模型的独立训练入口、数据增强脚本、预测脚本以及配套数据集说明环境是 Windows 10 Anaconda 3 PyTorch 1.0用 tensorboardX 做训练可视化。适合正在做毕设、课程大作业或者想拿一个真实遥感分割项目练手的人。它解决的核心问题是你不用从零搭数据管线直接改路径就能跑训练两个模型还能横向对比效果。2. 工程结构拆解从 train_Seg.py 到 dataset.py 的数据流2.1 两个训练入口的设计逻辑拿到压缩包解压后根目录下有两个训练主函数train_Seg.py和train_U.py。这种设计的好处是 SegNet 和 UNet 各自独立互不干扰你想跑哪个直接执行对应脚本就行。我一般会先看训练脚本里的参数配置区因为学习率、batch size、epoch 这些直接影响你能不能跑出结果。# train_Seg.py 典型结构基于项目实际文件推断 import torch import torch.nn as nn from models.seg_net import SegNet from data_loader.dataset import RemoteSensingDataset from torch.utils.data import DataLoader # 超参数配置区——这里是你第一个要改的地方 BATCH_SIZE 4 # 显存不够就降到 2 LR 1e-3 # 遥感数据通常从 1e-3 或 1e-4 起步 EPOCHS 100 NUM_CLASSES 2 # 根据你的标签类别数改 device torch.device(cuda if torch.cuda.is_available() else cpu) # 数据集加载 train_dataset RemoteSensingDataset(root_dir./data/train) train_loader DataLoader(train_dataset, batch_sizeBATCH_SIZE, shuffleTrue) # 模型实例化 model SegNet(num_classesNUM_CLASSES).to(device) criterion nn.CrossEntropyLoss() optimizer torch.optim.Adam(model.parameters(), lrLR) for epoch in range(EPOCHS): model.train() for imgs, labels in train_loader: imgs, labels imgs.to(device), labels.to(device) optimizer.zero_grad() outputs model(imgs) loss criterion(outputs, labels) loss.backward() optimizer.step()这段代码里几个关键点NUM_CLASSES必须和你标签图的类别数一致遥感分割常见的是二分类建筑/非建筑或多分类道路、植被、水体等BATCH_SIZE设 4 是因为遥感图像切割成 256×256 后显存占用不算大但如果你显卡只有 4GB建议降到 2LR用 1e-3 是 Adam 的常规起点如果 loss 震荡厉害就降到 1e-4。train_U.py的结构几乎一样只是把模型换成了models/u_net.py里的 UNet。两个脚本分开写的好处是你改一个不会影响另一个方便做对比实验。2.2 数据加载与增强管线data_loader/dataset.py负责把图像和标签读进来utils/DataArgument.py负责数据增强。这两个文件是整个项目能不能跑通的关键。# utils/DataArgument.py 核心逻辑基于项目说明还原 from PIL import Image import numpy as np import os import random def crop_image(img, label, crop_size256): 将大图切割成 256x256 的小图 w, h img.size patches [] for i in range(0, w - crop_size 1, crop_size): for j in range(0, h - crop_size 1, crop_size): img_patch img.crop((i, j, i crop_size, j crop_size)) label_patch label.crop((i, j, i crop_size, j crop_size)) patches.append((img_patch, label_patch)) return patches def augment(img, label): 旋转 加噪 # 随机旋转 90/180/270 度 angle random.choice([0, 90, 180, 270]) img img.rotate(angle) label label.rotate(angle) # 加高斯噪声 img_array np.array(img).astype(np.float32) noise np.random.normal(0, 5, img_array.shape) img_array np.clip(img_array noise, 0, 255).astype(np.uint8) return Image.fromarray(img_array), labelcrop_image函数把原始遥感大图切成 256×256 的 patch这是遥感分割的标准做法因为原图动辄几千像素直接送进网络不现实。augment函数做了旋转和高斯噪声旋转角度只选了 90 的倍数这是为了避免插值带来的标签错位——如果你用任意角度旋转标签图的像素值会被插值成非整数导致类别混乱。噪声标准差设 5 是个保守值加太多会让图像失真。运行数据增强的命令cd utils python DataArgument.py执行前确认DataArgument.py里的输入路径指向你下载的原始数据集输出路径指向你希望保存切割后数据的目录。项目说明里提到相对路径已在代码中配置但实际使用时建议还是打开文件确认一下路径变量。2.3 模型定义文件的关键参数models/seg_net.py和models/u_net.py分别定义了 SegNet 和 UNet。SegNet 的核心是编码器用 VGG16 的前 13 层解码器用最大池化索引做上采样UNet 的核心是编码器-解码器之间的跳跃连接。这两个模型在遥感分割里都是经典 baselineSegNet 参数量更小、推理更快UNet 对小目标的分割精度通常更好。# models/u_net.py 典型结构 import torch.nn as nn class UNet(nn.Module): def __init__(self, num_classes2): super(UNet, self).__init__() # 编码器四次下采样 self.enc1 self._block(3, 64) self.enc2 self._block(64, 128) self.enc3 self._block(128, 256) self.enc4 self._block(256, 512) # 瓶颈层 self.bottleneck self._block(512, 1024) # 解码器四次上采样 跳跃连接 self.up4 nn.ConvTranspose2d(1024, 512, 2, stride2) self.dec4 self._block(1024, 512) # ... 后续层省略 self.final nn.Conv2d(64, num_classes, 1) def _block(self, in_ch, out_ch): return nn.Sequential( nn.Conv2d(in_ch, out_ch, 3, padding1), nn.BatchNorm2d(out_ch), nn.ReLU(inplaceTrue), nn.Conv2d(out_ch, out_ch, 3, padding1), nn.BatchNorm2d(out_ch), nn.ReLU(inplaceTrue) )num_classes默认是 2对应二分类任务。如果你的数据集有更多类别改这个参数就行。_block里用了 BatchNorm这在遥感数据上很重要因为遥感图像的光照和对比度差异大BN 能加速收敛。3. 训练与推理全流程从 python train_Seg.py 到 predict.py 出图3.1 环境配置与依赖安装项目说明里给的环境是 Windows 10 Anaconda 3 PyTorch 1.0。PyTorch 1.0 是比较老的版本如果你现在装新版本比如 1.13 或 2.x大部分代码能兼容但有几个地方要注意nn.ConvTranspose2d的参数没变DataLoader的用法也没变但如果你用了torchvision.transforms里的新 API可能需要微调。# 创建 conda 环境 conda create -n remote_seg python3.7 conda activate remote_seg # 安装 PyTorch根据你的 CUDA 版本选择 pip install torch1.0.0 torchvision0.2.1 # 如果装不上老版本用新版本也行 pip install torch torchvision # 安装可视化和图像处理依赖 pip install tensorboard tensorboardX pillow numpy matplotlibtensorboardX是用来写训练日志的配合tensorboard可以在浏览器里看 loss 曲线和分割效果图。如果你不用可视化这两个可以不装但建议装上因为训练过程中看 loss 曲线是判断模型有没有学到的第一手依据。3.2 训练 SegNet 和 UNet训练命令很简单# 训练 SegNet python train_Seg.py # 训练 UNet python train_U.py但直接跑之前建议先检查三个地方第一data_loader/dataset.py里的数据路径是否指向你切割好的数据目录第二train_Seg.py里的NUM_CLASSES是否和你的标签类别数一致第三确认 GPU 可用如果torch.cuda.is_available()返回 False代码会自动用 CPU但训练速度会慢很多。训练过程中终端会打印每个 epoch 的 loss。正常情况下loss 应该在前几个 epoch 快速下降然后逐渐趋于平稳。如果 loss 一直不降或者变成 NaN常见原因是学习率太大或者数据标签有问题。# 在训练循环里加一段简单的日志打印 if epoch % 10 0: print(fEpoch [{epoch}/{EPOCHS}], Loss: {loss.item():.4f}) # 保存模型检查点 torch.save(model.state_dict(), fcheckpoints/segnet_epoch{epoch}.pth)每 10 个 epoch 保存一次模型是个好习惯万一训练中途崩了不用从头再来。保存的.pth文件就是后面推理要用的权重。3.3 用 predict.py 做推理训练完成后predict.py负责加载模型权重并对新图像做预测。# predict.py 核心逻辑 import torch from PIL import Image import numpy as np from models.seg_net import SegNet # 加载模型 model SegNet(num_classes2) model.load_state_dict(torch.load(checkpoints/segnet_final.pth)) model.eval() # 读取待预测图像 img Image.open(test_image.png).convert(RGB) img_tensor torch.from_numpy(np.array(img)).permute(2, 0, 1).float().unsqueeze(0) / 255.0 # 推理 with torch.no_grad(): output model(img_tensor) pred torch.argmax(output, dim1).squeeze().numpy() # 保存预测结果 pred_img Image.fromarray((pred * 255).astype(np.uint8)) pred_img.save(prediction_result.png)model.eval()这行必须加它会把 BatchNorm 和 Dropout 切换到推理模式否则预测结果会不稳定。torch.no_grad()是关闭梯度计算节省显存。argmax取每个像素最大概率对应的类别得到分割掩码。推理时常见的坑是输入图像的尺寸和训练时不一致。训练用的是 256×256 的 patch推理时如果输入一张 1000×1000 的大图模型可能能跑但结果会很奇怪。建议推理前也把图像切成 256×256 的 patch预测完再拼回去。4. 避坑与排查数据标签、显存和 loss 不降的常见问题4.1 标签图是彩色导致 loss 不降现象训练时 loss 一直在 0.69 附近震荡二分类的随机猜测值完全不下降。原因遥感数据集的标签图经常是彩色的比如建筑是红色、背景是黑色但CrossEntropyLoss要求标签是 0、1、2 这样的类别索引不是 RGB 值。解决在dataset.py的__getitem__里把标签图转成灰度或直接映射到类别索引。# 在 dataset.py 中处理标签 label Image.open(label_path) label np.array(label) # 如果是彩色标签做颜色到类别的映射 if len(label.shape) 3: # 假设红色(255,0,0)是类别1黑色(0,0,0)是类别0 label ((label[:, :, 0] 128) (label[:, :, 1] 128)).astype(np.uint8)4.2 显存不足导致训练中断现象跑几个 batch 后报CUDA out of memory。原因BATCH_SIZE设太大或者模型参数量超出显卡容量。解决把BATCH_SIZE从 4 降到 2 甚至 1或者在训练脚本里加torch.cuda.empty_cache()。如果还不行考虑用更小的输入尺寸比如 128×128但要注意 UNet 的下采样次数是固定的输入太小会导致维度不匹配。4.3 数据增强后图像和标签不对应现象训练出来的模型预测结果完全乱套分割掩码和原图对不上。原因DataArgument.py里对图像做了旋转但标签图没有同步旋转或者旋转时用了不同的插值方式。解决确保图像和标签用同样的变换参数。在augment函数里旋转角度、裁剪坐标这些必须对图像和标签同时应用。如果用了torchvision.transforms可以用JointTransform或者手动同步。4.4 训练 loss 震荡太大现象loss 一会儿高一会儿低没有稳定的下降趋势。原因学习率太大或者 batch size 太小导致梯度估计方差大。解决把学习率从 1e-3 降到 1e-4或者加学习率衰减策略。# 加一个简单的学习率衰减 scheduler torch.optim.lr_scheduler.StepLR(optimizer, step_size30, gamma0.1) # 在每个 epoch 结束后调用 scheduler.step()4.5 推理结果全黑或全白现象predict.py输出的分割图要么全黑要么全白没有任何细节。原因模型权重没加载成功或者输入图像的归一化方式和训练时不一致。解决检查load_state_dict是否报错确认输入图像的像素值范围是 0-255 还是 0-1。训练时如果用了/255.0归一化推理时也要做同样的处理。5. 模型对比与调优SegNet 和 UNet 在遥感数据上的选择策略5.1 两个模型的性能差异跑完两个模型后你大概率会发现 UNet 的精度比 SegNet 高一点但 SegNet 的推理速度更快。这不是玄学是结构决定的UNet 的跳跃连接把编码器的高分辨率特征直接传到解码器保留了更多空间细节对小目标比如细窄的道路分割更好SegNet 用池化索引做上采样参数量少但细节恢复能力弱一些。对比维度SegNetUNet参数量约 29M约 31M推理速度较快稍慢小目标分割一般较好训练显存占用较低稍高适合场景实时性要求高、类别少精度要求高、多类别如果你的毕设要求是「跑通就行」SegNet 足够如果要求「精度尽可能高」UNet 更合适。两个都跑一遍做对比论文里还能多写一章实验分析。5.2 提升分割精度的几个实用技巧第一个技巧是加数据增强的多样性。项目自带的DataArgument.py只做了旋转和高斯噪声你可以加上随机裁剪、亮度对比度调整、水平翻转。遥感图像对水平翻转不敏感不像文字所以翻转是安全的增强方式。# 扩展 DataArgument.py 的增强函数 def augment_v2(img, label): # 随机水平翻转 if random.random() 0.5: img img.transpose(Image.FLIP_LEFT_RIGHT) label label.transpose(Image.FLIP_LEFT_RIGHT) # 随机亮度调整 if random.random() 0.5: enhancer ImageEnhance.Brightness(img) img enhancer.enhance(random.uniform(0.8, 1.2)) return img, label第二个技巧是用预训练权重初始化编码器。SegNet 的编码器是 VGG16UNet 的编码器可以换成 ResNet34用 ImageNet 预训练权重能显著加快收敛。不过项目里没有提供预训练加载的代码需要自己加。# 加载 VGG16 预训练权重到 SegNet 编码器示例 import torchvision.models as models vgg16 models.vgg16(pretrainedTrue) # 把 vgg16.features 的前几层权重拷贝到 segnet 的编码器第三个技巧是调整损失函数。CrossEntropyLoss在类别不平衡时效果不好遥感数据里背景像素通常远多于目标像素可以换成 Dice Loss 或者带权重的 CrossEntropy。# 带权重的 CrossEntropyLoss weights torch.tensor([0.3, 0.7]) # 背景权重低目标权重高 criterion nn.CrossEntropyLoss(weightweights)5.3 验证模型是否真的学到了训练 loss 下降不代表模型学到了有用的特征。我一般会做两件事验证第一用predict.py跑几张训练集里的图看分割结果是否合理第二在验证集上算 IoU交并比。# 简单的 IoU 计算 def compute_iou(pred, label, num_classes2): ious [] for cls in range(num_classes): pred_cls (pred cls) label_cls (label cls) intersection (pred_cls label_cls).sum() union (pred_cls | label_cls).sum() if union 0: ious.append(float(nan)) else: ious.append(intersection / union) return np.nanmean(ious)IoU 低于 0.5 说明模型基本没学到东西需要检查数据标签和训练配置IoU 在 0.6-0.7 之间是正常水平如果能到 0.8 以上说明模型和数据处理都做得不错。从那以后我每次拿到一个新的分割项目都会先跑一遍数据增强脚本用predict.py可视化几张训练样本确认图像和标签是对应的再开始训练。这个习惯帮我省了很多来回排查的时间。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

基于SVM支持向量机的降水量预测模型:从原理到调参避坑实战
基于SVM支持向量机的降水量预测模型:从原理到调参避坑实战

简介:这份资源是面向气象预测与机器学习入门者的SVM降水量预测模型代码包,聚焦如何用支持向量机完成降雨量回归建模。压缩包共54个文件,约292KB,以m脚本、c源码、mat数据、mexw32与obj编译文件为主,辅以txt说明、h头文… · 2026/9/28 2:11:17

Ubuntu下创芯科技CAN分析仪驱动安装与调试实战
Ubuntu下创芯科技CAN分析仪驱动安装与调试实战

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

DDR5 2N模式与1N模式详解:原理、切换与实战验证
DDR5 2N模式与1N模式详解:原理、切换与实战验证

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

Python搭建QQ聊天机器人极简教程
Python搭建QQ聊天机器人极简教程

随着QQ粉丝群管理需求的不断增长,简单的群管工具难以满足复杂的信息响应和自动化需求。现有的自动回复机器人虽然功能强大,但其高昂的年费成为不少用户的顾虑。因此,通过搭建一个自定义机器人来实现自动回复,成为解决这一问题的有效途径。 基于此需求,本文介绍了使用go-c… · 2026/9/28 2:14:08

Python整理百度云盘文件大量重复无用文件
Python整理百度云盘文件大量重复无用文件

百度云盘容量有限,当文件数量逐渐增多,空间很容易被填满。删除重复文件可以帮助释放大量空间。通过获取云盘缓存目录并使用Python脚本来整理数据,可以高效识别重复文件并避免手动操作的繁琐。 此方法基于 sqlite3 和 pandas 进行数据处理,简单快捷。 文章目录 云盘数据整理… · 2026/9/28 2:14:07

Python实现将图片转化为具有视觉震撼效果的字符图
Python实现将图片转化为具有视觉震撼效果的字符图

字符画是一种将图片转化为字符的艺术表现形式,它通过字符的密度和排列来模拟图片的色彩和形状效果。这种技术不仅在视觉上充满了创造力,还在文字处理领域展示了字符的丰富表现力。通过Python,可以将图片转换为字符画,生成具有视觉冲击力的字符艺术。 本文将通过具体步骤和… · 2026/9/28 2:13:48

Python实现将目录下的图片合并成PDF文件
Python实现将目录下的图片合并成PDF文件

在图像处理和文档管理中,经常需要将一系列图片文件合并为PDF格式,以便于传输、存档和阅读。Python凭借其丰富的第三方库,为图像处理和PDF操作提供了便捷的解决方案。 本文将详细介绍如何通过Python脚本,将目录中的所有图片合并为一个PDF文件,内容包括从基础环境配置到代码… · 2026/9/28 2:13:48

Python实现文件移动到指定文件夹
Python实现文件移动到指定文件夹

在编程过程中,经常需要对文件进行整理和管理,将不同类型的文件分类存放在指定文件夹中。Python提供了强大的文件操作模块,使得文件的移动操作变得简单高效。这篇教程将详细讲解如何使用Python实现将文件移动到指定文件夹的功能,帮助理解并掌握文件操作的基本方法和常见应用… · 2026/9/28 2:13:47

【PyQt】PyQT6制作一个Django项目启动器
【PyQt】PyQT6制作一个Django项目启动器

在现代的桌面和Web应用开发中,Python以其简单高效的特点获得了广泛的应用。通过集成PyQt和Django框架,将桌面应用的便捷操作与Django项目的后端处理相结合,不仅能够提升用户体验,更能显著提高开发的便利性和效率。 本文将聚焦于如何构建一个基于PyQt的Django项目启动器,实… · 2026/9/28 2:13:40

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

制作网页比较方便的软件怎么选?一文搞懂避坑指南
制作网页比较方便的软件怎么选?一文搞懂避坑指南

制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码