【米尔 瑞芯微RK3576 工业AI开发板】5.使用开发板实机运行异常检测AI模型
[复制链接]
本帖最后由 qianmo2001 于 2025-2-25 14:29 编辑
【米尔 瑞芯微RK3576 工业AI开发板】5.使用开发板实机运行异常检测AI模型
开发板配置为4+32G
板载系统为出厂默认系统
RKNN-Toolkit-Lite和RKNN-Toolkit均来自米尔SDK中MYD-LR3576-Debian12-Distribution-L6.1.75-V1.0.0/MYD-LR3576/external/目录下。
rknn_toolkit2-2.0.0b0+9bab5682-cp38-cp38-linux_x86_64.whl
rknn_toolkit_lite2-2.0.0b0-cp38-cp38-linux_aarch64.whl
确保开发板中完成RKNN-Toolkit-Lite的安装并激活其所在的conda环境后,进入工程文件所在路径,执行以下命令,进行实际运行测试。
python runtime2.py
完整代码如下,完整工程见附件
import numpy as np
import time
import os
import matplotlib.pyplot as plt
from rknnlite.api import RKNNLite
# 滑动窗口切割函数
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)
datax = datax[1000:1020]
print(datax.shape)
data = sliding_window(datax, window_size, step_size)
# 2. 创建 RKNN 对象
rknn = RKNNLite()
# 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:-8], 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()
实机运行结果如下:
终端显示已放弃,怀疑是系统资源不足,进程被强制终止,
尝试对数据集进行裁剪,减少模型的输入,无果
重启开发板后,进行测试,发现程序在执行outputs = rknn.inference(inputs=inputs)这一行时出现异常,向终端抛出 “已放弃” 后,程序中断退出。
|