Fast-BEV 自定义数据标定与 nuScenes 格式转换方案 适用范围仅修改推理、不重新训练前视单目CAM_FRONT × 4 帧沿用原 Fast-BEV checkpoint。本文中的“nuScenes 格式”分为两种Fast-BEV 可直接读取的最小infos_test.pkl当前方案推荐完整 nuScenes 原生 JSON 数据库只有后续训练、官方 devkit 浏览或标准评测时才需要。1. 结论当前任务不建议直接搭建完整 nuScenes 数据库。对于 Fast-BEV 推理核心是标定前视相机内参标定相机相对车体坐标系的外参对图像预去畸变为连续四帧提供时间戳和车辆位姿生成 Fast-BEV 旧版NuScenesDataset能读取的nuscenes_infos_custom_test_4d.pkl。Fast-BEV 的数据读取代码主要使用cam_intrinsicsensor2ego_rotationsensor2ego_translationsensor2lidar_rotationsensor2lidar_translationego2global_rotationego2global_translation当前帧和prev/next时序图像因此推理阶段不需要sample_annotation.json、instance.json、类别表和 3D 真值框。2. 推荐标定工具2.1 当前前视单目方案的首选组合标定内容推荐工具推荐程度说明相机内参、畸变OpenCV ChArUco★★★★★部署简单角点精度高允许部分遮挡相机—车体外参OpenCalib / SensorsCalibration 的 SensorX2car 或标定板方案★★★★★可得到 camera→ego/car 的旋转和平移相机—IMU 与时间偏移Kalibr★★★★☆适合相机—IMU空间和时间联合标定ROS 2 下交互式外参检查Autoware / TIER IV calibration tools★★★★☆可在 RViz 中实时观察投影和修改外参纯手工粗标TF RViz 投影微调★★☆☆☆只能用于初值不建议作为最终结果2.2 推荐落地顺序OpenCV ChArUco 内参 ↓ 图像去畸变与新内参 K_rect ↓ OpenCalib / 标定板求 camera→ego 外参 ↓ Kalibr 或时间戳检查求时间偏移存在 IMU 时 ↓ LiDAR/地面/车道线投影验证 ↓ 写入 Fast-BEV calibration JSON2.3 为什么优先使用 ChArUco相较普通棋盘格ChArUco允许标定板部分离开画面对遮挡更鲁棒角点精度通常高于直接使用 ArUco 角点更适合车载广角相机。针孔相机使用 OpenCVcalibrateCamera鱼眼相机使用 OpenCV fisheye 模型。标定使用的图像分辨率、ISP 裁剪方式、缩放方式必须与推理一致。3. 必须得到的标定参数3.1 相机内参K [ fx 0 cx 0 fy cy 0 0 1 ]还需要保存原始畸变参数针孔模型k1, k2, p1, p2, k3...鱼眼模型k1, k2, k3, k4但 Fast-BEV 原始数据读取只直接使用cam_intrinsic不读取畸变系数。因此应当使用标定得到的K、D对原图去畸变将去畸变后的新内参K_rect写入cam_intrinsic推理时只读取去畸变图。不要把原始畸变图和去畸变后的K_rect混用。3.2 相机到车体外参统一定义p_ego R_sensor2ego · p_camera t_sensor2ego其中R_sensor2ego3×3 旋转矩阵t_sensor2ego相机坐标原点在车体坐标系中的位置保存为 nuScenes 四元数时使用[qw, qx, qy, qz]。建议车体坐标系x车辆前方 y车辆左方 z车辆上方常见 OpenCV 相机坐标系x图像右方 y图像下方 z镜头前方两者不能直接当成相同坐标系。3.3 时序位姿Fast-BEV 四帧融合需要把历史帧特征变换到当前帧。每一帧至少需要timestamp_us ego2global_translation [tx, ty, tz] ego2global_rotation [qw, qx, qy, qz]可来自GNSS/INS轮速计 IMULiDAR SLAM视觉惯性里程计已有 ROS/tf或 odometry。如果四帧全部写单位位姿等价于假设车辆完全静止。车辆运动时会产生 BEV 重影和位置偏差。4. 当前方案使用“虚拟 LIDAR_TOP”坐标系Fast-BEV 的旧版 nuScenes 数据接口以LIDAR_TOP作为 3D 参考坐标系。当前是纯相机推理可令virtual_lidar_frame ≡ ego_frame因此lidar2ego_rotation [1, 0, 0, 0] lidar2ego_translation [0, 0, 0] sensor2lidar_rotation sensor2ego_rotation sensor2lidar_translation sensor2ego_translation这里的虚拟 LiDAR 只用于保持 Fast-BEV 坐标接口一致不代表实际必须输入点云。配置中应保持input_modalitydict(use_lidarFalse,use_cameraTrue,)并在推理数据集上设置test_modeTruewith_velocityFalsesequentialTruen_times4prev_onlyTruetest_adj_ids[0,1,2]min_interval0max_interval2test_adj_ids必须与生成的prev列表顺序一致。5. 推荐目录结构data/custom_fastbev/ ├── calibration/ │ └── cam_front.json ├── samples/ │ ├── CAM_FRONT/ │ │ ├── 000000.jpg │ │ ├── 000001.jpg │ │ └── ... │ └── LIDAR_TOP/ │ └── dummy.bin ├── poses.csv # 可选但动态车辆强烈建议 └── nuscenes_infos_custom_test_4d.pklposes.csv格式timestamp_us,tx,ty,tz,qw,qx,qy,qz 1000000,0.0,0.0,0.0,1.0,0.0,0.0,0.0 1033333,0.15,0.0,0.0,0.99999,0.0,0.0,0.004若不提供poses.csv转换脚本会使用单位位姿只适合静止测试或先验证数据通路。6. 标定 JSON 模板{image_size:[1920,1080],camera_matrix:[[1200.0,0.0,960.0],[0.0,1200.0,540.0],[0.0,0.0,1.0]],distortion_model:plumb_bob,distortion_coefficients:[-0.1,0.03,0.0,0.0,0.0],images_are_rectified:true,sensor2ego_translation:[1.50,0.00,1.40],sensor2ego_rotation:[0.5,-0.5,0.5,-0.5]}注意上述数值仅为格式示例不能直接用于实际设备camera_matrix应填写去畸变后图像对应的K_rectsensor2ego_rotation是[qw, qx, qy, qz]外参方向必须是 camera/sensor → ego若标定工具输出 ego → camera必须先求逆。7. 变换方向检查假设标定工具输出齐次矩阵T_ego_camera其含义为p_camera T_ego_camera · p_egoFast-BEV 需要的是T_camera_ego因此T_camera_egonp.linalg.inv(T_ego_camera)对齐检查p_egoT_camera_ego p_camera不要只把平移取负。齐次变换求逆必须同时处理旋转和平移T [R t] [0 1] T^-1 [R^T -R^T t] [ 0 1 ]8. 生成 Fast-BEV 最小pkl配套脚本python build_fastbev_custom_infos.py\--data-root data/custom_fastbev\--calibdata/custom_fastbev/calibration/cam_front.json\--images-dir data/custom_fastbev/samples/CAM_FRONT\--posesdata/custom_fastbev/poses.csv\--fps30\--n-times4\--outputdata/custom_fastbev/nuscenes_infos_custom_test_4d.pkl无位姿时python build_fastbev_custom_infos.py\--data-root data/custom_fastbev\--calibdata/custom_fastbev/calibration/cam_front.json\--images-dir data/custom_fastbev/samples/CAM_FRONT\--fps30\--n-times4\--outputdata/custom_fastbev/nuscenes_infos_custom_test_4d.pkl脚本生成的顶层结构{infos:[{token:...,lidar_path:.../dummy.bin,sweeps:[],timestamp:1000000,lidar2ego_translation:[0,0,0],lidar2ego_rotation:[1,0,0,0],ego2global_translation:[...],ego2global_rotation:[...],cams:{CAM_FRONT:{data_path:...jpg,sensor2ego_translation:[...],sensor2ego_rotation:[...],ego2global_translation:[...],ego2global_rotation:[...],sensor2lidar_rotation:3x3,sensor2lidar_translation:[...],cam_intrinsic:3x3}},prev:[...],next:null}],metadata:{version:v1.0-custom-fastbev}}9. Fast-BEV 配置修改要点9.1 数据路径data_rootdata/custom_fastbev/ann_filedata_rootnuscenes_infos_custom_test_4d.pkl9.2 输入模态input_modalitydict(use_lidarFalse,use_cameraTrue,use_radarFalse,use_mapFalse,use_externalFalse,)9.3 时序参数sequentialTruen_times4prev_onlyTruetest_adj_ids[0,1,2]min_interval0max_interval29.4 单相机注意事项原始 nuScenes checkpoint 通常基于六相机训练。你当前前视单目方案已经要求修改推理数据流和视角数量因此需要确认数据加载器只输出CAM_FRONT × 4图像 batch/view 维度与修改后的模型入口一致不再硬编码六个相机名称img_metas中的lidar2img数量与输入图像数量一致checkpoint 权重不改变但视角减少会带来明显视野和精度损失只保留前视区域的检测结果避免解释为 360° 感知结果。10. 完整 nuScenes 原生格式何时需要只有在以下情况才建议生成完整v1.0-custom使用 nuScenes devkit 的NuScenes(...)类直接加载需要标准场景浏览和渲染需要训练需要 3D GT、类别、实例跟踪需要官方风格评测。最小原生表包括sensor.json calibrated_sensor.json ego_pose.json sample_data.json sample.json scene.json log.json若训练还必须增加category.json instance.json sample_annotation.json attribute.json visibility.json原生 nuScenes 中所有记录通过 token 关联calibrated_sensor外参以 ego 车体坐标系为参考相机图像应是已去畸变和校正后的图像rotation使用[w, x, y, z]sample_data保存文件、时间戳、标定 token 和 ego pose tokensample表示同步关键帧。对于当前仅推理任务生成这些表不会提升 Fast-BEV 结果只会增加转换和调试成本。11. 标定质量验收建议以下是工程建议值不是 nuScenes 官方硬性阈值。11.1 内参平均重投影误差建议 0.5 px广角镜头边缘误差建议 1.0 px标定图覆盖画面中心、四角、上下边缘至少包含近、中、远和不同倾角的标定板姿态固定焦镜头完成标定后不得改变焦距、分辨率、裁剪和数字变焦。11.2 外参投影到图像中的地面点应落在真实地面车辆、立柱和墙边缘应基本重合远距离不应出现随距离快速增大的固定方向偏差左右偏差通常对应 yaw 或横向平移错误上下偏差通常对应 pitch、相机高度或坐标轴方向错误图像整体镜像或旋转 90° 通常是坐标系定义错误。11.3 时间同步静止场景投影正确、运动场景错位优先排查时间偏移相机曝光时间建议使用曝光中点时间戳统一到微秒四帧排序必须严格单调不要用文件写入时间代替传感器采集时间。12. 必须实现的三项验证验证一去畸变图检查显示原图、去畸变图和标定板重投影点确认直线不弯曲且边缘没有明显异常拉伸。验证二外参投影检查将已知 3D 点、LiDAR 点或地面网格投影到图像p_img ~ K · T_ego_to_camera · p_ego只显示z_camera 0的点。验证三BEV 时序重合检查选取连续四帧将同一静态目标变换到当前帧 BEV静态物体应基本重合若随速度增大而错位检查时间同步和 ego pose若固定方向错位检查外参若只在图像边缘错位检查内参和去畸变。13. 推荐最终工具组合当前项目推荐相机内参OpenCV ChArUco 相机外参OpenCalib / SensorsCalibration 相机—IMUKalibr有 IMU 时 可视化验收ROS 2 RViz 自定义投影检查脚本 格式转换配套 build_fastbev_custom_infos.py不建议仅用卷尺和欧拉角作为最终外参未去畸变直接写内参将camera→ego和ego→camera混用把[qx,qy,qz,qw]直接写入 nuScenes[qw,qx,qy,qz]字段动态车辆四帧全部写单位位姿为纯推理任务强行构造完整 3D 标注数据库。单束线雷达适配说明当前雷达为单束线雷达/单点测距雷达不能按 16/32/64 线激光雷达使用。1. 对 Fast-BEV 数据格式的影响Fast-BEV 的主输入仍然是相机图像。建议保持input_modalitydict(use_lidarFalse,use_cameraTrue,use_radarFalse,)数据转换时继续使用virtual LIDAR_TOP ≡ ego也就是说lidar2ego_rotation [1, 0, 0, 0] lidar2ego_translation [0, 0, 0]LIDAR_TOP/dummy.bin仅用于兼容原有 nuScenes/Fast-BEV 数据接口不能把单束距离值伪装成完整点云。单束线雷达不具备以下能力生成稠密 3D 点云直接支持 Fast-BEV 的点云分支独立估计车辆周围 3D 障碍物尺寸使用常规多线 LiDAR—Camera 自动标定工具直接获得稳定结果提供 nuScenes 风格的完整LIDAR_TOP扫描。因此当前 checkpoint 的 BEV 检测仍然完全依赖图像。线雷达只能用于前方距离校验检测结果深度修正近距离安全触发时序稳定性辅助对特定目标进行单点距离约束。2. 单束线雷达坐标模型定义雷达坐标系x_r激光束正方向 y_r雷达左方 z_r雷达上方单次测距值为d时雷达坐标系中的测量点为p_radar [d, 0, 0, 1]^T转换到车体坐标系p_ego T_radar_to_ego · p_radar转换到相机坐标系p_camera T_ego_to_camera · p_ego投影到图像u ~ K_rect · p_camera只有满足以下条件时投影点才有效z_camera 0 d 0 测距状态有效3. 推荐标定方法不建议直接使用针对多线点云设计的 LiDAR—Camera 标定流程。推荐使用可见标定板进行平面约束标定。方法 AChArUco 平面板联合标定推荐使用一块足够大的 ChArUco 板并确保单束激光始终打在标定板有效区域内。每个采样姿态记录相机图像单束雷达距离d_i图像时间戳雷达时间戳ChArUco 板尺寸相机估计的标定板位姿。相机通过 ChArUco 得到标定板平面n_i^T p_camera b_i 0雷达测量点经过待求外参变换后必须落在该平面上n_i^T (R_radar_to_camera · [d_i, 0, 0]^T t_radar_to_camera) b_i 0通过多组不同距离、不同倾角、不同横向位置的标定板姿态联合优化R_radar_to_camera t_radar_to_camera time_offset建议采集2050 组有效姿态至少 3 个距离层级左、中、右多个位置上下和 yaw/pitch 不同倾角避免所有标定板姿态互相平行。只改变距离、不改变标定板方向会导致部分旋转和平移参数不可观。方法 B机械测量初值 图像投影微调适合传感器安装刚性强、标定板条件受限的情况。用卡尺、卷尺或三坐标测量雷达发射点相对base_link的位置根据安装面确定雷达光轴方向建立T_radar_to_ego初值在多个已知距离放置竖直平板将单束落点投影到相机图像优化 yaw、pitch 和平移使投影点落在实际激光击中位置。机械测量适合提供初值不建议作为唯一标定结果。方法 C带反光标记的专用靶板在 ChArUco 板中心或指定区域增加高反射材料图像中可直接识别靶板中心单束雷达容易获得稳定距离可通过移动靶板产生距离跳变用于估计时间偏移更适合户外强光和低纹理环境。4. 推荐工具调整标定任务推荐工具相机内参OpenCV ChArUco标定板相机位姿OpenCVsolvePnP/ ChArUco pose estimation单束雷达—相机外参自定义 Ceres Solver 或 SciPy least_squares 平面约束优化雷达—车体安装初值CAD、机械测量、ROS TF时间同步硬件触发优先否则使用距离跳变与图像事件相关性投影检查ROS 2 RViz / OpenCV 可视化多线 LiDAR 标定工具仅可参考流程不建议直接套用OpenCalib、Autoware 等工具多数假设输入为点云。单束雷达没有足够空间结构时通常需要自定义残差项或专用标定板。5. 时间同步建议单束雷达对时间偏移较敏感。推荐相机与雷达使用同一硬件时钟使用硬件触发或 PPS时间戳记录传感器采集时刻不使用 ROS 接收时刻在激光束前快速移动平板对比图像中平板穿过光束的时刻和距离突变时刻估计固定时间偏移Δt。动态融合时t_camera_corrected t_camera Δt6. 与 Fast-BEV 检测结果的融合方式单束雷达不应参与 Fast-BEV 图像特征编码。建议在后处理中融合。方案一单点距离校验若 Fast-BEV 检测框的图像投影区域覆盖雷达光束像素|z_bev - d_radar| threshold则提高该目标置信度否则标记为深度不一致。方案二沿雷达射线修正目标深度已知雷达射线在 ego 坐标系中的方向vp_radar_ego o d · v选择与该射线相交或距离最近的前向 BEV 目标并使用测距值修正其纵向位置。方案三安全距离独立输出不要强行把单束雷达测距写入 3D 检测框。可独立输出{front_range_m:4.82,range_valid:true,timestamp_us:123456789,source:single_beam_lidar}再由碰撞检测或安全决策模块使用。7. nuScenes 转换建议当前数据转换仍只生成CAM_FRONT × 4 帧 虚拟 LIDAR_TOP ego pose 相机内外参单束雷达数据建议单独保存data/custom_fastbev/single_beam_lidar/ranges.csv格式timestamp_us,range_m,status 1000000,5.24,1 1033333,5.18,1 1066667,0.00,0不建议把每个距离值转换成 nuScenesLIDAR_TOP/*.bin并交给 Fast-BEV 点云分支因为单点数据无法满足原模型的点云分布假设。8. 验收标准单束雷达外参验收建议多距离标定板投影点落在真实激光击中区域近、中、远距离投影误差方向一致且无明显系统偏差静止目标距离误差稳定车辆运动时图像事件与距离变化基本同步雷达射线在 BEV 中方向与车辆前向一致不出现左右镜像、上下翻转或光轴指向车后的情况。14. 参考实现依据Sense-GVT Fast-BEVnuScenes 数据目录、时序nuscenes_seq_converter.py和NuScenesDataset数据读取逻辑nuScenes devkitcalibrated_sensor、ego_pose、sample、sample_data数据结构OpenCVChArUco 相机标定ETH Zürich Kalibr多相机及相机—IMU时空标定PJLab OpenCalib / SensorsCalibration相机、LiDAR、IMU、车体坐标系标定Autoware / TIER IV calibration toolsROS 环境下交互式和标定板外参标定。