跳到主要内容

RKNN 模型转换

RKNN 模型转换一般放在 x86 Ubuntu PC 上做。板端负责运行 .rknn,PC 端负责把模型准备好。简单说就是:先把 yolov8n.onnx 这类 ONNX 模型转成 yolov8.rknn,再把 RKNN 模型拷贝到 Neardi Pi 3 上跑 Demo。

下面以 Ubuntu 22.04 x86_64 PC 环境为例,命令里的示例用户统一写成 neardi@ubuntu2204-pc

安装基础环境

neardi@ubuntu2204-pc:~/rknn_model_zoo$ sudo apt update
neardi@ubuntu2204-pc:~/rknn_model_zoo$ sudo apt install git python3 python3-pip python3-venv

提示

如果安装时遇到 python3.10-venv 之类包的 404 Not Found,先执行 sudo apt update,再重新安装。这个一般是本地 apt 索引太旧导致的。

获取 rknn_model_zoo

  • Rockchip 官方仓库
  • Neardi 镜像仓库
neardi@ubuntu2204-pc:~$ git clone https://github.com/airockchip/rknn_model_zoo
neardi@ubuntu2204-pc:~$ cd rknn_model_zoo

如果 GitHub 访问慢或者不稳定,可以直接用 Neardi 镜像。

neardi@ubuntu2204-pc:~$ git clone http://git.neardi.com/airockchip/rknn_model_zoo
neardi@ubuntu2204-pc:~$ cd rknn_model_zoo

创建 Python 虚拟环境

建议用虚拟环境,避免 RKNN Toolkit2 的依赖和系统 Python 包混在一起:

neardi@ubuntu2204-pc:~/rknn_model_zoo$ python3 -m venv .venv
neardi@ubuntu2204-pc:~/rknn_model_zoo$ source .venv/bin/activate
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ python3 -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple --timeout 120

提示

如果 pip 下载很慢或者超时,建议把源和超时时间固定下来:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ pip config set global.timeout 120

安装 RKNN Toolkit2

RKNN Toolkit2 是 PC 端转换工具,可以从 SDK 获取,也可以从 Rockchip GitHub 或 Neardi 镜像获取。

  • SDK
  • Rockchip GitHub
  • Neardi 镜像仓库

SDK 中的 RKNN Toolkit2 通常在这个目录:

sdk/external/rknn-toolkit2/rknn-toolkit2

先找 wheel 包:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ find /path/to/sdk/external/rknn-toolkit2/rknn-toolkit2 -name "rknn_toolkit2*.whl"

Ubuntu 22.04 + Python 3.10 + x86_64 环境,选择 cp310x86_64 的 wheel,例如:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ pip install /path/to/sdk/external/rknn-toolkit2/rknn-toolkit2/packages/x86_64/rknn_toolkit2-2.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ cd ..
(.venv) neardi@ubuntu2204-pc:~$ git clone https://github.com/airockchip/rknn-toolkit2
(.venv) neardi@ubuntu2204-pc:~$ cd rknn_model_zoo
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ find ../rknn-toolkit2 -name "rknn_toolkit2*.whl"
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ pip install ../rknn-toolkit2/rknn-toolkit2/packages/x86_64/rknn_toolkit2-2.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

如果 GitHub 下载不了,可以用 Neardi 镜像:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ cd ..
(.venv) neardi@ubuntu2204-pc:~$ git clone http://git.neardi.com/airockchip/rknn-toolkit2
(.venv) neardi@ubuntu2204-pc:~$ cd rknn_model_zoo
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ find ../rknn-toolkit2 -name "rknn_toolkit2*.whl"
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ pip install ../rknn-toolkit2/rknn-toolkit2/packages/x86_64/rknn_toolkit2-2.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

提示

wheel 文件名里的 cp310cp311cp38 等字段,要和虚拟环境里的 Python 版本对应。Ubuntu 22.04 通常是 Python 3.10,所以一般选 cp310

验证 RKNN Toolkit2 是否可用:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ python3 -c "from rknn.api import RKNN; print('RKNN OK')"
RKNN OK

转换 YOLOv8

先下载 ONNX 模型:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ cd examples/yolov8/model
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo/examples/yolov8/model$ bash download_model.sh

再执行转换:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo/examples/yolov8/model$ cd ../python
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo/examples/yolov8/python$ python3 convert.py ../model/yolov8n.onnx rk3576

转换成功时会看到类似输出:

I rknn-toolkit2 version: 2.3.2
--> Config model
done
--> Loading model
done
--> Building model
I rknn building ...
I rknn building done.
done
--> Export rknn model
done

生成的模型在 model 目录下:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo/examples/yolov8/python$ ls ../model/*.rknn
../model/yolov8.rknn

把它拷贝到 Neardi Pi 3 对应 Demo 的 model 目录:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo/examples/yolov8/python$ scp ../model/yolov8.rknn neardi@192.168.1.153:~/rknn_model_zoo/examples/yolov8/model/

其中 192.168.1.153 换成实际板卡 IP。拷贝后,在板端重新编译 YOLOv8 Demo,这样新的模型会被安装到 install/rk3576_linux_aarch64/rknn_yolov8_demo/model/

转换 MobileNet

MobileNet 的 Python 脚本参数形式和 YOLOv8 不太一样。先下载 ONNX 模型:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ cd examples/mobilenet/model
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo/examples/mobilenet/model$ bash download_model.sh

执行转换:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo/examples/mobilenet/model$ cd ../python
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo/examples/mobilenet/python$ python3 mobilenet.py --model ../model/mobilenetv2-12.onnx --target rk3576

正常的话,脚本会顺手跑一次模拟器测试,并打印 Top 5 结果:

--> Export rknn model
done
--> Running model
--> PostProcess
-----TOP 5-----
[494] score=0.98 class="n03017168 chime, bell, gong"
done

生成的模型是:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo/examples/mobilenet/python$ ls ../model/*.rknn
../model/mobilenet_v2.rknn

如果要在板端跑 MobileNet Demo,可以拷贝到对应目录:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo/examples/mobilenet/python$ scp ../model/mobilenet_v2.rknn neardi@192.168.1.153:~/rknn_model_zoo/examples/mobilenet/model/

常见问题

apt 提示 404 Not Found

通常是 Ubuntu 包索引过期。先更新索引,再重新安��装:

neardi@ubuntu2204-pc:~/rknn_model_zoo$ sudo apt update
neardi@ubuntu2204-pc:~/rknn_model_zoo$ sudo apt install git python3 python3-pip python3-venv

pip 升级或下载依赖超时

使用国内镜像并加长超时时间:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ python3 -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple --timeout 120
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ pip config set global.timeout 120

No matching distribution found for onnx

这个多数是 PyPI 源或网络问题。先设置镜像,再重新安装 RKNN Toolkit2 的 wheel:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ pip config set global.timeout 120
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ pip install /path/to/rknn_toolkit2-2.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

AttributeError: module 'onnx' has no attribute 'mapping'

RKNN Toolkit2 2.3.2 可能和太新的 onnx 包不兼容。实测 Ubuntu 22.04 环境中,把 onnx 固定到 1.16.1 可以解�决:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ pip uninstall -y onnx
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ pip install onnx==1.16.1 -i https://pypi.tuna.tsinghua.edu.cn/simple --timeout 120
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ python3 -c "import onnx; print(onnx.__version__); print(hasattr(onnx, 'mapping'))"
1.16.1
True

Model file ../model/yolov8n.onnx not exists

ONNX 模型还没下载,或者传给 convert.py 的路径不对。先下载模型:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo$ cd examples/yolov8/model
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo/examples/yolov8/model$ bash download_model.sh

再从 examples/yolov8/python 执行转换:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo/examples/yolov8/model$ cd ../python
(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo/examples/yolov8/python$ python3 convert.py ../model/yolov8n.onnx rk3576

mobilenet.py 提示 unrecognized arguments

mobilenet.py 使用的是命名参数,不是位置参数。用下面这种写法:

(.venv) neardi@ubuntu2204-pc:~/rknn_model_zoo/examples/mobilenet/python$ python3 mobilenet.py --model ../model/mobilenetv2-12.onnx --target rk3576