编译部署 - Yolov5
自己部署一次
RK官方的rknn_model_zooyolov5交叉编译工具链:
RV1126 链接: https://pan.baidu.com/s/1RZC4oGlDzX6iyWIBd9zkoQ?pwd=btgt 提取码: btgt 复制这段内容后打开百度网盘手机App,操作更方便哦
1. 准备编译环境
1.1 电脑硬件配置
编译 Ubuntu 开发环境电脑硬件配置参考:
| 硬件 | 信息 |
|---|---|
| CPU | 64位 4核 ⬆️ |
| 系统 | Ubuntu Server 24.04.3 LTS | |
| 内存 | 8GB ⬆️ |
| 存储 | 64GB ⬆️ 空闲 |
| 用户 | 普通用户, |
1.2 电脑软件配置
| 项目 | 配置 |
|---|---|
| 使用系统 | Ubuntu Server 24.04.3 LTS |
| 主板芯片 | RV1126B-p |
| SDK | rv1126-repo-v20230717-dev.tar.gz (已包含 prebuilts 目录) |
| 交叉编译环境 | rv1126-repo-v20230717-dev_prebuilts.zip 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)仓库来安装:
-
添加 PPA 仓库:
sudo add-apt-repository ppa:deadsnakes/ppa按
Enter键继续 -
更新软件包列表:
sudo apt update -
安装 Python 3.8:
sudo apt install python3.8
sudo apt install python3.8-venv
sudo apt install python3.8-dev build-essential -
验证安装:
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 激活虚拟环境再操作
- 激活虚拟环境:
cd ~
source venv_1126/bin/activate
2.1 准备环境转换软件
这里下载 https://github.com/rockchip-linux/rknn-toolkit/releases
- 环境安装 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
- 准备环境 rknn_model_zoo
cd ~
git clone https://github.com/airockchip/rknn_model_zoo.git
3. 转换模型
3.1 获取并转换模型
-
下载模型:
cd ~/rknn_model_zoo/examples/yolov5/model/
wget https://ftrg.zbox.filez.com/v2/delivery/data/95f00b0fc900458ba134f8b180b3f7a1/examples/yolov5/yolov5n.onnx -
转换模型:
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 激活虚拟环境再操作
- 激活虚拟环境:
cd ~
source venv_1126b/bin/activate
4.1 准备交叉编译工具链
如果已经下载 SDK
直接使用 prebuilts 目录即可
下载交叉编译工具链:
下载地址见 1.2 电脑软件配置
-
下载并解压交叉编译环境:
cd ~
unzip rv1126-repo-v20230717-dev_prebuilts.zip -
获取交叉编译工具路径:
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
-
设置环境变量:
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 -
开始编译:
cd ~/rknn_model_zoo
chmod +x build-linux.sh
./build-linux.sh -t rv1126 -a armhf -d yolov5 -
编译输出内容: 程序位于
~/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 部署文件
-
复制模型到程序目录:
准备一个 RV1126 主板,并且
刷好固件 开机 -
复制模型到程序目录:
如果 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/
-
安装 ADB 工具:
sudo apt install google-android-platform-tools-installer -
连接设备并上传程序:
有线连接: 直接接入 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 执行验证
- 进入程序目录:
先确保连接上设备:
(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
- 运行测试程序:
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
效果图:


总结
通过以上步骤,我们成功完成了:
- ✅ 搭建交叉编译环境
- ✅ 转换 Yolov5 模型为 RKNN 格式
- ✅ 编译 RKNN Yolov5 演示程序
- ✅ 在 RV1126 设备上部署并验证
注意事项
| 项目 | RV1126B-p | RV1126 | 说明 |
|---|---|---|---|
| RKNN Toolkit 版本 | rknn-toolkit2 v2.x | rknn-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 + 虚拟环境 | 确保环境一致性 |