当前位置: 首页 > news >正文

【EdgeAI实战】(2)STM32 AI 扩展包的安装与使用

【EdgeAI实战】(1)STM32 边缘 AI 生态系统
【EdgeAI实战】(2)STM32 AI 扩展包的安装与使用

【EdgeAI实战】(2)STM32 AI 扩展包的安装与使用

    • 1. STM32Cube.AI 简介
      • 1.1 STM32Cube.AI 简介
      • 1.2 X-CUBE-AI 内核引擎
    • 2. 支持的深度学习框架和算子
      • 2.1 支持的 Keras 运算符
      • 2.2 支持的 Tensorflow Lite 运算符
      • 2.3 支持的 ONNX 运算符
      • 2.4 支持的 ST Neural ART NPU 运算符
    • 3. Cube.AI 扩展包的下载与安装
      • 3.1 Cube.AI 扩展包的下载
      • 3.2 Cube.AI 扩展包的安装
    • 4. 环境配置
      • 4.1 Windows10 64-bit or newer
      • 4.2 Ubuntu 20.4 and Ubuntu 22.4 (or derived)
      • 4.3 macOS (x64) - Minimum version High Sierra
    • 5. 启动一个新的 STM32 AI 项目
    • 6. 嵌入式推理客户端 API
      • 6.1 张量
        • 6.1.1 一维张量
        • 6.1.2 二维张量
        • 6.1.3 三维张量
      • 6.2 create() / destroy()
      • 6.5 init()
      • 6.6 run()


STM32Cube.AI 套件将基于各种人工智能开发框架训练出来的算法模型,统一转换为c语言支持的源码模型,然后将 c模型部署到 STM32 的硬件产品,实现将人工智能模型直接部署在前端或边缘端设备。
本文介绍 STM32Cube.AI 套件的下载、安装和使用。

1. STM32Cube.AI 简介

1.1 STM32Cube.AI 简介

将人工智能模型/神经网络模型部署到边缘设备,可以减少延迟、节约能源、提高云利用率,并通过大限度地减少互联网上的数据交换来保护隐私。

STM32Cube.AI 是ST公司的打造的 STM32Cube 生态体系的扩展包 X-CUBE-AI,用于帮助开发者实现人工智能开发。具体地说,STM32Cube.AI 将基于各种人工智能开发框架训练出来的算法模型,统一转换为c语言支持的源码模型,然后将 c模型部署到 STM32 的硬件产品,实现将人工智能模型直接部署在前端或边缘端设备。

ST Edge AI套件支持各种意法半导体产品:STM32微控制器和微处理器、神经ART加速器、恒星微控制器和智能传感器。

X-CUBE-AI 是 ST Edge AI Suite的一部分,该套件是一个集成的软件工具集合,旨在促进嵌入式AI应用程序的开发和部署。这个全面的套件支持机器学习算法和神经网络模型的优化和部署,从数据收集到硬件上的最终部署,简化了跨学科专业人员的工作流程。

X-CUBE-AI扩展包扩展了STM32CubeMX,提供了一个自动神经网络库和经典的机器学习库生成器,在计算和内存(RAM和闪存)方面进行了优化,可以将最常用的人工智能框架(如Keras、TensorFlow Lite、scikit-learn和以ONNX格式导出的任何模型)中的预训练人工智能算法转换为自动集成在最终用户项目中的库。该项目会自动设置,准备在STM32微控制器或神经ART加速器上编译和执行。

X-CUBE-AI还扩展了STM32CubeMX,为项目创建添加了特定的MCU和板过滤,以选择符合用户AI模型特定标准要求(如RAM或闪存大小)的正确设备。

主要功能:

  • 从预训练神经网络和经典机器学习(ML)模型生成STM32优化库
  • 支持意法半导体神经ART加速器神经处理单元(NPU),用于硬件中的AI/ML模型加速
  • 原生支持各种深度学习框架,如Keras和TensorFlow Lite,并支持可导出为ONNX标准格式的所有框架,如PyTorch、MATLAB等
  • 通过ONNX支持各种内置的sci-kit学习模型,如随机森林、支持向量机(SVM)和 K-means
  • 支持32位浮点和8位量化神经网络格式(TensorFlow Lite和面向 ONNX Tensor的QDQ)
  • 支持QEras和Larq的深度量化神经网络(低至1位)
  • 可重定位选项,通过创建与应用程序代码分离的模型二进制代码,在产品生命周期内实现独立模型更新
  • 通过在外部闪存中存储权重和在外部RAM中存储激活缓冲区,可以使用更大的网络
  • 通过STM32Cube集成,可在不同STM32微控制器系列之间轻松便携
  • 使用TensorFlow Lite神经网络,使用STM32Cube生成代码。用于微控制器运行时的AI运行时或TensorFlow Lite

开发过程:
STM32Cube.AI 以插件形式支持ST相关开发平台如cubeIDE、cubeMX、keil等,整体开发过程分为三个步骤:

  • (1)收集和整理数据,
  • (2)训练及验证模型,
  • (3)模型生成和部署。

生成项目:

  • 在STM32 MCU或NPU上运行的系统性能项目,允许准确测量神经网络推理CPU或NPU的负载和内存使用情况
  • 验证项目,在台式PC和基于STM32 Arm®Cortex®-M的MCU或具有neural ART Accelerator嵌入式环境的STM32 MCU上,对随机或用户测试数据刺激的神经网络返回的结果进行增量验证
  • 应用程序和混合精度量化模板项目允许构建包括多网络支持的8位量化网络和二值化神经网络的应用程序,从而减少了所需的闪存大小,提高了推理时间,而不会显著降低网络精度。

在这里插入图片描述


1.2 X-CUBE-AI 内核引擎

X-CUBE-AI 的内核引擎如下图所示。

  • 提供一个自动且先进的 NN 映射工具,利用有限并受约束的硬件资源为嵌入式系统的预训练神经网络(DL模型)生成并部署优化且稳定的 C模型。
  • 生成 STM32NN 库(专用和通用部分),可以直接集成到 IDE项目或基于 makefile 的构建系统。
  • 可以导出定义明确且特定的推理客户端 API,用于开发客户端基于 AI 的应用程序。
    在这里插入图片描述

配备一个简单的配置接口。使用预训练的 DL 模型文件,只需要几个参数:

  • name,表示生成的 C模型的名称,默认为 “network”;
  • 压缩系数,表示用于减小权重/偏差参数大小的压缩系数;
  • STM32 系列,选择优化的 NN 内核运行时的库。

在这里插入图片描述
STM32Cube 是 ST公司推出的用于 STM32 微处理器的软件配置工具,可以利用图形向导为 STM32 创建完整的 IDE 项目,包括生成用于设备和平台设置的 C 初始化代码。
X-CUBE-AI 扩展包可以视为添加 IP 或中间件 SW 组件。基于 X-CUBE-AI 内核提供了以下功能:

  • 扩展 MCU 过滤器选择,利用可选特定 AI 过滤器移除内存不足的设备,例如滤除没有 Arm Cortex-M4 或 Cortex-M7 内核的 STM32 设备;
  • 提供完整的 AI 配置向导,可以上传多个深度学习模型,包括在 PC 和目标板上对生成的 C 代码进行验证过程。
  • 扩展 IDE 项目生成器,辅助生成优化的 STM32NN库,并将其集成到选定的 STM32 Arm Cortex-M 内核和 IDE。
  • 可选插件式应用程序,可生成完整的即用型 AI 测试应用程序项目,包括生成的 NN 库。

在这里插入图片描述


2. 支持的深度学习框架和算子

STM32Cube.AI 支持各种深度学习框架的训练模型,如 Keras、TensorFlow Lite,并支持可导出为 ONNX 标准格式的所有框架,如 PyTorch、Microsoft Cognitive Toolkit、MATLAB 等。
通过 cube.MX 可视化配置界面,导入基于深度学习框架的训练模型,来配置及生成 c 模型,并部署在STM32芯片上。

  • Keras: //keras.io/
  • TensorFlow Lite: www.tensorflow.org/lite/
  • ONNX: //onnx.ai/

对于每个工具箱,根据网络C API 的表达能力以及特定工具箱的解析器,仅支持所有可能层和层参数的一个子集。
以下章节详细介绍每个工具箱的当前版本工具在所支持的各层(使用工具箱命名惯例)以及每层支持的属性(参数)方面支持的配置。同时列出多个层支持的相同功能。


2.1 支持的 Keras 运算符

本文档列出了可以导入和转换的图层(或运算符)。支持的运营商允许解决针对移动或物联网资源受限的运行时环境的大量经典拓扑:SqueezeNet、MobileNet V1或V2、Inception、SSD MobileNet V1等,。。
本文档的目的是列出运算符及其相关约束或限制,有关给定层的详细信息,请参阅原始文档。
Keras通过Tensorflow后端支持通道最后维度排序。支持Keras.io 2.0至2.5.1版本,而Keras 1.x中定义的网络则不受官方支持。最多支持TF Keras 2.7.0。

下表列出了在满足约束或限制的情况下可以导入的运算符。下表列出了30个自定义运算符。

  • 支持可选的融合激活(或非线性):gelu、线性、relu、relun1_to_1、relu_0_to1、leaky_relu、relu6、elu、selu、sigmoid、hard_sigmoid、hard_swish、指数、tanh、softmax、softplus、softsign、abs、acos、acosh、asin、asinh、atan、atanh、ceil、clip、cos、cosh、erf、flexrf、exp、floor、identity、log、logistic、neg、logical_not、prelu、probit、reciprocal、relu_generic、relu_threshold、round、sign。sin、sinh、softmax_zero、sqrt、swish、tan
  • 支持可选的融合整数激活(或非线性):prelu、relu、clip、lut、swish、identity、relu6
  • 整数运算仅支持使用ST Edge AI Core训练后量化脚本量化的Keras模型。请求额外的张量格式配置文件(json文件格式)。
  • 如果整数中不支持运算符,则使用浮点版本。转换器由代码生成器自动添加。

(略)


2.2 支持的 Tensorflow Lite 运算符

本文档列出了可以导入和转换的图层(或运算符)。支持的运营商允许解决针对移动或物联网资源受限的运行时环境的大量经典拓扑:SqueezeNet、MobileNet V1或V2、Inception、SSD MobileNet V1等,。。

本文档的目的是列出运算符及其相关约束或限制,有关给定层的详细信息,请参阅原始文档。
Tensorflow Lite是用于在移动平台上部署神经网络模型的格式。STM.ai导入并转换基于flatbuffer技术的.tflite文件。官方的“schema.fbs”定义(标签v2.5.0)用于导入模型。处理支持运算符列表中的许多运算符,包括量化感知训练或/和训练后量化过程生成的量化模型和/或运算符。

下表列出了在满足约束或限制的情况下可以导入的运算符。

  • 支持可选的融合激活(或非线性):gelu、线性、relu、relun1_to_1、relu_0_to1、leaky_relu、relu6、elu、selu、sigmoid、hard_sigmoid、hard_swish、指数、tanh、softmax、softplus、softsign、abs、acos、acosh、asin、asinh、atan、atanh、ceil、clip、cos、cosh、erf、flexrf、exp、floor、identity、log、logistic、neg、logical_not、prelu、probit、reciprocal、relu_generic、relu_threshold、round、sign。sin、sinh、softmax_zero、sqrt、swish、tan
  • 支持可选的融合整数激活(或非线性):prelu、relu、clip、lut、swish、identity、relu6
  • 如果整数中不支持运算符,则使用浮点版本。转换器由代码生成器自动添加。

(略)


2.3 支持的 ONNX 运算符

针对移动或物联网资源受限的运行时环境:SqueezeNet、MobileNet V1或V2、Inception、SSD MobileNet V1等,。。
本文档的目的是列出运算符及其相关约束或限制,有关给定层的详细信息,请参阅原始文档。
ONNX是一种开放格式,用于表示机器学习模型。支持ONNX 1.15的操作集7、8、9、10到15的部分运算符子集。
注意:生成的C代码总是最后一个通道,这取决于应用程序是否正确地重新排列元素顺序。
此文件是自动生成的。

下表列出了在满足约束或限制的情况下可以导入的运算符。

  • 支持可选的融合激活(或非线性):gelu、线性、relu、relun1_to_1、relu_0_to1、leaky_relu、relu6、elu、selu、sigmoid、hard_sigmoid、hard_swish、指数、tanh、softmax、softplus、softsign、abs、acos、acosh、asin、asinh、atan、atanh、ceil、clip、cos、cosh、erf、flexrf、exp、floor、identity、log、logistic、neg、logical_not、prelu、probit、reciprocal、relu_generic、relu_threshold、round、sign。sin、sinh、softmax_zero、sqrt、swish、tan

(略)


2.4 支持的 ST Neural ART NPU 运算符

本文档描述了在neural ART加速器上高效部署神经网络模型所需的模型格式和相关量化方案。它列出了不同运算符的映射。

量化模型格式
ST 神经ART编译器支持两种量化模型格式。两者都基于相同的量化方案:每信道8b/8b,ss/sa。

  • 由训练后或训练感知过程生成的量化TensorFlow lite模型。校准由TensorFlow Lite框架执行,主要是通过导出TensorFlow文件的“TF Lite转换器”实用程序。
  • 基于面向张量(QDQ;量化和去量化)格式的量化ONNX模型。在原始运算符之间插入 DeQuantizeLinear和QuantizeLiner运算符(浮点数),以模拟量化和解量化过程。它可以通过ONNX量化器运行时服务生成。

请参阅量化模型一章,了解使用Tensorflow Lite转换器或onnxruntime的量化过程的详细说明。
如有必要,模型中的某些层可以保持浮动状态,但它们将在CPU上执行,而不是在Neural ART NPU上执行。

推理模型约束
ST神经ART处理器单元是一个可重新配置的纯推理引擎,能够在硬件上加速量化推理模型,不支持训练模式。

  • 输入和输出张量必须是静态的
  • 可变长度批次维度被视为等于1
  • 不支持输出未连接的操作单元
  • 不支持混合数据操作(即混合运算符),应量化激活和权重
  • 权重/激活张量的数据类型必须为:
    • int8(比例/偏移格式)ss/sa方案(见量化模型-每个通道)
    • 如果请求float32操作,它将映射到软件操作上

自定义层支持-后处理
目前,对象检测模型不支持“TFLite_Detection_PostProcess”运算符等自定义层。如果可能的话,在量化模型之前,最好将其删除,只保留骨干和头部。这包括“NMS”(非最大抑制)算法(通常基于浮点运算),它将由在HOST MCU处理器上运行的“外部”库支持。

TFlite到Neural ART操作映射
下表列出了TensorFlow Lite(TFlite)和Neural ART™堆栈之间的操作映射。请注意,只有量化操作(int8比例/偏移格式)可以直接映射到Neural ART™处理单元上。如果操作员未映射到硬件上,则会发出回退实现(int8或float32版本),并使用HOST(Cortex-m55)子系统来执行回退实现。

(略)


3. Cube.AI 扩展包的下载与安装

3.1 Cube.AI 扩展包的下载

X-CUBE-AI 是 STM32Cube.AI生态系统的STM32Cube扩展包部分,能够自动转换预训练人工智能算法(包括神经网络和经典机器学习模型),并将生成的优化库集成到用用户项目中,以此来扩展STM32CubeMX功能。

关于 STM32Cube.AI 的资料和文档可以从 ST 官网上查看和下载:STM32 x-cube-ai 扩展包

在这里插入图片描述

下载地址:
STM32 Cube.AI 扩展包的下载地址为:STM32 x-cube-ai
根据使用的操作系统,选择对应的安装包进行下载,即可安装使用。

在这里插入图片描述


3.2 Cube.AI 扩展包的安装

  1. X-CUBE-AI 是 STM32Cube 的扩展包,需要先安装 STM32CubeMX 开发工具(5.0以上版本)。
    STM32CubeMX 是 ST公司推出的软件开发工具,官方下载地址:https://www.st.com.cn/content/st_com/zh/stm32cubemx.html,安装步骤详见本系列 【动手学电机驱动】STM32-FOC(1)STM32 电机控制的软件开发环境。

  2. 启动 STM32CubeMX,安装 X-CUBE-AI 扩展包:
    (1)从菜单中选择 [帮助] > [管理嵌入式软件包],或者 Alt-U 快捷键。
    在这里插入图片描述

(2)从[嵌入式软件包管理器]窗口,点击[刷新]按钮,获得扩展包的更新列表。进入[STMicroelectronics] 选项卡,找到 X-CUBE-AI。
注意不同版本的 STM32CubeMX 支持的 X-CUBE-AI 版本也不同,不兼容的版本之前会出现红色叉号 ❌。

(3)选中相应的复选框,然后点击[立即安装]按钮进行安装。安装完成后,该版本前面方框呈绿色标记,点击[关闭] 按钮。

在这里插入图片描述


4. 环境配置

4.1 Windows10 64-bit or newer

  1. 打开 Windows 命令行窗口。

  2. 更新系统路径变量。

set PATH=%STEDGEAI_CORE_DIR%\Utilities\windows;%PATH%

  1. [替代方案] 使用doskey命令创建别名

doskey stedgeai=“%STEDGEAI_CORE_DIR%\Utilities\windows\stedgeai.exe” $*

  1. 验证环境(显示的版本取决于安装的组件)
$  stedgeai --version
ST Edge AI Core v2.0.0-A1ISPU 1.1.0MLC 1.1.0StellarStudioAI 2.0.0STM32CubeAI 10.0.0STM32MP2 1.0

或者也有嵌入式Python模块的版本(显示的模块取决于安装的组件)

$ stedgeai --tools-version
stedgeai - ST Edge AI Core v1.0.0- Python version   : 3.9.13- Numpy version    : 1.23.5- TF version       : 2.15.1- TF Keras version : 2.15.0- ONNX version     : 1.15.0- ONNX RT version  : 1.18.1

4.2 Ubuntu 20.4 and Ubuntu 22.4 (or derived)

环境设置类似。系统路径中应可访问本机GCC(X86_64)工具链。

export PATH= S T E D G E A I C O R E D I R / U t i l i t i e s / l i n u x : STEDGEAI_CORE_DIR/Utilities/linux: STEDGEAICOREDIR/Utilities/linux:PATH


4.3 macOS (x64) - Minimum version High Sierra

环境设置类似。系统路径中应可访问本机GCC(X86_64)工具链。

export PATH= S T E D G E A I C O R E D I R / U t i l i t i e s / m a c : STEDGEAI_CORE_DIR/Utilities/mac: STEDGEAICOREDIR/Utilities/mac:PATH


5. 启动一个新的 STM32 AI 项目

《待续》


6. 嵌入式推理客户端 API

嵌入式推理客户端API 是<project_name>/Middlewares/ST/AI/src/.h 文件的一部分。所有函数和宏均根据所提供的C 网络名称生成。


6.1 张量

输入和输出缓冲区被定义为具有最多3 个维度的张量(HWC 布局格式,代表高度、宽度和通道)。为了处理一组张量,可添加批维度。缓冲区完全通过struct ai_buffer C 结构定义来定义。

/* @file: ai_platform.h */
typedef struct ai_buffer_ {
ai_buffer_format format; /*!< 缓冲区格式 */
ai_u16 n_batches; /*!< 缓冲区中的批数 */
ai_u16 height; /*!< 缓冲区高度维度 */
ai_u16 width; /*!< 缓冲区宽度维度 */
ai_u32 channels; /*!< 缓冲区通道编号 */
ai_handle data; /*!< 指向缓冲区数据的指针 */
} ai_buffer;

提示:目前,输入和输出张量仅支持AI_BUFFER_FORMAT_FLOAT 格式(32 位浮点)。这种C 结构还可用于处理不透明和特定数据缓冲区。


6.1.1 一维张量

对于一维张量,预计采用标准C 数组类型处理输入和输出张量。

#include "network.h"
#define xx_SIZE VAL /* = H * W * C = C */
ai_float xx_data[xx_SIZE]; /* n_批次 = 1,高度 = 1,宽度 = 1,通道 = C */
ai_float xx_data[B * xx_SIZE]; /* n_批次 = B,高度 = 1,宽度 = 1,通道 = C */
ai_float xx_data[B][xx_SIZE];

6.1.2 二维张量

对于二维张量,采用标准二维C 数组存储器排列来处理输入和输出张量。两个维度映射到原始工具箱表达中的张量的前两个维度:Keras / TensorFlow™中的H 和C、Lasagne 中的H 和W。

#include "network.h"
#define xx_SIZE VAL /* = H * W * C = H * C */
ai_float xx_data[xx_SIZE]; /* n_批次 = 1,高度 = H,宽度 = 1,通道 = C */
ai_float xx_data[H][C];
ai_float xx_data[B * xx_SIZE]; /* n_批次 = B,高度 = H,宽度 = 1,通道 = C */
ai_float xx_data[B][H][C];

6.1.3 三维张量

对于三维张量,采用标准三维C 数组存储器排列来处理输入和输出张量。

#include "network.h"
#define xx_SIZE VAL /* = H * W * C */
ai_float xx_data[xx_SIZE]; /* n_批次 = 1,高度 = H,宽度 = W,通道 = C */
ai_float xx_data[H][W][C];
ai_float xx_data[B * xx_SIZE]; /* n_批次 = B,高度 = H,宽度 = W,通道 = C */
ai_float xx_data[B][H][W][C];

6.2 create() / destroy()

ai_error ai_<name>_create(ai_handle* network, const ai_buffer* network_config);
ai_handle ai_<name>_destroy(ai_handle network);

这份强制函数是 AI 客户端实例化和初始化 NN 实例必须调用的早期函数。 ai_handle 引用必须传递到其他函数的不透明上下文。

  • config 参数是编码为ai_buffer 的特定网络配置缓冲区,由(AI_DATA_CONFIG C 定义)AI 代码生成器(参见 <名称>.h 文件)生成
  • 当应用程序不再使用该实例,必须调用ai__destroy()函数,释放所分配的资源

典型使用

#include <stdio.h>
#include "network.h"
...
/* 引用实例化NN 的全局句柄 */
static ai_handle network = AI_HANDLE_NULL;
...
int aiInit(void) {
ai_error err;
...
err = ai_network_create(&network, AI_NETWORK_DATA_CONFIG);
if (err.type != AI_ERROR_NONE) {
/* 管理错误 */
printf("E: AI error - type=%d code=%d\r\n", err.type, err.code);
...
}
...
}

6.5 init()

ai_bool ai__init(ai_handle network, const ai_network_params* params);

该强制函数必须由客户端用于初始化实例化NN 的内部运行时结构:

  • params 参数是一个结构(ai_network_params 类型),用于传递所生成权重(params 属性)的引用以及激活/崩溃存储器缓冲区(activations 属性)。
  • network 句柄必须是有效句柄。请参考ai__create()函数。
/* @file: ai_platform.h */
typedef struct ai_network_params_ {
ai_buffer params; /*! 参数缓冲区信息(必需!) */
ai_buffer activations; /*! 激活缓冲区信息(必需!) */
} ai_network_params;

必须使用多个C 宏助手和特定AI__XX C 定义初始化此参数:

  • params 属性处理权重/偏差存储器缓冲区
  • activations 属性处理转发过程使用的激活/崩溃存储器缓冲区, 参考ai__run()函数)
  • 相关存储块的大小分别由以下C 定义(参考文件<名称>_data.h)来定义。这些缓冲区的存储布局取决于实现的神经网络。
    • AI__DATA_WEIGHTS_SIZE
    • AI__DATA_ACTIVATIONS_SIZE

典型使用

#include <stdio.h>
#include "network.h"
#include "network_data.h"
...
/* 引用实例化NN 的全局句柄 */
static ai_handle network = AI_HANDLE_NULL;
/* 处理激活数据缓冲区的全局缓冲区 - R/W 数据 */
AI_ALIGNED(4)
static ai_u8 activations[AI_NETWORK_DATA_ACTIVATIONS_SIZE];
...
int aiInit(void) {
ai_error err;
...
/* 初始化网络 */
const ai_network_params params = {
AI_NETWORK_DATA_WEIGHTS(ai_network_data_weights_get()),
AI_NETWORK_DATA_ACTIVATIONS(activations) };
if (!ai_network_init(network, &params)) {
err = ai_network_get_error(network);
/* 管理错误 */
...
}
...
}

6.6 run()

ai_i32 ai__run(ai_handle network, const ai_buffer* input, ai_buffer* output);

该函数是馈送NN 的主函数。输入和输出缓冲区参数(ai_buffer 类型)提供输入张量并存储预测的输出张量

  • 返回值是处理的输入张量数(n_batches > 1)。如果返回值是负数或为空,则使用
    ai__get_error()函数获取错误。
  • 必须使用AI_IN_1(和AI_OUT_1)初始化输入(和输出)缓冲区句柄
  • AI_IN_1_SIZE(和AI_OUT_1_SIZE)用于初始化输入数据(和输出数据)缓冲区

提示:可以传递两个单独的输入和输出ai_buffer 列表。这样即可在未来支持具有多个输入、输出或两者的神经网络。AI_IN_NUM 和AIOUT_NUM 分别用于在编译时获取输入和输出的数量。这些数值也由 ai_network_report 结构返回(参考ai_get_info()函数)。

典型应用:

#include <stdio.h>
#include "network.h"
...
/* 引用实例化NN 的全局句柄 */
static ai_handle network = AI_HANDLE_NULL;
...
static ai_buffer ai_input[AI_NETWORK_IN_NUM] = { AI_NETWORK_IN_1 };
static ai_buffer ai_output[AI_NETWORK_OUT_NUM] = { AI_NETWORK_OUT_1 };
...
int aiRun(const ai_float *in_data, ai_float *out_data,
const ai_u16 batch_size)
{
ai_i32 nbatch;
...
/* 初始化输入/输出缓冲区处理程序 */
ai_input[0].n_batches = batch_size;
ai_input[0].data = AI_HANDLE_PTR(in_data);
ai_output[0].n_batches = batch_size;
ai_output[0].data = AI_HANDLE_PTR(out_data);
nbatch = ai_network_run(network, &ai_input[0], &ai_output[0]);
if (nbatch != batch_size) {
err = ai_network_get_error(network);
/* 管理错误 */
...
}
...
}

参考文献:UM2526 人工智能(AI)X-CUBE-AI 扩展包入门指南

版权声明:
youcans@qq.com 原创作品,转载必须标注原文链接:【EdgeAI实战】(2)STM32Cube.AI 扩展包
Copyright@youcans 2025
Crated:2025-02

相关文章:

【EdgeAI实战】(2)STM32 AI 扩展包的安装与使用

【EdgeAI实战】&#xff08;1&#xff09;STM32 边缘 AI 生态系统 【EdgeAI实战】&#xff08;2&#xff09;STM32 AI 扩展包的安装与使用 【EdgeAI实战】&#xff08;2&#xff09;STM32 AI 扩展包的安装与使用 1. STM32Cube.AI 简介1.1 STM32Cube.AI 简介1.2 X-CUBE-AI 内核引…...

【Java】MyBatis动态SQL

在MyBatis中使用动态SQL语句。 动态SQL是指根据参数数据动态组织SQL的技术。 生活中的案例&#xff1a; 在京东上买东西时&#xff0c;用户搜索商品&#xff0c;可以选择筛选条件&#xff0c;比如品牌&#xff0c;价格&#xff0c;材质等&#xff0c;也可以不使用筛选条件。这时…...

Spring Boot篇

为什么要用Spring Boot Spring Boot 优点非常多&#xff0c;如&#xff1a; 独立运行 Spring Boot 而且内嵌了各种 servlet 容器&#xff0c;Tomcat、Jetty 等&#xff0c;现在不再需要打成 war 包部署到 容器 中&#xff0c;Spring Boot 只要打成一个可执行的 jar 包就能独…...

深入理解Node.js_架构与最佳实践

1. 引言 1.1 什么是Node.js Node.js简介:Node.js是一个基于Chrome V8引擎的JavaScript运行时,用于构建快速、可扩展的网络应用。Node.js的历史背景和发展:Node.js最初由Ryan Dahl在2009年发布,旨在解决I/O密集型应用的性能问题。随着时间的推移,Node.js社区不断壮大,提供…...

使用mockttp库模拟HTTP服务器和客户端进行单元测试

简介 mockttp 是一个用于在 Node.js 中模拟 HTTP 服务器和客户端的库。它可以帮助我们进行单元测试和集成测试&#xff0c;而不需要实际发送 HTTP 请求。 安装 npm install mockttp types/mockttp模拟http服务测试 首先导入并创建一个本地服务器实例 import { getLocal } …...

响应式编程_02基本概念:背压机制 Backpressure

文章目录 Pre流流的处理模型拉模式推模式 流量控制产者生产数据的速率小于消费者的场景生产者生产数据的速率大于消费者消费数据无界队列有界丢弃队列有界阻塞队列 背压机制响应式流规范响应式流的核心接口PublisherSubscriberSubscription 响应式流的技术生态圈 小结 Pre 响应…...

Jason配置环境变量

jason官网 https://jason-lang.github.io/ https://github.com/jason-lang/jason/releases 步骤 安装 Java 21 或更高版本 安装 Visual Studio Code 根据操作系统&#xff0c;请按照以下具体步骤操作 视窗 下载 Jason 的最新版本&#xff0c;选择“jason-bin-3.3.0.zip”…...

[ESP32:Vscode+PlatformIO]新建工程 常用配置与设置

2025-1-29 一、新建工程 选择一个要创建工程文件夹的地方&#xff0c;在空白处鼠标右键选择通过Code打开 打开Vscode&#xff0c;点击platformIO图标&#xff0c;选择PIO Home下的open&#xff0c;最后点击new project 按照下图进行设置 第一个是工程文件夹的名称 第二个是…...

java开发面试自我介绍模板_java面试自我介绍3篇

java 面试自我介绍 3 篇 java 面试自我介绍篇一&#xff1a; 我叫赵&#xff0c;我的同学更都喜欢称呼我的英文名字&#xff0c;叫&#xff0c;六月的 意思&#xff0c;是君的谐音。我来自安徽的市&#xff0c;在 21 年我以市全市第一名 的成绩考上了大学&#xff0c…...

intra-mart实现简易登录页面笔记

一、前言 最近在学习intra-mart框架&#xff0c;在此总结下笔记。 intra-mart是一个前后端不分离的框架&#xff0c;开发时主要用的就是xml、html、js这几个文件&#xff1b; xml文件当做配置文件&#xff0c;html当做前端页面文件&#xff0c;js当做后端文件&#xff08;js里…...

2025最新软件测试面试大全

前面看到了一些面试题&#xff0c;总感觉会用得到&#xff0c;但是看一遍又记不住&#xff0c;所以我把面试题都整合在一起&#xff0c;都是来自各路大佬的分享&#xff0c;为了方便以后自己需要的时候刷一刷&#xff0c;不用再到处找题&#xff0c;今天把自己整理的这些面试题…...

JDK17主要特性

JDK 17&#xff0c;也被称为Java 17或Java Platform, Standard Edition 17&#xff0c;是Java编程语言的第十七个主要版本&#xff0c;由Oracle公司在2021年9月发布。Java 17是一个长期支持&#xff08;LTS&#xff0c;Long-Term Support&#xff09;版本&#xff0c;这意味着它…...

基于SpringBoot的在线远程考试系统的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

Android Studio:Application 和 Activity的区别

Application 和 Activity 是 Android 中非常重要的两个组件&#xff0c;它们分别负责不同的生命周期管理和应用的不同层次的操作。 Application 是应用级别的生命周期管理&#xff0c;它在整个应用运行时只有一个实例&#xff0c;负责应用的全局初始化和资源管理。Activity 是…...

GAN(生成对抗网络,Generative Adversarial Network)

https://www.bilibili.com/video/BV1mp4y187dm/?spm_id_from333.788.recommend_more_video.2&vd_source35b06c13f470dff84c947fa3045bafc3...

大模型Dense、MoE 与 Hybrid-MoE 架构的比较

在大模型架构设计中&#xff0c;Dense&#xff08;全连接&#xff09;、MoE&#xff08;混合专家&#xff09;和Hybrid-MoE&#xff08;混合式MoE&#xff09;是三种主流的参数组织方式&#xff0c;它们在模型容量、计算效率和应用场景上存在显著差异。以下从核心原理、技术特点…...

Java进阶学习之路

Java进阶之路 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 Java进阶之路前言一、Java入门 Java基础 1、Java概述 1.1 什…...

Django 多数据库

django 支持项目连接多个数据库 DATABASES = {default: {ENGINE: django.db.backends.mysql,NAME: xxx,USER: root,"PASSWORD": xxxxx,HOST: xxxx,PORT: 3306,},bak: {ENGINE: django.db.backends.mysql,NAME: xxx,USER: root,"PASSWORD": xxxx,HOST: xxx…...

Vue 中如何嵌入可浮动的第三方网页窗口(附Demo)

目录 前言1. 思路Demo2. 实战Demo 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 1. 思路Demo 以下Demo提供思路参考&#xff0c;需要结合实际自身应用代码 下述URL的链接使用百度替代&#xff01; 方式 1…...

6-图像金字塔与轮廓检测

文章目录 6.图像金字塔与轮廓检测(1)图像金字塔定义(2)金字塔制作方法(3)轮廓检测方法(4)轮廓特征与近似(5)模板匹配方法6.图像金字塔与轮廓检测 (1)图像金字塔定义 高斯金字塔拉普拉斯金字塔 高斯金字塔:向下采样方法(缩小) 高斯金字塔:向上采样方法(放大)…...

【学Rust写CAD】4 相对坐标系详解与实现要素概览

相对坐标系&#xff08;Relative Coordinate System, RCS&#xff09;是一个强大且灵活的工具&#xff0c;尤其在绘图、三维建模等领域中发挥着重要作用。以下是对相对坐标系的详细解析&#xff0c;包括其定义、应用、特性、与绝对坐标的区别、在CAD中的应用以及实现方式。 一…...

win编译openssl

一、perl执行脚本 1、安装perl脚本 perl安装 2、配置perl脚本 perl Configure VC-WIN32 no-asm no-shared --prefixE:\openssl-x.x.x\install二、编译openssl 1、使用vs工具编译nmake 如果使用命令行nmake编译会提示“无法打开包括文件: “limits.h”“ 等错误信息 所以…...

Kafka 使用说明(kafka官方文档中文)

文章来源:kafka -- 南京筱麦软件有限公司 第 1 步:获取 KAFKA 下载最新的 Kafka 版本并提取它: $ tar -xzf kafka_{{scalaVersion}}-{{fullDotVersion}}.tgz $ cd kafka_{{scalaVersion}}-{{fullDotVersion}} 第 2 步:启动 KAFKA 环境 注意:您的本地环境必须安装 Java 8+。…...

PyTorch数据建模

回归分析 import torch import numpy as np import pandas as pd from torch.utils.data import DataLoader,TensorDataset import time strat = time.perf_counter()...

Node.js与嵌入式开发:打破界限的创新结合

文章目录 一、Node.js的本质与核心优势1.1 什么是Node.js?1.2 嵌入式开发的范式转变二、Node.js与嵌入式结合的四大技术路径2.1 硬件交互层2.2 物联网协议栈2.3 边缘计算架构2.4 轻量化运行时方案三、实战案例:智能农业监测系统3.1 硬件配置3.2 软件架构3.3 核心代码片段四、…...

CVPR | CNN融合注意力机制,芜湖起飞!

**标题&#xff1a;**On the Integration of Self-Attention and Convolution **论文链接&#xff1a;**https://arxiv.org/pdf/2111.14556 **代码链接&#xff1a;**https://github.com/LeapLabTHU/ACmix 创新点 1. 揭示卷积和自注意力的内在联系 文章通过重新分解卷积和自…...

Markdown转换器中间件

目录 需求 文本编码检测 Markdown→HTML 注意 实现 需求 Markdown是一种文本格式&#xff1b;不被浏览器支持&#xff1b;编写一个在服务器端把Markdown转换为HTML的中间件。我们开发的中间件是构建在ASP.NET Core内置的StaticFiles中间件之上&#xff0c;并且在它之前运…...

https是如何保证安全的,又是如何保证不被中间人攻击的?

HTTPS如何保证安全&#xff0c;以及如何防止中间人攻击 保护用户隐私和数据安全已经成为了一个不可忽视的问题。随着网络攻击的不断升级&#xff0c;HTTPS&#xff08;超文本传输安全协议&#xff09;成为了我们在网络上交流时的一道重要防线。以下是HTTPS是如何保证安全的&am…...

2025.2.5

Web [SWPUCTF 2021 新生赛]ez_unserialize: 这个题先了解一下反序列化&#xff1a;反序列化是序列化的逆过程。序列化是将对象或数据结构转换为可以存储或传输的格式&#xff08;如JSON、XML或二进制格式&#xff09;的过程。反序列化则是将这个格式的数据转换回原始的对象或…...

TGT-HC:一种用于无线时间敏感网络的时隙感知整形MAC方案的调研、设计与评估

论文标题 中文标题&#xff1a;TGT-HC&#xff1a;一种用于无线时间敏感网络的时隙感知整形MAC方案的调研、设计与评估 英文标题&#xff1a;Survey, Design and Evaluation of TGT-HC: A Time-Aware Shaper MAC for Wireless TSN 作者信息 Raymond J. Jayabal&#xff08;I…...

Ollama教程:轻松上手本地大语言模型部署

Ollama教程&#xff1a;轻松上手本地大语言模型部署 在大语言模型&#xff08;LLM&#xff09;飞速发展的今天&#xff0c;越来越多的开发者希望能够在本地部署和使用这些模型&#xff0c;以便更好地控制数据隐私和计算资源。Ollama作为一个开源工具&#xff0c;旨在简化大语言…...

《Redis4.0数据持久化》

【redis持久化导读】Redis作为一款高性能的内存数据库&#xff0c;支持key-value键值对的形式存储数据&#xff0c;为业务层提供了高效的数据查询能力&#xff0c;但大家有思考过一个问题没&#xff1f;假如redis服务所在的主机突然挂了&#xff0c;那么之前缓存在内存的数据是…...

如何利用Docker和.NET Core实现环境一致性、简化依赖管理、快速部署与扩展,同时提高资源利用率、确保安全性和生态系统支持

目录 1. 环境一致性 2. 简化依赖管理 3. 快速部署与扩展 4. 提高资源利用率 5. 确保安全性 6. 生态系统支持 总结 使用 Docker 和 .NET Core 结合&#xff0c;可以有效地实现环境一致性、简化依赖管理、快速部署与扩展&#xff0c;同时提高资源利用率、确保安全性和生态…...

前端js高级25.1.30

原型&#xff1a;函数的组成结构 通过这个图我们需要知道。 假设我们创建了一个Foo函数。 规则&#xff1a;Function.protoType是函数显示原型。__proto__是隐式对象。 Function、Object、Foo函数的__proto__指向了Function.protoType说明。这三个都依托function函数来创建。…...

C语言打印输出星号图形(三角形、菱形、漏斗)

文章目录 1. 介绍2. 案例分析3. 漏斗型4. 直角三角形4.1 左上直角三角形4.2 右上直角三角形4.3 左下直角三角形4.4 右下直角三角形 5. 等腰三角形5.1 正等腰三角形5.2 倒等腰三角形 6. 平行四边形6.1 纵向左下平行四边形6.2 纵向左上平行四边形6.3 横向左上平行四边形6.4 横向左…...

litemall,又一个小商场系统

litemall Spring Boot后端 Vue管理员前端 微信小程序用户前端 Vue用户移动端 代码地址&#xff1a;litemall: 又一个小商城。 litemall Spring Boot后端 Vue管理员前端 微信小程序用户前端 Vue用户移动端...

消费kafka消息示例

以下是使用 Java 结合 Spring Kafka 框架来监听 updated-topic-test 这个 Kafka Topic 的详细实现步骤及代码示例&#xff0c;用于捕获人员信息变更的事件。 1. 添加依赖 在 pom.xml 文件中添加 Spring Kafka 相关依赖&#xff1a; <dependencies><!-- Spring Boot…...

ShardingSphere--03--SpringBoot整合案例

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 SpringBoot整合案例1.建表2.nacos 配置ShardingSphere 规则3.java 依赖4.sql5.java 代码 SpringBoot整合案例 1.建表 CREATE TABLE t_audience_customer_0 (audid …...

​K8S运行时切换-从Docker到Containerd的切换实战

1. 切换的原因 性能提升&#xff1a;Containerd通过减少抽象层提升了整体性能。 安全性增强&#xff1a;它提供了更直接的系统调用&#xff0c;减少了潜在的安全风险。 简化架构&#xff1a;Containerd拥有更简洁的设计&#xff0c;使得维护和故障排除更为容易。 官方支持趋…...

C# yield 关键字

前言   在 C# 中&#xff0c;yield 关键字是一个非常独特且强大的语言特性&#xff0c;它主要用于迭代器块&#xff08;Iterator Block&#xff09;中&#xff0c;能够让开发者以一种简洁高效的方式实现自定义的可迭代类型&#xff0c;轻松地生成并返回一个序列的值&#xff…...

软件设计模式

目录 一.创建型模式 抽象工厂 Abstract Factory 构建器 Builder 工厂方法 Factory Method 原型 Prototype 单例模式 Singleton 二.结构型模式 适配器模式 Adapter 桥接模式 Bridge 组合模式 Composite 装饰者模式 Decorator 外观模式 Facade 享元模式 Flyw…...

【Leetcode 每日一题 - 补卡】922. 按奇偶排序数组 II

问题背景 给定一个非负整数数组 n u m s nums nums&#xff0c; n u m s nums nums 中一半整数是 奇数 &#xff0c;一半整数是 偶数 。 对数组进行排序&#xff0c;以便当 n u m s [ i ] nums[i] nums[i] 为奇数时&#xff0c; i i i 也是 奇数 &#xff1b;当 n u m s [ …...

Redis缓存穿透、击穿、雪崩介绍以及解决方案

一、缓存穿透 1.1 什么是缓存穿透&#xff1f; 指的是&#xff0c;外部进来的请求&#xff0c;查询一个不存在的数据。Redis中没有&#xff0c;数据库中也没有&#xff0c;这时候如果外部恶意大量请求&#xff0c;所有请求会直接查询数据库&#xff0c;导致数据库崩溃 1.2 解决…...

Django框架丨从零开始的Django入门学习

Django 是一个用于构建 Web 应用程序的高级 Python Web 框架&#xff0c;Django是一个高度模块化的框架&#xff0c;使用 Django&#xff0c;只要很少的代码&#xff0c;Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容&#xff0c;并进一步开发出全功能…...

AI绘画:解锁商业设计新宇宙(6/10)

1.AI 绘画&#xff1a;商业领域的潜力新星 近年来&#xff0c;AI 绘画技术以惊人的速度发展&#xff0c;从最初简单的图像生成&#xff0c;逐渐演变为能够创造出高度逼真、富有创意的艺术作品。随着深度学习算法的不断优化&#xff0c;AI 绘画工具如 Midjourney、Stable Diffu…...

.net的一些知识点

1.public,protected,private的区别 从访问权限来说是 public>protecd>private 翻译成汉字&#xff1a;公有的>受保护的>私有的 但是在拿那种旧版本(2017及之前)的vs创建class的时候&#xff0c;这个类是没有修饰符的。现在vs2022版本创建带了默认修饰符&#x…...

【Docker】——安装Docker以及解决常见报错

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…...

Linux环境部署DeepSeek大模型

一、背景 【DeepSeek 深度求索】这个春节给了世界一个重磅炸弹&#xff0c;弄得美国都睡不好觉。这次与以往不同&#xff0c;之前我们都是跟随着美国的AI人工智能&#xff0c;现在DeepSeek通过算法上的优化&#xff0c;大大降低了训练模型所需的成本以及时间&#xff0c;短期造…...

Java 面试真题

本题适合一到三年 Java 开发 &#xff0c;以下问题都是按照原面试官提问记录 文章目录 我要进大厂系列面试题二面 我要进大厂系列面试题 全部真题&#xff0c;欢迎投稿你的面试经验。 本篇涉及基础较多&#xff0c;但要耐性看完。 JVM内存模型垃圾回收器用的哪个gc各个算法…...

Electron使用WebAssembly实现CRC-8 MAXIM校验

Electron使用WebAssembly实现CRC-8 MAXIM校验 将C/C语言代码&#xff0c;经由WebAssembly编译为库函数&#xff0c;可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-8 MAXIM格式校验的方式。 CRC-8 MAXIM校验函数WebAssembly源文件 C语言实现C…...