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 环境,选择 cp310、x86_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 文件名里的 cp310、cp311、cp38 等字段,要和虚拟环境里的 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