ew2024 发表于 2024-12-13 16:31

FRDM-MCXN947 环境搭建与ML集成测试(Debug)

本帖最后由 ew2024 于 2024-12-13 16:30 编辑

唉,之前写了好多了,数据也保存了,结果页面忽然一个提示异常,再回来恢复数据时候就什么都没有了,还要重新开始写:Onion-43:

我之前并没有用过NXP的产品,只是见到身边有人使用,使用体验是怎么样的也不是很清楚。因此想要感受一下,并便于的项目的器件选型等。拿到板卡之后,这个板卡给我的感觉与其他厂商的板卡很不一样——器件整体排布相当紧密,加上整体的黑色风格与金色焊盘,一种高级感油然而生。


在未使用的情况下,这个板卡我觉得相当好的一点是在背面四个顶角的地方都加装了一个托垫,这省去了我寻找亚克力板或是其他东西的功夫,同时也能保护这个板卡。(仍然想起来很久以前因为这个与一些意外状况,有一个板卡出现问题的情形:Onion-103:)

**目录 (Table of Contents)**



# 上电测试
拿到板卡的首要步骤就是先进行上电,确保能够上电正常,方便后续操作的进行。
同时由于板卡出厂内置了一个点灯程序,我们也可以看一下程序的运行情况是否良好。

将数据线插入J17口之后,上边两个红灯便是点灯程序所点亮的,一个闪烁,一个呼吸灯,交替点亮。

# 开发环境搭建
## IDE与SDK
想要安装相应的开发环境,就必须得先注册一个NXP的账号,这样才能下载软件。不过这里有一个问题,不知道是哪的问题,给大家参考一下吧。
我最终使用了3个邮箱才成功注册成功,最开始用的Outlook邮箱,完全收不到,垃圾箱什么的都找了也没有,然后我用QQ邮箱,结果就是半个小时以上才收到,和页面要求的10分钟相差甚远,一点不能用,最后还是换了个谷歌邮箱,才能够收到验证信息。

根据自己的开发平台,选择合适的,我是在Windows下使用的,这里直接找到的就是最新版的MCUXpresso IDE,可以直接下载。之后可以一直点击next,建议还是更换一下安装位置,不要默认C盘。这样就安装完成了。


之后要安装这个板卡相对应的SDK。可以在(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工具将模型进行转换。从(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
y_test = np.array(test_batch)

# 查找第一个属于“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 = img.reshape(3, 32, 32).transpose()# 调整通道顺序到最后一维

    # 将图像展平为一维数组并转换为十六进制字符串
    img_data = img.flatten().tolist()
    hex_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) + ",", 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这个文件,在其他情况会不会失效不清楚,暂时是没有什么问题的。不过这个文件官方的库中似乎没有,可以到(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文件中操作类型,不过这个总体是正常结束了,后续特意训练一个模型再使用吧

ew2024 发表于 2024-12-13 16:32

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

秦天qintian0303 发表于 2024-12-15 00:07

<p>安装确实没有遇见什么问题,我的也是win10,是不是的管理员模式打开啊</p>

nmg 发表于 2024-12-16 11:17

<p>什么异常,有印象吗?看看能否重现<br />
以便反馈给技术,让他帮忙规避下这种情况引起的数据丢失情况</p>

nmg 发表于 2024-12-16 11:27

<p>四角没加拖垫的板子出现什么异常情况?<img height="52" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/pleased.gif" width="48" />有空来具体说说,似乎这种不加坐垫的板子,还挺多的吧</p>

freebsder 发表于 2024-12-17 17:28

<p>这就评测上了?N系列应该是面向AI的吧</p>

ew2024 发表于 2025-1-7 02:46

秦天qintian0303 发表于 2024-12-15 00:07
安装确实没有遇见什么问题,我的也是win10,是不是的管理员模式打开啊

<p>不好意思,之前没有注意到消息。开或者不开管理员模式我都试过,不过都没有用<img height="53" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/sad.gif" width="54" /></p>

ew2024 发表于 2025-1-7 02:48

nmg 发表于 2024-12-16 11:17
什么异常,有印象吗?看看能否重现
以便反馈给技术,让他帮忙规避下这种情况引起的数据丢失情况

<p>问题想不起来具体是什么样的了,只是有印象是闪了一下,就弹出一个什么提示窗口,关了就没了。</p>

ew2024 发表于 2025-1-7 02:52

nmg 发表于 2024-12-16 11:27
四角没加拖垫的板子出现什么异常情况?有空来具体说说,似乎这种不加坐垫的板子,还挺多的吧

<p>之前的问题是,板卡背面当时接触到别的东西了,导致不同引脚之间短路了<img height="28" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/loudly-crying-face_1f62d.png" width="28" />所以现在不管有没有自带脚垫,基本上用的时候都是把板卡找个东西架起来<img height="28" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/grinning-face-with-smiling-eyes_1f601.png" width="28" /></p>

ew2024 发表于 2025-1-7 02:53

freebsder 发表于 2024-12-17 17:28
这就评测上了?N系列应该是面向AI的吧

<p>是AI向的,可以部署点简单的AI程序</p>

freebsder 发表于 2025-1-16 10:24

ew2024 发表于 2025-1-7 02:53
是AI向的,可以部署点简单的AI程序

<p>之前看材料,按它的频率和FLOP比,要是拉到N卡的频率,FLOP比N卡大好几倍<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/lol.gif" width="48" />&nbsp;</p>
页: [1]
查看完整版本: FRDM-MCXN947 环境搭建与ML集成测试(Debug)