基于深度学习的多光谱图像语义分割 —— 从原理到实践(第六节·完结篇)

经过前五节,我们完成了数据准备、分块处理、模型推理、应用分析以及网络训练。
最后一节,我们将对训练好的模型进行量化评估,用客观指标衡量它的分割性能。
同时,我们会回顾整个流程,给出总结和扩展建议。


在这里插入图片描述

6. 模型评估与性能分析

6.1 为什么需要评估?

训练完成后,我们需要回答几个关键问题:

  • 模型在未见过的数据上表现如何?
  • 哪些类别分割得更好?哪些容易混淆?
  • 模型是否达到了实际应用所需的精度?

定量评估不仅帮助我们判断模型优劣,还能指导后续调优(如调整网络结构、数据增强策略、损失权重等)。

6.2 评估流程概览

我们将验证集图像输入训练好的网络,得到预测分割图,然后与真实标签(labelsVal)进行逐像素比较,计算出多个指标。主要步骤如下:

  1. 对验证集图像进行分块推理(与测试相同)。
  2. 拼接预测结果,并应用掩膜。
  3. 使用 evaluateSemanticSegmentation 函数自动计算全局准确率、类别准确率、IoU 等。
  4. 输出和解读评估结果。

6.3 对验证集执行分块分割

验证集图像尺寸 8833×6918,同样采用分块推理,块大小与测试时一致(1024×1024):

patchSize = [1024 1024];
bimVal = blockedImage(val_data(:,:,1:6), BlockSize=patchSize);

bimSeg = apply(bimVal, @(bs) semanticseg(bs.Data, net, Outputtype="uint8"), ...
    PadPartialBlocks=true, PadMethod=0);

segmentedImage = gather(bimSeg);

应用掩膜(验证集掩膜 maskVal):

maskVal = val_data(:,:,7);
segmentedImage = segmentedImage .* uint8(maskVal ~= 0);

然后将预测结果保存为 PNG 文件(与真实标签格式一致):

imwrite(segmentedImage, "results.png");

6.4 加载真实标签与预测结果

真实标签 labelsVal 我们已在第二节保存为 gtruth.png。使用 pixelLabelDatastore 分别加载预测和真实标签,并指定类别名称和 ID:

classNames = ["NotVegetation", "Vegetation"];
pixelLabelIDs = [1 2];
pxdsResults = pixelLabelDatastore("results.png", classNames, pixelLabelIDs);
pxdsTruth = pixelLabelDatastore("gtruth.png", classNames, pixelLabelIDs);

6.5 计算语义分割指标

使用 evaluateSemanticSegmentation 函数一键计算多项指标:

ssm = evaluateSemanticSegmentation(pxdsResults, pxdsTruth);

输出示例:

Evaluating semantic segmentation results
----------------------------------------
* Selected metrics: global accuracy, class accuracy, IoU, weighted IoU, BF score.
* Processed 1 images.
* Finalizing... Done.
* Data set metrics:

    GlobalAccuracy    MeanAccuracy    MeanIoU    WeightedIoU    MeanBFScore
    ______________    ____________    _______    ___________    ___________
        0.9694           0.9704       0.9406       0.94064        0.79474  

6.6 各项指标解读

指标 值(示例) 含义
GlobalAccuracy 0.9694 所有像素中正确分类的比例,整体准确率 96.94%,非常不错。
MeanAccuracy 0.9704 每一类准确率的平均值,不受类别不均衡影响。
MeanIoU 0.9406 平均交并比(Intersection over Union),是语义分割最常用的指标之一。它计算每个类别的预测区域与真实区域的重叠程度,平均后得到。0.94 表示预测与真实重叠度很高。
WeightedIoU 0.94064 按类别像素数加权后的 IoU,反映了整体重叠程度。
MeanBFScore 0.7947 边界 F1 分数,评估分割边界的完整性。数值低于前几项,说明边界处仍有改进空间。

这些指标表明,U‑Net 在多光谱数据上表现优异,能够可靠地用于植被/非植被分类。

6.7 进一步分析(可选)

如果你需要更细粒度的信息,可以查看每个类别的 IoU 和准确率:

% 显示每个类别的 IoU
disp(ssm.Metrics.IoU)

或者绘制混淆矩阵:

cm = confusionmat(pxdsTruth, pxdsResults);
% 可进一步可视化

这有助于发现哪些类别容易被误分,从而调整模型或训练策略。

6.8 模型保存与部署建议

评估满意后,你的模型可以用于实际生产环境。MATLAB 支持:

  • dlnetwork 导出为 ONNX 格式,用于跨平台部署。
  • 使用 GPU Coder 生成 CUDA 代码,实现高性能推理。
  • 集成到 App Designer 或 Web 应用中,提供在线分割服务。

6.9 本节完整代码

以下是验证评估的完整代码段:

% 1. 验证集分块推理
patchSize = [1024 1024];
bimVal = blockedImage(val_data(:,:,1:6), BlockSize=patchSize);
bimSeg = apply(bimVal, @(bs) semanticseg(bs.Data, net, Outputtype="uint8"), ...
    PadPartialBlocks=true, PadMethod=0);
segmentedImage = gather(bimSeg);

% 2. 应用掩膜
maskVal = val_data(:,:,7);
segmentedImage = segmentedImage .* uint8(maskVal ~= 0);

% 3. 保存预测结果
imwrite(segmentedImage, "results.png");

% 4. 加载真实标签和预测标签
classNames = ["NotVegetation", "Vegetation"];
pixelLabelIDs = [1 2];
pxdsResults = pixelLabelDatastore("results.png", classNames, pixelLabelIDs);
pxdsTruth = pixelLabelDatastore("gtruth.png", classNames, pixelLabelIDs);

% 5. 评估
ssm = evaluateSemanticSegmentation(pxdsResults, pxdsTruth);
disp(ssm.Metrics);

7. 全文总结与拓展方向

7.1 系列回顾

本系列博客从零开始,系统讲解了如何使用 MATLAB 和 U‑Net 对多光谱遥感图像进行语义分割。我们走过了以下环节:

  1. 基础认知:语义分割的任务定义、多光谱数据的优势、U‑Net 的原理。
  2. 数据准备:下载预训练模型和数据集,维度转换,多通道可视化,标签二分类。
  3. 分块策略:利用 blockedImageblockedImageDatastore 处理超大图像,构建训练数据流水线。
  4. 模型推理:对测试图像进行分块预测、去噪、叠加可视化,并计算植被覆盖率。
  5. 模型训练:自定义损失函数,设置超参数,从头训练 U‑Net(可选)。
  6. 性能评估:使用多种指标量化模型精度,验证其实际应用价值。

7.2 拓展建议

如果你希望进一步提升模型能力或拓展应用场景,可以考虑以下方向:

  • 多类别分割:将二分类扩展为原始 18 类,实现更精细的地物分类。
  • 更先进的主干网络:尝试 DeepLabv3+、Swin Transformer 等,结合注意力机制提升边界精度。
  • 数据增强:在线随机旋转、翻转、色彩抖动、弹性变形等,增强泛化性。
  • 时间序列分析:利用多时相影像监测植被变化,预测生态趋势。
  • 轻量化部署:使用 MobileNet、EfficientNet 等轻量级编码器,适配边缘设备。

7.3 资源与参考资料

  • MATLAB 官方文档:Semantic Segmentation Using Deep Learning
  • 原论文:Ronneberger et al., “U‑Net: Convolutional Networks for Biomedical Image Segmentation”
  • 数据集:Kemker et al., “High‑Resolution Multispectral Dataset for Semantic Segmentation”

8. 致谢与结语

感谢你跟随本系列教程,从原理到实践完整走了一遍多光谱图像语义分割的全流程。希望这些内容能够帮助你在自己的研究或项目中快速落地。如有任何疑问或建议,欢迎在评论区交流讨论。

深度学习与遥感结合的前景广阔,让我们共同探索更多可能!


本系列博客完

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐