我在基于地平线oe包部署Centerpoint的模型到板端时遇到检测失效问题,具体情况如下:我在自定义的四维度数据集上完成了Centerpoint模型训练,
1.由于自定义数据集没有nuscenes个时的验证文件,因此跳过了原流程中的基于nuscenes的各个验证阶段,
2.但我通过infer_hbir.py脚本直接通过bc文件进行推理和可视化,效果良好,模型的定点检查、编译流程均无报错,量化校准过程也顺利完成,检查结果状态正常;之后使用compile_perf_hbir.py脚本将模型转换为板端可部署的HBM文件,转化流程无报错,生成的模型文件正常;
3.但再半段编写ROS2节点调用转换后的HBM模型进行推理时,推理流程可正常运行,却出现模型输出的热力图置信度一直很低、同帧点云中无法检测到任何目标的问题。
4.想请教这种“PC端验证正常,转化流程无报错,但板端推理检测失效”的情况,常见的排查方向有哪些?
5.可能是模型转换、板端推理预处理/后处理、输入数据格式不匹配、模型定点精度损失,还是其他配置问题?
目前已经检查了特征归一化范围、体素数没有问题,ros2的节点编写也是按照训练时的模型配置文件来的,想问一下这种前处理和后处理的ros2节点咱们这儿是否有参考,使用的是horizon_j6_open_explorer_v3.8.1-py310_20260326.tar.gz工具链
你好!针对你在 RDK S100 部署 CenterPoint 模型遇到的“PC 端推理正常,板端 HBM 推理无检测”问题,这是一个典型的端侧部署一致性问题。
根据社区已有的 CenterPoint 参考算法文档(【参考算法】地平线 Centerpoint 参考算法-V1.2.1)以及常见部署案例,问题通常集中在前处理对齐、输入数据格式、后处理阈值或量化精度损失上。
以下是针对性的排查步骤和建议:
核心排查方向
1. 检查 ROS2 节点的前处理逻辑 (最常见原因)
PC 端 infer_hbir.py 通常直接调用 Python 预处理脚本,而 ROS2 节点往往需要自己实现或调用 DSP 库进行体素化(Voxelization)。
- 体素化参数对齐:确保 ROS2 节点中的
point_cloud_range、voxel_size、max_num_points、max_voxels 与训练 config 文件完全一致。任何一个浮点数精度差异都会导致特征图错位。
- 归一化范围:CenterPoint 参考算法中对输入特征做了归一化(
norm_range)。
- 检查 ROS2 节点是否对 x, y, z, intensity 等维度做了相同的归一化处理?
- 参考算法中默认归一化范围是
[-51.2, -51.2, -5.0, 0.0, 51.2, 51.2, 3.0, 255.0](具体看你的 config)。如果板端没做归一化或范围不对,模型输入分布会偏移,导致置信度极低。
- 数据维度顺序:
- 确认输入 Tensor 的 Shape 是否为
(1, 5, max_voxels, max_points) 或 (1, 5, max_points, max_voxels)(参考算法中有过 H/W 维度转换优化)。
- 确认
coors (体素坐标) 的生成逻辑是否与 PC 端一致(特别是坐标系的 origin 定义)。
2. 检查输入数据格式与坐标系
- 点云维度:你提到是“自定义四维度数据集”。
- 训练时如果是 4 维 (x,y,z,intensity),但模型 Config 或板端输入配置成了 5 维(带时间戳 t),会导致通道错位。
- 动作:检查编译生成的 HBM 模型的输入描述,确认通道数是 4 还是 5。ROS2 节点填充数据时,如果模型期待 5 维,你只填了 4 维,后面的数据会全部错位。
- 坐标系转换:
- PC 端可视化正常,说明点云本身没问题。但 ROS2 节点读取的点云坐标系(如
base_link 或 lidar_link)是否与模型训练时的坐标系一致?
- CenterPoint 对位置非常敏感,如果点云整体偏移了 10 米,可能所有目标都跑出了
point_cloud_range 范围,导致检测为空。
- 动作:在 ROS2 节点中打印一帧原始点云的
x, y 最大值和最小值,确认是否落在模型设定的检测范围内(如 [-51.2, 51.2])。
3. 检查后处理阈值 (NMS & Score Threshold)
- 置信度阈值:板端量化后,模型的输出分布可能发生变化。PC 端能检测到的阈值(如 0.1),在板端可能需要调整为 0.05 甚至更低。
- 动作:暂时将后处理中的
score_threshold 调得非常低(如 0.01),看是否有输出。如果有但框很乱,说明是阈值问题;如果还是没有,说明是前处理或模型本身问题。
- NMS 配置:检查板端后处理脚本中的 NMS 阈值是否与 PC 端一致。
4. 量化精度与模型转换验证
虽然你提到量化校准顺利,但“顺利”不代表“精度无损”。
- 中间层对比:
- 这是最硬核的排查方法。在 PC 端使用
infer_hbir.py 时,导出模型中间层(如 Backbone 输出、Heatmap 输出)的 Tensor 数据。
- 在板端 ROS2 节点中,同样抓取对应层的输出数据。
- 对比:计算两者的余弦相似度或均方误差。如果 Heatmap 输出差异巨大,说明前处理有问题;如果 Heatmap 相似但最后没框,说明后处理有问题。
- Simulator 验证:
- 使用工具链中的仿真工具(如
hrt_model_exec 或 Python 仿真脚本)在 PC 上模拟板端推理流程(加载 HBM 模型,使用与板端完全一致的预处理代码)。如果仿真也失败,说明是预处理代码写错了;如果仿真成功但板端失败,说明是板端环境或内存对齐问题。
建议的排查路径
-
第一步(最快验证):
- 在 ROS2 节点中,打印输入模型前的 Tensor 统计信息(Mean, Std, Max, Min)。
- 在 PC 端
infer_hbir.py 中,打印同一帧数据输入模型前的 Tensor 统计信息。
- 对比:如果两者差异明显(例如板端 Max 值是 PC 端的 10 倍,或者全是 0),直接定位到前处理代码。
-
第二步(参考官方实现):
- 地平线 OE 包中通常包含 CenterPoint 的参考 ROS2 节点或前处理库(DSP 库)。
- 查看路径:
ddk/samples/ai_benchmark/j5/qat/script/detection/centerpoint_pointpillar 或 ddk/samples/vdsp_rpc_sample。
- 强烈建议:不要完全自己手写前处理,尽量复用官方提供的
pointpillars_preprocess 库或参考其参数配置。你的工具链版本是 v3.8.1,请确认该版本对应的参考代码路径。
-
第三步(可视化调试):
- 在板端 ROS2 节点中,将模型输出的 Heatmap 或原始 Box 结果发布为一个 Topic。
- 在 PC 端通过
ros2 topic echo 或写一个简单的订阅节点,把板端的输出画出来。
- 如果 Heatmap 全是接近 0 的值,肯定是前处理或模型权重问题;如果 Heatmap 有峰值但被过滤了,是后处理阈值问题。
关于 ROS2 节点参考
社区目前公开的完整 CenterPoint ROS2 源码较少,但你可以参考以下资源进行拼接:
- 前处理参考:查阅 OE 包文档中关于
Voxelization 和 PillarFeatureNet 的 C++/DSP 实现说明。
- 后处理参考:参考算法文档中
CenterPointPostProcess 的逻辑,确保 NMS 和阈值筛选逻辑一致。
- 相关帖子:
- 雷达点云预处理:这篇帖子详细介绍了 J5/RDK 上的点云前处理优化和 DSP 代码,务必阅读,里面提到了
centerpoint 预处理代码的文件名称修改和优化细节,可能你的版本正好对应这个变更。
总结
既然 infer_hbir.py (PC) 正常,说明模型权重和结构没问题。问题 90% 出在 ROS2 节点的前处理(体素化 + 归一化)与 PC 端 Python 脚本不一致。
优先检查:
- 输入特征的归一化范围 (
norm_range) 是否硬编码错误?
- 点云坐标是否超出了
point_cloud_range?
- 是否复用了官方 DSP 库进行前处理?如果是手写的,建议切换为官方库测试。
如果需要更具体的代码片段对比,可以提供你 ROS2 节点中前处理部分的伪代码或关键参数配置。
你好 S100目前 只支持到3.7.0 ,
这个可以先验证一下bc 和 hbm 模型对同一数据输出是否保持一致 ,用hbm_infer工具介绍 - 地瓜算法工具链官方用户手册 来验证是否是模型的问题
centpoint手册应该有推理方案:激光雷达目标检测算法 | RDK DOC