📌 前言
随着智能场景的发展,越来越多的智能产品开始走进我们的生活。它们执行任务时需要具备“感知—决策—控制”的闭环能力,其中视觉感知系统承担了关键作用:检测障碍物、识别道路、理解环境。这背后,对高效部署模型提出了更高要求。
在本篇文章中,我将结合近期在地平线J系列平台上的一些思考,分享一个智能小车视觉模型部署的实践概要路径,涵盖:
✅ 场景理解与模型选择;
✅ 工具链 PTQ 流程落地;
✅ 常见问题排查与精度优化技巧;
✅ 面向部署的脚本结构与性能测试。
📍 1. 场景定义与模型选型
智能小车多部署在密闭室内或园区,主要关注以下目标:
- 人类关键部位检测(头、手、躯干等);
- 关键物体识别(包裹、障碍物、指示物、充电桩等);
- 区域理解与导航辅助(地标、线框、背景分割等)。
基于这些需求,我们选用了改进版的 YOLO-WorldV2-S 作为基础模型,在训练阶段支持自定义类别语义文本,并通过词嵌入增强其多类泛化能力。
🧰 2. 使用地平线工具链进行 PTQ 部署
我们采用地平线 OE v3.0.31 工具链,流程包括:
(1) 模型导出
通过 ONNX 或 TorchScript 导出模型结构,确保符合平台支持的算子范围。
(2) 精度感知量化(PTQ)
使用 horizon_model_convert_sample 中的 PTQ 示例为参考:
生成模拟校准数据;
- 配置 config.yaml;
- 运行 hb_compile 生成 .hbm 模型。
(3) 模型分析
使用 hb_model_info 结合编译过程日志 查看模型节点精度、计算路径(BPU/CPU)等信息,优化节点落点。
🔍 3. 精度调试与常见问题排查
在 PTQ 过程中,常见的精度问题包括:
- 中间节点量化误差大:Slice、Concat 等非计算型节点在精度统计中可能影响较大;
- LUT型算子影响精度:如 segment_lut;
- 模型存在动态Shape或反向算子(如 inverse):建议提前静态化并剔除。
调试技巧:
- 使用 ptq.debug 提供的脚本进行输出对比(浮点 vs 量化);
关注每类的最大score,检查是否预测偏向“person”等泛类;
- 合理调整 score_thr、topk 和 NMS 策略。
💻 4. Python 与 C++ 推理代码封装建议
为满足快速验证 + 终端部署双场景,建议构建:
- Python 脚本: 使用 HBRuntime 接口支持 .onnx / .bc 模型,便于快速可视化;
- C++ 工程: 参考 ucp_tutorial 示例,使用 hb_dnn_initialize、hb_dnn_infer 等 API 搭建完整流程,并集成 rapidjson 加载分类信息。
目录结构可参考如下:
⚙️ 5. 部署优化经验总结
维度 | 优化建议 |
|---|---|
模型精度 | 使用 class-specific NMS;合理设置类别词嵌入顺序 |
推理性能 | 尽量使用 int8 路径;图片预处理使用 nv12 输入格式直通 |
内存 | 减少中间节点输出;关注 BPU L1 能否容纳模型 tile |
工具链稳定性 | 使用 OE v3.0.31 或以上版本,支持更多 Transformer 结构 |
📢 结语
智能小车是嵌入式 AI 应用的绝佳载体,其视觉模型部署是提升其智能程度的关键环节。本文结合地平线工具链进行了部署实践与经验沉淀,希望能为类似应用提供参考。
