从模型到芯片手把手教你用RKNN-Toolkit2在RK3588上跑通第一个YOLOv5检测附完整代码边缘计算正成为AI落地的关键战场而RK3588作为国产高性能AIoT芯片的代表搭配RKNN-Toolkit2工具链为开发者提供了从模型训练到边缘部署的完整解决方案。本文将带您完成YOLOv5模型从PyTorch到RK3588芯片的端到端部署实战包含环境配置、模型转换、量化优化和推理测试全流程。1. 环境准备与工具链配置RKNN-Toolkit2是Rockchip官方提供的模型转换与部署工具链支持将主流框架训练的模型转换为RK3588芯片可执行的RKNN格式。在开始之前请确保您的开发环境满足以下基础要求操作系统Ubuntu 20.04/22.04 LTS推荐Python版本3.8.xCUDA版本11.6如需GPU加速开发板准备RK3588开发板及配套电源、数据线环境搭建步骤如下# 创建并激活conda虚拟环境 conda create -n rknn-toolkit2 python3.8 -y conda activate rknn-toolkit2 # 安装基础依赖 sudo apt-get install -y libxslt1-dev zlib1g-dev libgl1-mesa-glx # 安装RKNN-Toolkit2 git clone https://github.com/airockchip/rknn-toolkit2.git --depth 1 cd rknn-toolkit2/rknn-toolkit2 pip install -r packages/requirements_cp38-1.6.0.txt pip install packages/rknn_toolkit2-1.6.0*.whl注意如果遇到依赖冲突可以尝试单独安装有问题的包或使用--ignore-installed参数强制安装。验证安装是否成功from rknn.api import RKNN print(RKNN-Toolkit2导入成功)2. YOLOv5模型转换与优化2.1 模型导出为ONNX格式首先需要将训练好的YOLOv5模型.pt文件转换为ONNX格式。YOLOv5官方仓库提供了便捷的导出脚本git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt # 导出ONNX模型 python export.py --weights yolov5s.pt --include onnx --imgsz 640 640 --opset 12关键参数说明--imgsz指定模型输入尺寸必须与训练时一致--opsetONNX算子集版本建议使用12或更高2.2 ONNX到RKNN的转换创建转换脚本convert.pyfrom rknn.api import RKNN rknn RKNN() print(-- Config model) rknn.config(mean_values[[0, 0, 0]], std_values[[255, 255, 255]], target_platformrk3588, quantize_input_nodeTrue) print(-- Loading model) ret rknn.load_onnx(modelyolov5s.onnx) if ret ! 0: print(Load model failed!) exit(ret) print(-- Building model) ret rknn.build(do_quantizationTrue, dataset./dataset.txt) if ret ! 0: print(Build model failed!) exit(ret) print(-- Export rknn model) ret rknn.export_rknn(yolov5s.rknn) if ret ! 0: print(Export rknn model failed!) exit(ret) rknn.release()量化数据集准备dataset.txt./images/1.jpg ./images/2.jpg ...3. RK3588开发板部署与推理3.1 开发板环境准备将转换好的RKNN模型传输到开发板并安装必要的运行时环境# 在RK3588开发板上执行 sudo apt-get update sudo apt-get install -y python3-opencv python3-numpy pip3 install rknn_toolkit_lite23.2 推理测试代码实现创建推理脚本inference.pyimport numpy as np import cv2 from rknnlite.api import RKNNLite # 初始化RKNN Lite rknn_lite RKNNLite() ret rknn_lite.load_rknn(yolov5s.rknn) ret rknn_lite.init_runtime(core_maskRKNNLite.NPU_CORE_0) # 预处理函数 def preprocess(image, input_size): h, w image.shape[:2] scale min(input_size[0]/h, input_size[1]/w) image cv2.resize(image, (int(w*scale), int(h*scale))) pad_h input_size[0] - image.shape[0] pad_w input_size[1] - image.shape[1] image np.pad(image, ((0, pad_h), (0, pad_w), (0, 0)), constant) return image # 执行推理 img cv2.imread(test.jpg) img preprocess(img, (640, 640)) outputs rknn_lite.inference(inputs[img]) # 后处理简化版 boxes outputs[0].reshape(-1, 6) # [x1,y1,x2,y2,conf,cls] for box in boxes: if box[4] 0.5: # 置信度阈值 cv2.rectangle(img, (int(box[0]), int(box[1])), (int(box[2]), int(box[3])), (0,255,0), 2) cv2.imwrite(result.jpg, img) rknn_lite.release()4. 性能优化与调试技巧4.1 量化策略优化RKNN-Toolkit2支持多种量化方式针对YOLOv5推荐以下配置rknn.config( quantized_dtypeasymmetric_quantized-8, quantized_algorithmnormal, quantized_methodchannel, quant_img_RGB2BGRFalse, quantized_iteration3 )4.2 多核NPU并行计算RK3588内置6TOPS算力的NPU支持多核并行# 初始化时指定使用多个核心 ret rknn_lite.init_runtime(core_maskRKNNLite.NPU_CORE_0_1_2)4.3 常见问题排查精度下降严重检查量化数据集是否具有代表性尝试增加量化迭代次数推理速度不达标确保使用NPU核心而非CPU检查输入尺寸是否正确内存不足减小batch size或使用rknn.config(memory_size_basexxx)调整内存分配5. 完整项目结构与进阶扩展建议的项目目录结构yolov5_rk3588/ ├── convert.py # 模型转换脚本 ├── inference.py # 推理测试脚本 ├── yolov5s.onnx # ONNX模型 ├── yolov5s.rknn # RKNN模型 ├── dataset/ # 量化数据集 │ ├── 1.jpg │ └── ... └── images/ # 测试图像 └── test.jpg进阶扩展方向集成多线程处理实现视频流实时分析添加TensorRT后端支持实现异构计算开发C版本推理接口提升性能