2025-05-16 2:09 AM
你好,近期我在使用NanoEdge AI Studio实现异常检测功能,基于三轴加速度计的数据实现。我出现了以下问题:
1.我使用的最新版本5.0.2,在benchmark界面训练模型后,表格Best Library Result 中异常数据的结果为零,就是在表格的底部。但我生成代码需要的文件后运用到工程中其相似度一直输出为91%,即使我大幅度的改变加速度计的值也仍然时91%。
2.在有一次训练时,表格Best Library Result 中异常数据的结果不为零了,大概为68%。我生成需要的额NanoEdge AI.h和library.a以及knowledge.h生成后运用到keil工程中发现能够正常进行学习,并且也可不学习使用knowledge.h的这个数据集进行检测相似度,结果较为明显。只是原本的异常数据其相似度对应的也为68%。
3.我的疑惑在于,对应的模型训练不应该异常数据接近为零,正常数据接近一百吗,可我似乎于认为的不一样。并且同样的数据进行第一次训练的结果可能异常数据不为零,但后面几次训练后一直为零。导致的结果就是,训练结果异常数据为零的模型,在使用官方给的先进行学习一段时间,在进行异常检测运行效果是错误的,相似度一直输出为一个固定值,比如91%。并且运行不事先学习,利用knowledge这个数组作为学习数据,运行结果也是不正确的,但是训练结果异常数据不为零的就可正常运行。但这个结果也不是一直会出现的,偶尔出现。我的数据上传使用的是USB串口上传(USB转TTL、或者蓝牙串口)
以下为代码(省略了部分)
#include “NanoEdgeAI.h”
#include “knowledge.h”
#define LEARNING_ITERATIONS 30
浮点数 input_user_buffer[DATA_INPUT_USER * AXIS_NUMBER];输入值的缓冲区
无效 SystemClock_Config(void);
静态 void MPU_Config(void);
void fill_buffer(float input_buffer[])
{
/* 用户开始 */
float acc_mg[3]; // 临时存储单个样本的X/Y/Z数据
uint16_t samples_collected = 0;
uint32_t last_tick = HAL_GetTick();
持续采集直到存满256个样本
while (samples_collected < DATA_INPUT_USER) {
// 1. 精确控制采样间隔(1000Hz = 1ms)
HAL_Delay(1);
//阿拉伯数字。读取加速度数据
if (LSM6DSV16X_Read6AxisData(&lsm6dsv16x_dev_ctx, acc_mg, NULL) & 0x01) {
// 3. 填充到NanoEdge缓冲区(按X,Y,Z顺序交替存储)
input_buffer[samples_collected * AXIS_NUMBER + 0] = acc_mg[0]; // X
input_buffer[samples_collected * AXIS_NUMBER + 1] = acc_mg[1]; // Y
input_buffer[samples_collected * AXIS_NUMBER + 2] = acc_mg[2]; // Z
samples_collected++;
}
}
/* 用户结束 */
}
int main(void) (无效)
{
MPU_Config();
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART2_UART_Init();
MX_USART1_UART_Init();
MX_CRC_Init();
/* 用户代码开始 2 */
GPS_Init(&huart1, &huart2);UART1接GPS,UART2接PC
MagIMU_Fusion_Init();
MX_MEMS_Init();
/* 初始化 ------------------------------------------------------------*/
enum neai_state error_code = neai_anomalydetection_init();
if (error_code != NEAI_OK) {
printf(“错误!\r\n”);
/* 如果库在不支持的板子中工作,则会发生这种情况。*/
}
printf(“学习开始!\r\n”);
/* 学习过程 ----------------------------------------------------------*/
for (uint16_t iteration = 0 ; iteration < LEARNING_ITERATIONS ; iteration++) {
fill_buffer(input_user_buffer);
printf(“正在学习 %d/%d!\r\n”,迭代,LEARNING_ITERATIONS);
HAL_Delay(50);
neai_anomalydetection_learn(input_user_buffer);
}
neai_anomalydetection_knowledge(知识);
printf(“学习结束!\r\n”);
uint32_t last_print_time = HAL_GetTick();
uint8_t相似度 = 0;
while (1)
{
1. 填充数据并检测
fill_buffer(input_user_buffer);
neai_anomalydetection_detect(input_user_buffer, &similarity);
//阿拉伯数字。定期打印相似度(避免刷屏)
if (HAL_GetTick() - last_print_time >= 1000) {
last_print_time = HAL_GetTick();
// 打印带时间戳的相似度信息
printf("[%lu ms] similarity: %d%%\r\n",
(unsigned long) HAL_GetTick(),
similarity);
}
HAL_Delay(100); // 控制检测频
}
}