最近我完整复现了一套用于红树林分割的深度学习实验流程,并最终得到了当前实验条件下的最佳结果。整个过程从数据整理、模型训练、checkpoint 筛选,到后处理与 TTA(Test Time Augmentation)优化,基本走完了一次完整的遥感语义分割实验闭环。
这篇文章会尽量以"从 0 到 1"的方式,把整个实验过程梳理清楚,适合刚接触遥感分割、UNet、SwinIR 或 AutoDL 训练的新手参考。
一、项目整体结构
虽然项目目录名叫:
Pytorch-UNet-master
但最终真正使用的模型,其实并不是原始 U-Net。
本次实验的核心模型是:
SwinIR-Denoise-UNet
整体思路可以概括为:
部分输入通道
↓
SwinIR 风格模块进行去噪增强
↓
与原始输入 concat 融合
↓
送入 U-Net 完成二分类分割
也就是说:
- SwinIR 模块负责特征增强与去噪
- U-Net 负责最终的语义分割
- 中间通过 concat 融合增强特征与原始输入
这套结构本质上属于:
Transformer + CNN 混合分割框架
相比原始 U-Net,对噪声和复杂纹理区域会更友好。
二、实验数据集
本实验使用的是:
Sentinel-1 + Sentinel-2 融合数据
总输入通道数为:
6 通道
数据目录结构如下:
训练集
data/imgs/train/6
data/masks/train
其中:
imgs/train/6:6 通道遥感图像masks/train:红树林标签 mask
测试集
测试集被划分为了三个区间:
data/imgs/test/6/20-30
data/imgs/test/6/50-60
data/imgs/test/6/80-90
分别用于评估不同场景下模型泛化能力。
三、训练配置
训练过程中,模型权重保存在:
checkpoints/6_swinirdenoise2_concat_unet_w8_lr5e5_b4
这个目录名其实已经包含了整个实验的核心配置。
目录名含义解析
1. 6
表示:
输入为 6 通道数据
即 Sentinel-1 与 Sentinel-2 融合。
2. swinirdenoise2
表示:
使用 SwinIR 风格去噪增强模块
用于提高输入特征质量。
3. concat
表示:
增强特征与原始输入进行 concat 融合
而不是直接替换原输入。
4. unet
表示:
分割头使用 U-Net
5. w8
表示:
window size = 8
即 Swin Transformer 中窗口注意力大小为 8。
6. lr5e5
表示:
learning rate = 5e-5
7. b4
表示:
batch size = 4
四、Checkpoint 筛选
很多新手训练完模型后,会默认使用:
最后一个 epoch
但实际上:
最后一个 epoch ≠ 最优 epoch
因此本实验并没有直接使用最终权重,而是对多个 checkpoint 进行了独立评估。
测试的 checkpoint
实验共测试了以下权重:
epoch 120
epoch 124
epoch 128
epoch 132
epoch 136
epoch 140
epoch 144
epoch 148
epoch 152
平均 Dice 对比
| Epoch | Average Dice |
|---|---|
| 120 | 0.6227 |
| 124 | 0.6321 |
| 128 | 0.6391 |
| 132 | 0.6289 |
| 136 | 0.6284 |
| 140 | 0.6336 |
| 144 | 0.6293 |
| 148 | 0.6308 |
| 152 | 0.6096 |
可以看到:
epoch 128 的平均 Dice 最高
因此最终基础权重选择:
checkpoint_epoch128.pth
五、后处理实验
在得到基础最佳权重后,我进一步尝试了传统图像后处理方法。
包括:
- 去除小连通域
- Morphological Closing
- 不同 min-area 阈值
测试方案
实验测试了:
min-area = 128
min-area = 64
min-area = 32(不做 closing)
实验现象
后处理确实能:
提高部分区域 Precision
因为它会过滤掉一些噪声小块。
但问题是:
真实的小型红树林区域也会被一起删除
导致:
- Recall 下降
- 小目标漏检增加
最终结果表现为:
平均 Dice 并没有超过原始预测
最终结论
传统形态学后处理:
没有带来稳定收益
因此没有作为最终方案采用。
六、TTA(测试时增强)
后处理中收益不明显后,我开始尝试:
TTA(Test Time Augmentation)
TTA 的核心思想是:
同一张图像
→ 多种翻转方式分别预测
→ 再将结果平均
它不需要重新训练模型,只改变推理阶段。
七、TTA 推理流程
本实验使用了四种输入:
1. 原图
2. 水平翻转
3. 垂直翻转
4. 水平 + 垂直翻转
推理流程如下:
输入图像
↓
四种增强方式分别预测
↓
预测结果翻转回原方向
↓
概率图求平均
↓
生成最终 mask
八、最终最佳结果
使用:
checkpoint_epoch128.pth + TTA
后,最终测试结果如下。
20-30 区间
| Metric | Score |
|---|---|
| Precision | 0.7534 |
| Recall | 0.7721 |
| Dice / F1 | 0.7394 |
| IoU | 0.6462 |
50-60 区间
| Metric | Score |
|---|---|
| Precision | 0.5964 |
| Recall | 0.6946 |
| Dice / F1 | 0.6055 |
| IoU | 0.4935 |
80-90 区间
| Metric | Score |
|---|---|
| Precision | 0.6228 |
| Recall | 0.6384 |
| Dice / F1 | 0.5752 |
| IoU | 0.4634 |
九、最终平均性能
三个测试区间平均 Dice:
0.6400
这是当前实验配置下取得的最佳结果。
十、最终采用方案
最终模型权重
checkpoints/6_swinirdenoise2_concat_unet_w8_lr5e5_b4/checkpoint_epoch128.pth
推理脚本
predict_tta.py
预测结果目录
data/masks/predict_tta_epoch128/6
评估结果目录
accuracy/6_tta_epoch128
十一、实验最终结论
这次实验最大的收获有三个。
1. Checkpoint 筛选非常重要
很多时候:
最佳模型并不是最后一个 epoch
通过系统评估多个 checkpoint,最终找到了效果最好的:
epoch128
这是最终性能提升的重要来源之一。
2. TTA 的收益明显高于传统后处理
相比:
- closing
- 连通域过滤
- min-area 调参
TTA 的提升更加稳定。
而且:
不需要重新训练模型
实现成本非常低。
3. 传统形态学后处理不一定有效
在遥感小目标分割中:
小连通域未必是噪声
很多真实红树林区域本身面积就很小。
因此:
过强的后处理容易误删真实目标
十二、总结
最终,本实验的最佳方案为:
SwinIR-Denoise-UNet
+ checkpoint_epoch128
+ TTA 推理
在三个测试区间上取得:
Average Dice = 0.6400
整个实验也验证了一个很重要的经验:
合理的 checkpoint 筛选 + 推理优化,
往往比盲目加复杂后处理更有效。
对于遥感分割任务来说,这类"训练 + 推理联合优化"的思路,通常比单纯堆模型更稳定,也更容易复现。