Thank you for your post, xuehongbo! You’re asking for help with converting a trained model from BT (likely a custom or proprietary format) to ONNX format — and you mentioned that AI-generated code isn’t working well. This is a common challenge in the AI/ML deployment pipeline.
Since this is a 求助帖 (help request) under the 算法工具链 (Algorithm Toolchain) category and tagged with RDK X3, I’ll try to find relevant resources or similar discussions that might help you.
Let me search for related topics in the forum first:
您好,感谢您的提问!您希望获得将训练好的模型(可能是BT格式)转换为ONNX格式的代码,尤其是在RDK X3平台上使用。
从论坛搜索结果来看,目前没有直接提供“bt转onnx”的通用代码,但我们可以为您提供一个基于现有工具链和社区经验的完整解决方案,帮助您完成模型转换。
问题分析
- “bt”格式:通常指代的是地平线(Horizon Robotics)的自定义模型格式,可能来自其训练框架(如
hb_model或hb_mapper)。 - 目标格式:ONNX(Open Neural Network Exchange),是跨平台、可移植的模型格式,便于后续量化、编译和部署。
- 当前痛点:AI生成的转换代码效果不佳,说明需要手动配置或使用官方工具链。
推荐解决方案:使用 hb_mapper 工具链进行转换
地平线官方提供了完整的模型转换工具链,包括从原始模型(如PyTorch、TensorFlow)到ONNX,再到BPU优化的全流程。以下是标准操作步骤:
步骤一:准备环境
确保您已安装以下工具:
- 地平线开发者工具包(如
horizon_xj3_open_explorer) - Python 3.6+ 环境
- ONNX 模型支持库(
onnx,onnxruntime)
pip install onnx onnxruntime
步骤二:创建配置文件(config.yaml)
这是关键一步,用于指定输入/输出、模型路径、编译参数等。
# config.yaml 示例
model_parameters:
onnx_model: "your_model.onnx" # 输出的ONNX模型文件名
march: "bernoulli2" # 编译目标架构(X3常用)
output_model_file_prefix: "converted_model"
working_dir: "./model_output"
input_parameters:
input_name: "images" # 输入张量名称
input_type_train: "float32" # 训练时数据类型
input_batch: 1 # 批次大小
input_layout_train: "NCHW" # 数据布局
input_shape: "1x3x416x416" # 输入尺寸
calibration_parameters:
cal_data_dir: "calibration_data" # 校准数据目录
cal_data_type: "float32" # 校准数据类型
calibration_type: "kl" # 校准方法
compiler_parameters:
compile_mode: "latency" # 编译模式(latency / throughput)
debug: true # 是否开启调试信息
input_source: {"images": "ddr"} # 输入来源(ddr / pyramid)
core_num: 1 # 使用核心数
optimize_level: "O2" # 优化等级(O0/O1/O2/O3)
提示:请根据您的实际模型输入尺寸修改
input_shape和input_name。
步骤三:执行转换命令
在终端中运行:
hb_mapper makertbin --config config.yaml --model-type onnx
这会自动:
- 解析ONNX模型
- 优化算子
- 校准量化(如果启用)
- 编译为BPU可执行格式(
.hbm或.bin)
常见错误与解决办法
错误1:Segmentation fault
→ 通常是内存不足或编译器bug。尝试:
- 降低
optimize_level为O1或O0 - 增加Docker内存限制(如果是容器环境)
- 升级到最新版工具链(如
OE 2.6.2+)
错误2:Non-zero status code returned while running Reshape node
→ 表明ONNX模型中存在不兼容的reshape操作。建议:
- 使用
onnx-simplifier简化模型:pip install onnx-simplifier python -m onnxsim your_model.onnx simplified_model.onnx - 或者在模型导出时避免使用动态reshape。
错误3:不支持某些算子(如 ReduceMax, Sub)
→ 这些算子在BPU上默认不支持,需手动替换或移除。可在 config.yaml 中设置:
custom_op:
- name: "ReduceMax"
type: "cpu"
- name: "Sub"
type: "cpu"
然后在模型转换时,这些算子会被强制放在CPU上运行,避免BPU崩溃。
额外技巧:自定义算子支持(高级用户)
如果您需要添加自定义算子(如Transformer、Attention模块),可以:
- 在
custom_op中注册新算子; - 编写对应的C++实现(参考官方文档);
- 通过
hbdk编译并链接进最终模型。
官方文档:地平线模型转换指南
总结:推荐操作流程
| 步骤 | 内容 |
|---|---|
准备ONNX模型(确保能用 onnx.load() 加载) |
|
创建 config.yaml 配置文件(重点!) |
|
运行 hb_mapper makertbin 转换 |
|
| 处理报错:调整优化级别、简化模型、禁用不支持算子 | |
测试推理:使用 hobot_dnn 库加载 .bin 文件进行部署 |
附赠:一键脚本模板(convert.sh)
#!/bin/bash
echo "开始转换模型..."
hb_mapper makertbin --config config.yaml --model-type onnx
if [ $? -eq 0 ]; then
echo "✅ 转换成功!输出文件位于 ./model_output/"
else
echo "❌ 转换失败,请检查 config.yaml 或升级工具链版本。"
fi
保存为 convert.sh,赋予执行权限:
chmod +x convert.sh
./convert.sh
参考资源
如果您能提供具体的模型结构(如输入维度、是否含Transformer)、使用的训练框架(PyTorch/TensorFlow),我可以为您定制一份专属的转换配置文件和脚本!
祝您转换顺利,早日部署成功!![]()
如有其他问题,欢迎随时提问!
回复结束,感谢您的提问!