STM32N6 AI官方软件包介绍 LAT1609
为了方便客户使用和评估STM32N6的性能,ST官方发布了一系列的参考例程,用于快速评估和开发,本文将简单介绍这些demo的获取途径,并简单介绍其中部分例程。
关键字:AI, STM32N6
1. 简介
为了方便客户使用和评估STM32N6的性能,ST官方发布了一系列的参考例程,用于快速评 估和开发,本文将简单介绍这些demo的获取途径,并简单介绍其中部分例程。
例程的官网地址:https://www.st.com/en/development-tools/stm32n6-ai.html
另外,建议工程师参考ST官方github总入口: https://github.com/STMicroelectronics/STM32AI_Overall_Offer
2. 总览
在https://github.com/STMicroelectronics/STM32AI_Overall_Offer内,总共有以下 demo:
| 分类 | 项目(点击跳转) | 描述 |
| Demo binary | STM32N6 AI | 官网总入口,binary文件以及相关 demo。 |
| Getting Started | Audio | 简单的音频应用:音频事件检测(AED)和 语音增强 (SE) |
| Getting Started | Image Classification |
简单视觉类应用:图片分类
|
| Getting Started | Object Detection |
简单视觉类应用:目标检测
|
| Getting Started | Pose Estimation |
简单视觉类应用:姿态评估
|
| Getting Started | Instance Segmentation |
简单视觉类应用:实例分割
|
| Getting Started | Segmantic Segmentation |
简单视觉类应用:语义分割
|
| Optimized application | People detection and tracking |
基于FreeRTOS的人体检测和追踪
|
| Optimized application | Pose estimation |
基于FreeRTOS的姿态评估
|
| Optimized application | Hand landmarks |
基于FreeRTOS的手部关键点检测
|
| Optimized application | AI with h264 encoder and USB UVC | 基于AI的多媒体应用, H264 编码和USB and USB UVC Optimized UVC实现。 |
| Optimized application | Power measurement utilities | 基于STM32N6570-DK的功耗测量应 用。 |
3. 音频应用:音频事件检测(AED)和语音增强 (SE)
3.1. AED
AED应用首先通过MIC采集数据,然后对音频数据进行特征提取,最后再由模型进行分类 处理。Audio软件包中有完整的MFCC音频中间件,以及AI模型的处理流程。
AED工程可以对环境音进行分类,比如犬吠声,直升机噪声,下雨背景声,时钟滴答声,婴 儿啼哭声等。用户可以使用自己的音频数据集进行重新训练,并可以非常简单快速的改为KWS 语音关键字分类等音频分类应用。
部署方式有两种,第一种是使用ST model zoo的服务进行部署,可以使用自己的模型,也 可以使用ST预训练的模型,参考:https://github.com/STMicroelectronics/stm32ai modelzoo-services,需要按下面的方式修改yaml配置文件.
指定工程和模型:
general:
project_name: aed_project
model_path:/audio_event_detection/yamnet/ST_pretrainedmodel_p ublic_dataset/esc10/yamnet_1024_64x96_tl/yamnet_1024_64x96_tl_qdq_int8.onnx
指定数据集和类别:
dataset:
name: esc10
class_names: ['dog', 'chainsaw', 'crackling_fire', 'helicopter', 'rain', 'crying_baby', 'clock_tick', 'sneezing', 'rooster', 'sea_waves']
指定预处理参数:
feature_extraction:
patch_length: 96
n_mels: 64 ...
指定本地工具路径和环境:
tools:
stedgeai:
version: 10.0.0
optimization: balanced
on_cloud: False
path_to_stedgeai: C://STM32Cube/Repository/Packs/STMicroelectronics/X CUBE-AI//Utilities/windows/stedgeai.exe
path_to_cubeIDE: C:/ /STM32CubeIDE/stm32cubeide.exe
设置部署相关参数:
deployment: c_project_path: ../../application_code/audio/STM32N6
IDE: GCC
verbosity: 1
hardware_setup:
serie: STM32N6
board: STM32N6570-DK
build_conf : "N6 Audio Bare Metal" # this is default configuration
# build_conf : "N6 Audio Thread X"
# build_conf : "N6 Audio Bare Metal Low Power"
# build_conf : "N6 Audio Thread X Low Power"
unknown_class_threshold: 0.5 # Threshold used for OOD detection. Mutually exclusive with use_garbage_class
# Set to 0 to disable. To enable, set to any float between 0 and 1.
第二种部署方法是本地部署:
这种方法不需要使用model zoo service,仅需要使用本地的脚本文件。
具体脚本实现在deploy-model.sh中,位于Projects\X-CUBE-AI\models目录下。
其包含三个参数:
1. 模型文件:xxx.onnx 类型的模型文件,可以来自 ST 官方参考的模型,也可以是自己的模型。 2. 模型类型:SE/AED。
3. 编译配置:BM/BM_LP/TX/TX_LP,BM:裸机程序,无操作系统。LP:加入了低功耗处理。 TX:使用ThreadX操作系统。
除此之外,还需要修改工程中的一些配置,比如:
<getting-start-install-dir>/Projects/DPU/ai_model_config.h
修改模型输出:
#define CTRL_X_CUBE_AI_MODE_NB_OUTPUT (1U) /* or (2U)*/
#define CTRL_X_CUBE_AI_MODE_OUTPUT_1 (CTRL_AI_CLASS_DISTRIBUTION)
修改模型类别:
#define CTRL_X_CUBE_AI_MODE_CLASS_NUMBER (10U)
#define CTRL_X_CUBE_AI_MODE_CLASS_LIST (1U) /* or (2U)*/ (CTRL_AI_CLASS_DISTRIBUTION) (10U) {"chainsaw","clock_tick",\ "crackling_fire","crying_baby","dog","helicopter","rain",\ "rooster","sea_waves","sneezing"}
修改预处理类型:
#define CTRL_X_CUBE_AI_PREPROC (CTRL_AI_SPECTROGRAM_LOG_MEL)
图1. 预处理流程

音频的预处理流程如上图1所示,首先做一段FFT,然后加窗,其后再对每列进行logMel 滤波,DCT等处理,之后使用一定的窗口进行移帧,对每一帧都进行同样的处理,最后在时间上 会得到上图1中的MFCC频谱。该流程是音频处理的通用特征工程,同样可以应用于KWS等应 用场景。
3.2. AED使用的模型
ST官方提供了三个不同的模型:
ST预训练模型参考:https://github.com/STMicroelectronics/stm32ai-modelzoo services/tree/main/audio_event_detection/pretrained_models
3.2.1. miniresnet
该模型参考了ResNet的实现,ResNet主要特点是在卷积层中的跳跃连接,从而解决梯度 消失和梯度爆炸的问题。
Miniresnet基于ResNet18网络拓扑,自定义了block功能,然后进行堆叠和跳跃连接, 用户可以指定堆叠的stack的数量,从而改变网络的大小。
关于池化层,ST参考的模型中删除了卷积后加池化的传统操作,因为在实验测试中发现如 果不实现池化,在模型大小,推理时间,内存占用方面能够更好的得到平衡。
模型的输入形状为(64, 50, 1),即64个梅尔通道数,50帧音频,1个通道。输入为(-1, 10), 代表10个分类结果。
基本性能参考下表:
图2. 内存和推理时间

图3. 准确率

3.2.2. miniresnet v2
和miniresnet类似,miniresnet v2也参考了ResNetv2的实现,ResNetv2相对于 ResNet改变了跳跃连接的顺序,改变了ReLU的激活函数,主要是为了训练时候更快的收敛。
图4. 内存占用和推理时间

图5. 准确率

3.2.3. yamnet
yamnet模型,是基于MobileNetv1框架的模型,主要使用了卷积和深度可分离的卷积。 原始的yamnet模型太大,ST在原始模型上进行了一定的裁剪。
性能和指标参考下图:
图6. 内存占用和推理时间

图7. 准确率

3.3. SE
SE 是音频降噪类的应用,该应用可以从带噪声的语音中恢复出更清晰的语音信号。由于噪 声的种类多种多样,传统的滤波方法非常有限。

图8. 基本流程
SE 处理的基本流程如上所示,输入是带有噪声的语音信号,先经过STFT得到复频域的幅度 谱和相位谱,然后对其进行额外的如DCT操作等,预处理完成后输入模型进行处理,得到输出 的mask,使用输出的mask对频域进行处理,再使用逆STFT变换,最后得到输出的音频。
简单总结如下:带噪语音 → STFT → 幅度谱 → CNN → 增强幅度谱 → ISTFT(结合相位) → 增强语音。
其模型的损失函数可以是MSE,用于计算增强谱和干净谱的差异,经过CNN网络,最后得 到mask。训练使用的数据需要大量带噪语音和干净语音对。
其模型结构可以参考ST官方使用TCNN结构,官方的结构基于论文重新调整了一下结构, 删除了encoder和decoder部分,保留了主要的TCN结构,用STFT和ISTFT替代了 encoder 和decoder。 ST 预训练模型参考:https://github.com/STMicroelectronics/stm32ai modelzoo/blob/main/speech_enhancement/stft_tcnn/README.md

图9. 内存等基本信息

图10. 推理时间

图11. 指标
Note:在2.0.0版本上的推理时间有很大的优化空间,2.0.0版本上很多卷积操作还依赖于 软件实现,在更新版本中将由硬件NPU实现,修复该问题后推理时间会大幅优化,有兴趣可以 从官网下载模型,然后在最新版本的STEdgeAI工具上重新测试。
4. 视觉应用:Hand landmark
不同视觉类应用有一定的通用性,Hand landmark工程内用了两个模型,一个模型用于识别 手掌,一个模型用于标记关键点。本文以Hand Landmark为例,介绍基本的流程。
4.1. 摄像头配置
目前官方demo中主要支持三款摄像头:
• MB1854B IMX335 :DK板中自带的摄像头。
• ST VD66GY:ST全局快门的TOF。
• ST VD55G1:ST全局快门的TOF。
Camera sensor 的方向可以配置为:
• CMW_MIRRORFLIP_NONE:无翻转无镜像
• CMW_MIRRORFLIP_FLIP:翻转
• CMW_MIRRORFLIP_MIRROR:镜像
• CMW_MIRRORFLIP_FLIP_MIRROR:镜像+翻转
Hand landmark 的默认配置为:
#define CAMERA_FLIP CMW_MIRRORFLIP_MIRROR
图12. DCMIPP框图

DCMIPP的大体框架如上图,总共有三个PIPE可以选择,数据源可以是CSI的接口也可以 是并口,不同PIPE对应的功能不同,一般PIPE1用于显示,PIPE2用于神经网络的输入。每个 功能块的详细差异建议参考官网手册RM0486。
图13. 数据流

Hand landmark的数据流如上图所示,摄像头CSI接口输入2592x1940的数据流,经过 PIPE1转换为800x480,用于LCD进行显示,同时经过PIPE2转换为192x192的图片,放在 nn_input_buffer内,然后给第一个手掌检测模型,手掌检测模型进行后处理输出手掌的ROI区 LAT1609 LAT1609 - Rev 1.0 page 13/19 域以及旋转角度,然后使用CPU或GPU在用于显示的图片上进行Crop和Resize,将手掌区域 裁剪并压缩成第二个模型的输入形状,然后放入第二个关键点检测模型内进行推理,得到21个 关键点,与此同时,实时更新一些信息用于显示屏,画出手掌的框和关键点。
纵横比配置:
摄像头的输入图像,放在LCD显示屏上进行显示或者是放入神经网络进行识别,通常需要 对其进行压缩或裁剪。对于图像的分辨率,会有不同的模式对其进行处理,目前ST提供的中间 件中支持以下几种常见的处理:
图14. ASPECT_RATIO_CROP

ASPECT_RATIO_CROP:对于NN pipe,将保持宽高比,但边沿的像素点会丢失。对于显 示用的display pipe,将和NN pipe使用一模一样的像素,但会放大到480x480的大小。
图15. ASPECT_RATIO_FIT

ASPECT_RATIO_FIT:该模式对于NN Pipe,会将原始图片压缩到NN输入的高和宽,但 由于NN需要的高宽比和摄像头的不一致,图片会发生变形,对于显示的display pipe,其使用 的和NN pipe的内容一致,但会放大到480x480的大小。
图16. ASPECT_RATIO_FULLSCREEN

ASPECT_RATIO_FULLSCREEN:全屏模式,该模式对于NN pipe和前面模式一样,会将原 始图片压缩到NN的高宽比,这会使图片发生变形。对于Display pipe,则和前面模式不同,将 会对原始图片的高和宽进行一定比例的转换,使其适应到全屏800x480的比例。
CMW_Aspect_ratio_manual_roi:Hand landmark demo中使用的是这种实现,该方法 可以根据设定的ROI区域对原始图片进行裁剪,和ASPECT_RATIO_FULLSCREEN类似,但是 先进行CROP,将原始图片裁剪至LCD高宽比大小一致的区域,Display pipe保持裁剪后同比 例伸缩,NN pipe则是在裁剪后再压缩,会存在变形。
4.2. 模型部署
在Model目录下,有一个自动部署的脚本generate-n6-model.sh,内容如下:
图17. 部署脚本

该脚本内主要使用stedgeai工具对模型进行转换,stedgeai generate指令会生成相 关.c, .h和模型权重文件。
参数:
--no-inputs-allocation:不再重新分配空间存储inputs。
--name palm_detector :命名为palm_detector,与后面的关键点检测模型区分开。
--model 033_palm_detection_full_quant_pc_uf_od.tflite :使用的模型文件。
--target stm32n6 :部署目标位STM32N6。
--st-neural-art palm_detector@user_neuralart.json:编译选项为 user_neuralart.json 文件中的 palm_detector。
CP指令将.c,.h 和.bin 拷贝到相关目录。
arm-none-eabi-objcopy -I binary st_ai_output/palm_detector_data.xSPI2.bin - change-addresses 0x70380000 -O ihex palm_detector_data.hex
这段指令将.bin添加地址信息0x70380000,即要烧录到flash中的地址,然后重命名为 xxx.hex。
后面一段只是将模型换成了关键点检测模型,其余类似,不再赘述。
图18. user_neuralart.json

user_neuralart.json 是配置文件,其中定义了两个不同的配置,一个用于手掌模型,一个用 于关键点模型。每个模型配置项主要有两项:
memory_pool: 指向内存配置文件,实际开发板如果内存布局有变更,需要更改该文件。
Options: stedgeai 要使用的编译选项,具体选项的含义可以查看stedgeai安装目录中相应 的documentation 目录中的文档,一般使用官方默认的即可,不需要修改。
图19. .mpool 文件

5. 总结
本文简单介绍了ST在github上AI相关的demo,包括语音和视觉类的应用,更详细的内 容及源码,建议直接从github上获取并阅读。
意法半导体公司及其子公司 (“ST”)保留随时对 ST 产品和 / 或本文档进行变更的权利,恕不另行通知。买方在订货之前应获取关于 ST 产 品的最新信息。 ST 产品的销售依照订单确认时的相关 ST 销售条款。 买方自行负责对 ST 产品的选择和使用, ST 概不承担与应用协助或买方产品设计相关的任何责任。 ST 不对任何知识产权进行任何明示或默示的授权或许可。 转售的 ST 产品如有不同于此处提供的信息的规定,将导致 ST 针对该产品授予的任何保证失效。 ST 和 ST 徽标是 ST 的商标。若需 ST 商标的更多信息,请参考 www.st.com/trademarks。所有其他产品或服务名称均为其 各自所有者的财 产。 本文档是ST中国本地团队的技术性文章,旨在交流与分享,并期望借此给予客户产品应用上足够的帮助或提醒。若文中内容存有局限或与ST 官网资料不一致,请以实际应用验证结果和ST官网最新发布的内容为准。您拥有完全自主权是否采纳本文档(包括代码,电路图等)信息, 我们也不承担因使用或采纳本文档内容而导致的任何风险。 本文档中的信息取代本文档所有早期版本中提供的信息。
更多推荐










所有评论(0)