新闻详情

新闻详情

首页 / 资讯中心 / 详情

遥感图像语义分割实战:UNet与DeepLab V3+的PyTorch实现全解析

发布时间:2026/9/1 3:38:33来源:尧图网络
遥感图像语义分割实战:UNet与DeepLab V3+的PyTorch实现全解析
简介本资源是一套面向高校学生与遥感图像处理初学者的完整语义分割实践项目聚焦遥感影像地物识别任务提供基于PyTorch实现的DeepLab V3与U-Net双模型对比方案适用于毕业设计、课程设计及期末大作业等学术场景。压缩包共11个文件8.67MB含4个核心Python脚本train.py、model.py、plot.py、make_data.py、1份详尽的Word文档说明手册、5张遥感样本图像及1张示例原图代码全程中文注释模块划分清晰数据预处理、模型构建、训练可视化与结果评估流程完备。已有334人下载学习项目经实际调试验证可一键部署运行附带典型遥感图像如农田、建筑、水体等多类别标注数据集与训练日志分析逻辑显著降低入门门槛助力快速掌握遥感图像分割的关键技术路径与工程实现细节。 遥感图像语义分割这块近几年真是被问烂了。主要原因在于做遥感项目的人越来越多但多数人一开始接触的是自然图像的分割任务直接迁移过来坑一个比一个深。我今天就把自己踩过的、补过的、优化过的完整思路整理出来从数据准备的痛点开始到UNet和DeepLab V3两个模型的原理差异、代码实现、训练策略、调参心得最后是问题排查尽可能做到可以直接照着跑通。这个项目用的是Python框架是PyTorch完整工程包含源代码、文档说明和数据集适合已经入门深度学习、想系统性做遥感语义分割的开发者参考也适合做毕设或者小型项目落地前先搭一套基线。1. 整体设计思路为什么同时选UNet和DeepLab V3远程遥感图像的语义分割跟普通自然图像分割有个很明显的区别目标尺度差异巨大地物边界往往模糊而且类别分布极度不均衡。道路、建筑物、水体、植被、裸地这些类别在不同分辨率下的表现完全不同。单靠一个模型很难同时满足边界精细度和多尺度语义表达的需求所以我在工程里同时实现了UNet和DeepLab V3让两者形成对比与互补。1.1 从项目目标反推模型选型设计这个项目时我先想清楚了一个问题做遥感图像语义分割到底要解决哪些核心问题小目标漏检建筑物、车辆、小船这类小物体分辨率占比很低容易被下采样过程抹掉边界锯齿道路、耕地边界在预测结果中经常断裂、不平滑这对后续GIS矢量化是灾难类间混淆植被和农田、水体和阴影、裸土和道路在光谱特征上高度相似类别不均衡背景或植被占比非常高而建筑物、水体等占比低导致模型偏向多数学类基于这些问题模型结构上我的选型逻辑很明确UNet通过跳跃连接保留了大量的空间细节信息对小目标和边缘敏感训练速度快显存占用低适合快速迭代DeepLab V3通过ASPP模块空洞空间金字塔池化提取多尺度上下文信息对场景理解更全面在大型地物大面积水体、农田上优势更大训练时我会用同一个数据集和同样的增强策略对两个模型进行对比输出各自的mIoU、F1分数和可视化结果。1.2 为什么数据集如此重要遥感图像的标注成本远高于自然图像。公开数据集里常见的有DeepGlobe土地覆盖数据集、Massachusetts Buildings数据集、ISPRS Potsdam和Vaihingen数据集。这些数据集各有特点有的仅含建筑物有的包含多类别土地覆盖。我提供的工程里内置了一个简化版的多类别遥感分割数据集并写了完整的数据加载器支持直接替换为自己的数据。关键的一点是遥感图像分辨率通常很大4000x4000甚至更高根本不可能直接送入GPU。因此数据预处理流程中我做了裁剪crop和缩放resize两种策略。我的经验是对于UNet裁剪比缩放好因为缩放会扭曲地物的尺寸比例和纹理细节对于DeepLab V3由于ASPP的多尺度设计适度的resize反而能增强对上下文信息的感知。2. 遥感图像语义分割的数据准备与预处理详细拆解数据是整个工程的胜负手。我自己做过一次对比实验同样的模型在未清洗的数据上mIoU只有52%对数据做了针对性处理后直接提升到67%。所以这一节我尽量把细节都说透。2.1 数据集目录结构与标注格式工程中推荐的数据集目录结构如下dataset/ ├── images/ │ ├── train/ │ │ ├── img_001.tif │ │ ├── img_002.tif │ │ └── ... │ ├── val/ │ └── test/ ├── masks/ │ ├── train/ │ │ ├── img_001.png │ │ ├── img_002.png │ │ └── ... │ ├── val/ │ └── test/ └── class_dict.json这里有个非常容易被新手忽略的坑原始图像是遥感影像往往是多波段RGB、近红外、甚至更多波段而标注mask一定是单通道的PNG像素值从0开始递增每个值对应一个类别。千万不要把mask存成彩色图否则后面计算loss时类别数会爆炸。class_dict.json的内容大致是这样{ 0: background, 1: building, 2: water, 3: vegetation, 4: road }2.2 遥感图像的裁剪与滑动窗口策略遥感原始影像动辄上万像素宽直接resize到512x512会丢掉太多细节。我的做法是采用滑窗裁剪sliding window crop同时为了保证训练样本的多样性窗口位置是随机偏移的而不是严格按网格切。import random import numpy as np from PIL import Image def random_crop(image, mask, crop_size(512, 512)): h, w image.shape[:2] ch, cw crop_size if h ch or w cw: raise ValueError(crop size should be smaller than image size) top random.randint(0, h - ch) left random.randint(0, w - cw) img_crop image[top:topch, left:leftcw] mask_crop mask[top:topch, left:leftcw] return img_crop, mask_crop滑窗裁剪还有两个细节值得注意预测阶段使用滑窗推理时窗口之间会有重叠区域最后对重叠区域取平均或者投票能明显减少边界处的拼接伪影。重叠比例我一般设置在1/4到1/3之间。裁剪时不要裁得太碎窗口大小建议覆盖主要地物的平均尺寸2倍以上否则单个样本内可能完全看不到完整目标。2.3 数据增强的实用组合遥感图像增强不能照搬自然图像的套路。比如随机翻转、旋转90度这类几何增强完全可用但色彩抖动要谨慎因为遥感地物的光谱特征本身就很重要大幅扰动色调会导致模型学到的光谱特征失真。我常用的增强组合如下from albumentations import ( HorizontalFlip, VerticalFlip, RandomRotate90, ShiftScaleRotate, RandomBrightnessContrast, Normalize, Compose ) train_transform Compose([ RandomRotate90(p0.5), HorizontalFlip(p0.5), VerticalFlip(p0.5), ShiftScaleRotate(shift_limit0.1, scale_limit0.15, rotate_limit30, p0.5), RandomBrightnessContrast(brightness_limit0.15, contrast_limit0.15, p0.5), Normalize(mean(0.485, 0.456, 0.406), std(0.229, 0.224, 0.225)) ])特别说明一下Normalize的细节。很多人直接使用ImageNet的均值和标准差这在自然图像上没问题但遥感影像的像素分布和自然图像差异很大尤其如果输入是多光谱影像直接沿用这套参数就不合适了。我的做法是先对训练集所有图像的每个波段分别计算均值和标准差然后保存到json里供训练和推理时统一使用。这个操作能稳定带来1到2个百分点的mIoU提升。2.4 类别不平衡的处理不只是加权那么简单遥感分割里类别不平衡是常态。以我的多类别数据集为例背景占了60%以上建筑物只有8%水体只有5%。如果直接训练模型输出几乎全是背景。处理这个问题我用了三层防线第一层给损失函数加上类别权重。权重计算方法有很多种我比较推荐的是中位数频率平衡法而不是简单的反频率。因为简单的反频率会让极少数类权重过大反而造成训练震荡。中位数频率平衡会对权重作截断更稳定。def median_frequency_balancing(class_counts): total np.sum(class_counts) frequencies class_counts / total median_freq np.median(frequencies) weights median_freq / frequencies weights np.clip(weights, 1.0, 10.0) # 防止权重过大 return weights.astype(np.float32)第二层使用Focal Loss。在切割后的512x512块中如果某个类别完全缺失Focal Loss能有效降低易分类样本的贡献把训练重点引导到困难样本上。这个损失函数尤其适合小目标检测。第三层在评估指标上不要只看accuracy必须结合mIoU、F1分数和每类IoU。accuracy在小类失衡情况下毫无意义模型全部预测背景也能到60%以上的accuracy。3. UNet模型实现与训练实战UNet在这几年虽然被很多新模型超越但它在遥感分割、医学分割等小数据集场景下依然是极具性价比的基线选择。它的结构简洁、收敛快、显存占用低而且对细节的保持能力极强。3.1 UNet的核心原理与遥感适配UNet的结构是一个对称的U型左侧编码器逐层下采样提取语义信息右侧解码器逐层上采样恢复分辨率同时通过跳跃连接把编码器的浅层特征拼接到解码器对应层从而恢复空间细节。这正是它适合遥感图像分割的原因遥感地物的边界对空间精度要求很高跳跃连接能保证边缘不会被深层卷积完全抹平。代码实现的核心部分如下import torch import torch.nn as nn class DoubleConv(nn.Module): def __init__(self, in_ch, out_ch): super().__init__() self.conv 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) ) def forward(self, x): return self.conv(x) class UNet(nn.Module): def __init__(self, in_channels3, num_classes5): super().__init__() self.enc1 DoubleConv(in_channels, 64) self.pool1 nn.MaxPool2d(2) self.enc2 DoubleConv(64, 128) self.pool2 nn.MaxPool2d(2) self.enc3 DoubleConv(128, 256) self.pool3 nn.MaxPool2d(2) self.enc4 DoubleConv(256, 512) self.pool4 nn.MaxPool2d(2) self.bottleneck DoubleConv(512, 1024) self.up4 nn.ConvTranspose2d(1024, 512, kernel_size2, stride2) self.dec4 DoubleConv(1024, 512) self.up3 nn.ConvTranspose2d(512, 256, kernel_size2, stride2) self.dec3 DoubleConv(512, 256) self.up2 nn.ConvTranspose2d(256, 128, kernel_size2, stride2) self.dec2 DoubleConv(256, 128) self.up1 nn.ConvTranspose2d(128, 64, kernel_size2, stride2) self.dec1 DoubleConv(128, 64) self.out nn.Conv2d(64, num_classes, 1) def forward(self, x): e1 self.enc1(x) e2 self.enc2(self.pool1(e1)) e3 self.enc3(self.pool2(e2)) e4 self.enc4(self.pool3(e3)) b self.bottleneck(self.pool4(e4)) d4 self.dec4(torch.cat([self.up4(b), e4], dim1)) d3 self.dec3(torch.cat([self.up3(d4), e3], dim1)) d2 self.dec2(torch.cat([self.up2(d3), e2], dim1)) d1 self.dec1(torch.cat([self.up1(d2), e1], dim1)) return self.out(d1)这段代码里我用了BatchNorm但在批大小较小比如2或4时BatchNorm的效果会变差。如果你显存有限、只能用小batch训练可以把BatchNorm换成GroupNorm这在遥感图像分割小batch场景下是我很推荐的一个改进。3.2 UNet训练的核心参数选择输入尺寸方面我建议在512x512和256x256之间选择。如果你的GPU是单张8GB512x512配batch size 4可能就是极限了此时可以降到256x256但要注意分割细节会损失一些。很多改进版的UNet比如使用深度可分离卷积的轻量化UNet也是在这个阶段开始介入的能够显著降低参数量和显存占用。我工程里提供的默认训练参数如下model: unet encoder: None裸UNet不加载预训练骨干 input_size: 512x512 batch_size: 8 optimizer: AdamW base_lr: 1e-4 weight_decay: 1e-4 scheduler: CosineAnnealingLR loss: CrossEntropyLoss带中位数频率权重 epochs: 60使用AdamW而不是Adam是因为AdamW对权重衰减的处理更规范在一些分割任务上泛化性更好。学习率从1e-4起步配合CosineAnnealingLR逐步降低实测收敛比固定学习率快。3.3 UNet训练时的显存优化经验训练遥感图像分割模型最让人头疼的就是显存不够。这里分享几个我常用的省显存技巧使用混合精度训练AMP。PyTorch的torch.cuda.amp自带自动混合精度能在几乎不掉点的情况下把显存占用降低40%左右。我在工程里默认开启了ampTrue。启用gradient checkpointing。以时间换空间对UNet这种编码器解码器结构能把显存占用再降一个量级不过训练速度会下降适合模型较大时的备选方案。不要盲目加大输入尺寸。很多人觉得大图更清晰、效果更好但如果因为显存爆掉被迫调低batch sizeBN层不稳定反而让效果变差。4. DeepLab V3模型实现与训练实战DeepLab系列在语义分割里属于经典中的经典。V3在V3的基础上引入了编码器-解码器结构在保持多尺度上下文提取能力的同时恢复了更精细的空间边界信息。遥感图像中大范围的地物类别比如大型水体、农田连片区域非常依赖上下文信息这正是DeepLab V3的优势场景。4.1 DeepLab V3的ASPP模块深入理解ASPPAtrous Spatial Pyramid Pooling设计了多个不同膨胀率的空洞卷积并行分支用来捕获不同感受野下的上下文特征。遥感图像上的地物尺度差异很大比如一条道路可能只占几个像素但一片森林占据了上千像素。ASPP通过多分支结构在不同尺度上提取特征再concat融合从而让同一个模型同时具备看得细和看得广的能力。核心实现如下class ASPP(nn.Module): def __init__(self, in_channels, out_channels256, rates(6, 12, 18)): super().__init__() self.conv1 nn.Sequential( nn.Conv2d(in_channels, out_channels, 1, biasFalse), nn.BatchNorm2d(out_channels), nn.ReLU(inplaceTrue) ) self.conv2 nn.Sequential( nn.Conv2d(in_channels, out_channels, 3, paddingrates[0], dilationrates[0], biasFalse), nn.BatchNorm2d(out_channels), nn.ReLU(inplaceTrue) ) self.conv3 nn.Sequential( nn.Conv2d(in_channels, out_channels, 3, paddingrates[1], dilationrates[1], biasFalse), nn.BatchNorm2d(out_channels), nn.ReLU(inplaceTrue) ) self.conv4 nn.Sequential( nn.Conv2d(in_channels, out_channels, 3, paddingrates[2], dilationrates[2], biasFalse), nn.BatchNorm2d(out_channels), nn.ReLU(inplaceTrue) ) self.pool nn.Sequential( nn.AdaptiveAvgPool2d(1), nn.Conv2d(in_channels, out_channels, 1, biasFalse), nn.BatchNorm2d(out_channels), nn.ReLU(inplaceTrue) ) def forward(self, x): h, w x.size(2), x.size(3) feat1 self.conv1(x) feat2 self.conv2(x) feat3 self.conv3(x) feat4 self.conv4(x) feat5 nn.functional.interpolate(self.pool(x), size(h, w), modebilinear, align_cornersFalse) return torch.cat([feat1, feat2, feat3, feat4, feat5], dim1)这里特别要注意膨胀率的选择。膨胀率过大会导致空洞卷积的感受野覆盖不到有效区域大量采样点落在padding区域内产生所谓的“网格伪影”。遥感图像分辨率高、地物密集我测试下来rates取(6, 12, 18)在这类数据上表现最稳定。4.2 DeepLab V3的编码器-解码器设计DeepLab V3整体结构可以拆成以下几个部分骨干网络backbone默认采用ResNet101负责提取初步特征图。如果追求推理速度可以换成MobileNetV2或Xception。ASPP模块从骨干网络的最后一层特征图出发在不同膨胀率下并行提取多尺度信息。解码器将ASPP输出的特征图与骨干网络低层特征通常是第2个stage的输出进行concat融合高层语义与低层细节。解码器的实现值得多写两句。很多简化版DeepLab V3实现直接只保留ASPP然后接一个上采样输出结果这其实是原始V3结构并非V3。真正的V3解码器需要把低层特征卷积到256通道和ASPP结果concat后做3x3卷积融合最后再上采样回原图尺寸。这个细节直接决定了边界质量。class Decoder(nn.Module): def __init__(self, low_level_channels, num_classes): super().__init__() self.low_level_conv nn.Sequential( nn.Conv2d(low_level_channels, 48, 1, biasFalse), nn.BatchNorm2d(48), nn.ReLU(inplaceTrue) ) self.fusion nn.Sequential( nn.Conv2d(256 48, 256, 3, padding1, biasFalse), nn.BatchNorm2d(256), nn.ReLU(inplaceTrue), nn.Dropout(0.5), nn.Conv2d(256, num_classes, 1) ) def forward(self, x, low_level_feature): low self.low_level_conv(low_level_feature) x nn.functional.interpolate(x, sizelow.size()[2:], modebilinear, align_cornersFalse) x torch.cat([x, low], dim1) return self.fusion(x)我见过不少人忽略低层特征对齐这一步直接concat不同尺寸的特征图导致维度报错然后在网上搜半天。这里明确一下必须先做interpolate把高层次的低分辨率特征图resize到低层特征图同样的大小再走concat。4.3 DeepLab V3在遥感数据上的训练策略DeepLab V3的参数量比UNet大不少如果从零训练收敛速度会明显慢于UNet而且最终效果不一定更好。我强烈建议使用在ImageNet上预训练的ResNet101作为backbone初始化。在这个工程里我使用torchvision.models.resnet101(pretrainedTrue)来加载骨干网络然后把最后两层的stride改成1并引入空洞卷积以保留更高的特征分辨率。这一步是DeepLab系列的标准操作在工程代码里有体现。训练参数上DeepLab V3我给的配置如下model: deeplabv3plus backbone: resnet101预训练 output_stride: 16 input_size: 512x512 batch_size: 6单张16GB显存 optimizer: SGD momentum: 0.9 base_lr: 0.01 lr_scheduler: polypower0.9 loss: CrossEntropyLoss DiceLoss 组合 epochs: 80这里我对优化器的选择和UNet刻意做了区分。DeepLab系列官方实现大多使用SGD poly学习率策略实际测试下来在大型数据集上确实比Adam类优化器更稳最终精度更高。而在UNet上SGD收敛慢AdamW反而更省心。不同模型搭配不同优化器这个观念很重要别一个优化器走天下。DeepLab V3的loss我使用了CrossEntropyLoss和DiceLoss的组合。DiceLoss对类别不平衡的鲁棒性很好但单独使用容易导致训练不稳定和CE组合起来能互相牵制。实现时可以这样组织class ComboLoss(nn.Module): def __init__(self, ce_weight1.0, dice_weight1.0, num_classes5): super().__init__() self.ce nn.CrossEntropyLoss(weighttorch.tensor([...])) # 中位数频率权重 self.dice_weight dice_weight self.ce_weight ce_weight def forward(self, logits, targets): ce_loss self.ce(logits, targets) preds torch.softmax(logits, dim1) dice_loss 0.0 for cls in range(preds.size(1)): p preds[:, cls].flatten() t (targets cls).float().flatten() intersection (p * t).sum() dice_loss 1 - (2 * intersection 1) / (p.sum() t.sum() 1) dice_loss dice_loss / preds.size(1) return self.ce_weight * ce_loss self.dice_weight * dice_loss5. 训练流程与评估指标完整实现一只脚踩进工程之后你会发现训练流程的搭建比模型本身更能影响最终效果。第5章我把自己在完整跑通多次实验后沉淀出的标准训练管线写清楚顺手把最容易出错的指标计算环节也标记出来。5.1 训练主循环的标准写法训练阶段的代码结构我统一安排成初始化模型和数据加载器创建优化器和scheduler进入epoch循环每个epoch内先训练后验证保存最优模型。训练函数的核心部分如下def train_one_epoch(model, dataloader, optimizer, criterion, device, ampFalse): model.train() total_loss 0.0 scaler torch.cuda.amp.GradScaler(enabledamp) for images, masks in dataloader: images images.to(device) masks masks.to(device) optimizer.zero_grad() with torch.cuda.amp.autocast(enabledamp): outputs model(images) loss criterion(outputs, masks) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() total_loss loss.item() * images.size(0) return total_loss / len(dataloader.dataset)我特别想强调一个很多人会忽略的点mask一定不能以one-hot形式参与交叉熵计算直接在原图上计算即可。PyTorch的CrossEntropyLoss期望target是一个[H, W]的整数张量而不是[H, W, C]的one-hot向量。如果做错了会得到一条非常隐晦的维度错误排查起来非常浪费时间。5.2 评估指标实现与可视化对比评估阶段我计算mIoU、F1分数、每类IoU并保存预测结果可视化图。mIoU是语义分割最核心的指标它的计算方式是先求出每个类别的IoU再对所有类别取平均。IoU本身是交集和并集的比值遥感任务中IoU能直观反映每个类别的分割精度。def compute_iou_per_class(preds, masks, num_classes): ious [] preds preds.argmax(dim1).cpu().numpy() masks masks.cpu().numpy() for cls in range(num_classes): p (preds cls) t (masks cls) intersection (p t).sum() union (p | t).sum() iou intersection / (union 1e-6) if union 0 else 0.0 ious.append(iou) return np.array(ious)训练结束后我会把UNet和DeepLab V3两个模型的结果并排画出来和原始图像叠加对比。这类可视化在调试阶段的价值不亚于指标数字因为你能肉眼看到边界处理不当、小目标丢失等问题往往很容易被mIoU掩盖。6. 常见问题与排查技巧实录我把这个项目从搭环境到跑通的过程中遇到过的各类问题整理成速查表供参考。6.1 环境与数据加载阶段的典型报错先列一个比较高频出现的问题表现象可能原因解决办法训练时RuntimeError: CUDA out of memory输入尺寸过大或batch size设置过高降低batch size开启AMP混合精度或使用gradient checkpointingmask读取出来全是0或者全黑mask使用彩色PNG存储或错误加载为RGB使用PIL打开后转换为L模式并检查像素值是否为类别索引加载图片时shape不匹配遥感影像波段数不是3针对多波段图像手动选择需要的波段组合并保存为RGB预测结果整块区域全部错分为一类类别权重设置不合理或损失函数使用错误检查类别权重尝试组合DiceLoss / Focal Loss图片resize后地物扭曲严重直接resize大尺寸遥感影像到小尺寸改用滑动窗口裁剪或保持原分辨率做推理UNet训练损失不断下降但mIoU不涨数据标注存在噪声或类别数设置有误随机抽几张标注mask可视化检查像素值范围是否包含多余类别这些错误我都真实踩过尤其是mask读取出来全是0新手期困扰了我一个下午后来发现是PIL默认读成了L模式但强制转成了RGB导致所有值被拉伸到了0到255的彩色空间。6.2 训练过程中的稳定性问题与调整方向训练loss震荡不降最常见的原因是学习率过大。UNet我初设1e-4DeepLab V3初设0.01如果你换了自己的数据集这两个值未必还合适。我的判断方法是第一个epoch结束后如果loss和初始值相比变化幅度超过30%基本就是学习率偏大需要降低到1/5继续试。另外遥感分割中经常遇到训练集和验证集分布差异大的情况。因为滑窗裁剪的样本来源于不同的原始影像有的影像整体是城市区域有的整体是农田区域随机划分训练集和验证集很容易造成分布偏移。这种情况下建议按原始影像ID划分数据集而不是按裁剪后的patch划分确保同一张原始影像的patch不会同时出现在训练集和验证集中。6.3 模型改进的几条路线这个项目做完后如果你想冲击更高的精度我还有几个常见但有效的改进方向在UNet中引入注意力模块比如CBAM或SE模块能对通道维度的特征重新加权。遥感地物类别多不同类别在通道维度上的注意力确实不同这个改进能提升2到3个点。把UNet的普通卷积替换为深度可分离卷积参数数量大幅减少的同时精度几乎不掉还能有效提升推理速度适合部署到边缘设备。DeepLab V3使用更大的backboneResNet152能提点但收益逐渐递减而且训练时间成倍增加除非你的算力非常充裕否则不推荐。在推理阶段使用多尺度预测multi-scale inference和CRF后处理能进一步平滑边界。前者我在工程里已内置支持后者需要额外安装pydensecrf效果对小目标类别的稳定性有一定帮助。另外很多朋友问过是否应该直接换用新的分割大模型比如SAM系列。我的看法是SAM在标签生成和预标注阶段非常好用可以辅助制作数据集但在遥感分割这类多类别、边界复杂、类别不均衡的任务上直接端到端微调的代价还比较大不如先用UNet和DeepLab V3这类成熟模型把基线打牢再考虑扩散到大模型迭代。结尾最后分享一点我做这个项目时最深的体会语义分割模型本身没有任何神秘感真正的壁垒在数据细节和训练策略上。UNet和DeepLab V3的代码网上随便就能搜到但能把数据预处理做对、类别权重算准、学习率调稳、评估指标看明白的人结果就是和别人拉开差距。我自己从第一次跑通到最终在验证集拿到满意的mIoU中间踩过的坑、翻过的车基本都在前文写清楚了。希望这篇文章能帮你把这个项目从跑通到真正用好。如果你在自己数据集上尝试遇到问题建议先从可视化标注mask开始排查数据没问题模型多半就稳了。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

本地部署大语言模型:多轮对话、上下文记忆与API接入全攻略 2026/9/1 4:20:42

本地部署大语言模型:多轮对话、上下文记忆与API接入全攻略

玉伯聊 AI 的时候,聊到一个现象:和真正有智慧的模型对话,是会上瘾的。这不是玄学,而是大语言模型的能力密度到了一个临界点——它不再只是回复标准答案,而是能理解上下文、顺着你的思路往下走、甚至主动追问你“然后呢…

阅读更多 →
AI Co-Scientist升级:多智能体驱动的实验室集成研究伙伴解析 2026/9/1 4:20:42

AI Co-Scientist升级:多智能体驱动的实验室集成研究伙伴解析

深度解析:Google DeepMind Co-Scientist 如何演变为实验室集成研究伙伴这段时间 AI 圈的重磅消息一个接一个,但真正让我觉得“科研范式要被改写了”的,还是 Google DeepMind 对 AI Co-Scientist 的这次升级。项目初始版本发布时,大…

阅读更多 →
Apache Ozone S3生命周期配置详解:自动过期删除与存储类型转换 2026/9/1 4:20:42

Apache Ozone S3生命周期配置详解:自动过期删除与存储类型转换

Apache Ozone 的 S3 生命周期配置,最值得先看的能力不是“能不能给桶写规则”,而是它把文件自动过期、删除、存储类型转换这三件事统一放到了桶级别策略里。做分布式存储运维的人很容易碰到同一个问题:集群里每天产生临时文件、过期日志、离线…

阅读更多 →
卫宁PACS阅片器深度解析:从DICOM协议到三维重建与部署实战 2026/9/1 4:20:42

卫宁PACS阅片器深度解析:从DICOM协议到三维重建与部署实战

简介:卫宁PACS阅片器是一套面向医学影像阅片场景的客户端软件资源,适合医疗信息化实施人员、PACS运维工程师以及医学影像客户端开发者,用于研究阅片器功能结构或开展二次开发。压缩包共包含524个文件,整体约120.2MB,文…

阅读更多 →
双变频风冷无霜冰箱怎么选?以尊贵BCD-219WB219为例拆解嵌入式安装要点 2026/9/1 4:20:42

双变频风冷无霜冰箱怎么选?以尊贵BCD-219WB219为例拆解嵌入式安装要点

如果你正在研究小户型厨房的冰箱方案,或者准备把冰箱嵌入到定制橱柜里,大概率会看到这样一台产品:外观是星空银、玻璃门,容量不算夸张,走的是小型双门路线,但重点标注了“双变频”“风冷无霜”“嵌入式厨房…

阅读更多 →
零嵌双系统+细胞级保鲜:高端冰箱选购与安装技术指南 2026/9/1 4:17:41

零嵌双系统+细胞级保鲜:高端冰箱选购与安装技术指南

上个月帮朋友选冰箱,他开口第一句就是:容量要大,最好能嵌进橱柜。我问了一句:你上一台冰箱最让你头疼的是什么?他想了半天,说冷冻室总有一股说不清的味道,放进去的白菜没几天就蔫了。问题一下就…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞