跳到主要内容

物体检测模型:YOLOv5

提示

本文档旨在演示如何在 Allwinner T527/A733 系列芯片上运行板端推理 YOLOv5 物体检测模型。

此示例用 ultralytics/yolov5 中预训练好的 ONNX 格式模型为例子通过模型转换到板端推理做完整示例。

主板部署 YOLOv5 需要两个步骤

  • PC 端利用 ACUITY Toolkit 将不同框架下的模型转换成 NBG 格式模型
  • 板端利用 awnn API 板端推理模型

下载 ai-sdk 示例仓库

X86 PC / Device
git clone https://github.com/ZIFENG278/ai-sdk.git

PC 端模型转换

提示

Radxa 已提供预转换好的 yolov5.nb 模型,用户可直接参考 板端推理 YOLOv5 跳过 PC 端模型转换章节

提示

yolov5 示例所使用的文件已经包含在ai-sdk 示例仓库models/yolov5s-sim

  • 进入 ACUITY Toolkit Docker 容器

    ACUTIY Toolkit Docker 环境准备请参考 ACUITY Toolkit 环境配置

    配置环境变量

    X86 Linux PC
    cd ai-sdk/models
    source env.sh v3 #NPU_VERSION

    A733 选择 v3, T527 选择 v2

    提示

    NPU 版本选择请参考 NPU 版本对照表

  • 下载 yolov5s onnx 模型

    X86 Linux PC
    mkdir yolov5s-sim && cd yolov5s-sim
    wget https://github.com/ultralytics/yolov5/releases/download/v6.0/yolov5s.onnx
  • 固定输入

    使用 NPU 推理仅接受固定输入尺寸,这里使用 onnxsim 进行输入固定

    X86 Linux PC
    pip3 install onnxsim onnxruntime
    onnxsim yolov5s.onnx yolov5s-sim.onnx --overwrite-input-shape 1,3,640,640
  • 制作量化校准集合

    使用适量图片做量化校准集合,量化图片以图片路经形式保存在 dataset.txt

    X86 Linux PC
    vim dataset.txt
    images/COCO_train2014_000000000529.jpg
    images/COCO_train2014_000000001183.jpg
    images/COCO_train2014_000000002349.jpg
    images/COCO_train2014_000000003685.jpg
    images/COCO_train2014_000000004463.jpg
    images/dog.jpg
  • 制作模型输入输出文件

    可使用 netron 确认 onnx 模型输入输出的名字

    X86 Linux PC
    vim inputs_outputs.txt
    --inputs images --input-size-list '3,640,640' --outputs '350 498 646'

    yolov5s in/output name

  • 目录包含文件

    .
    |-- dataset.txt
    |-- images
    | |-- COCO_train2014_000000000529.jpg
    | |-- COCO_train2014_000000001183.jpg
    | |-- COCO_train2014_000000002349.jpg
    | |-- COCO_train2014_000000003685.jpg
    | |-- COCO_train2014_000000004463.jpg
    | `-- dog.jpg
    |-- inputs_outputs.txt
    |-- yolov5s-sim.onnx
  • 解析模型

    提示

    pegasus 脚本在 ai-sdk/scripts 中,可复制到 models 目录中

    使用 pegasus_import.sh 将模型解析为 IR 中见表达式,会得到 yolov5s-sim.json 包含模型结构 和 yolov5s-sim.data 包含模型权重

    X86 Linux PC
    ./pegasus_import.sh yolov5s-sim/
  • 修改 yolov5s-sim_inputmeta.yml 文件

    这里修改 scale 值, 根据公式 scale = 1 / std

    scale = 1 / 255
    scale = 0.00392157
    input_meta:
    databases:
    - path: dataset.txt
    type: TEXT
    ports:
    - lid: images_208
    category: image
    dtype: float32
    sparse: false
    tensor_name:
    layout: nchw
    shape:
    - 1
    - 3
    - 640
    - 640
    fitting: scale
    preprocess:
    reverse_channel: true
    mean:
    - 0
    - 0
    - 0
    scale:
    - 0.00392157
    - 0.00392157
    - 0.00392157
    preproc_node_params:
    add_preproc_node: false
    preproc_type: IMAGE_RGB
    # preproc_dtype_converter:
    # quantizer: asymmetric_affine
    # qtype: uint8
    # scale: 1.0
    # zero_point: 0
    preproc_image_size:
    - 640
    - 640
    preproc_crop:
    enable_preproc_crop: false
    crop_rect:
    - 0
    - 0
    - 640
    - 640
    preproc_perm:
    - 0
    - 1
    - 2
    - 3
    redirect_to_output: false
  • 量化模型

    使用 pegasus_quantize.sh 将模型量化成 uint8 类型

    X86 Linux PC
    ./pegasus_quantize.sh yolov5s-sim/ uint8 10
  • 编译模型

    使用 ./pegasus_export_ovx.sh 将模型量编译为 NBG 模型格式

    X86 Linux PC
    ./pegasus_export_ovx.sh yolov5s-sim/ uint8

    NBG 模型保存在 yolov5s-sim/wksp/yolov5s-sim_uint8_nbg_unify/network_binary.nb

板端推理 YOLOv5

进入 yolov5 示例代码文件目录路经

Device
cd ai-sdk/examples/yolov5

编译示例

Device
make AI_SDK_PLATFORM=a733
make install AI_SDK_PLATFORM=a733 INSTALL_PREFIX=./

参数解析:

AI_SDK_PLATFORM: 指定 SoC,可选 a733, t527

INSTALL_PREFIX: 指定安装路经

运行示例

导入环境变量

Device
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/rock/ai-sdk/viplite-tina/lib/aarch64-none-linux-gnu/NPU_VERSION # NPU_SW_VERSION
提示

指定 NPU_SW_VERSION, A733 选择 v2.0, T527 选择 v1.13, NPU 信息对照请参考 NPU 版本对照表

进入示例安装目录

Device
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/rock/ai-sdk/viplite-tina/lib/aarch64-none-linux-gnu/NPU_VERSION # NPU_SW_VERSION
cd INSTALL_PREFIX/etc/npu/yolov5
# ./yolov5 nbg_model input_picture
./yolov5 ./model/yolov5.nb ./input_data/dog.jpg
提示

示例会自动安装 radxa 提供的 yolov5.nb 模型,这里可手动指定用户转换的 NBG 模型路经。

(.venv) rock@radxa-cubie-a7a:~/ai-sdk/examples/yolov5/etc/npu/yolov5$ ./yolov5 ./model/network_binary.nb ./input_data/dog.jpg
./yolov5 nbg input
VIPLite driver software version 2.0.3.2-AW-2024-08-30
viplite init OK.
VIPLite driver version=0x00020003...
VIP cid=0x1000003b, device_count=1
* device[0] core_count=1
awnn_init total: 5.49 ms.
vip_create_network ./model/network_binary.nb: 3.96 ms.
input 0 dim 640 640 3 1, data_format=2, name=input/output[0], elements=1833508979, scale=0.003922, zero_point=0
create input buffer 0: 1228800
output 0 dim 85 80 80 3 1, data_format=2, name=uid_5_out_0, elements=1632000, scale=0.085919, zero_point=211
create output buffer 0: 1632000
output 1 dim 85 40 40 3 1, data_format=2, name=uid_4_out_0, elements=408000, scale=0.071616, zero_point=204
create output buffer 1: 408000
output 2 dim 85 20 20 3 1, data_format=2, name=uid_3_out_0, elements=102000, scale=0.072006, zero_point=196
create output buffer 2: 102000
memory pool size=3892224 bytes
load_param ./model/network_binary.nb: 0.97 ms.
prepare network ./model/network_binary.nb: 2.56 ms.
set network io ./model/network_binary.nb: 0.01 ms.
awnn_create total: 7.55 ms.
yolov5_preprocess.cpp run.
memcpy(0xffff89621000, 0xffff886f8010, 1228800) load_input_data: 0.33 ms.
vip_flush_buffer input: 0.02 ms.
awnn_set_input_buffers total: 0.38 ms.
vip_run_network: 17.07 ms.
vip_flush_buffer output: 0.01 ms.
int8/uint8 1632000 memcpy: 2.72 ms.
int8/uint8 408000 memcpy: 0.46 ms.
int8/uint8 102000 memcpy: 0.11 ms.
tensor to fp: 28.64 ms.
awnn_run total: 45.75 ms.
yolov5_postprocess.cpp run.
detection num: 3
16: 86%, [ 130, 222, 312, 546], dog
7: 59%, [ 469, 78, 692, 171], truck
1: 53%, [ 158, 133, 560, 424], bicycle
awnn_destroy total: 1.95 ms.
awnn_uninit total: 0.66 ms.

推理结果保存在 result.png 中

yolov5s demo output