练一个centernet.hbm 模型
训练一个生成 centernet.hbm 的模型,核心是分为两阶段走:先在PC上用PyTorch等框架训练好一个浮点模型,再用地平线的工具链将它量化和编译成.hbm格式
。
下面的图表清晰地展示了整个流程。
🔬 第一阶段:浮点模型训练
这个阶段的目标是得到一个能正常工作的.onnx格式的浮点模型。关键挑战在于Align with your 3D output parser。
-
1. 环境搭建
你可以选择地平线官方提供的PyTorch开发环境(包括Docker镜像或本地安装)
,也可以使用更熟悉的CenterNet3D开源项目(如maudzung/CenterNet3D-PyTorch)自行搭建
-
。
-
2. 数据准备
模型的输入是关键:训练图像的尺寸须固定为512x960,色彩空间为BGR。对于标签,你得按照CenterNet3D的方式,为每个目标生成一个高斯热力图,并准备好其3D属性 -
。
-
3. 模型架构修改 (最重要)
这是整个训练任务中最关键的一步。你的模型输出必须与centernet_3d_output_parser.cpp完全匹配,这个解析器通过以下5个特定名称的“头”(Head)来获取3D信息
-
:
| 模块/函数 | 说明 |
|---|---|
heatmap (热力图) |
预测类别 |
size_2d (2D尺寸) |
输出维度: 2 |
offset_2d (2D偏移) |
输出维度: 2 |
depth (深度) |
输出维度: 2 |
offset_3d (3D偏移) |
输出维度: 3 |
size_3d (3D尺寸) |
输出维度: 3 |
heading (朝向) |
输出维度: 12 |
设置自定义模型输出头:
python
self.heads = {
'heatmap': num_class, # 类别数量
'offset_2d': 2, # 2D偏移量
'size_2d': 2, # 2D尺寸
'depth': 2, # 深度信息
'offset_3d': 2, # 3D偏移量
'size_3d': 3, # 3D尺寸 (长宽高)
'heading': 12 # 朝向角编码
}
-
4. 模型训练
使用修改好的架构在自定义3D数据集上训练浮点模型。为更快收敛,强烈建议使用在KITTI或COCO等大型数据集上预训练的模型作为起点。 -
5. 导出ONNX
训练完成后,将PyTorch模型导出为ONNX格式。这一步是连接两个阶段的桥梁。这里有个优化点:可以将后处理的一部分(比如解码)直接写入模型图,这样能减少部署后的开发工作量,提升推理效率
-
。
⚙️ 第二阶段:模型转换与编译
工具链的核心功能是模型量化、转换、编译和性能分析
。
-
1. 环境搭建:进入地平线工具链的Docker环境
首先,从地平线官网获取与你芯片匹配的工具链Docker镜像
。地平线强烈建议使用官方提供的Docker镜像以获得稳定一致的开发环境
-
。
-
2. 配置与量化
你需要准备三样东西:-
浮点模型 (ONNX): 上一步导出的
centernet3d.onnx。 -
校准数据集 (Calibration Data): 从训练集中挑选能代表真实场景的少量图片样本
-
-
。
-
YAML配置文件: 这是核心,需要定义输入节点、输出节点、量化校准参数(如
calibration_type)等。建议复制官方示例(如yolov5s_config.yaml)进行修改 -
-
。
-
-
3. 模型检查
使用hb_mapper checker命令检查模型算子的兼容性 -
。这一步会告诉模型转换工具来检查你的ONNX模型,确保所有算子都受支持,并预测运算将如何在BPU/CPU上分配。
-
4. 生成 .hbm 模型
最后,使用hb_mapper makertbin命令进行模型编译
-
。将上面准备好的模型、校准集和配置都喂给指令,就能生成最终的
centernet.hbm文件了。指令执行成功后,你就拿到了可以在RDK开发板上直接使用的最终产物。
常见问题排查
-
算子兼容性问题: 如果
hb_mapper checker报错,说明有算子不支持。这时可以尝试简化模型结构,或者在工具链支持列表里寻找替代方案
-
。
-
量化后精度下降: 这是常见问题。可以调整YAML中的校准参数,或尝试使用量化感知训练(QAT) 进行更精细的调优
- 。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)