YOLOv5
本文档讲述如何在 NPU 上运行 YOLOv5。
信息
参考 Model Zoo 下载获取示例。
YOLOv5 示例目录结构:
$ tree ./
./
├── CMakeLists.txt
├── convert_model
│ ├── config_yml.py
│ ├── convert_model_env.sh
│ ├── python
│ │ ├── onnx_extract.py
│ │ └── yolov5s-sim.onnx
│ └── yolov5s_rt.onnx
├── figures
│ ├── dog.jpg
│ ├── onnx.jpg
│ ├── onnx-sim.jpg
│ ├── output.jpg
│ └── output_yolov5_uint8.png
├── main.cpp
├── model
│ ├── dog.jpg
│ ├── yolov5s_rt_uint8_a733.nb
│ └── yolov5s_rt_uint8_t527.nb
├── model_config.h
├── README.md
├── yolov5_post.cpp
└── yolov5_pre.cpp
模型转换
无需导出到 onnx 模型,直接使用仓库中提供的 yolov5s_rt.onnx 。
创建转换脚本的软链接
X86 Linux PC
cd convert_model/
./convert_model_env.sh
模型导入/量化/转换
需要先进入容器开发环境。可以参考 Model Zoo 下载中创建容器这一部分。
信息
不同平台请使用对应的 Docker 镜像:
- A733:ubuntu-npu:v2.0.10.1
- T527:ubuntu-npu:v1.8.11
X86 Linux PC
docker exec -it model-zoo /bin/bash
进入容器对应目录之后运行脚本。
X86 Linux PC
cd /workspace/examples/yolov5/convert_model/
X86 Linux PC
./pegasus_import.sh yolov5s_rt
./pegasus_quantize.sh yolov5s_rt uint8 12
- A733
- T527
X86 Linux PC
./pegasus_export_ovx_nbg.sh yolov5s_rt uint8 a733
X86 Linux PC
./pegasus_export_ovx_nbg.sh yolov5s_rt uint8 t527
导出的模型文件存放在../model目录。
编译示例
接下来可以编译示例,先 exit 退出容器,然后执行下面的命令编译示例。
首先需要配置第三方库和交叉编译工具链。
信息
如果你已经在其他示例中配置过第三方库和交叉编译工具链则可以跳过这一步。
X86 Linux PC
cd ../../../3rdparty/opencv/
unzip opencv-4.9.0-aarch64-linux-sunxi-glibc.zip
cd ../../0-toolchains/
需要先手动点击链接下载之后放到 0-toolchains/ 再执行下面的命令:
X86 Linux PC
tar -xvf gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz
X86 Linux PC
cd ../examples/yolov5/
- A733
- T527
X86 Linux PC
../build_linux.sh -t a733 -s debian11
X86 Linux PC
../build_linux.sh -t t527 -s debian11
模型部署
编译示例完成之后,示例会安装到 install 目录,可以使用 scp 传输到板端。
配置 NPU 驱动
信息
如果你已经在其他示例中配置过 NPU 驱动则可以跳过这一步。
将驱动库 scp 传输到板端的 lib 目录。
- A733 对应 common/lib_linux_aarch64/A733 目录
- T527 对应 common/lib_linux_aarch64/T527 目录
然后执行下面的命令导出到环境变量。
Radxa SBC
echo 'export LD_LIBRARY_PATH=$HOME/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
运行示例
配置好驱动之后就可以运行示例了。
提示
对于 T527 平台,你还需要参考 A5E 的板端启用 NPU文档先启用 NPU ,然后使用下面的命令增加当前用户使用 /dev/vipcore 的权限。
Radxa SBC
sudo chmod 777 /dev/vipcore
- A733
- T527
Radxa SBC
cd yolov5_demo_linux_a733/
Radxa SBC
chmod +x ./yolov5_demo_a733
./yolov5_demo_a733 -nb model/yolov5s_rt_uint8_a733.nb -i model/dog.jpg
运行结果如下:
$ ./yolov5_demo_a733 -nb model/yolov5s_rt_uint8_a733.nb -i model/dog.jpg
model_file=model/yolov5s_rt_uint8_a733.nb, input=model/dog.jpg, loop_count=1, malloc_mbyte=10
VIPLite driver software version 2.0.3.2-AW-2024-08-30
input 0 dim 3 640 640 1, data_format=2, quant_format=0, name=input/output[0], none-quant
output 0 dim 80 80 85 3, data_format=0, name=uid_20000_sub_uid_1_out_0, none-quant
output 1 dim 40 40 85 3, data_format=0, name=uid_20001_sub_uid_1_out_0, none-quant
output 2 dim 20 20 85 3, data_format=0, name=uid_20002_sub_uid_1_out_0, none-quant
nbg name=model/yolov5s_rt_uint8_a733.nb, size: 5564152.
create network 0: 11618 us.
prepare network: 2756 us.
buffer ptr: 0x3f0327c0, buffer size: 1228800
feed input cost: 19421 us.
network: 0, loop count: 1
run time for this network 0: 20142 us.
detection num: 3
16: 92%, [ 134, 226, 307, 545], dog
7: 69%, [ 471, 77, 689, 173], truck
1: 52%, [ 162, 125, 559, 423], bicycle
draw objects time : 32 ms
destroy npu finished.
~NpuUint.
此性能数据仅计算模型推理的时间消耗。如无特别说明,不包含预处理和后处理的时间消耗。
| SoC | NPU | 模型 | 输入分辨率 | 网络创建耗时 | 网络准备耗时 | 单帧推理耗时 | 后处理耗时 | 总耗时 | 帧率 |
|---|---|---|---|---|---|---|---|---|---|
| 全志 A733 | Vivante VIP9000 | yolov5s | 640×640 | 11.6 ms | 2.8 ms | 20.1 ms | 32.0 ms | 66.5 ms | 49.8 FPS |
Radxa SBC
cd yolov5_demo_linux_t527/
Radxa SBC
chmod +x ./yolov5_demo_t527
./yolov5_demo_t527 -nb model/yolov5s_rt_uint8_t527.nb -i model/dog.jpg
运行结果如下:
$ ./yolov5_demo_t527 -nb model/yolov5s_rt_uint8_t527.nb -i model/dog.jpg
model_file=model/yolov5s_rt_uint8_t527.nb, input=model/dog.jpg, loop_count=1, malloc_mbyte=10
VIPLite driver software version 1.13.0.0-AW-2023-10-19
input 0 dim 3 640 640 1, data_format=2, quant_format=0, name=input[0], none-quant
output 0 dim 80 80 85 3, data_format=0, name=uid_20000_sub_uid_1_out_0, none-quant
output 1 dim 40 40 85 3, data_format=0, name=uid_20001_sub_uid_1_out_0, none-quant
output 2 dim 20 20 85 3, data_format=0, name=uid_20002_sub_uid_1_out_0, none-quant
nbg name=model/yolov5s_rt_uint8_t527.nb, size: 6300672.
create network 0: 24270 us.
prepare network: 10842 us.
buffer ptr: 0x18296780, buffer size: 1228800
feed input cost: 90901 us.
network: 0, loop count: 1
run time for this network 0: 49985 us.
detection num: 3
16: 92%, [ 137, 229, 303, 539], dog
7: 69%, [ 471, 79, 687, 171], truck
1: 44%, [ 151, 120, 560, 429], bicycle
draw objects time : 81 ms
destroy npu finished.
~NpuUint.
此性能数据仅计算模型推理的时间消耗。如无特别说明,不包含预处理和后处理的时间消耗。
| SoC | NPU | 模型 | 输入分辨率 | 网络创建耗时 | 网络准备耗时 | 单帧推理耗时 | 后处理耗时 | 总耗时 | 帧率 |
|---|---|---|---|---|---|---|---|---|---|
| 全志 T527 | Vivante VIP9000 | yolov5s | 640×640 | 24.3 ms | 10.8 ms | 50.0 ms | 81.0 ms | 166.1 ms | 20.0 FPS |