【小白说】【代码拆解】RoMe: Towards Large Scale Road Surface Reconstruction via Mesh Representation

张开发
2026/4/13 19:36:33 15 分钟阅读

分享文章

【小白说】【代码拆解】RoMe: Towards Large Scale Road Surface Reconstruction via Mesh Representation
文章目录论文相关信息文件结构拆解代码执行顺序一、训练流程Training FlowTODO论文相关信息RoMe: Towards Large Scale Road Surface Reconstruction via Mesh Representation10.48550/arXiv.2306.11368文件结构拆解/root/autodl-tmp/RoMe/RoMe/scripts/train.py主训练的循环入口/root/autodl-tmp/RoMe/RoMe/scripts/eval.py模型评估的入口/root/autodl-tmp/RoMe/RoMe/scripts/select_nusc_scenes.pynuScenes场景筛选工具这里功能不是筛选路面的场景是根据地理位置筛选数据集按照城市空间范围或天气、时间等。如果需要在特定场景训练那么就可以通过这个工具然后找到nuScenes场景车辆轨迹经过这个区域然后填入配置文件/root/autodl-tmp/RoMe/RoMe/scripts/mask2former_infer/inference.pyMask2Former分割推理 这里是生成语义分割标签的预处理脚本O. M训练需要语义分割的标签比如道路、车辆、行人类别。但nuisance、kitti这种原始数据只提供RGB图像不提供语义分割的表现所以流程是先调用预训练的mark two former模型也就是Facebook的SOTA分割模型然后对每帧图像做语义分割然后将预测的分割结果保存为PNG标签图。总的来说就是把原始图像在原始图像的基础上生成分割的标签/root/autodl-tmp/RoMe/RoMe/scripts/mask2former_infer/kitti_dataset.pyKITTI数据适配器这个遍历kit t的数据目录然后收集所有的图像路径需要适配是因为它的数据是按照特定格式的目录结构存储而markdu. Former推理是需要一个图像路径批量处理所以这里就是遍历指定的序列和相机目录然后把它收集成列表返回帮助mark two former批量找到要推理的图像文件/root/autodl-tmp/RoMe/RoMe/scripts/mask2former_infer/nuscenes_dataset.py和上面的KITTI类似也是收集路径/root/autodl-tmp/RoMe/RoMe/scripts/mask2former_infer/nuscenes_scenes.py这个同样是路径遍历的工具但是按照场景级别筛选只取指定场景列表中的图像按照指定场景的名称列表去做筛选/root/autodl-tmp/RoMe/RoMe/datasets/base.py数据集抽象基类提供相机坐标转换、图像筛选、航点管理这个是数据集的抽象基类就是如果说直接继承torch.utils.data.Dataset那么每个数据集都要重写一遍一些方法那么这个文件的话把通用功能抽离出来子类的话只需关注各自的数据加载差异/root/autodl-tmp/RoMe/RoMe/datasets/nusc.pynuScenes数据集加载包含外参计算、平面估计、2HZ→12HZ插值直接对接 nuScenes 数据集的文件/root/autodl-tmp/RoMe/RoMe/datasets/kitti.pyKITTI数据集加载支持序列级别数据组织和时序处理和上面类似也是直接对接models/voxel.pyBEV蜂巢网格生成与裁剪支持RGB/Label/Z多配置组合RoMe 的核心把路面表面建模成一个可以优化的蜂巢状的2D网格这里的蜂巢状就是三角形的交错每个顶点周围都是6个三角形这样渲染效果更好它这里本质上用的就是三角面片用的PyTorch 3Dmodels/surface_model.py位置编码高度估计MLPFeatureMLP处理带特征的深度估计实际在项目里面没有被调用没有任何文件去import遗留代码。它主要定义了hat. MLP是位置编码预测高度但没有接入训练流程早期可能用MLP学习高度分布但是后来直接优化顶点Z值但是没有删这个文件models/pose_model.py可学习相机外参旋转/平移优化模型优化相机外参就用于校准这个相机安装的误差就是数据集它提供的相机外参是理论值实际相机安装的话它有微小的偏差。这里就是让相机外参变成可学习的然后渲染总是反向传播自动找到最优相机安装位置models/loss.pyL1/MSE掩码损失、交叉熵分割损失、SSIM、网格平滑损失ROME的四个损失函数全部定义包括RGB渲染损失、语义分割损失、Mse渲染损失和网格平滑正则化损失都在这里面啊。以及训练的总损失utils/geometry.py蜂巢网格创建、网格裁剪、最远点采样算法这里面的蜂巢网格创建用解析几何加G五行偏移最原点采样。为什么要用最原点采样就是点均匀分布每个采样点之间有足够间隔。在Rome里面每个相机轨迹点太多直接训练太慢所以用FPS最远点采样筛选出一批次最关键的行点每个行点周围的数据一起训练确保覆盖的均匀训练的高效utils/renderer.pyPyTorch3D网格渲染管线透视/正交相机支持这里的话是3D渲染引擎把网格拍扁成2D的图像从BV网格到透视视角的图像渲染出的图像要和真实图像对比损失没有渲染的话就没有loss就没办法反向传播啊。所以这里的话主要就是一个3D渲染的引擎utils/visualizer.pyBEV可视化、深度图着色、OBJ网格导出utils/metrics.py语义分割mIoU、交集/并集统计计算utils/image.py语义标签着色、图像去畸变utils/plane_fit.py地面平面稳健估计这里的稳健性估计是因为n nu senses提供的雷达点云是按照车辆轨迹采集的。如果行驶路线近似直线直接拟合会出现问题如果车辆按直线行驶点云只分布在一条线上无数个平面都能穿过这条线就会导致拟合不唯一。所以的话这里稳健性估计让它的Z轴校准更加可靠它这里处理的就是点云数据啊X, Y坐标Rome只用雷达的轨迹点不是密集点云。点云在这里用于初始化阶段校准地面高度之后的话是不参与训练utils/lie_group_helper.pySE(3)/SO(3)群元素操作辅助这里是坐标变换就是在就是算物体在这个位置看整个事件是看是什么样子的utils/wandb_loggers.pyWandB训练日志记录代码执行顺序一、训练流程Training Flow这里最终是两个独立的模型因为数据集不同训练配置也不同BEV、感知范围、分辨率、训练轮数等关键参数都不同训练输出各自隔离所以最终会生成专用于这两个数据集的一个模型nuScenes这个主要是道路城市道路停车场复杂场景以城市为主。路面场景的话不如kitti I纯粹KITTI这个数据集更小一些更加专注于道路场景所以接下来以KITTI为例分析TODO进入configs/local_kitti.yaml进入scripts/train.py

更多文章