STM32N6570-DK开发板AI体验记录01
STM32N6570-DK开发板AI模型体验
以下内容主要介绍使用 STM32N6570-DK开发板进行深度学习模型的部署。主要参考博客:链接: 【STM32N6570-DK测评】3.快速实现AI目标检测应用这个博主介绍的比较详细,跟着操作能够很好的复现出来。
我写这篇文章的目的:
- 记录自己的复现过程
- 对复现过程中的迷惑之处进行讲解(希望能帮助到遇到一样问题的人)
准备工具:
1.STEdgeAI:STEdgeAI下载地址
2.STM32CubeIDE:STM32CubeIDE下载地址
3.arm-none-eabi-objcopy:arm-none-eabi-objcopy下载链接(GitHub下载)
4.STM32CubeProgrammer:STM32CubeProgrammer下载地址
针对这些软件工具,STM32CubeIDE、STM32CubeProgrammer这些都很具体,也是比较常见的。STEdgeAI用到的是下图中的STEAICore-Win。
**注意:**因为STM32CubeProgrammer和arm-none-eabi-objcopy等后面都是在终端使用命令调用,所以需要将其添加到环境变量中。
我直接copy一下参考博客的截图,
可以看出他把新建了一个ST文件夹,将STEdgeAI安装在目录下,ELF目录下存放的是arm-none-eabi-objcopy.exe。根据自己的安装路径将上面的三个包含到环境变量的系统变量中的Path里面去。
关于STEdgeAI安装,可以选择ST EdgeAI Core2.1.0,2.0.0和1.0.0三个版本。参考博主使用的是2.0.0,但选择2.0.0,我这边显示需要ST Neural-ART package,但我真的不知道这个包在哪里,如果不安装这个包,后面运行python程序会报错,所以我选择了2.1.0,不需要手动指定包的位置,能够直接下载下来。
还需要下载资源包:
STM32N6 Getting Started V1.0.0:下载链接
STM32 model zoo services:GitHub链接
stm32ai-modelzoo:GitHub链接
这是参考博客对三个资源包的介绍。
**注意:**博主使用的是STM32 model zoo services3.0.0,所以提到了需要将下载的STM32N6 Getting Started V1.0.0解压至stm32ai-modelzoo-services目录,这样其中的application_code目录下才会有STM32N6的示例工程,否则这个目录是空的。 但我使用的STM32 model zoo services3.1.0好像不需要这一操作。
安装python环境
因为后面是使用python进行模型的代码生成,所以需要配置python环境,安装需要使用的库。
需要的库保存在F:\\STAI\\stm32ai-modelzoo-services-3.1.0目录的requirements.txt文件中。需要在stm32ai-modelzoo-services-3.1.0目录下运行
pip install -r requirements.txt
注意:我第一次运行的时候报错,然后我使用aconda创建了一个虚拟环境,就可以下载了。可能是包存在冲突。
关于使用aconda创建虚拟环境,网上资源很多,自行查找。我使用的是python=3.1.0
配置YAML文件
YAML文件中包含一些模型、数据集、使用的工具等信息。我们可以根据提供的yaml文件进行修改。F:\\STAI\\stm32ai-modelzoo-services-3.1.0\\object_detection\\src\\config_file_examples目录下提供了很多yaml文件。使用的是deployment_n6_ssd_mobilenet_v2_fpnlite_config.yaml和参考博主一致(为了更好的复刻,防止后面存在未知问题)
将这一yaml文件复制一份,并修改名称。然后打开,进行配置。
这一部分是使用到的模型名称:model_type: ssd_mobilenet_v2_fpnlite
模型地址:model_path。
模型在之前下载的stm32ai-modelzoo。路径为:F:\\STAI\\stm32ai-modelzoo\\object_detection\\ssd_mobilenet_v2_fpnlite\\ST_pretrainedmodel_public_dataset\\coco_2017_80_classes\\ssd_mobilenet_v2_fpnlite_100_256
这一部分为模型使用的数据集:
name:为数据集名称,class_names:为包含的识别对象类别名称
dataset: name: coco_2017_80_classes class_names: [person, bicycle, car, motorcycle, airplane, bus, train, truck, boat, traffic light, fire hydrant, stop sign, parking meter, bench, bird, cat, dog, horse, sheep, cow, elephant, bear, zebra, giraffe, backpack, umbrella, handbag, tie, suitcase, frisbee, skis, snowboard, sports ball, kite, baseball bat, baseball glove, skateboard, surfboard, tennis racket, bottle, wine glass, cup, fork, knife, spoon, bowl, banana, apple, sandwich, orange, broccoli, carrot, hot dog, pizza, donut, cake, chair, couch, potted plant, bed, dining table, toilet, tv, laptop, mouse, remote, keyboard, cell phone, microwave, oven, toaster, sink, refrigerator, book, clock, vase, scissors, teddy bear, hair drier, toothbrush]
这一部分是使用的工具路径,主要包含stedgeai和cubeide,直接复制自己安装的的路径进去。
其他的可以不进行修改,也可以参考这一链接参考连接进行修改。
运行python代码,生成模型文件。
python stm32ai_main.py --config-path ./src/config_file_examples/ --config-name my_deployment_n6_ssd_mobilenet_v2_fpnlite_config.yaml
运行上面连接,自动生成结果文件。
**注意:**上面的命令与参考博客存在区别,应为stm32ai_main.py代码文件存在位置在stm32ai-modelzoo-services-3.1.0和stm32ai-modelzoo-services-3.0.0存在区别。stm32ai-modelzoo-services-3.1.0是存放在stm32ai-modelzoo-services-3.1.0\\object_detection目录下,stm32ai-modelzoo-services-3.0.0是存放在stm32ai-modelzoo-services-3.1.0\\object_detection\\src文件夹下面。
运行上面代码时,命令行位置是在stm32ai_main.py目录下。
运行这个脚本,需要在前面安装了相关库的python环境,否则可能无法运行。
模型文件格式转换
生成的模型C文件和bin文件在对应的工程的Model目录下。我的是在F:\\STAI\\stm32ai-modelzoo-services-3.1.0\\application_code\\object_detection\\STM32N6\\Model\\STM32N6570-DK。我这里好像已经生成了network_data.hex。如果里面没有,就是用命令
arm-none-eabi-objcopy -I binary network_atonbuf.xSPI2.bin --change-addresses 0x70380000 -O ihex network_data.hex
进行格式转换。
程序烧录
程序烧录时,需要将BOOT0开关拨到右边,再次上电后,是开发板进入dev模式,然后烧录程序。
烧录引导程序
引导程序就是First stage boot loader程序,需要用到的是STM32CubeProgrammer里面的文件和ai_fsbl.hex文件
F:/STM32CubeProgrammer/bin/ExternalLoader/MX66UW1G45G_STM32N6570-DK.stldr -->根据自己的路径进行修改
ai_fsbl.hex -->F:\\STAI\\stm32ai-modelzoo-services-3.1.0\\application_code\\object_detection\\STM32N6\\Binary
STM32_Programmer_CLI -c port=SWD mode=HOTPLUG -el F:/STM32CubeProgrammer/bin/ExternalLoader/MX66UW1G45G_STM32N6570-DK.stldr -hardRst -w Binary/ai_fsbl.hex
在这里遇到了擦除失败的问题,把供电线和下载线重新插了一下,就没有出现了
烧录模型文件
烧录上面转换的network_data.hex文件。
STM32_Programmer_CLI -c port=SWD mode=HOTPLUG -el F:/STM32CubeProgrammer/bin/ExternalLoader/MX66UW1G45G_STM32N6570-DK.stldr -hardRst -w Binary/network_data.hex
烧录代码
生成的程序固件在STM32CubeIDE\\Debug目录下。在烧录代码之前,我们首先需要使用STM32_SigningTool_CLI 工具对其进行签名,之后再进行烧录。
我的文件位置F:\\STAI\\stm32ai-modelzoo-services-3.1.0\\application_code\\object_detection\\STM32N6\\Application\\STM32N6570-DK\\STM32CubeIDE\\Debug
STM32_SigningTool_CLI -bin STM32N6570-DK_GettingStarted_ObjectDetection.bin -nk -t ssbl -hv 2.3 -o STM32N6_GettingStarted_ObjectDetection_signed.bin
注意这里刚开始的文件名称与参考博主的不一致。
然后进行烧录
STM32_Programmer_CLI -c port=SWD mode=HOTPLUG -el F:/STM32CubeProgrammer/bin/ExternalLoader/MX66UW1G45G_STM32N6570-DK.stldr -hardRst -w STM32N6_GettingStarted_ObjectDetection_signed.bin 0x70100000
烧录完成后,将BOOT0和BOOT1拨码开关均拨至左侧,重新给开发板上电,即可正常从外部FLASH运行刚才下载的程序了。
总体注意事项:
STM32 model zoo services需要和stedgeai的版本对应,
STM32 model zoo services3.1.0对应ST EdgeAI Core2.1.0
STM32 model zoo services3.1.0文件的一些生成文件路径和STM32 model zoo services3.0.0不一样,需要进行修改。
烧录程序需要在烧录文件的当前文件夹下启动终端。命令中的工具地址需要根据自己的进行调整。
软件工具需要加入环境变量里面,才能正常使用终端命令。