| name | rockchip-rknn |
| description | OpenCV4 Rockchip RKNN 部署技能 - RK3588/RK3399Pro、RKNN-Toolkit2、NPU 加速 |
| user-invocable | true |
| argument-hint | rockchip OR rknn OR rk3588 OR rk3399 OR npu OR 边缘部署 |
OpenCV4 Rockchip RKNN Deployment Skill
Rockchip 平台 RKNN 加速部署完整指南
何时使用
当需要以下帮助时使用此技能:
- RK3588/RK3399Pro 开发环境配置
- RKNN-Toolkit2 模型转换
- RKNN SDK OpenCV 集成
- NPU 加速推理
- ROS2 Rockchip 部署
- 性能调优
快速参考
Rockchip 芯片对比
| 芯片 | NPU 算力 | CPU | 适用场景 |
|---|
| RK3588 | 6TOPS | 4xA76 + 4xA55 | 高性能边缘 |
| RK3399Pro | 3TOPS | 2xA72 + 4xA53 | 中等性能 |
| RV1126 | 1TOPS | 4xA7 | 低功耗 |
RKNN-Toolkit2 安装
conda create -n rknn python=3.8
conda activate rknn
pip install torch torchvision
pip install rknn-toolkit2==1.5.0
docker pull rockchip/rknn-toolkit2:1.5.0
docker run -it --network host \
-v $(pwd):/workspace \
rockchip/rknn-toolkit2:1.5.0 /bin/bash
YOLO 转 RKNN 模型
from rknnocket2 import RKNN
from ultralytics import YOLO
model = YOLO('yolov8n.pt')
model.export(format='onnx', simplify=True)
rknn = RKNN(verbose=True)
rknn.config(mean_values=[0, 0, 0], std_values=[255, 255, 255],
target_platform='rk3588')
rknn.load_onnx('yolov8n.onnx')
rknn.build(do_quantization=True, dataset='dataset.txt')
rknn.save('yolov8n.rknn')
RKNN OpenCV DNN 推理
import cv2
import numpy as np
from rknn.toolkit.decrypt import decrypt_model
rknn = cv2.dnn.readRKNN('yolov8n.rknn')
img = cv2.imread('image.jpg')
resized = cv2.resize(img, (640, 640))
input = np.expand_dims(resized, axis=0)
outputs = rknn.inference(inputs=[input])
def postprocess(outputs, img_shape, conf_thresh=0.5, iou_thresh=0.4):
...
return boxes
ROS2 Rockchip 部署
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
class RockchipNode(Node):
def __init__(self):
super().__init__('rockchip_inference')
self.bridge = CvBridge()
self.rknn = cv2.dnn.readRKNN('/models/yolov8n.rknn')
self.sub = self.create_subscription(
Image, '/image_raw', self.callback, 10)
self.pub = self.create_publisher(Image, '/detections', 10)
def callback(self, msg):
img = self.bridge.imgmsg_to_cv2(msg, 'bgr8')
resized = cv2.resize(img, (640, 640))
input_data = np.expand_dims(resized, axis=0)
outputs = self.rknn.inference(inputs=[input_data])
最佳实践
-
模型转换:
- 使用 RKNN-Toolkit2 的
do_quantization=True 启用量化
- 提供代表性的
dataset.txt 提高量化精度
- 输入尺寸需与训练时一致
-
NPU 利用率:
- RK3588 NPU 算力 6TOPS,需合理分配模型
- 使用
rknn-toolkit-benchmark 测试性能
-
内存管理:
- RK3399Pro/3588 支持 DMA 共享内存
- 多模型时注意释放 RKNN 上下文
-
调试工具:
rknn_monitor 查看 NPU 状态
adb shell cat /sys/class/npu/npu/利用率
相关技能