【米尔 瑞芯微RK3576 工业AI开发板】3.RKNN模型导出及仿真运行
[复制链接]
本帖最后由 qianmo2001 于 2025-2-23 23:11 编辑
【米尔 瑞芯微RK3576 工业AI开发板】3.RKNN模型导出及仿真运行
要将 ONNX 模型转换为 RKNN 模型(Rockchip Neural Network,适用于 Rockchip 设备的神经网络模型),可以使用 RKNN Toolkit。RKNN Toolkit 是 Rockchip 提供的工具,用于将深度学习模型转换为 RKNN 格式,以便在 Rockchip 设备上部署和运行。
1. 在PC端Linux系统下搭建相关环境
之前关于异常检测的模型设计,训练,验证及ONNX模型的导出,验证均在Windows环境下进行
后续RKNN模型的导出及仿真运行在虚拟机中的Linux环境下进行。
默认Linux环境中已经安装python相关环境及conda
新建一个conda环境并激活
conda creat -n py38rk3576 python=3.8 #新建一个conda环境
conda activate py38rk3576 #激活环境
2. 安装 RKNN Toolkit
RKNN Toolkit可以通过扫描开发板上的二维码,在米尔官网提供的SDK中获得,解压后文件所在目录如下图所示:
在该目录下打开终端,执行conda activate py38rk3576,激活环境。
执行以下命令安装相关必要的包,并安装RKNN Toolkit。
pip install -r requirements_cp38-2.0.0b0.txt
pip install ./rknn_toolkit2-2.0.0b0+9bab5682-cp38-cp38-linux_x86_64.whl
安装成功后终端显示如上图:
在终端中执行以下命令验证RKNN Toolkit是否可以正常使用。
python
from rknn.api import RKNN
终端结果如下图则完成安装。
3. 加载ONNX模型并将其转换为RKNN模型
完整代码如下:
# from rknn import RKNN
from rknn.api import RKNN
rknn = RKNN()
rknn.config(target_platform='rk3568', dynamic_input=[[[1, 100, 1]]])
onnx_model_path = "tcn_autoencoder.onnx"
rknn.load_onnx(model=onnx_model_path, inputs=['input'], input_size_list=[[1, 100, 1]])
rknn.build(do_quantization=False)
rknn_model_path = "tcn_autoencoder.rknn"
rknn.export_rknn(rknn_model_path)
print("ONNX")
终端输出如下:
4. 加载RKNN模型并仿真验证
完整代码如下:
import numpy as np
import time
import os
import matplotlib.pyplot as plt
from rknn.api import RKNN
# 滑动窗口切割函数
def sliding_window(data, window_size, step_size):
X = []
for i in range(0, len(data) - window_size, step_size):
window = data[i:i + window_size]
X.append(window)
return np.array(X)
# 1. 加载数据集 (假设数据保存在 'data.npy' 文件中)
window_size = 16
step_size = 1
data_path = 'dataset/UCR/test.npy' # 替换为您的实际数据路径
datax = np.load(data_path)
print(datax.shape)
data = sliding_window(datax, window_size, step_size)
# 2. 创建 RKNN 对象
rknn = RKNN()
# 3. 配置 RKNN 模型(启用动态输入)
rknn.config(target_platform='rk3576', dynamic_input=[[[1, 16, 1]]]) # 适应输入形状
# 4. 加载 ONNX 模型
onnx_model_path = "tcn_autoencoder.onnx" # 替换为您实际的模型路径
rknn.load_onnx(model=onnx_model_path, inputs=['input'], input_size_list=[[1, 16, 1]])
# 5. 编译模型,不启用量化(如果不需要量化)
rknn.build(do_quantization=False)
# 6. 导出 RKNN 模型
rknn_model_path = "tcn_autoencoder.rknn"
rknn.export_rknn(rknn_model_path)
# 7. 加载 RKNN 模型
rknn.load_rknn(rknn_model_path)
# 8. 初始化 RKNN 模型
rknn.init_runtime()
# 9. 准备输入数据并逐个进行推理
print(data.shape)
num_samples = data.shape[0] # 样本数量(num)
reconstruction_errors = [] # 用于存储每次推理的重建误差
# 遍历每个样本,逐个进行推理
for i in range(num_samples):
input_data = data[i:i+1].astype(np.float32) # 提取单个样本,形状为 (1, 16, 1)
# 执行推理
inputs = [input_data]
outputs = rknn.inference(inputs=inputs)
# 获取推理结果
output_data = outputs[0] # 获取模型输出(第一个输出)
# 计算重建误差(均方误差)
reconstruction_error = np.mean((output_data - input_data) ** 2, axis=(1, 2)) # 计算每个样本的均方误差
reconstruction_errors.append(reconstruction_error)
# 10. 将重建误差保存为 numpy 数组
reconstruction_errors = np.array(reconstruction_errors)
# 11. 设置阈值并检测异常点
threshold = 0.001 # 设置重建误差的阈值
anomalies = reconstruction_errors > threshold # 如果重建误差大于阈值,则为异常点
# 12. 输出检测到的异常点数量
print(f"检测到 {np.sum(anomalies)} 个异常点")
# 13. 输出所有重建误差
print("所有重建误差:", reconstruction_errors.shape)
# 创建图表和子图
fig, ax1 = plt.subplots()
# 绘制第一条曲线,使用默认的左侧Y轴
ax1.plot(datax[8:5892], label="Reconstruction Error",alpha=0.2, color='b')
ax1.set_xlabel('Sample Index')
ax1.set_ylabel('Reconstruction Error', color='b')
# 创建第二个Y轴
ax2 = ax1.twinx()
# 绘制第二条曲线,使用右侧Y轴
ax2.plot(reconstruction_errors, label="Reconstruction Error", color='r')
ax2.set_ylabel('Y values for ln(x)', color='r')
# 显示图表
plt.show()
rknn.release()
终端输出如下:
5. 运行结果(蓝色为输入数据,红色为模型计算的异常分数):
|