| name | rknn-deployment |
| description | RKNN 部署技能 - RKNN-Toolkit2、RK3588 NPU、模型转换、ROS2 部署 |
| argument-hint | RKNN OR RK3588 OR 瑞芯微 OR NPU OR rknn deployment |
| user-invocable | true |
RKNN 部署技能
瑞芯微 RK3588/RK3399Pro NPU 加速部署
何时使用
当需要以下帮助时使用此技能:
- ONNX/TFLite 转 RKNN
- RK3588 NPU 部署
- RKNN-Toolkit2 使用
- 性能优化
- ROS2 RKNN 节点
核心实现
RKNN 模型转换
from rknn.api import RKNN
class RKNNConverter:
def __init__(self):
self.rknn = RKNN(verbose=True)
def convert_onnx(self, onnx_path, rknn_path,
inputs=['images'], input_shapes=[[1, 3, 640, 640]],
layout='NCHW'):
"""ONNX 转 RKNN"""
self.rknn.config(
mean_values=[[123.675, 116.28, 103.53]],
std_values=[[58.395, 57.12, 57.375]],
target_platform='rk3588'
)
self.rknn.load_onnx(onnx_path, inputs=inputs, input_shapes=input_shapes)
self.rknn.build(do_quantization=True, dataset='./dataset.txt')
self.rknn.export_rknn(rknn_path)
def convert_tflite(self, tflite_path, rknn_path):
"""TFLite 转 RKNN"""
self.rknn.config(target_platform='rk3588')
self.rknn.load_tflite(tflite_path)
self.rknn.build(do_quantization=True)
self.rknn.export_rknn(rknn_path)
ROS2 RKNN 节点
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from rknn.api import RKNN
import numpy as np
import cv2
class RKNNNode(Node):
def __init__(self):
super().__init__('rknn_node')
self.bridge = CvBridge()
self.rknn = RKNN()
self.rknn.load_rknn('/path/to/model.rknn')
self.rknn.init_runtime()
self.image_sub = self.create_subscription(
Image, '/image_raw', self.callback, 10)
self.pub = self.create_publisher(Image, '/detections', 10)
def callback(self, msg):
cv_image = self.bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')
input_data = self.preprocess(cv_image)
outputs = self.rknn.inference([input_data])
results = .postprocess(outputs[])
output_image = .draw_results(cv_image, results)
output_msg = .bridge.cv2_to_imgmsg(output_image, )
.pub.publish(output_msg)
():
img = cv2.resize(image, (, ))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = img.astype(np.float32)
img = (img - [, , ]) / [, , ]
img = img.transpose(, , )
img = img.reshape(, , , )
img
():
outputs
():
det results:
x1, y1, x2, y2, score, cls = det
cv2.rectangle(image, ((x1), (y1)), ((x2), (y2)), (, , ), )
image
RK3588 性能优化
class RKNNOptimizer:
def __init__(self, rknn_model):
self.rknn = rknn_model
def optimize(self):
"""性能优化"""
self.rknn.config(core_mask='BIG')
self.rknn.config(mem_alloc_type='dma')
self.rknn.config(batch_size=4)
def benchmark(self, input_data, num_iterations=100):
"""性能测试"""
import time
times = []
for _ in range(num_iterations):
start = time.time()
self.rknn.inference([input_data])
times.append(time.time() - start)
print(f"Average inference time: {np.mean(times)*1000:.2f} ms")
print(f"FPS: {1/np.mean(times):.2f}")