地平线X3芯片内置自研BPU(AI加速核),针对AIoT与自动驾驶场景进行了软硬件协同优化。在功耗不变的前提下,AI计算性能实现了数倍提升。X3与J3芯片各集成两个伯努利2.0 BPU核心,显著增强对先进CNN网络的支持,同时降低DDR带宽占用,能够高效完成实时像素级视频分割与结构化视频分析等任务。
注:更多细节请参考官方芯片开发手册,此处不再赘述。
1. 图片分类任务演示
我们首先使用系统自带的样例程序进行图片分类测试,验证模型效果。
切换到目标目录:
cd /app/ai_inference/01_basic_sample/
sudo python3 ./test_mobilenetv1.py
该脚本对一张斑马图片执行分类,输出结果如下:
========== Classification result ==========
cls id: 340 Confidence: 0.991851
标签340对应'zebra',分类准确。为验证模型鲁棒性,我们更换了多张图片进行测试。发现背景干净、特征明显的图片(如金鱼)置信度高达0.999884,标签1正确识别为'goldfish, Carassius auratus'。当然也存在误判情况:对玉米进行检测时,结果输出为998: 'ear, spike, capitulum',置信度0.753721,出现了明显偏差。
========== Classification result ==========
cls id: 1 Confidence: 0.999884
========== Classification result ==========
cls id: 998 Confidence: 0.753721
2. FCOS目标检测快速验证
接着运行目标检测样例,快速验证FCOS模型在实时场景下的表现:
cd /app/ai_inference/02_usb_camera_sample/
python3 usb_camera_fcos.py
之前已快速展示过效果,此处将代码拆分为五个部分进行详细分析:
模型加载与正向推理采用地平线封装的接口,来自from hobot_dnn import pyeasy_dnn as dnn;HDMI显示则通过vio封装实现,来自from hobot_vio import libsrcampy as srcampy。加载的模型是经由地平线工具链编译的bin文件:fcos_512x512_nv12.bin。运行时打印了输入输出张量信息:
tensor type: NV12_SEPARATE
data type: uint8
layout: NCHW
shape: (1, 3, 512, 512)
15
tensor type: float32
...
tensor type: float32
shape: (1, 4, 4, 1)
输入为512x512像素图像,输出包含15个张量,分别对应检测框坐标、类别、置信度得分等关键信息。
3. 改用YOLOv5进行目标检测
接下来我们尝试使用YOLOv5模型进行目标检测。工具链中已包含编译好的YOLOv5模型,可直接调用。相关文件位于horizon_xj3_open_explorer_v1.11.4_20220413/ddk/samples/ai_toolchain/model_zoo/runtime/yolov5。只需在usb_camera_fcos.py中替换模型路径:
models = dnn.load('../models/yolov5_672x672_nv12.bin')
打印输入输出信息,发现输入尺寸为(1, 3, 672, 672),输出为3层张量,意味着后处理逻辑需要重写。
tensor type: NV12_SEPARATE
data type: uint8
layout: NCHW
shape: (1, 3, 672, 672)
3
tensor type: float32
layout: NHWC
shape: (1, 84, 84, 255)
tensor type: float32
shape: (1, 42, 42, 255)
tensor type: float32
shape: (1, 21, 21, 255)
查阅地平线对YOLOv5后处理的官方说明,在horizon_xj3_open_explorer_v1.11.4_20220413/ddk/samples/ai_toolchain/horizon_model_convert_sample/04_detection/03_yolov5/mapper中有一段描述:
1.4 对于 YOLOv5 模型,我们在模型结构上的修改点主要在于几个输出节点处。由于目前的浮点转换工具链暂时不支持 5 维的 Reshape,所以我们在 prototxt中进行了删除,并将其移至后处理中执行。同时我们还添加了一个 transpose 算子,使该节点将以 NHWC 进行输出。这是因为在地平线芯片中, BPU 硬件本身以 NHWC 的layout 运行,这样修改后可以让 BPU 直接输出结果,而不在量化模型中引入额外的transpose。 详情请见文档中benchmark部分的图文介绍
由此可知:YOLOv5采用异构量化方案,部分网络在后处理中执行,因此会引入额外耗时。参考地平线公开的YOLOv5代码,主要修改后处理部分并调整类别展示逻辑。
检测结果:
执行以下命令:
python3 usb_camera_yolov5.py
检测效果出色,环境中的大部分物体均能实时识别,且置信度较高。
我们统计了各阶段耗时,根据场景复杂度,整体时间在0.5~0.8秒之间。主要统计了cv_time(图像获取并缩放到模型输入尺寸)、forward_time(模型正向推理)、postprocess_time(后处理):
time: 0.8004379272460938
cv_time = 0.15749073028564453
Forward_time = 0.06625533103942871
postprocess_time= 0.38094043731689453
chair is in the picture with confidence:0.8259
pottedplant is in the picture with confidence:0.7951
tvmonitor is in the picture with confidence:0.7798
...
可以看到,量化后的模型正向推理时间极短(约66ms),但后处理与显示环节占用了大部分时间,仍有进一步优化的空间。
4. 使用工具链量化模型
地平线工具链提供两种量化方式,我们采用浮点转定点方案,该方案具有最佳通用性。具体操作可参考官方配套视频。首先下载docker文件,安装后读取镜像:
docker image ls
docker run -it hub.hobot.cc/aitools/ai_toolchain_centos_7_xj3:v2.1.7 /bin/bash
镜像中已包含YOLOv5s的相关内容,可直接快速部署:
cd /open_explorer/horizon_xj3_open_explorer_v2.1.7_20220520/ddk/samples/ai_toolchain/horizon_model_convert_sample/04_detection/03_yolov5s/mapper
bash 01_check.sh
bash 02_preprocess.sh
bash 03_build.sh # 这一步耗时较长
完成后,在model_output目录下得到yolov5s_672x672_nv12.bin。模型格式与之前使用的完全一致,直接替换板子上的代码运行,效果与YOLO官方模型保持一致。

