ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

mmdetection3d 中的 MonoFlex 实现解析:面向截断目标与不确定性深度集成的柔性单目 3D 检测

mmdetection3d 中的 MonoFlex 实现解析:面向截断目标与不确定性深度集成的柔性单目 3D 检测 人工智能计算机视觉深度学习自动驾驶【免费下载链接】mmdetection3dOpenMMLabs next-generation platform for general 3D object detection.项目地址https://gitcode.com/gh_mirrors/mm/mmdetection3d点击查看免费下载单目 3D 目标检测的核心难点在于从单张 RGB 图像中恢复目标的深度与三维位姿而图像边缘处被截断truncated的目标因其 2D 外观残缺、3D 中心投影偏移历来是精度掉点最严重的区域。MonoFlexObjects are Different: Flexible Monocular 3D Object Detection, CVPR 2021提出了一种柔性框架显式解耦截断目标、并以不确定性引导的多源深度集成替代单一深度回归在 KITTI 测试集上相对当时最先进方法将 Moderate / Hard 级别 3D 检测精度分别提升了约 27% / 30%。本文以 configs/monoflex/README.md 为核心结合本仓库中 MonoFlexHead、MonoFlexCoder、EdgeFusionModule 等源码实现完整解读该算法的设计动机、网络结构、训练目标与在 KITTI 上的使用方式读完即可掌握 MonoFlex 在 mmdetection3d 中的复现细节与调参要点。论文背景与核心动机论文Objects are Different: Flexible Monocular 3D Object DetectionarXiv:2104.02323发表于 CVPR 2021。作者指出单目 3D 检测中绝大多数方法对所有目标一视同仁地使用同一套回归流程忽略了目标分布的多样性尤其对截断目标表现不佳。MonoFlex 从两个角度解决该问题显式解耦截断目标在特征图的边缘上单独构建特征融合分支把长尾的截断目标从普通目标中分离出来优化避免截断目标干扰正常目标的训练不确定性引导的多源深度集成将目标深度估计建模为直接回归深度与由多组关键点几何解算的深度的集成并用网络预测的不确定性对多个深度估计加权融合。这种不同目标使用不同处理策略的柔性设计正是模型名称 Flexible 的由来。论文在 KITTI 测试集上报告相对当时最先进方法Moderate 级别提升约 27%、Hard 级别提升约 30%同时保持实时推理效率上述相对提升为论文原文声称的实验结果。在 mmdetection3d 中MonoFlex 的实现head 与 bbox coder完整保留在mmdet3d/models/下并基于 KITTI 数据集提供了一组可复现的模型与结果。KITTI 上的复现结果与模型仓库的 configs/monoflex/README.md 与 configs/monoflex/metafile.yml 记录了 KITTI 上的复现配置与指标。模型配置名为monoflex_dla34_pytorch_dlaneck_gn-all_2x4_6x_kitti-mono3d主干网络为 DLA34配置声明于 configs/monoflex/monoflex_dla34_pytorch_dlaneck_gn-all_2x4_6x_kitti-mono3d.py该路径同时记录于 metafile.yml 的Config字段当前仓库快照的configs/monoflex/目录仅包含 README 与 metafile 两个文件完整训练配置请以 metafile 声明的路径为准。BackboneLr schdMem (GB)mAPDLA346x9.6421.86其中 mAP 为Car Moderate 级别、3D 严格评测、AP11的结果。模型权重与训练日志的下载地址记录在 metafile.yml 的Weights字段属于官方模型库托管资源。3D / BEV 详细精度AP11 与 AP40指标EasyModerateHardCar (AP11)28.02 / 36.1121.86 / 29.4619.01 / 24.83Car (AP40)23.22 / 32.7417.18 / 24.0215.13 / 20.67表中每格为3D AP / BEV AP。README 特别注明两点由于行人与骑行者数据量有限这两类的检测性能通常不稳定因此仅列出 Car 结果AP11 结果波动范围较大约 ±1 APAP40 因稳定性更好是更推荐的参考指标。这两点提示在实际评估与论文对比中应优先以 AP40 为准并关注 Car 单类指标而非多类平均。源码架构总览从单阶段单目检测器到 MonoFlexHeadMonoFlex 属于无锚框anchor-free单阶段单目检测器。在 mmdetection3d 中MonoFlexHead继承自 anchor_free_mono3d_head.py 中的AnchorFreeMono3DHead见 monoflex_head.py并通过MODELS.register_module()注册进模型库见 dense_heads/init.py检测器侧的基类为 single_stage_mono3d.py 中的SingleStageMono3DDetector。MonoFlexHead的 docstring 中给出了完整的网络分支结构输入特征经过一组3x3 conv → 1x1 conv卷积分别引出分类、2D 框、中心偏移、关键点、关键点不确定性、3D 尺寸、朝向bin 分类 bin 偏移以及深度与其不确定性等 8 组预测。其中分类分支与 2D 偏移分支插入了边缘融合模块见 monoflex_head.py。50 通道回归输出的组成MonoFlexHead的回归输出由 8 组子回归项拼接而成。测试用例 test_monoflex_head.py 验证了前向输出形状为[B, 50, H, W]其通道分布与MonoFlexCoder.decode()中的切片一一对应见 monoflex_bbox_coder.py通道区间维度数含义0:44FCOS 风格 2D 框回归左/上/右/下距离4:62投影中心相对 base center 的 2D 偏移6:262010 个关键点的 2D 坐标8 个角点 顶/底中心26:293三组关键点解算深度的不确定性29:3233D 尺寸长高宽残差32:408朝向 bin 分类4 bins × 240:488朝向 bin 偏移4 bins × 248:491直接回归深度的残差49:501直接回归深度不确定性合计 4220338811 50 通道对应group_reg_dims((4,), (2,), (20,), (3,), (3,), (8, 8), (1,), (1,))的配置见测试用例中的显式传入以及 monoflex_head.py 的预测层初始化逻辑。截断目标的专用处理边缘特征融合与椭圆高斯热图边缘融合模块 EdgeFusionModuleMonoFlex 的关键创新之一是在特征图边缘额外构建融合路径专门服务于截断目标。其实现位于 edge_fusion_module.py对每条输入特征先通过grid_sample在边缘索引处采样特征再经一组Conv1d含 BN 与 ReLU与1x1 Conv1d将融合结果加回到原特征图的边缘像素上见该文件forward()。在MonoFlexHead中use_edge_fusionTrue时通过_init_edge_module()为分类分支与指定的回归分支各建立一个边缘融合子模块见 monoflex_head.py并在forward_single()中按edge_fusion_inds指定的(回归组索引, 输出索引)应用融合。边缘索引由 edge_indices.py 中的get_edge_indices()生成按图像真实尺寸img_shape相对填充尺寸pad_shape与下采样率计算特征图上的上/下/左/右四条边缘坐标。该函数刻意使用 numpy 在 CPU 上生成——注释说明 batch8 时比 CUDA 张量快约 8 倍100 次运行 0.09s vs 0.72s是训练吞吐上的一个工程优化细节。截断目标的目标热图椭圆高斯对于被截断的目标其 3D 中心投影到 2D 后往往落在 2D 框之外使用常规圆形高斯热图会产生中心偏移与歧义。MonoFlex 在get_targets()中针对被截断目标改用椭圆高斯热图以 base center 为基准用目标到 2D 框左右/上下边界的距离乘以edge_heatmap_ratio作为椭圆半径见 monoflex_head.py椭圆生成函数为 gaussian.py 中的get_ellip_gaussian_2D。普通目标则仍使用gaussian_radius(min_overlap0.7)计算的标准圆形高斯。辅助工具handle_proj_objs()见 handle_objs.py负责把越界的 3D 中心投影点搬回到 2D 框边缘作为 base center并记录截断掩码filter_outside_objs()则负责过滤完全在视野外的目标。这两个函数配合保证了训练目标对截断与正常目标的分流处理。不确定性引导的深度估计集成深度是单目 3D 检测中最难回归的量。MonoFlex 不做单一深度预测而是维护四条深度线索见 monoflex_bbox_coder.py 的decode()直接回归深度direct_depth由 1 维深度残差经decode_direct_depth()解码支持exp/linear/inv_sigmoid三种模式并按depth_range截断三组关键点解算深度keypoints_depthkeypoints2depth()把 10 个关键点8 角点 顶/底中心分成三组——中心组顶/底中心高度差、角点组 0索引(7,3),(0,4)、角点组 1索引(2,6),(1,5)利用3D 高度已知 相机焦距 2D 关键点竖直像素差的投影几何分别解出三个深度详见该函数 docstring 中的分组示意图集成深度combined_depthcombine_depths()用1 / exp(uncertainty)作为权重对 1 个直接深度与 3 个关键点深度的加权求和归一化后得到最终深度。每条深度线索都伴随一个预测的不确定性direct_depth_uncertainty与keypoints_depth_uncertainty均被 clamp 到uncertainty_range内。这正对应论文的 uncertainty-guided ensemble模型自己学会为更可信的深度来源分配更高权重显著缓解了直接回归深度对截断目标失效的问题。combine_depthFalse时则退化为仅使用直接回归深度。中心点 2D 位置则由decode_location()通过base_centers2d offsets_2d结合集成深度与相机内参cam2imgs逆矩阵反投影得到 3D 位置3D 尺寸由类别相关的base_dims每类 3 个均值 3 个标准差经decode_dims()线性解码朝向采用multibin表示encode()把局部偏航角编码为num_dir_bins × 2的 bin 分类 偏移目标decode_orientation()再结合目标位置射线角恢复全局偏航角见 monoflex_bbox_coder.py 与 L421-L476。MonoFlexCoder 核心参数详解MonoFlexCoder通过build_bbox_coder()在 head 内构建见 monoflex_head.py。其完整参数可由单元测试 test_monoflex_bbox_coder.py 中的配置复现bbox_coder dict( typeMonoFlexCoder, depth_modeexp, # 直接深度解码方式exp / linear / inv_sigmoid base_depth(26.494627, 16.05988), # linear 模式下的 base 深度均值, 标准差 depth_range[0.1, 100], # 预测深度的截断范围米 combine_depthTrue, # 是否启用不确定性引导的多源深度集成 uncertainty_range[-10, 10], # 深度不确定性的截断范围 base_dims((3.8840, 1.5261, 1.6286, 0.4259, 0.1367, 0.1022), # 每类 (l均值, h均值, w均值, l标准差, h标准差, w标准差) (0.8423, 1.7607, 0.6602, 0.2349, 0.1133, 0.1427), (1.7635, 1.7372, 0.5968, 0.1766, 0.0948, 0.1242)), dims_modelinear, # 尺寸解码方式linear / exp multibinTrue, # 是否使用 multibin 朝向表示 num_dir_bins4, # 朝向 bin 数量配合 2 倍输出用于 bin 分类偏移 bin_centers[0, np.pi / 2, np.pi, -np.pi / 2], # 各 bin 的中心角 bin_marginnp.pi / 6, # bin 分类允许的角度余量 code_size7) # 3D 框编码维度x,y,z,l,h,w,yaw测试用例同时断言了各解码产物的形状bboxes2d(N,4)、dimensions(N,3)、offsets2d(N,2)、keypoints2d(N,10,2)、orientations(N,16)、direct_depth(N,)、keypoints_depth(N,3)、combined_depth(N,)以及两组不确定性形状与上文 50 通道的分布完全吻合。注意base_dims的类别顺序与数据集class_names对齐KITTI 单目配置下为[Pedestrian, Cyclist, Car]调整类别顺序时必须同步修改该表。训练目标九路损失联合监督MonoFlexHead.loss_by_feat()见 monoflex_head.py把 50 通道回归与热图输出组织成 9 个损失项损失项监督对象默认配置源码 docstring / 参数默认值loss_cls中心点热图GaussianFocalLossmmdet权重 1.0loss_bbox2D 框FCOS 风格IoULoss权重 0.1loss_keypoints10 个 2D 关键点局部坐标L1Loss权重 0.1loss_dirmultibin 朝向MultiBinLoss权重 0.1loss_dims3D 尺寸L1Loss权重 0.1loss_offsets_2d投影中心偏移L1Loss权重 0.1loss_direct_depth直接深度带不确定性加权L1Loss权重 0.1loss_keypoints_depth关键点解算深度带不确定性加权L1Loss权重 0.1loss_combined_depth集成深度L1Loss权重 0.1后三个深度损失中体现了不确定性引导直接深度与关键点深度损失都乘以exp(-uncertainty)作为样本权重并额外加上uncertainty × loss_weight的正则项使网络在拟合深度的同时学习不确定性见 monoflex_head.py。目标构建get_targets()会过滤视野外目标filter_outside_objs、生成 base center 与截断掩码handle_proj_objs、投影 10 个关键点并计算可见性掩码与三组关键点深度掩码get_keypoints见 gen_keypoints.py——其中关键点掩码要求关键点位于图像内且位于相机前方三组深度掩码分别对应中心组与两组角点组的可见性。损失计算中所有关键点深度损失都通过掩码过滤避免遮挡关键点参与监督。KITTI 数据管线与训练/推理实战MonoFlex 训练依赖 KITTI 单目数据管线仓库内的基线配置为 mmdet3d/configs/base/datasets/kitti_mono3d.py对应 configs 侧的同名基类 configs/base/datasets/kitti-mono3d.py输入模态use_lidarFalse, use_cameraTrue类别[Pedestrian, Cyclist, Car]训练管线LoadImageFromFileMono3D → LoadAnnotations3D含 2D/3D 框、中心点 centers_2d 与深度 depths→ Resize(1242, 375) keep_ratio → RandomFlip3D水平翻转概率 0.5→ Pack3DDetInputs测试管线仅保留读图、Resize 与打包评估使用KittiMetric与Det3DLocalVisualizer。训练与推理使用 mmdetection3d 的标准入口 tools/train.py 与 tools/test.py单卡/多卡命令模板KITTI 数据需按 docs/zh_cn/user_guides/dataset_prepare.md 准备好data/kitti/目录并将data_root指向对应位置# 单卡训练6x 学习率调度即约 1440 epoch 量级按 2x4 配置 python tools/train.py configs/monoflex/monoflex_dla34_pytorch_dlaneck_gn-all_2x4_6x_kitti-mono3d.py # 多卡分布式训练2 卡对应论文的 2x4 配置 bash tools/dist_train.sh configs/monoflex/monoflex_dla34_pytorch_dlaneck_gn-all_2x4_6x_kitti-mono3d.py 2 # 使用官方权重评估权重下载地址见 metafile.yml 的 Weights 字段 python tools/test.py configs/monoflex/monoflex_dla34_pytorch_dlaneck_gn-all_2x4_6x_kitti-mono3d.py /path/to/checkpoint.pth训练资源方面metafile.yml 记录该配置使用 2 张 V100 GPUTraining Resources: 2x V100 GPUS优化器为 Adam显存占用约 9.64 GB。测试验证与工程可靠性仓库为 MonoFlex 提供了两层单元测试test_monoflex_head.py以num_classes3、edge_fusion_inds[(1, 0)]、edge_heatmap_ratio1/8等参数实例化 head验证前向输出cls_score[1,3,32,32]、out_reg[1,50,32,32]test_monoflex_bbox_coder.py验证encode/decode全链路产物形状覆盖 2D 框、尺寸、偏移、关键点、朝向、直接/关键点/集成深度及两组不确定性。这两组测试为自定义修改如调整group_reg_dims、增减关键点组、切换depth_mode提供了回归基线是实验迭代时可复用的规格说明书。引用若在论文或工作中使用 MonoFlex可按 README 提供的 BibTeX 引用InProceedings{MonoFlex, author {Zhang, Yunpeng and Lu, Jiwen and Zhou, Jie}, title {Objects Are Different: Flexible Monocular 3D Object Detection}, booktitle {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)}, month {June}, year {2021}, pages {3289-3298} }同时建议在实现层面引用 mmdetection3d 的复现配置见 configs/monoflex/metafile.yml 的Code与Config字段。综上MonoFlex 通过边缘特征融合 椭圆高斯热图与不确定性引导的深度集成两套机制为单目 3D 检测中目标分布不均、截断目标难优化这一痛点提供了可直接复用的工程范式其 head 与 coder 的解耦设计也使其易于在 mmdetection3d 中作为模块组合进新的单目检测框架。赞分享人工智能计算机视觉深度学习自动驾驶【免费下载链接】mmdetection3dOpenMMLabs next-generation platform for general 3D object detection.项目地址https://gitcode.com/gh_mirrors/mm/mmdetection3d点击查看免费下载相关推荐SMOKE 单目 3D 目标检测算法在 mmdetection3d 中的实现与 KITTI 实战指南SMOKE 单目 3D 目标检测算法在 mmdetection3d 中的实现与 KITTI 实战指南 本文基于 mmdetection3d 仓库中 config人工智能计算机视觉深度学习自动驾驶MMDetection3D 全面解析OpenMMLab 通用 3D 目标检测平台的特性、模型库与上手实战MMDetection3D 全面解析OpenMMLab 通用 3D 目标检测平台的特性、模型库与上手实战 导读 本文以 MMDetection3D 官方 R人工智能计算机视觉深度学习自动驾驶mmdetection3d 中的 FCOS3D单目 3D 目标检测的端到端配置与实战指南mmdetection3d 中的 FCOS3D单目 3D 目标检测的端到端配置与实战指南 FCOS3D 是 OpenMMLab 在 mmdetection3d人工智能计算机视觉深度学习自动驾驶上一篇Honey Select 2中文补丁3分钟完成汉化与100插件一键安装下一篇小爱音箱接入大模型MiGPT 部署与配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进