跳到主要内容

编译部署 - Yolov5

自己部署一次 RK 官方的 rknn_model_zoo yolov5

交叉编译工具链:

RV1126B-p 链接: https://pan.baidu.com/s/1uZjPxDe-oXNBeSScQhNu-A?pwd=fanc 提取码: fanc 复制这段内容后打开百度网盘手机App,操作更方便哦


1. 准备编译环境

1.1 电脑硬件配置

编译 Ubuntu 开发环境电脑硬件配置参考:

硬件信息
CPU64位 4核 ⬆️
系统Ubuntu Server 24.04.3 LTS | 建议最低 Ubunu 22 LTS ⬆️
不要使用 Windows 子系统 (WSL)
内存8GB ⬆️
存储64GB ⬆️ 空闲
用户普通用户, 不要使用 root 用户编译

1.2 电脑软件配置

项目配置
使用系统Ubuntu Server 24.04.3 LTS
主板芯片RV1126B-p
SDKrv1126b_linux6.1_sdk_v1.1.0.tar.gz (已包含 prebuilts 目录)
交叉编译环境rv1126b_linux6.1_sdk_v1.1.0_prebuilts.zip 下载了 SDK 无需单独下载 prebuilts
sudo apt update
sudo apt install git unzip vim
sudo apt install -y git cmake build-essential

## Ubuntu 24 server (minimized) 缺这个
sudo apt update
sudo apt install -y libgl1
sudo apt install -y libsm6 libxext6 libxrender1
sudo apt install -y libglib2.0-0 libgomp1

1.3 安装 Python 3.8

推荐使用 PPA(Personal Package Archives)仓库来安装:

  1. 添加 PPA 仓库:

    sudo add-apt-repository ppa:deadsnakes/ppa

    Enter 键继续

  2. 更新软件包列表:

    sudo apt update
  3. 安装 Python 3.8:

    sudo apt install python3.8
    sudo apt install python3.8-venv
    sudo apt install python3.8-dev build-essential
  4. 验证安装:

    python3.8 --version

    显示 Python 3.8.x 表示安装成功

1.3 创建虚拟环境

# 创建虚拟环境 venv_1126b
python3.8 -m venv venv_1126b
source venv_1126b/bin/activate

## 虚拟环境里升级 pip
pip install --upgrade pip

2. 准备软件环境


2.0 激活虚拟环境再操作

  1. 激活虚拟环境:
    cd ~
    source venv_1126b/bin/activate

2.1 准备环境转换软件

  1. 环境安装 rknn-toolkit2:

    git clone https://github.com/airockchip/rknn-toolkit2.git
    cd ~/rknn-toolkit2/rknn-toolkit2

    # 卸载可能的旧环境
    # pip uninstall protobuf onnx

    # 安装 rknn_toolkit2 | 用 tsinghua 比较快
    pip install -r packages/x86_64/requirements_cp38-2.3.2.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install packages/x86_64/rknn_toolkit2-2.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  2. 准备环境 rknn_model_zoo

cd ~
git clone https://github.com/airockchip/rknn_model_zoo.git

3. 转换模型

3.1 获取并转换模型

  1. 下载模型:

    cd ~/rknn_model_zoo/examples/yolov5/model/
    wget https://ftrg.zbox.filez.com/v2/delivery/data/95f00b0fc900458ba134f8b180b3f7a1/examples/yolov5/yolov5n.onnx
  2. 转换模型:

    cd ~/rknn_model_zoo/examples/yolov5/python/
    python3 convert.py ../model/yolov5n.onnx rv1126b u8 ../model/yolov5n_rv1126b.rknn

模型下载:

rknn_model_zoo 提供的范例模型列表见首页 readme: https://github.com/airockchip/rknn_model_zoo

当前测试模型 yolov5n: https://ftrg.zbox.filez.com/v2/delivery/data/95f00b0fc900458ba134f8b180b3f7a1/examples/yolov5/yolov5n.onnx

3.2 转换结果

转换过程:

(venv_1126b) roy@Debian-i7-7700:~/rknn_model_zoo/examples/yolov5/python$ python3 convert.py ../model/yolov5n.onnx rv1126b u8 ../model/yolov5n_rv1126b.rknn

I rknn-toolkit2 version: 2.3.2
--> Config model
done
--> Loading model
I Loading : 100%|██████████████████████████████████████████████| 121/121 [00:00<00:00, 47493.05it/s]
done
--> Building model
I OpFusing 0: 100%|█████████████████████████████████████████████| 100/100 [00:00<00:00, 1577.74it/s]
I OpFusing 1 : 100%|████████████████████████████████████████████| 100/100 [00:00<00:00, 1164.83it/s]
I OpFusing 2 : 100%|█████████████████████████████████████████████| 100/100 [00:00<00:00, 279.81it/s]
W build: found outlier value, this may affect quantization accuracy
const name abs_mean abs_std outlier value
onnx::Conv_347 0.68 0.89 -11.603
I GraphPreparing : 100%|████████████████████████████████████████| 149/149 [00:00<00:00, 9141.53it/s]
I Quantizating : 100%|████████████████████████████████████████████| 149/149 [00:04<00:00, 34.59it/s]
W build: The default input dtype of 'images' is changed from 'float32' to 'int8' in rknn model for performance!
Please take care of this change when deploy rknn model with Runtime API!
W build: The default output dtype of 'output0' is changed from 'float32' to 'int8' in rknn model for performance!
Please take care of this change when deploy rknn model with Runtime API!
W build: The default output dtype of '343' is changed from 'float32' to 'int8' in rknn model for performance!
Please take care of this change when deploy rknn model with Runtime API!
W build: The default output dtype of '345' is changed from 'float32' to 'int8' in rknn model for performance!
Please take care of this change when deploy rknn model with Runtime API!
I rknn building ...
I rknn building done.
done
--> Export rknn model
done
(venv_1126b) roy@Debian-i7-7700:~/rknn_model_zoo/examples/yolov5/python$ ls ../model
anchors_yolov5.txt bus.jpg coco_80_labels_list.txt download_model.sh yolov5n.onnx yolov5n_rv1126b.rknn

转换后的文件位于: ~/rknn_model_zoo/examples/yolov5/model/

包含文件:

  • yolov5n.onnx - 原始 ONNX 模型
  • yolov5n_rv1126b.rknn - 转换后的 RKNN 模型
  • anchors_yolov5.txt - 锚点文件
  • coco_80_labels_list.txt - 标签文件
  • bus.jpg - 测试图片
  • download_model.sh - 范例提供了一个 yolov5s_relu.onnx 可以自行尝试

4. 交叉编译 YOLOV5

4.0 激活虚拟环境再操作

  1. 激活虚拟环境:
    cd ~
    source venv_1126b/bin/activate

4.1 准备交叉编译工具链

如果已经下载 SDK rv1126b_linux6.1_sdk_v1.1.0.tar.gz无需再次下载rv1126b_linux6.1_sdk_v1.1.0_prebuilts.zip

直接使用 prebuilts 目录即可

下载交叉编译工具链:

下载地址见 1.2 电脑软件配置

  1. 下载并解压交叉编译环境:

    cd ~
    unzip rv1126b_linux6.1_sdk_v1.1.0_prebuilts.zip
  2. 获取交叉编译工具路径:

    RV1126B 是 aarch64 获取下对应环境的路径

    cd prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu
    (venv_1126b) roy@Debian-i7-7700:~/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu$ pwd

    /home/roy/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu

输出路径: /home/roy/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu

4.2 交叉编译 yolov5

  1. 设置环境变量:

    export PATH=/home/roy/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/:$PATH
    export GCC_COMPILER=/home/roy/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu
  2. 开始编译:

    cd ~/rknn_model_zoo
    chmod +x build-linux.sh
    ./build-linux.sh -t rv1126b -a aarch64 -d yolov5
  3. 编译输出内容: 程序位于 ~/rknn_model_zoo/install/rv1126b_linux_aarch64/rknn_yolov5_demo

4.3 编译结果

roy@Debian-i7-7700:~/rknn_model_zoo$ cd ~/rknn_model_zoo
chmod +x build-linux.sh
./build-linux.sh -t rv1126b -a aarch64 -d yolov5
./build-linux.sh -t rv1126b -a aarch64 -d yolov5
/home/roy/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu
===================================
BUILD_DEMO_NAME=yolov5
BUILD_DEMO_PATH=examples/yolov5/cpp
TARGET_SOC=rv1126b
TARGET_ARCH=aarch64
BUILD_TYPE=Release
ENABLE_ASAN=OFF
DISABLE_RGA=OFF
DISABLE_LIBJPEG=OFF
INSTALL_DIR=/home/roy/rknn_model_zoo/install/rv1126b_linux_aarch64/rknn_yolov5_demo
BUILD_DIR=/home/roy/rknn_model_zoo/build/build_rknn_yolov5_demo_rv1126b_linux_aarch64_Release
CC=/home/roy/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc
CXX=/home/roy/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++
===================================
-- Configuring done (0.0s)
-- Generating done (0.0s)
-- Build files have been written to: /home/roy/rknn_model_zoo/build/build_rknn_yolov5_demo_rv1126b_linux_aarch64_Release
[ 50%] Built target fileutils
[ 50%] Built target imagedrawing
[ 50%] Built target imageutils
[ 66%] Built target audioutils
[100%] Built target rknn_yolov5_demo
[ 16%] Built target imageutils
[ 33%] Built target fileutils
[ 50%] Built target imagedrawing
[ 83%] Built target rknn_yolov5_demo
[100%] Built target audioutils
Install the project...
-- Install configuration: "Release"
-- Installing: /home/roy/rknn_model_zoo/install/rv1126b_linux_aarch64/rknn_yolov5_demo/./rknn_yolov5_demo
-- Set non-toolchain portion of runtime path of "/home/roy/rknn_model_zoo/install/rv1126b_linux_aarch64/rknn_yolov5_demo/./rknn_yolov5_demo" to "$ORIGIN/lib"
-- Installing: /home/roy/rknn_model_zoo/install/rv1126b_linux_aarch64/rknn_yolov5_demo/./model/bus.jpg
-- Installing: /home/roy/rknn_model_zoo/install/rv1126b_linux_aarch64/rknn_yolov5_demo/./model/coco_80_labels_list.txt
-- Installing: /home/roy/rknn_model_zoo/install/rv1126b_linux_aarch64/rknn_yolov5_demo/model/yolov5n_rv1126b.rknn
-- Installing: /home/roy/rknn_model_zoo/install/rv1126b_linux_aarch64/rknn_yolov5_demo/lib/librknnrt.so
-- Installing: /home/roy/rknn_model_zoo/install/rv1126b_linux_aarch64/rknn_yolov5_demo/lib/librga.so

roy@Debian-i7-7700:~/rknn_model_zoo$ ls /home/roy/rknn_model_zoo/install/rv1126b_linux_aarch64/rknn_yolov5_demo
lib model rknn_yolov5_demo
roy@Debian-i7-7700:~/rknn_model_zoo$ ls /home/roy/rknn_model_zoo/install/rv1126b_linux_aarch64/rknn_yolov5_demo/model/
bus.jpg coco_80_labels_list.txt yolov5n_rv1126b.rknn

5. RV1126B-p 设备验证

5.1 部署文件

  1. 复制模型到程序目录:

    准备一个 RV1126B-p主板,并且刷好固件开机

  2. 复制模型到程序目录:

如果 rknn_yolov5_demo 没有 yolov5n_rv1126b.rknn 可以手动复制一个

cp ~/rknn_model_zoo/examples/yolov5/model/yolov5n_rv1126b.rknn ~/rknn_model_zoo/install/rv1126b_linux_aarch64/rknn_yolov5_demo/model/
  1. 安装 ADB 工具:

    sudo apt install google-android-platform-tools-installer
  2. 连接设备并上传程序:

    有线连接: 直接接入 usb 数据线

roy@Debian-i7-7700:~$ adb devices
List of devices attached
fec3d3812d367ee device

adb push ~/rknn_model_zoo/install/rv1126b_linux_aarch64/rknn_yolov5_demo/ /root/

无线连接: 先获取设备 IP 地址,例如: 10.0.1.226

roy@Debian-i7-7700:~$ adb connect 10.0.1.226
connected to 10.0.1.226:5555
roy@Debian-i7-7700:~$ adb devices
List of devices attached
10.0.1.226:5555 device

adb push ~/rknn_model_zoo/install/rv1126b_linux_aarch64/rknn_yolov5_demo/ /root/

5.2 执行验证

  1. 进入程序目录:

先确保连接上设备:

(venv_1126) roy@Debian-i7-7700:~$ adb devices 
List of devices attached
10.0.1.226:5555 device

(venv_1126) roy@Debian-i7-7700:~$ adb shell
root@rv1126_rv1109:/#
root@rv1126bp-buildroot:~# ls 
rknn_yolov5_demo
root@rv1126bp-buildroot:~# cd /root/rknn_yolov5_demo/
root@rv1126bp-buildroot:~/rknn_yolov5_demo# ls
lib model rknn_yolov5_demo
  1. 运行测试程序:
root@rv1126bp-buildroot:~/rknn_yolov5_demo# ./rknn_yolov5_demo ./model/yolov5n_rv1126b.rknn ./model/bus.jpg

5.3 运行结果

root@rv1126bp-buildroot:~/rknn_yolov5_demo# ./rknn_yolov5_demo ./model/yolov5n_rv1126b.rknn ./model/bus.jpg 
load lable ./model/coco_80_labels_list.txt
model input num: 1, output num: 3
input tensors:
index=0, name=images, n_dims=4, dims=[1, 640, 640, 3], n_elems=1228800, size=1228800, fmt=NHWC, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
output tensors:
index=0, name=output0, n_dims=4, dims=[1, 255, 80, 80], n_elems=1632000, size=1632000, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003917
index=1, name=343, n_dims=4, dims=[1, 255, 40, 40], n_elems=408000, size=408000, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
index=2, name=345, n_dims=4, dims=[1, 255, 20, 20], n_elems=102000, size=102000, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
model is NHWC input fmt
model input height=640, width=640, channel=3
origin size=640x640 crop size=640x640
input image: 640 x 640, subsampling: 4:2:0, colorspace: YCbCr, orientation: 1
scale=1.000000 dst_box=(0 0 639 639) allow_slight_change=1 _left_offset=0 _top_offset=0 padding_w=0 padding_h=0
rga_api version 1.10.1_[0]
46 im2d_rga_impl rga_get_info(718): Can not get the correct RGA version, please check the driver, version=4.1.34669

46 im2d_rga_impl rga_check(1280): rga im2d: rga2 get info failed!

Error on improcess STATUS=0
RGA error message: Fatal error: rga im2d: rga2 get info failed!

try convert image use cpu
finish
rknn_run
person @ (110 232 203 528) 0.822
person @ (209 241 287 512) 0.809
person @ (483 222 564 515) 0.617
bus @ (115 143 564 452) 0.527
write_image path: out.png width=640 height=640 channel=3 data=0x371d8ed0
root@rv1126bp-buildroot:~/rknn_yolov5_demo# ./rknn_yolov5_demo ./model/yolov5n_rv1126b.rknn ./model/bus.jpg

最终输出: 文件信息:

root@rv1126bp-buildroot:~/rknn_yolov5_demo# ls 
lib model out.png rknn_yolov5_demo

效果图:

bus

bus


总结

通过以上步骤,我们成功完成了:

  1. ✅ 搭建交叉编译环境
  2. ✅ 转换 Yolov5 模型为 RKNN 格式
  3. ✅ 编译 RKNN Yolov5 演示程序
  4. ✅ 在 RV1126B-p 设备上部署并验证

注意事项

项目RV1126B-pRV1126说明
RKNN Toolkit 版本rknn-toolkit2 v2.xrknn-toolkit v1.7.5两者不兼容,不可混用
系统架构64位 ARM (aarch64)32位 ARM (armhf)需要对应的交叉编译工具链
编译选项-t rv1126b -a aarch64-t rv1126 -a armhf编译脚本参数不同
部署方式文件直接部署文件直接部署运行方式差异
模型转换警告可能出现,通常不影响使用可能出现,通常不影响使用可忽略的量化精度警告
Python 环境Python 3.8 + 虚拟环境Python 3.8 + 虚拟环境确保环境一致性