766|3

17

帖子

0

TA的资源

一粒金砂(中级)

【米尔 瑞芯微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中获得,解压后文件所在目录如下图所示:

捕获.PNG

在该目录下打开终端,执行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

捕获2.PNG  

安装成功后终端显示如上图:

在终端中执行以下命令验证RKNN Toolkit是否可以正常使用

python
from rknn.api import RKNN

终端结果如下图则完成安装。

捕获3.PNG  

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.PNG  

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()

终端输出如下:

捕获6.PNG  

5. 运行结果(蓝色为输入数据,红色为模型计算的异常分数):

捕获7.PNG  

 

最新回复

这个是什么数据的异常检测?   详情 回复 发表于 2025-2-28 19:56

回复
举报

7002

帖子

0

TA的资源

五彩晶圆(高级)

红色是模型计算的异常分数,这个看起来异常分数也太明显了

点评

数据集使用的是在时序异常检测领域中常见的UCR数据集,正常数据和异常数据区分较为明显,对AII模型来说,难度不大。    详情 回复 发表于 2025-2-25 14:01

回复

17

帖子

0

TA的资源

一粒金砂(中级)

Jacktang 发表于 2025-2-25 07:35 红色是模型计算的异常分数,这个看起来异常分数也太明显了

数据集使用的是在时序异常检测领域中常见的UCR数据集,正常数据和异常数据区分较为明显,对AII模型来说,难度不大。

 


回复

7497

帖子

2

TA的资源

版主

这个是什么数据的异常检测?


回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 13

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表