ew2024

  • 2024-12-25
  • 发表了主题帖: ML集成测试后续补充(有玄学问题)

    想要把内核测量部分一块测量完成发布,但是暂时有点问题,得推迟一点发布那部分了,就先把之前集成ML的部分完善一下吧。 # eIQ模型转换 之前我使用随便一个模型文件,经过eIQ转化之后没有发生变化,我之前怀疑是优化了卷积等地方的运算,不过我使用了一个新的模型,里边有最常见的一些模块,却并没有看到这一个现象。 这个是我所使用的模型的完整的样子,但是经过转换之后并没有变化,模型是完全一样的,没有出现示例那样的变化,因此我现在并不清楚具体这个转换会将什么模块优化。我查看了TensorFlow Lite的算子文档,里边也能 找到常见的模块名称,这个算子文档与转换后的模型理应是一一对应的,也就是常见模块的名称在转换后的模型中也是存在的。具体优化了什么,只能在后续的实践中看了,不过这个也不是什么急需解决的问题,有则更好,没有也不会对项目有特别大的影响。 # 操作算子文件 我之前说有两个文件可以使用,一个是示例工程中的micro_mutable_op_resolver.h,另一个是micro/all_ops_resolver.h 我后续到TensorFlow Lite的官方网站看了一下,确实是都可以使用,但是他们有一个区别,这个区别在嵌入式开发中影响还是比较大的。 具体来说,all_ops_resolver.h 会拉取每一个可用的运算,因此它会占用大量内存但是micro_mutable_op_resolver.h并不是这样的,他会将每个运算分开,仅拉取我们所指定的运算。因此在生产应用中,应该仅使用 micro_mutable_op_resolver.h 拉取模型所需的运算。 # 模型运行 之前因为我没有仔细看过算子文件,因此之前的模型并没有完整运行过。这次我在修改过模型之后,重新运行了下项目。根据我在上文所提到的模型结构,我将model_cifarnet_ops_npu.cpp中的算子进行了修改 红框中的部分就是针对我的模型所添加的算子 `注意`除了这个以外,一定要将这段代码中的容器容量改为我们所需要的大小,默认工程是5,因为我增加了4个,改为了9 ## 玄学问题 本来我以为这些地方修改完以后,按照示例文档来说,就可以直接运行成功了,但是我得到的却是这样的结果 但是我们可以看示例结果应该是这样的 可以发现,在进行文件的推理时候项目卡住不动了。这不是时间的问题,我忙别的,放在那没有管他几个小时,他依然没有打印出正确的信息,可以看出并不是推理时间太长的问题。打印出的最后一句话是调用image_load.c文件中IMAGE_GetImage时候的结果。经过多次调试,最终发现,问题就出现在这行代码中,不是后续的问题。这行代码关系着图像数据的获取,这里出现了问题,后续自热无法进行模型推理。 可以看到是memcpy这个函数发生了问题。这个函数声明这样的,功能是从源内存地址的起始位置开始拷贝若干个**字节**到目标内存地址中,即从源source中拷贝n个字节到目标destin中。 ```c++ void *memcpy(void *destin, void *source, unsigned n); ``` 我当时觉得问题就是因为这个,这个是拷贝字节,而不是某个数据类型。我当时立即想改为这样的形式。 ```c++ memcpy(dstData, srcData, dstWidth * dstHeight * dstChannels * sizeof(uint8_t)); ``` 但是示例工程中最开始包含的是image_data .h文件,与给出的Python代码不同,Python代码要进行十六进制转换,image_data中是RGB数值~~(对于数据类型转换这个不是什么问题)~~这个又并非与我所考虑的数据类型字节数有关,也就不存在拷贝错误的问题。多次运行模型结果都是和上边一样,卡在了推理的那一步。 由于memcpy问题可能是**空指针/内存重叠/无效内存/内存超出**等导致的, 我就根据这个进行排查。 对于空指针,我在memcpy函数前加入了一段代码,来检验是否是空,这部分并没有被运行,也就是指针是正常的 ```c+++ if (srcData == NULL || dstData == NULL) {         PRINTF("ERROR: Null pointer detected.\n");         return kStatus_Fail; // Assuming you have a failure status defined     } ``` 我继续进行调试,在image_load.c文件中加入这行代码想查看一下数据内存读取时候大小,但是这时候奇怪的事发生了,输出竟然正常了,而我两次下载中间唯一的区别仅仅是加入了这一个`PRINTF`。 ```c++ if (s_staticCount == 1)     {         PRINTF("Size of string array: %d bytes\n", sizeof(bird));         PRINTF(EOL "Static data processing:" EOL);         return IMAGE_Decode(bird, dstData, dstWidth, dstHeight, dstChannels);     } ``` 我感觉很奇怪,把我所有添加的代码都注释掉后,也就是恢复到最开始的状态,重新编译下载,结果是正常显示的,之前卡在推理前的那种现象完全不见了,我怎么弄都没有找到是发生了什么改变了之前重复编译下载几十次都一样的现象,这个问题实在是太玄学了,我实在没有办法,如果有人后续也碰到了一样的情况,希望可以告诉我一下

  • 2024-12-13
  • 回复了主题帖: FRDM-MCXN947 环境搭建与ML集成测试(Debug)

    似乎论坛对于Markdown渲染支持不是很好,导致分享看起来有的地方会有点怪,下次写的时候会尽量注意下这个问题的

  • 发表了主题帖: FRDM-MCXN947 环境搭建与ML集成测试(Debug)

    本帖最后由 ew2024 于 2024-12-13 16:30 编辑 唉,之前写了好多了,数据也保存了,结果页面忽然一个提示异常,再回来恢复数据时候就什么都没有了,还要重新开始写:Onion-43: 我之前并没有用过NXP的产品,只是见到身边有人使用,使用体验是怎么样的也不是很清楚。因此想要感受一下,并便于的项目的器件选型等。拿到板卡之后,这个板卡给我的感觉与其他厂商的板卡很不一样——器件整体排布相当紧密,加上整体的黑色风格与金色焊盘,一种高级感油然而生。 在未使用的情况下,这个板卡我觉得相当好的一点是在背面四个顶角的地方都加装了一个托垫,这省去了我寻找亚克力板或是其他东西的功夫,同时也能保护这个板卡。(仍然想起来很久以前因为这个与一些意外状况,有一个板卡出现问题的情形:Onion-103:) **目录 (Table of Contents)** [TOC] # 上电测试 拿到板卡的首要步骤就是先进行上电,确保能够上电正常,方便后续操作的进行。 同时由于板卡出厂内置了一个点灯程序,我们也可以看一下程序的运行情况是否良好。 将数据线插入J17口之后,上边两个红灯便是点灯程序所点亮的,一个闪烁,一个呼吸灯,交替点亮。 # 开发环境搭建 ## IDE与SDK 想要安装相应的开发环境,就必须得先注册一个NXP的账号,这样才能下载软件。不过这里有一个问题,不知道是哪的问题,给大家参考一下吧。 我最终使用了3个邮箱才成功注册成功,最开始用的Outlook邮箱,完全收不到,垃圾箱什么的都找了也没有,然后我用QQ邮箱,结果就是半个小时以上才收到,和页面要求的10分钟相差甚远,一点不能用,最后还是换了个谷歌邮箱,才能够收到验证信息。 根据自己的开发平台,选择合适的,我是在Windows下使用的,这里直接找到的就是最新版的MCUXpresso IDE,可以直接下载。之后可以一直点击next,建议还是更换一下安装位置,不要默认C盘。这样就安装完成了。 之后要安装这个板卡相对应的SDK。可以在[MCUxpresso SDK Builder](https://mcuxpresso.nxp.com/en/builder?hw=FRDM-MCXN947)中选择FRDM-MCXN947,同时选择好什么开发环境,是这个IDE还是VSC或者是keil等。由于没有什么要求,系统默认又是全部勾选组件,我们就可以直接build & download了。当然,不在那个网站下载也可以,MCUXpresso IDE中欢迎页面也有下载SDK的位置,也可以从这里下载。 ---- 发生意外了:Onion-103:,不知道怎么回事,无法正常使用MCUXpresso IDE,花了几天的时间都没有办法解决,因此只能先安装其他的开发环境,便于后续测试,MCUXpresso IDE具体问题需要后续自己排查。我查看了我所能想到的问题,也参考了各个电子论坛中很多人建议,似乎也有很多人有这个问题,但是他们的方法对我并没有什么帮助,现在有个想法是和我的win10系统有关,但是暂时还不确定。 ---- 完蛋,用VSC也有问题,会和我安装的别的东西有冲突,小改一部分,没办法编译,全改了,我就得重装好多软件,太费劲了,我之前的开发环境全被破坏了:Onion-43:只能换到keil了,索性花了一段时间,这是是可以正常使用的,要不然就只能出师未捷身先死了。 安装过程中,使用installer安装时候,对官方有一点点建议,首先是能够自定义安装位置,要不然全装在C盘是个很不好的事情;其次希望官方能对工具链的版本做出一些宽松调整,例如能够对本地的软件 版本进行一个检测,大于某个版本即可使用,不要直接安装一个版本。 ---- ## elQ Toolkit 要使用NPU加速模型,需要使用Neutron Converter工具将模型进行转换。从[elQ](https://www.nxp.com.cn/design/design-center/software/eiq-ml-development-environment/eiq-toolkit-for-end-to-end-model-development-and-deployment:EIQ-TOOLKIT)下载合适的版本安装后,我们可以点击最上方的`PLUG-INS`进行初始化 可以看到他所支持的文件格式还是比较多的。 # ML测试 ## 模型转换 这里就使用一个随便的搭建的网络导出的tflite模型进行实验。 点击model tools,我们可以选择自己的模型,导入成功后,可以看到模型所包含的网络结构。 接着将其进行转化,转化时候应该选择自己板卡对应型号 选择好以后,我们就可以进行TensorFlow Lite For Neutron转化过程了 遗憾的是,转换的模型似乎没有发生变化,我觉得可能是因为我所使用的模型结构太过于简单所导致的,因为整个结构中只有全连接层,而没有卷积层,也就是至只是简单的线性运算,elQ应该是对卷积运算等特殊运算进行过特别优化,能转换为NeutronGraph节点,而全连接变化不是特别大。等后边有时间换一个模型看一下。 ## 集成模型 这个阶段是bug集大成的时候,会出现很多要解决的,要耐心处理 ### 配置文件 后边打开example中的tflm_cifar10工程,将转换后的模型文件复制到工程文件夹中,创建名为model_data.s的程序集文件,并将模型文件包含到数据部分custom_model_data中。导出第32行至第35行的指令。 官方说的就是导出这个照片的1-4行,但是导出指的是什么意思,我并没有理解,就直接整个文件都使用了,后续感觉也正常,有什么问题后续我在研究一下。 `注意` 这里模型文件导入keil时候会让你选择文件类型,这个直接可以选择文本文件,不要选择image类型,否则后续会报错,类似这样的 ```txt FCARM - Output Name not specified, please check ‘Options for Target - Utilities‘ ``` 后边就正常按照指导修改model.cpp的33与42行以及修改model_cifarnet_ops_npu.cpp文件 这里先插个标,后边需要回来改这里的bug ### 数据准备 官方说要准备测试数据,但是给的代码并不好用,大部分情况下下载到的CIFAR是pickle格式的,使用OpenCV不方便读取,而且tofile有以下风险,所以我自己写了一段代码,用于处理数据 ```python import pickle import numpy as np # CIFAR-10 类别名称 label_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',                'dog', 'frog', 'horse', 'ship', 'truck'] # 加载本地的CIFAR-10数据集(文件名为cifar-10-batches-py) def unpickle(file):     with open(file, 'rb') as fo:         dict = pickle.load(fo, encoding='bytes')     return dict # 定义CIFAR-10数据集的路径 data_path = './cifar-10-batches-py'   # 加载测试集 test_batch = unpickle(f'{data_path}/test_batch') # 解析测试集中的数据和标签 x_test = test_batch[b'data'] y_test = np.array(test_batch[b'labels']) # 查找第一个属于“bird”类别的图像索引 bird_label_index = label_names.index('bird') img_index = next((i for i, label in enumerate(y_test) if label == bird_label_index), None) if img_index is not None:     print(f"Found a bird image at index {img_index}.")     # 获取图像并重塑为32x32x3形状     img = x_test[img_index]     img = img.reshape(3, 32, 32).transpose([1, 2, 0])  # 调整通道顺序到最后一维     # 将图像展平为一维数组并转换为十六进制字符串     img_data = img.flatten().tolist()     hex_data = [f"0x{value:02X}" for value in img_data]     # 写入头文件     header_filename = 'bird.h'     with open(header_filename, 'w') as fout:         print('#define STATIC_IMAGE_NAME "bird"', file=fout)         print('static const uint8_t bird[] = {', file=fout)                  # 每行输出一定数量的数据,每行16个值         line_length = 16         for i in range(0, len(hex_data), line_length):             print("    " + ", ".join(hex_data[i:i+line_length]) + ",", file=fout)         print('};', file=fout)     print(f"Image data has been written to {header_filename}.") else:     print("No bird image found in the test set.") ``` `注意:`要确保with代码段中,文件名与输出的字符的一致性,因为后续其他cpp文件中会使用对应名字变量 后续依照官方示例将头文件(bird.h)复制到工程的图像文件夹中,并修改image_loade.c。切换到使用Bird类图像数据。 ### 补充文件 做完上述工作后,点击编译,但是先不要放松,这时候需要解决几个bug 1. 首先可能会看到这个问题 多看一下的话,发现这个问题是由之前我们提到的model_cifarnet_ops_npu.cpp引起的。仔细分析的话,会看到这个文件似乎只是写在这了,没有找到相关的头文件,在报错的model.cpp文件中也没有导入相关的头文件,这个文件是空置在这了。 因此我们要把头文件补齐了 ```cpp #ifndef MODEL_OPS_RESOLVER_H_ #define MODEL_OPS_RESOLVER_H_ // 包含必要的TensorFlow Lite Micro头文件 #include "tensorflow/lite/micro/kernels/micro_ops.h" #include "tensorflow/lite/micro/micro_mutable_op_resolver.h" #include "tensorflow/lite/micro/kernels/neutron/neutron.h" tflite::MicroOpResolver& MODEL_GetOpsResolver(); #endif // MODEL_OPS_RESOLVER_H_ ``` `tips:`我试了下,第一个kernels/micro_ops.h文件似乎也可以用micro/all_ops_resolver.h这个文件,在其他情况会不会失效不清楚,暂时是没有什么问题的。不过这个文件官方的库中似乎没有,可以到[github](https://github.com/google/CFU-Playground/tree/main/third_party/tflite-micro/tensorflow/lite/micro)上把h与cpp同时拷下来放到SDK的middle文件夹中相对应使用 2. 补齐之后头文件后,又会看到文件上报错,编译又会有提示 这个是keil在链接时候的问题,可以参考这个网站解决 [内存对齐](https://www.cnblogs.com/henjay724/p/14069961.html) 在Linker处添加后,keil又警告,文档说的是默认的,但是又需要添加,添加后又在警告,但是索性是警告,暂时不影响使用,后续再看看官方文档有没有什么更好的处理方式 最后下载成功后,可以在串口工具上显示结果。 不过似乎是因为我偷懒,没有修改模型或者研究ops文件中操作类型,不过这个总体是正常结束了,后续特意训练一个模型再使用吧

  • 2024-12-10
  • 回复了主题帖: FRDM-MCXN947 下载问题linkserver

    bigbat 发表于 2024-12-10 18:04 我用的是vscode,没有发现有啥问题,你适用keil试试看看能不能调通。 我有个选主次核的过程,其它没有什 ... VSC吗,那就先不用官方IDE了,我试试这个,搞了好几天都没查出来哪的问题

  • 回复了主题帖: FRDM-MCXN947 下载问题linkserver

    TL-LED 发表于 2024-12-10 20:37 打开个MDK工程,看能不能找到仿真器   随便开了一个,确实是能找到的  

  • 回复了主题帖: FRDM-MCXN947 下载问题linkserver

    CoderX9527 发表于 2024-12-10 18:03 设备管理器有没有 MCU link? 这个也是有的,所以就更疑惑了  

  • 发表了主题帖: FRDM-MCXN947 下载问题linkserver

    在使用MCUXpresso IDE下载代码时候,点击debug,会有下边这样的弹窗  然后在下边的控制台中反复出现   等待一段时间之后,就会下边这样发生报错。   他是说检测不到,我看了设备管理器中,没有黄色三角,首先端口和设备是可以识别的,不过依然没有定位到问题在哪。请问有人知道这是由于什么导致的吗?

  • 2024-12-02
  • 回复了主题帖: 测评入围名单:NXP 边缘AI FRDM-MCXN947开发板

    个人信息无误,确认可以完成测评分享计划

  • 2024-11-26
  • 回复了主题帖: 这5本书,你想让哪一本先上线?快来给它投票啦~

    自动驾驶,冲!!!!!

最近访客

< 1/1 >

统计信息

已有9人来访过

  • 芯积分:41
  • 好友:--
  • 主题:3
  • 回复:6

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言