从 baseline 到 75.3 mIoU:structure_knowledge_distillation 训练脚本全解析

📅 2026/7/12 21:03:21 👁️ 阅读次数 📝 编程学习
从 baseline 到 75.3 mIoU:structure_knowledge_distillation 训练脚本全解析

从 baseline 到 75.3 mIoU:structure_knowledge_distillation 训练脚本全解析

【免费下载链接】structure_knowledge_distillationThe official code for the paper 'Structured Knowledge Distillation for Semantic Segmentation'. (CVPR 2019 ORAL) and extension to other tasks.项目地址: https://gitcode.com/gh_mirrors/st/structure_knowledge_distillation

语义分割是计算机视觉中的重要任务,而知识蒸馏技术能让轻量级学生模型从复杂教师模型中学习到丰富的结构化知识。本文将详细解析structure_knowledge_distillation项目如何通过三种蒸馏策略,将 Cityscapes 数据集上的 mIoU 从 69.10 提升到 75.3 的完整训练流程。🚀

📊 项目概览与性能提升

structure_knowledge_distillation是一个基于 CVPR 2019 口头报告论文的开源实现,专注于密集预测任务的结构化知识蒸馏。该项目通过创新的三层蒸馏架构,在语义分割、目标检测和深度估计等多个任务上都取得了显著性能提升。

在 Cityscapes 数据集上,项目展示了令人印象深刻的性能提升轨迹:

模型配置平均 mIoU提升幅度
Baseline69.10-
+ 像素级蒸馏70.51+1.41
+ 像素级+成对蒸馏71.78+2.68
+ 完整三层蒸馏75.3+6.20

🏗️ 三层蒸馏架构解析

1. 像素级蒸馏(Pixel-wise Distillation)

像素级蒸馏是最基础的蒸馏形式,让学生模型学习教师模型在像素级别的输出分布。在utils/criterion.py中,CriterionPixelWise类实现了这一功能:

# 核心实现:像素级蒸馏损失计算 softmax_pred_T = F.softmax(preds_T[0].permute(0,2,3,1).contiguous().view(-1,C), dim=1) loss = (torch.sum(-softmax_pred_T * logsoftmax(preds_S[0]))) / W / H

通过计算教师和学生输出之间的 KL 散度,学生模型能够学习到教师模型的软标签信息,而不仅仅是硬标签。

2. 成对蒸馏(Pair-wise Distillation)

成对蒸馏是项目的创新点之一,它关注特征空间中的结构化关系。在CriterionPairWiseforWholeFeatAfterPool类中,项目实现了基于池化后特征的相似度计算:

# 特征相似度计算 total_w, total_h = feat_T.shape[2], feat_T.shape[3] patch_w, patch_h = int(total_w*self.scale), int(total_h*self.scale) maxpool = nn.MaxPool2d(kernel_size=(patch_w, patch_h), stride=(patch_w, patch_h)) loss = self.criterion(maxpool(feat_S), maxpool(feat_T))

这种方法让学生模型学习到教师模型特征图中的空间关系模式,而不仅仅是单个像素的预测。

3. 整体蒸馏(Holistic Distillation)

整体蒸馏采用对抗学习的方式,通过判别器让学生模型生成与教师模型相似的整体特征分布。在networks/kd_model.py中,对抗训练的核心逻辑如下:

# 对抗训练实现 if self.args.ho == True: d_out_S = self.parallel_D(self.preds_S, parallel=args.parallel) G_loss = G_loss + args.lambda_d * self.criterion_adv_for_G(d_out_S, d_out_S)

Cityscapes 数据集上的语义分割结果对比

🚀 训练脚本深度解析

核心训练流程

项目的训练主脚本train_and_eval.py实现了完整的训练循环:

  1. 数据加载:使用 Cityscapes 数据集,支持随机镜像和缩放增强
  2. 模型初始化:同时加载教师模型(ResNet-101)和学生模型(ResNet-18)
  3. 多阶段训练:逐步引入三种蒸馏损失
  4. 周期性评估:每 2975 个批次进行一次验证集评估

关键训练参数配置

run_train_val.sh中,项目提供了完整的训练配置:

# 三层蒸馏全部启用 is_pi_use=True # 像素级蒸馏 is_pa_use=True # 成对蒸馏 is_ho_use=True # 整体蒸馏 # 损失权重配置 lambda_pi=10.0 # 像素级损失权重 lambda_pa=0.5 # 成对损失权重 lambda_d=0.1 # 对抗损失权重

学习率调度策略

项目采用多项式衰减的学习率调度策略,在networks/kd_model.py中实现:

def lr_poly(self, base_lr, iter, max_iter, power): return base_lr * ((1 - float(iter) / max_iter) ** power)

这种调度方式在训练初期提供较高的学习率,随着训练进行逐渐衰减,有助于模型收敛到更好的局部最优解。

🔧 环境配置与快速开始

系统要求

  • Python 3.5+
  • PyTorch 0.4.1+
  • CUDA 支持
  • 推荐使用 Anaconda 环境

编译步骤

项目使用 InPlace-ABN 优化内存使用,需要编译 CUDA 扩展:

cd libs sh build.sh python build.py

数据集准备

  1. 下载 Cityscapes 数据集
  2. 按照项目结构组织数据目录
  3. 使用预定义的训练/验证列表文件

📈 性能优化技巧

1. 批次大小调整

默认批次大小为 8,根据 GPU 显存可以适当调整。更大的批次大小通常能带来更稳定的梯度估计。

2. 损失权重调优

三个蒸馏损失的权重需要根据具体任务调整:

  • lambda_pi:控制像素级蒸馏强度
  • lambda_pa:控制成对蒸馏强度
  • lambda_d:控制对抗蒸馏强度

3. 学习率策略

项目默认使用 0.01 的初始学习率,可以根据训练曲线调整。如果训练早期损失震荡,可以适当降低学习率。

🎯 实际应用建议

迁移到其他任务

项目的三层蒸馏架构可以轻松迁移到其他密集预测任务:

  1. 目标检测:在 FCOS 检测器上,mAP 从 30.9 提升到 34.0
  2. 深度估计:在 VNL 深度估计模型上,相对误差从 13.5% 降低到 13.0%

自定义数据集适配

要适配自己的数据集,需要修改:

  • dataset/datasets.py中的数据加载器
  • dataset/list/目录下的文件列表
  • 类别数量和对应的配置文件

🔍 调试与问题排查

常见问题

  1. 内存不足:减小批次大小或输入图像尺寸
  2. 训练不稳定:调整损失权重或降低学习率
  3. 性能提升不明显:检查教师模型质量或数据预处理

监控训练过程

项目集成了 TensorBoard 日志,可以通过以下方式监控训练:

  • 损失曲线变化
  • 验证集 mIoU 趋势
  • 各蒸馏损失分量贡献

📊 实验结果分析

消融实验

项目的消融实验清晰地展示了每层蒸馏的贡献:

蒸馏组合mIoU相对提升
无蒸馏69.10基准
仅像素级70.51+2.0%
像素级+成对71.78+3.9%
完整三层75.3+9.0%

类别级性能提升

在 Cityscapes 的 19 个类别中,不同类别的提升幅度不同:

  • 大尺度物体(如道路、建筑):提升显著
  • 小尺度物体(如交通标志、杆子):提升相对较小
  • 复杂场景(如人群、车辆):受益于结构化信息

🚀 未来扩展方向

1. 多任务蒸馏

可以扩展为同时进行分割、检测和深度估计的多任务蒸馏框架。

2. 在线蒸馏

从静态教师模型扩展到在线教师模型,实现师生协同进化。

3. 自适应权重

根据训练进度动态调整各蒸馏损失的权重。

💡 总结与建议

structure_knowledge_distillation项目通过创新的三层蒸馏架构,为语义分割任务提供了强大的知识迁移方案。对于实际应用,建议:

  1. 从简单开始:先启用像素级蒸馏,逐步加入成对和整体蒸馏
  2. 耐心调参:损失权重需要根据具体任务仔细调整
  3. 充分利用硬件:合理设置批次大小,充分利用 GPU 并行能力
  4. 监控验证集:定期在验证集上评估,防止过拟合

通过本项目的训练脚本和架构设计,你可以在保持模型轻量化的同时,显著提升语义分割性能,实现从 baseline 到 75.3 mIoU 的跨越式提升!🎯

【免费下载链接】structure_knowledge_distillationThe official code for the paper 'Structured Knowledge Distillation for Semantic Segmentation'. (CVPR 2019 ORAL) and extension to other tasks.项目地址: https://gitcode.com/gh_mirrors/st/structure_knowledge_distillation

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考