板端部署 YOLOv5 目标检测
本文档旨在演示如何在 rockchip RK3588/3566 系列芯片上运行板端推理 YOLOv5 目标检测模型,所需环境配置请参考 RKNN 安装
此示例用 rknn_model_zoo 中预训练好的 ONNX 格式模型为例子通过模型转换到板端推理做完整示例。
利用 rknn 部署YOLOv5 需要两个步骤
- PC 端利用 rknn-toolkit2 将不同框架下的模型转换成 rknn 格式模型
- 板端利用 rknn-toolkit2-lite 的 Python API 板端推理模型
PC端模型转换
Radxa 已提供预转换好的 yolov5s_rk35XX.rknn
模型,用户可直接参考板端推理 YOLOv5 跳过 PC 端模型转换章节
-
如使用 conda 请先激活 rknn conda 环境
conda activate rknn
-
克隆 rknn_model_zoo 代码仓库
git clone -b v2.3.0 https://github.com/airockchip/rknn_model_zoo.git
-
下载 yolov5s_relu.onnx 模型
cd rknn_model_zoo/examples/yolov5/model
# 下载预训练好的 yolov5s_relu.onnx 模型
bash download_model.sh如遇到网络问题,可访问 此页 下载对应的模型到对应文件夹
-
使用 rknn-toolkit2 转换成 yolov5s_relu.rknn
cd rknn_model_zoo/examples/yolov5/python
python3 convert.py <onnx_model> <TARGET_PLATFORM> <dtype> <output_rknn_path>
# python3 convert.py ../model/yolov5s_relu.onnx rk3588 i8 ../model/yolov5s_relu_rk3588.rknn参数解析:
<onnx_model>
: 指定 ONNX 模型路径<TARGET_PLATFORM>
: 指定 NPU 平台名称。可选rk3562, rk3566, rk3568, rk3576, rk3588, rk1808, rv1109, rv1126
<dtype>
: 指定为i8
或fp
。i8
用于 int8 量化,fp
用于 fp16 量化。默认为i8
<output_rknn_path>
: 指定 RKNN 模型的保存路径,默认保存在与 ONNX 模型相同的目录 -
将 rknn 模型拷贝到板端
板端推理 YOLOv5
RK356X 芯片用户使用 NPU 前需要在终端使用 rsetup 开启 NPU: sudo rsetup -> overlays -> Enable NPU,最后重启系统。
如 overlays 选项中无 Enable NPU
选项,请通过: sudo rsetup -> system -> System Update 升级系统, 重启后执行上述步骤开启 NPU。
-
(可选)下载 radxa 准备的 yolov5s rknn 模型
平台 下载链接 rk3566 yolov5s_rk3566.rknn rk3568 yolov5s_rk3568.rknn rk3588 yolov5s_rk3588.rknn -
修改
rknn_model_zoo/py_utils/rknn_executor.py
代码,请备份原版代码请根据板端安装 RKNN Model Zoo 配置 RKNN Model Zoo 代码仓库
from rknnlite.api import RKNNLite as RKNN
class RKNN_model_container():
def __init__(self, model_path, target=None, device_id=None) -> None:
rknn = RKNN()
rknn.load_rknn(model_path)
ret = rknn.init_runtime()
self.rknn = rknn
def run(self, inputs):
if self.rknn is None:
print("ERROR: rknn has been released")
return []
if isinstance(inputs, list) or isinstance(inputs, tuple):
pass
else:
inputs = [inputs]
result = self.rknn.inference(inputs=inputs)
return result
def release(self):
self.rknn.release()
self.rknn = None -
修改
rknn_model_zoo/examples/yolov5/python/yolov5.py
262 行的代码, 请备份原版代码262 outputs = model.run([np.expand_dims(input_data, 0)])
-
进入虚拟环境
虚拟环境使用请参考: Python 虚拟环境使用
安装 rknn_toolkit-lite2 Python API 请参考 板端虚拟环境中安装 rknn_toolkit-lite2 Python API
-
安装依赖环境
pip3 install opencv-python-headless
-
运行 yolov5 示例代码
cd rknn_model_zoo/examples/yolov5/python
python3 yolov5.py --model_path <your model path> --img_save