跳到主要内容

编译部署 - Yolov5

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

交叉编译工具链:

RV1126 链接: https://pan.baidu.com/s/1RZC4oGlDzX6iyWIBd9zkoQ?pwd=btgt 提取码: btgt 复制这段内容后打开百度网盘手机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
SDKrv1126-repo-v20230717-dev.tar.gz (已包含 prebuilts 目录)
交叉编译环境rv1126-repo-v20230717-dev_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_1126
python3.8 -m venv venv_1126
source venv_1126/bin/activate

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

2. 准备软件环境


2.0 激活虚拟环境再操作

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

2.1 准备环境转换软件

这里下载 https://github.com/rockchip-linux/rknn-toolkit/releases

  1. 环境安装 rknn-toolkit v1.75:
cd ~
mkdir ~/rknn-toolkit-v1.75
cd ~/rknn-toolkit-v1.75
wget https://github.com/rockchip-linux/rknn-toolkit/releases/download/v1.7.5/rknn-toolkit-v1.7.5-packages.tar.gz

# 解压
tar -zxvf rknn-toolkit-v1.7.5-packages.tar.gz

复制一个 ubuntu22 改为 ubuntu24 用

cp packages/requirements-cpu-ubuntu20.04_py38.txt packages/requirements-cpu-ubuntu24.04_py38.txt

内容版本如下: vim packages/requirements-cpu-ubuntu24.04_py38.txt

tensorflow==2.2.0
torch==1.6.0
torchvision==0.7.0
mxnet==1.5.0
# 卸载可能的旧环境
# pip uninstall protobuf onnx

# 安装 rknn_toolkit-v1.7.5
pip install -r packages/requirements-cpu-ubuntu24.04_py38.txt
pip install packages/rknn_toolkit-1.7.5-cp38-cp38-linux_x86_64.whl
  1. 准备环境 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 rv1126 u8 ../model/yolov5n_rv1126.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_1126) roy@Debian-i7-7700:~/rknn_model_zoo/examples/yolov5/python$ python3 convert.py ../model/yolov5n.onnx rv1126 u8 ../model/yolov5n_rv1126.rknn 
W rknn-toolkit version: 1.7.5
--> Config model
done
--> Loading model
W Catch exception when optimize onnx model, skip it! Exception: Unresolved value references: /model.11/Constant_1_output_0,/model.11/Constant_output_0,/model.15/Constant_1_output_0,/model.15/Constant_output_0,
/home/roy/venv_1126/lib/python3.8/site-packages/rknn/api/rknn.py:160: FutureWarning: Possible nested set at position 7
ret = self.rknn_base.load_onnx(model, inputs, input_size_list, outputs)
done
--> Building model
W found outlier value, this may affect quantization accuracy
const name abs_mean abs_std outlier value
Conv_/model.0/conv/conv/Conv_194:weight 0.68 0.89 -11.603
W:tensorflow:From /home/roy/venv_1126/lib/python3.8/site-packages/tensorflow/python/framework/func_graph.py:981: py_func (from tensorflow.python.ops.script_ops) is deprecated and will be removed in a future version.
Instructions for updating:
tf.py_func is deprecated in TF V2. Instead, there are two
options available in V2.
- tf.py_function takes a python function which manipulates tf eager
tensors instead of numpy arrays. It's easy to convert a tf eager tensor to
an ndarray (just call tensor.numpy()) but having access to eager tensors
means `tf.py_function`s can use accelerators such as GPUs as well as
being differentiable using a gradient tape.
- tf.numpy_function maintains the semantics of the deprecated tf.py_func
(it is not differentiable, and manipulates numpy arrays). It drops the
stateful argument making all functions stateful.

W:tensorflow:From /home/roy/venv_1126/lib/python3.8/site-packages/tensorflow/python/ops/resource_variable_ops.py:1659: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.
Instructions for updating:
If using Keras pass *_constraint arguments to layers.


done
--> Export rknn model
done



(venv_1126) 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_rv1126.rknn

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

包含文件:

  • yolov5n.onnx - 原始 ONNX 模型
  • yolov5n_rv1126.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无需再次下载rv1126-repo-v20230717-dev_prebuilts.zip

直接使用 prebuilts 目录即可

下载交叉编译工具链:

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

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

    cd ~
    unzip rv1126-repo-v20230717-dev_prebuilts.zip
  2. 获取交叉编译工具路径:

    RV1126 是 arm 获取下对应环境的路径

    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/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin

4.2 交叉编译 yolov5

  1. 设置环境变量:

    export PATH=~/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin:$PATH
    export GCC_COMPILER=~/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf
  2. 开始编译:

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

4.3 编译结果

(venv_1126) roy@Debian-i7-7700:~/rknn_model_zoo$ ./build-linux.sh -t rv1126 -a armhf -d yolov5

./build-linux.sh -t rv1126 -a armhf -d yolov5
/home/roy/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf
===================================
BUILD_DEMO_NAME=yolov5
BUILD_DEMO_PATH=examples/yolov5/cpp
TARGET_SOC=rv1126
TARGET_ARCH=armhf
BUILD_TYPE=Release
ENABLE_ASAN=OFF
DISABLE_RGA=OFF
DISABLE_LIBJPEG=OFF
INSTALL_DIR=/home/roy/rknn_model_zoo/install/rv1126_linux_armhf/rknn_yolov5_demo
BUILD_DIR=/home/roy/rknn_model_zoo/build/build_rknn_yolov5_demo_rv1126_linux_armhf_Release
CC=/home/roy/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
CXX=/home/roy/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-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_rv1126_linux_armhf_Release
[ 50%] Built target imageutils
[ 50%] Built target imagedrawing
[ 50%] Built target fileutils
[ 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/rv1126_linux_armhf/rknn_yolov5_demo/./rknn_yolov5_demo
-- Set non-toolchain portion of runtime path of "/home/roy/rknn_model_zoo/install/rv1126_linux_armhf/rknn_yolov5_demo/./rknn_yolov5_demo" to "$ORIGIN/lib"
-- Installing: /home/roy/rknn_model_zoo/install/rv1126_linux_armhf/rknn_yolov5_demo/./model/bus.jpg
-- Installing: /home/roy/rknn_model_zoo/install/rv1126_linux_armhf/rknn_yolov5_demo/./model/coco_80_labels_list.txt
-- Installing: /home/roy/rknn_model_zoo/install/rv1126_linux_armhf/rknn_yolov5_demo/model/yolov5n_rv1126.rknn
-- Installing: /home/roy/rknn_model_zoo/install/rv1126_linux_armhf/rknn_yolov5_demo/model/yolov5n_rv1126b.rknn
-- Installing: /home/roy/rknn_model_zoo/install/rv1126_linux_armhf/rknn_yolov5_demo/lib/librknn_api.so
-- Installing: /home/roy/rknn_model_zoo/install/rv1126_linux_armhf/rknn_yolov5_demo/lib/librga.so

5. RV1126 设备验证

5.1 部署文件

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

    准备一个 RV1126 主板,并且刷好固件开机

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

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

cp ~/rknn_model_zoo/examples/yolov5/model/yolov5n_rv1126.rknn ~/rknn_model_zoo/install/rv1126_linux_armhf/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/rv1126_linux_armhf/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/rv1126_linux_armhf/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@rv1126_rv1109:~# ls /root/
rknn_yolov5_demo

root@rv1126_rv1109:~# cd /root/rknn_yolov5_demo/
root@rv1126_rv1109:/root/rknn_yolov5_demo# ls
lib model rknn_yolov5_demo
  1. 运行测试程序:
root@rv1126_rv1109:/root/rknn_yolov5_demo# ./rknn_yolov5_demo ./model/yolov5n_rv1126.rknn ./model/bus.jpg

5.3 运行结果

root@rv1126_rv1109:/root/rknn_yolov5_demo# ./rknn_yolov5_demo ./model/yolov5n_rv1126.rknn ./model/bus.jpg
load lable ./model/coco_80_labels_list.txt
librknn_runtime version 1.7.3 (2e55827 build: 2022-08-25 10:45:32 base: 1131)
model input num: 1, output num: 3
input tensors:
index=0, name=images_209, n_dims=4, dims=[1, 3, 640, 640], n_elems=1228800, size=1228800, fmt=NCHW, type=UINT8, qnt_type=AFFINE, zp=0, scale=0.003922
output tensors:
index=0, name=Sigmoid_/model.24/Sigmoid/out0_0, n_dims=4, dims=[1, 255, 80, 80], n_elems=1632000, size=1632000, fmt=NCHW, type=UINT8, qnt_type=AFFINE, zp=0, scale=0.003917
index=1, name=Sigmoid_/model.24/Sigmoid_1/out0_1, n_dims=4, dims=[1, 255, 40, 40], n_elems=408000, size=408000, fmt=NCHW, type=UINT8, qnt_type=AFFINE, zp=0, scale=0.003918
index=2, name=Sigmoid_/model.24/Sigmoid_2/out0_2, n_dims=4, dims=[1, 255, 20, 20], n_elems=102000, size=102000, fmt=NCHW, type=UINT8, qnt_type=AFFINE, zp=0, scale=0.003920
model is NCHW 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
librga fail to get driver version! Compatibility mode will be enabled.

rga_api version 1.10.1_[0]
rknn_run
person @ (108 235 203 523) 0.855
person @ (209 246 288 506) 0.830
person @ (483 223 568 510) 0.510
bus @ (122 158 557 451) 0.476
write_image path: out.png width=640 height=640 channel=3 data=0xa5347008

最终输出: 文件信息:

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

效果图:

bus

bus


总结

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

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

注意事项

项目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 + 虚拟环境确保环境一致性