mmsegmentation 项目实践:AdaBins 自适应分箱单目深度估计(EfficientNet-B5 + mViT 实现解析)
发布时间:2026/9/16 19:01:46来源:尧图网络
mmsegmentation 项目实践AdaBins 自适应分箱单目深度估计EfficientNet-B5 mViT 实现解析【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation导读本文围绕 mmsegmentation 仓库中projects/Adabins这一官方示例项目展开系统讲解 AdaBinsAdaptive Bins这一基于 Transformer 的单目深度估计方法从论文核心思想将深度范围自适应划分为可学习分箱、以箱中心线性组合得到最终深度出发结合仓库内真实可运行的源码与配置逐一拆解其 EfficientNet-B5 编码器解码器骨干网络、mViT 解码头、NYU / KITTI 训练配置与评测指标并说明如何在 mmseg 生态中通过DepthEstimator、DepthMetric等基础组件完成训练与验证。读完本文你将掌握 AdaBins 的完整实现链路、关键超参数的含义以及如何在 mmsegmentation 中复现或扩展该深度估计任务。AdaBins 方法概述AdaBins 由 S. A. Bhat、I. Alhashim 和 P. Wonka 提出发表于 CVPR 2021论文为《AdaBins: Depth Estimation Using Adaptive Bins》arxiv: 2011.14141。其核心思路是在编码器-解码器卷积网络基础上引入一个基于 Transformer 的构建模块把预测的深度范围划分为若干分箱bins且箱宽随输入图像自适应变化最终深度值由这些箱中心的线性组合得到。该模块被命名为AdaBins。其论文摘要见 projects/Adabins/README.md指出作者以 baseline 编码器-解码器 CNN 为起点研究全局信息处理如何帮助提升整体深度估计精度并提出一个 Transformer 构建块将深度范围划分为箱其中心值按每张图像自适应估计最终深度为箱中心的线性组合。实验表明该方法在多个主流深度数据集上的所有指标上相较当时 SOTA 均有显著提升并配套提供了代码与预训练权重。论文总结的三大贡献提出一种执行场景信息全局处理的架构构建块将预测深度范围划分为随图像变化的宽度可学分箱最终深度估计是箱中心值的线性组合在 NYU 与 KITTI 两个最流行数据集的监督式单目深度估计上所有指标均取得显著提升系统分析了所提 AdaBins 块的不同改进方式及其对深度估计精度的影响。仓库中的工程化落地projects/Adabins是 mmsegmentation 的独立可运行子项目其目录结构与 mmseg 的backbone decode_head 配置文件约定完全一致projects/Adabins/ ├── README.md ├── backbones/ │ ├── __init__.py │ └── adabins_backbone.py # EfficientNet-B5 编码器 多级跳跃解码 ├── decode_head/ │ ├── __init__.py │ └── adabins_head.py # mViT 解码头自适应分箱核心 └── configs/ ├── _base_/ │ ├── datasets/nyu.py # NYU 数据管线与 DepthMetric 评测配置 │ ├── models/Adabins.py # 模型骨架配置backbone decode_head │ └── default_runtime.py # 运行时、日志、可视化等通用配置 └── adabins/ ├── adabins_efficient_b5_4x16_25e_NYU_416x544.py └── adabins_efficient_b5_4x16_25e_kitti_352x704.py其中backbones/adabins_backbone.py与decode_head/adabins_head.py均通过MODELS.register_module()注册到 mmseg 的MODELS注册表因此可以在配置文件中以字符串typeAdabinsBackbone/typeAdabinsHead直接引用。骨干网络EfficientNet-B5 编码器与跳跃式上采样解码器骨干网络实现位于 backbones/adabins_backbone.py整体是编码器-解码器结构编码器Encoder使用timm.create_model(tf_efficientnet_b5_ap, pretrainedTrue)加载 EfficientNet-B5 预训练权重随后将global_pool与classifier替换为nn.Identity()去掉分类头只保留特征提取部分forward会逐个模块前向并保存每一阶段的中间特征features列表供解码端跳跃连接使用。解码器由 1×1 卷积conv2与四级UpSampleBN模块组成。每个UpSampleBN先将低分辨率特征双线性插值到与跳跃特征相同尺寸再沿通道拼接后经过两个ConvModule默认norm_cfgdict(typeBN)、act_cfgdict(typeLeakyReLU)。各层跳跃输入通道数固定拼接了 EfficientNet-B5 各阶段的特征11264、4024、2416、168最终由 3×3 卷积conv3输出num_classes128通道的稠密特征图供解码头使用。关键参数来自 Adabins.py 模型配置参数取值说明basemodel_nametf_efficientnet_b5_aptimm 中带抗锯齿池化的 EfficientNet-B5num_features2048中间特征通道数逐级减半2048→1024→512→256→128num_classes128最终输出特征通道数必须与解码头in_channels一致bottleneck_features2048EfficientNet-B5 末层特征通道数解码头mViT 自适应分箱模块解码头是 AdaBins 的核心实现在 decode_head/adabins_head.py由三个子模块协同完成分箱预测 逐像素深度回归PatchTransformerEncoder全局上下文编码将输入特征图用embedding_convPxP核大小与步长均为patch_size的卷积切成 patch 序列得到形状为n, embedding_dim, s的嵌入加上可学习的positional_encodings形状(500, embedding_dim)的参数后转置为 Transformer 要求的S, N, E格式送入 4 层nn.TransformerEncoderLayerembedding_dim128, num_heads4, dim_feedforward1024。输出序列中第 0 个 tokentgt[0]作为regression_head用于全局回归 bin 宽度第 1 到n_query_channels1个 tokentgt[1:n_query_channels1]作为queries参与逐像素注意力图计算。PixelWiseDotProduct逐像素查询点积将骨干输出的特征图x与queries做矩阵点积得到形状为n, n_query_channels, h, w的range_attention_maps即每个像素在各查询深度区间上的响应图。代码中通过assert c ck保证特征通道数与查询嵌入维度一致均为 128。分箱回归与深度合成regressorLinear(128,256) → LeakyReLU → Linear(256,256) → LeakyReLU → Linear(256, n_bins)从全局 token 回归出n_bins个归一化箱宽normlinear时先relu再加eps0.1防止除零与负箱宽normsoftmax时直接返回torch.softmax(y, dim1)与注意力图其余情况走sigmoid。随后bin_widths_normed y / y.sum(dim1, keepdimTrue)做归一化乘以深度范围(max_val - min_val)得到绝对箱宽左侧 pad 一个min_val后cumsum得到箱边界bin_edges箱中心centers 0.5 * (bin_edges[:, :-1] bin_edges[:, 1:])。另一路conv_out1×1 卷积 Softmax把注意力图映射为每个像素在各箱上的权重out。最终深度图pred Σ_c out[c] * centers[c]即逐像素地对箱中心加权求和这正是论文最终深度值是箱中心线性组合的工程化表达。解码头关键参数来自模型配置参数默认值NYU 配置KITTI 配置说明in_channels-128128骨干输出通道数n_query_channels128128128查询 token 数量patch_size161616全局上下文 patch 大小embedding_dim128128128Transformer 嵌入维度num_heads444注意力头数n_bins100256256分箱数量min_val/max_val0.1 / 100.001 / 100.001 / 80深度范围KITTI 深达 80mnormlinearlinearlinear箱宽归一化方式推理阶段predict()会执行forward并取最后一个输出深度图随后torch.clamp(pred, min_val, max_val)把预测裁剪到合法深度范围并将inf替换为max_val、nan替换为min_val。模型封装基于 DepthEstimator 的深度估计任务AdaBins 在 mmseg 中并不走语义分割的EncoderDecoder而是复用仓库新增的深度估计器 mmseg/models/segmentors/depth_estimator.py 中的DepthEstimator同样注册于MODELS继承自EncoderDecoder。其类注释给出了完整的调用链训练loss()→extract_feat()→_decode_head_forward_train()→decode_head.loss()推理predict()→inference()→whole_inference()/slide_inference()/slide_flip_inference()→encode_decode()→decode_head.predict()后处理postprocess_result()会依据img_meta去除 padding 区域、处理翻转并将深度图双线性 resize 回ori_shape最终以SegDataSample.pred_depth_mapPixelData形式输出。配置文件中model dict(typeDepthEstimator, ...)即指定该封装test_cfgdict(modewhole)表示整图推理。数据管线与评测指标NYU 数据配置configs/base/datasets/nyu.py 定义了 NYU 深度估计数据管线数据集类型NYUDatasetdata_rootdata/nyu测试图像位于images/test、深度标注位于annotations/test管线包含LoadImageFromFileto_float32True、LoadDepthAnnotationdepth_rescale_factor1e-3即把毫米级深度缩放到米与PackSegInputsmeta_keys 中携带depth_map_path等验证/测试评估器为DepthMetric配置max_depth_eval10.0, crop_typenyu_crop其中nyu_crop是 NYU 官方评测采用的中心裁剪方式剔除图像边界无效区域。评测指标定义mmseg/evaluation/metrics/depth_metric.py 中的DepthMetric支持 9 个标准深度估计指标d1/d2/d3阈值准确率 δ1/δ2/δ3、abs_rel相对绝对误差、sq_rel相对平方误差、rmse、rmse_log、log10与silog可通过depth_metrics参数按需选择还可配置min_depth_eval/max_depth_eval过滤评估深度范围、depth_scale_factor缩放深度、crop_type选择裁剪策略。训练配置与复现实验两个训练配置均通过_base_继承Adabins.py模型配置、default_runtime.py运行时配置default_scopemmseg、SyncBN 归一化等并通过custom_imports显式导入projects.Adabins.backbones与projects.Adabins.decode_head使 mmseg 能够解析到注册的组件NYU 配置 adabins_efficient_b5_4x16_25e_NYU_416x544.pycrop_size(416, 544)data_preprocessor指定输入尺寸模型沿用min_val0.001, max_val10。KITTI 配置 adabins_efficient_b5_4x16_25e_kitti_352x704.pycrop_size(352, 704)仅继承模型配置并将解码头改为decode_headdict(min_val0.001, max_val80)以匹配 KITTI 更深的测量范围可达 80m。默认运行时配置default_runtime.py中log_processor dict(by_epochFalse)表示按迭代数记录日志tta_model dict(typeSegTTAModel)为测试时增强预留接口。训练与测试可复用仓库根目录的标准入口脚本python tools/train.py projects/Adabins/configs/adabins/adabins_efficient_b5_4x16_25e_NYU_416x544.py python tools/test.py projects/Adabins/configs/adabins/adabins_efficient_b5_4x16_25e_NYU_416x544.py 权重路径 --out 结果目录多卡场景可改用tools/dist_train.sh/tools/dist_test.sh。需要注意EfficientNet-B5 预训练权重通过 timm 自动下载训练前请保证网络可达或已配置好本地权重缓存。复现性能与参考数值仓库 README 中给出的 NYU 与 KITTI 复现结果如下训练 25 epoch、batchsize 16参数规模约 78M模型编码器训练轮数Batchsize训练分辨率δ1δ2δ3RELRMSRMS logAdaBins_nyuEfficientNet-B52516416x5440.9030.9840.9970.1030.3640.044AdaBins_kittiEfficientNet-B52516352x7640.9640.9950.9990.0582.3600.088其中 δ1/δ2/δ3 为阈值准确率越大越好REL、RMS、RMS log 为误差指标越小越好。这两组权重以 third-party 形式提供可直接用于tools/test.py的推理验证具体下载地址见 projects/Adabins/README.md 中的 Links 列。扩展阅读与引用AdaBins 的官方开源实现与论文细节可分别通过 projects/Adabins/README.md 中提供的官方仓库链接与 arXiv 论文访问。若在论文或项目中引用该方法可使用 README 中给出的 BibTeX 条目article{10.1109/cvpr46437.2021.00400, author {Bhat, S. A. and Alhashim, I. and Wonka, P.}, title {Adabins: depth estimation using adaptive bins}, journal {2021 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)}, year {2021}, doi {10.1109/cvpr46437.2021.00400} }对于希望在 mmsegmentation 中扩展深度估计能力的开发者可以从projects/Adabins出发参照 mmseg/datasets/nyu.py、mmseg/models/segmentors/depth_estimator.py 与 mmseg/evaluation/metrics/depth_metric.py 了解数据集、模型封装与指标注册方式从而将该框架迁移到自定义的深度估计数据与任务上。【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网