ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ManyDepth的Teacher网络与冻结策略:自适应深度bin背后的训练奥秘

ManyDepth的Teacher网络与冻结策略:自适应深度bin背后的训练奥秘 ManyDepth的Teacher网络与冻结策略自适应深度bin背后的训练奥秘【免费下载链接】manydepth[CVPR 2021] Self-supervised depth estimation from short sequences项目地址: https://gitcode.com/gh_mirrors/ma/manydepthManyDepth 是登上 CVPR 2021 的自监督深度估计开源项目它仅用单目视频即可完成训练无需任何深度真值或位姿标注测试时只需输入短短几帧连续画面就能输出比单帧方法更精准的深度图。这个项目最精妙的地方在于一套双网络训练架构——单目 Teacher 网络与多帧学生网络并行训练再配合冻结策略与自适应深度bin两大设计才让短序列深度估计达到了当时的 SOTA 水平。这篇文章将为你拆解这两大训练奥秘背后的原理与实现。一句话看懂ManyDepth自监督多帧深度估计的独特思路传统的自监督深度估计如 Monodepth2通常只从单帧图像预测深度因为自监督训练没有真值多帧信息很难被有效利用。ManyDepth 的思路则完全不同它同时训练两条路径——单目 Teacher 网络从单帧图像直接预测深度负责提供稳定的参考答案多帧学生网络把连续几帧图像通过代价体cost volume匹配融合预测更精细的深度。测试时模型会根据是否有可用序列自动切换有序列就启用多帧路径没有就退化为单帧路径既高效又鲁棒。双网络架构单目Teacher网络如何教好多帧学生网络在代码中Teacher 网络由mono_encoderResNet 编码器和mono_depth深度解码器构成学生网络则由带代价体匹配模块的encoder和另一套depth解码器构成。二者在训练中分工明确Teacher 网络承担三个教学任务提供一致性损失目标在 trainer.py 的 compute_losses 中多帧学生网络的输出会与 Teacher 的单目深度做 L1 距离约束鼓励学生在没把握的区域向老师靠拢计算运动掩码通过比较 Teacher 深度与代价体最优深度的差异判断哪些像素可能是运动物体、不该相信多帧匹配见compute_matching_mask估计深度范围Teacher 的单目预测被用来动态推算场景的深度上下限这正是自适应深度bin的数据来源。训练前期Teacher 与学生同时更新Teacher 的输出质量随着训练逐步提升学生也越学越好。自适应深度binTeacher网络贡献的深度标尺要理解自适应深度bin先要知道代价体cost volume的工作原理多帧网络会把深度范围切分成若干深度假设平面把相邻帧的特征按照每个假设深度投影回当前视角再计算特征差异差异最小的那个深度就是该像素的预测深度。问题来了自监督训练没有真值场景尺度完全未知。如果深度bin的范围设得太宽深度假设被摊得很稀匹配精度下降设得太窄又会把远处物体截断。ManyDepth 的解法就是让 Teacher 网络来报数在 trainer.py 的 update_adaptive_depth_bins 中每一轮训练都会统计 Teacher 单目深度预测的最小值和最大值各乘上 0.9 和 1.1 的余量再通过指数加权平均旧值权重 0.99、新值权重 0.01平滑更新当前的深度上下限。这样深度bin的范围会随着训练推进自动收敛到数据集的实际分布相当于一把不断校准的深度标尺。而 resnet_encoder.py 的 compute_depth_bins 则负责把上下限切分成 96 个 bin支持两种采样方式linear默认在深度空间均匀采样近处 bin 多、远处 bin 稀inverse在逆深度空间均匀采样让近处物体的深度假设更密。训练结束后这把标尺的最终取值还会随模型权重一起保存推理时直接加载使用无需任何在线优化。冻结策略详解训练中途锁住Teacher网络和位姿网络既然 Teacher 教得好好的为什么要冻结答案藏在训练稳定性里如果 Teacher 和位姿网络一直跟着更新一致性损失的标准答案就会不断漂移多帧学生网络容易陷入震荡甚至发生训练崩溃。尤其在 Cityscapes 这种图像数量巨大的数据集上这个问题会被放大。因此 ManyDepth 在默认第 15 个 epochfreeze_teacher_epoch15执行 freeze_teacher 冻结操作这一步做了三件事重新初始化优化器把待训练参数列表清空只保留多帧学生网络encoderdepth的参数保证 Teacher 和位姿网络后续绝不会被更新切换批归一化模式Teacher 和位姿网络被设为eval模式使用运行均值running average统计避免因冻结后数据分布变化引发 BN 抖动停止传播单目损失冻结后Teacher 路径的前向计算全部包裹在torch.no_grad()中单帧损失不再叠加梯度只流向多帧学生网络。冻结之后Teacher 从陪练转为监考老师它不再学习但依然为一致性损失和运动掩码提供稳定的参考信号。冻结时机怎么选freeze_teacher_epoch与freeze_teacher_step关于冻结时机options.py 提供了三个关键参数--freeze_teacher_epoch 15按 epoch 冻结默认第 15 轮--freeze_teacher_step -1按迭代步数冻结默认关闭-1 表示不启用--freeze_teacher_and_pose如果设置则从训练一开始就冻结 Teacher 和位姿网络跳过联合训练阶段。官方在 README 中特别提醒训练 Cityscapes 模型时建议使用--freeze_teacher_epoch 5因为该数据集训练样本极多、单轮训练量巨大更早冻结才能保证学生网络有充足的时间在稳定环境下精修。而在 KITTI 上默认的第 15 轮冻结效果最佳。冻结之后多帧学生网络如何独自精进冻结看似损失了一个网络的训练量实际上收益显著。冻结后训练变得更纯粹位姿固定warp 时的相对位姿由冻结的位姿网络给出稳定且一致学生网络可以放心学习几何匹配标准答案固定一致性损失的目标不再漂移多帧输出被稳定地拉向 Teacher 的合理预测自适应bin固定深度标尺已被 Teacher 校准完毕代价体匹配进入高精度打磨阶段。一句话总结训练节奏前期联合训练定标尺、定标准后期冻结训练精修多帧匹配。这种先教后锁、锁后精修的两阶段策略正是 ManyDepth 训练稳定性与精度兼得的奥秘所在。效果验证这套训练奥秘带来了什么提升消融实验显示去掉自适应深度bin或去掉冻结策略多帧深度估计在 KITTI 上的误差指标都会明显回升。而完整配置下ManyDepth 的深度图在车辆轮廓、道路边缘等细节处明显比单帧方法 Monodepth2 更干净在 KITTI 的 Eigen 分割上ManyDepth 的 Abs Rel 等指标全面优于当时的自监督方法且推理时只需一次前向传播、无需测试时优化速度与精度兼得动手复现跟着代码读懂训练奥秘想亲手验证这套机制克隆仓库后即可开始git clone https://gitcode.com/gh_mirrors/ma/manydepthKITTI 上复现论文结果默认第 15 轮冻结 TeacherCUDA_VISIBLE_DEVICES0 python -m manydepth.train \ --data_path KITTI路径 --log_dir 保存路径 --model_name my_manydepthCityscapes 上训练时记得把冻结时机提前CUDA_VISIBLE_DEVICES0 python -m manydepth.train \ --data_path Cityscapes预处理路径 --log_dir 保存路径 \ --model_name my_manydepth --dataset cityscapes_preprocessed \ --split cityscapes_preprocessed --freeze_teacher_epoch 5训练日志中using adaptive depth binning! 表示自适应深度bin已开启而 freezing teacher and pose networks! 则标志着训练进入第二阶段。观察这两个关键节点你就能直观感受到 ManyDepth 训练奥秘的全过程。小结ManyDepth 用一套双网络 冻结策略 自适应深度bin的组合拳解决了自监督多帧深度估计中尺度未知、训练不稳两大难题。Teacher 网络负责定标尺、给标准冻结策略负责稳训练、保精度而自适应深度bin则让代价体匹配始终工作在合适的深度范围内。理解了这三点你就真正读懂了这份 CVPR 2021 代码的精髓。【免费下载链接】manydepth[CVPR 2021] Self-supervised depth estimation from short sequences项目地址: https://gitcode.com/gh_mirrors/ma/manydepth创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表