news 2026/2/16 5:14:08

嵌入式AI开发:STM32F103C8T6最小系统板与深度学习项目训练环境

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式AI开发:STM32F103C8T6最小系统板与深度学习项目训练环境

嵌入式AI开发:STM32F103C8T6最小系统板与深度学习项目训练环境

最近有不少做物联网和智能硬件的朋友跟我聊,说想把手头的一些小设备变得更“聪明”一点。比如,让一个简单的传感器不仅能采集数据,还能在现场就判断出数据是不是异常,或者直接识别出采集到的图像是什么。但一提到AI,大家总觉得那是云端服务器或者高性能电脑才能玩的东西,跟小小的单片机好像不沾边。

其实还真不是这样。我今天就想跟你聊聊,怎么用一块几十块钱的STM32F103C8T6最小系统板,再配合你电脑上的深度学习训练环境,就能搞出点有意思的嵌入式AI应用。这听起来可能有点跨界,但实际做下来你会发现,思路通了,步骤并不复杂。

1. 为什么要在单片机上跑AI?

你可能觉得,STM32F103这块经典的“蓝板子”,主频才72MHz,内存最大也就20KB的RAM,跑个复杂的神经网络不是天方夜谭吗?确实,直接在上面训练一个像ResNet那样的大模型是不可能的。但我们的思路不是“训练”,而是“推理”。

简单来说,整个过程分两步走:

  1. 在PC上训练:用你强大的电脑(或者云服务器),搭配PyTorch、TensorFlow这些框架,准备好数据,训练出一个针对你具体任务优化好的、小型化的神经网络模型。比如,训练一个能识别几种特定手势的模型,或者一个判断温度传感器读数是否异常的模型。
  2. 在单片机上部署:把这个训练好的、已经“学会”了技能的模型,经过专门的工具转换和优化,变成STM32能理解的格式,然后烧录进去。之后,单片机要做的就只是“照章办事”——根据输入的数据,运行这个固定的模型,给出预测结果。

这样做的好处非常明显:

  • 实时响应:数据在设备端就地处理,没有网络延迟,对于需要快速反应的应用(比如异常停机判断)至关重要。
  • 保护隐私:敏感数据(如家庭监控画面)无需上传到云端,在本地设备内就完成了处理。
  • 降低成本和功耗:不需要一直保持网络连接,也省去了云端服务器的费用,特别适合电池供电的海量物联网设备。
  • 功能增强:给传统的嵌入式设备赋予了“感知”和“决策”能力,打开了智能门锁、预测性维护、离线语音唤醒等一大堆新应用的大门。

所以,STM32F103C8T6在这里的角色,不是一个训练平台,而是一个低成本、低功耗的AI推理终端。它的核心工作是高效地执行那个预先训练好的、精简过的模型。

2. 搭建你的深度学习训练环境(PC端)

在让单片机变聪明之前,我们得先在自己的电脑上把“大脑”(模型)训练好。这一步是基础,环境搭好了,后面事半功倍。

2.1 核心工具选择

咱们不搞得太复杂,就用最主流、社区支持最好的那一套组合拳。别担心,跟着步骤来,一点都不难。

  • Python与包管理Anaconda。它是个Python的科学计算发行版,自带了很多常用的库,更重要的是它提供了conda命令,可以轻松创建和管理独立的Python环境,避免不同项目之间的库版本冲突。去官网下载安装就行,记得安装时勾选“Add Anaconda to my PATH environment variable”。
  • 深度学习框架PyTorch。它现在非常火,对研究者和小白都挺友好,动态图机制让调试更直观。我们主要用它来定义和训练模型。
  • 辅助工具Visual Studio Code (VS Code)。一个轻量级但功能强大的代码编辑器,装上Python插件后,写代码、调试都非常方便。

2.2 一步步搭建环境

打开你的终端(Windows用Anaconda Prompt,Mac/Linux用系统终端),咱们开始操作。

首先,为这个项目创建一个独立的Python环境,命名为stm32_ai_env(名字你随便取):

conda create -n stm32_ai_env python=3.8

创建完成后,激活这个环境:

conda activate stm32_ai_env

你会看到命令行前面出现了(stm32_ai_env),这说明你已经在这个独立的环境里了。

接下来,安装PyTorch。这里有个小选择:

  • 如果你的电脑有NVIDIA显卡并且安装了CUDA,可以去PyTorch官网生成对应的安装命令,这样训练时可以用GPU加速,速度快很多。
  • 如果没显卡或者不想折腾,安装CPU版本完全够用,对于训练我们后续要提到的小模型来说,速度可以接受。

这里给出CPU版本的安装命令:

pip install torch torchvision torchaudio

然后,安装一些我们肯定会用到的数据处理和可视化库:

pip install numpy pandas matplotlib scikit-learn

最后,验证一下安装是否成功。新建一个Python脚本,或者直接在终端里输入python进入交互模式,然后输入:

import torch import numpy as np print(f"PyTorch版本: {torch.__version__}") print(f"NumPy版本: {np.__version__}") # 检查GPU是否可用(如果有的话) print(f"CUDA是否可用: {torch.cuda.is_available()}")

如果都能正常输出版本号,没有报错,那么恭喜你,PC端的深度学习训练环境就准备好了。这个环境就像你的“模型实验室”,所有创造性的训练工作都在这里完成。

3. 训练一个适合STM32的微型AI模型

环境有了,我们来训练一个模型。关键点是:这个模型必须足够小、足够快,才能塞进STM32F103那有限的内存里。

3.1 模型设计:要小,要快

我们以经典的手写数字识别(MNIST)任务为例。但我们要的不是那种准确率99.5%的复杂模型,而是一个在保证基本可用前提下,尽可能微型的模型。

下面是一个专门为嵌入式设备设计的超小型卷积神经网络(CNN):

import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms # 定义一个非常小的CNN模型 class TinyMNISTCNN(nn.Module): def __init__(self): super(TinyMNISTCNN, self).__init__() # 第一层:卷积层。输入通道1(灰度图),输出通道4,卷积核3x3 self.conv1 = nn.Conv2d(1, 4, kernel_size=3, padding=1) # 激活函数,用ReLU因为它计算简单 self.relu = nn.ReLU() # 池化层,2x2窗口,下采样减少数据量 self.pool = nn.MaxPool2d(2) # 第二层:卷积层,通道数从4增加到8 self.conv2 = nn.Conv2d(4, 8, kernel_size=3, padding=1) # 全连接层。经过两层池化,28x28的图变成7x7,通道是8,所以是7*7*8=392 self.fc = nn.Linear(7 * 7 * 8, 10) # 输出10类(数字0-9) def forward(self, x): x = self.pool(self.relu(self.conv1(x))) x = self.pool(self.relu(self.conv2(x))) x = x.view(-1, 7 * 7 * 8) # 将多维特征图“拉平”成一维向量 x = self.fc(x) return x # 实例化模型 model = TinyMNISTCNN() print(model)

这个模型有多小?你可以用torchsummary库(需要先pip install torchsummary)来查看:

from torchsummary import summary summary(model, (1, 28, 28)) # 输入是1通道,28x28的图像

你会发现它的参数数量可能只有几千个,相比动辄数百万、数千万参数的大模型,它轻量得像个羽毛。这正是我们需要的。

3.2 训练与验证

用MNIST数据集来训练它。代码比较常规,重点是观察它能否在小型化后依然学到东西。

# 数据预处理和加载 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) train_dataset = datasets.MNIST('./data', train=True, download=True, transform=transform) test_dataset = datasets.MNIST('./data', train=False, transform=transform) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=1000, shuffle=False) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 训练循环(为了演示,只训练3个epoch) def train(epoch): model.train() for batch_idx, (data, target) in enumerate(train_loader): optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() if batch_idx % 100 == 0: print(f'Train Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)} ' f'({100. * batch_idx / len(train_loader):.0f}%)]\tLoss: {loss.item():.6f}') def test(): model.eval() test_loss = 0 correct = 0 with torch.no_grad(): for data, target in test_loader: output = model(data) test_loss += criterion(output, target).item() pred = output.argmax(dim=1, keepdim=True) correct += pred.eq(target.view_as(pred)).sum().item() test_loss /= len(test_loader.dataset) accuracy = 100. * correct / len(test_loader.dataset) print(f'\nTest set: Average loss: {test_loss:.4f}, Accuracy: {correct}/{len(test_loader.dataset)} ({accuracy:.2f}%)\n') return accuracy # 开始训练 for epoch in range(1, 4): train(epoch) test()

训练结束后,把这个小模型保存下来:

torch.save(model.state_dict(), 'tiny_mnist_cnn.pth')

现在,你得到了一个文件tiny_mnist_cnn.pth,里面就是模型的“灵魂”(权重参数)。下一步,就是把这个灵魂注入到STM32的“身体”里。

4. 从PyTorch到STM32:模型转换与部署

这是最关键的一步,桥接了两个世界。我们需要把PyTorch模型转换成STM32的MCU能直接运行的代码格式。这里隆重介绍一个强大的工具:STM32Cube.AI

4.1 什么是STM32Cube.AI?

它是意法半导体(ST)官方出的一个工具,集成在STM32CubeMX这个图形化配置工具里。它的核心功能就是“翻译”:

  • 输入:主流框架(TensorFlow, PyTorch, Keras, ONNX)训练好的模型。
  • 输出:高度优化的、纯C代码的模型推理库,专门针对STM32的ARM Cortex-M内核进行了指令集优化,甚至能利用一些MCU的硬件加速特性。

简单说,它帮你把Python世界里复杂的矩阵运算,变成了在单片机上跑起来效率最高的C代码。

4.2 转换与部署流程

  1. 将PyTorch模型转为ONNX格式: ONNX是一种开放的模型交换格式,是STM32Cube.AI支持的输入格式之一。在你刚才的训练环境里执行:

    # 加载训练好的模型 model.load_state_dict(torch.load('tiny_mnist_cnn.pth')) model.eval() # 创建一个示例输入(dummy input),用于定义输入维度 dummy_input = torch.randn(1, 1, 28, 28) # 导出为ONNX格式 torch.onnx.export(model, dummy_input, "tiny_mnist_cnn.onnx", input_names=['input'], output_names=['output'], opset_version=11)

    现在你得到了tiny_mnist_cnn.onnx文件。

  2. 使用STM32CubeMX和Cube.AI

    • 安装并打开STM32CubeMX,创建一个新工程,选择你的芯片型号STM32F103C8Tx
    • 配置好基本的时钟、调试接口(如SWD)等。
    • 在左侧的“Software Packs”组件列表里,选择“STMicroelectronics.X-CUBE-AI”,并把它添加到你的工程中。
    • 在工程配置的“Project Manager”页面,将Toolchain/IDE选为你使用的环境,比如“MDK-ARM V5”(Keil)或“STM32CubeIDE”。
    • 回到“Pinout & Configuration”页面,你应该能看到多了一个“Artificial Intelligence”的配置选项卡。点击进入。
    • 在这里,你可以导入刚才生成的tiny_mnist_cnn.onnx文件。Cube.AI会自动分析这个网络,并给出在STM32F103C8上运行所需的内存(RAM)和存储(Flash)预估。对于我们这个小模型,预估的资源消耗应该远小于芯片的20KB RAM和64KB Flash,完全可行!
    • 点击“Generate Code”。CubeMX会为你生成一个完整的Keil或CubeIDE工程,这个工程里已经包含了:
      • 初始化好的HAL库驱动。
      • 集成好的、优化过的AI推理库(network.cnetwork.h等)。
      • 一个简单的main.c模板,里面展示了如何调用AI库来运行推理。
  3. 在工程中编写应用逻辑: 打开生成的工程,你的主要工作集中在main.c的应用层部分。你需要:

    • 准备好输入数据。比如,如果你要通过摄像头采集图像做数字识别,就需要编写代码将摄像头数据(可能经过裁剪、缩放、灰度化)处理成28x28的数组,并归一化到模型期望的格式。
    • 调用Cube.AI生成的API(通常是aiRun()之类的函数)进行推理。
    • 处理输出结果。模型会输出一个包含10个数值的数组,分别对应数字0-9的“置信度”,找到最大值对应的索引,就是识别出的数字。
  4. 编译与烧录: 使用Keil MDK或STM32CubeIDE编译整个工程,生成.hex.bin文件。然后通过ST-Link、J-Link等调试器,把程序烧录到你的STM32F103C8T6最小系统板上。

5. 实战构想:从数字识别到真实项目

掌握了基本流程后,你可以尝试更贴近实际的应用。思路是一样的:在PC端训练小模型 -> 用Cube.AI转换 -> 在STM32端部署推理

  • 智能传感器:训练一个一维卷积网络(1D-CNN),识别三轴加速度计(如MPU6050)的信号模式,用于设备振动异常检测或人体活动识别(走、跑、跳)。
  • 简单视觉应用:使用OV7670等低成本摄像头模块,训练一个二分类模型(例如,“产品合格” vs. “产品有瑕疵”),用于产线上的初步视觉检测。
  • 音频关键词唤醒:训练一个微型语音模型,识别“打开”、“关闭”等几个关键词,实现离线语音控制,用于智能家居设备。

这些应用的共同点是:问题定义清晰,所需识别的类别不多,因此有可能用很小的模型取得不错的效果。而STM32F103C8正好为这类“轻智能”应用提供了一个性价比极高的硬件平台。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

整个流程走下来,你会发现嵌入式AI开发并没有想象中那么遥不可及。它更像是一种巧妙的组合:用PC的强大算力来“思考”和“学习”,生成一个精简的“知识包”;再用STM32这样的微型控制器,在物理世界中高效地“应用”这个知识。这种分工协作的模式,恰恰是边缘计算的核心价值所在。

当然,这条路也有挑战,最大的挑战就是如何在极有限的资源下,设计出效果和效率平衡的模型。这需要你对算法和硬件都有一定的理解。但好消息是,像STM32Cube.AI这样的工具正在努力降低这个门槛。如果你已经熟悉嵌入式开发,又想给产品增加一些智能化的亮点,那么从一个小实验开始,比如让STM32认识手写的数字,会是一个非常有成就感的起点。试试看,说不定下一个有趣的智能硬件点子,就在你手里诞生了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/14 6:19:00

3个强力技巧掌握LeagueAkari智能工具实战指南

3个强力技巧掌握LeagueAkari智能工具实战指南 【免费下载链接】LeagueAkari ✨兴趣使然的,功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari LeagueAkari是一款基于英雄联…

作者头像 李华
网站建设 2026/2/14 14:30:03

赶deadline必备!本科生专属AI论文平台 —— 千笔·专业论文写作工具

你是否曾为论文选题发愁,反复修改却总不满意?是否在查重、格式、文献查找等环节频频受挫?面对时间紧迫和写作压力,很多同学都感到力不从心。别再让这些难题拖慢你的节奏,千笔AI——专为本科生打造的智能论文写作平台&a…

作者头像 李华
网站建设 2026/2/15 23:45:40

零基础玩转文脉定序:AI重排序系统实战教程

零基础玩转文脉定序:AI重排序系统实战教程 你是否遇到过这样的烦恼?在知识库或搜索引擎里输入一个问题,系统确实返回了一大堆结果,但最相关、最准确的答案却可能藏在第三页,甚至更靠后的位置。传统的关键词匹配和向量…

作者头像 李华
网站建设 2026/2/15 8:16:08

Spring全家桶全彩笔记(终极版)全网首次公开!

Spring这个技术栈,在LZ心目中一直是最好的Java项目,没有之一。这玩意面试必考工作必用,是我们Java人的饭碗;它跟它后面诞生的一系列解决方案被我们亲切的成为Spring全家桶,如果你自诩是一名合格的Java程序员&#xff0…

作者头像 李华
网站建设 2026/2/15 12:56:48

零基础使用StructBERT:中文情感分析保姆级教程

零基础使用StructBERT:中文情感分析保姆级教程 1. 前言:为什么需要中文情感分析? 你有没有遇到过这样的情况:面对成千上万的用户评论,想要快速了解大家的真实感受,却不知道从何下手?或者作为产…

作者头像 李华