找回密码
 立即注册
查看: 7230|回复: 39

AI手写计算器:卷积神经网络在Ai8051U上的实现与应用

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:282
  • 最近打卡:2025-05-01 12:48:52

11

主题

37

回帖

1044

积分

荣誉版主

积分
1044
发表于 2024-11-27 00:03:34 | 显示全部楼层 |阅读模式
《AI 手写计算器:卷积神经网络Ai8051U上的实现应用


效果演示:Ai8051U 运行 LeNet 卷积神经网络,实现手写计算器功能 ! 8051U, AI 开山之作
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=11901

在过去几年中,机器学习技术,尤其是神经网络在图像识别、自然语言处理等领域取得了显著成果。
本文将简要介绍AI手写计算器所用的卷积神经网络
如何在电脑运行搭建训练部署到 Ai8051U


下面谈谈我对这些专有名词的理解,仅代表个人意见,并不保证准确。

  • 人工智能AI: 泛指能产生类似人类思考、判断结果的人为程序、算法。其中最常见的应用包含电脑视觉(CV)、自然语言处理及理解(NLP)及数据分析/挖矿几大领域。
  • 机器学习(ML):机器学习是一种人工智能技术,它使计算机能够从数据中学习并改进其在特定任务上的表现,而无需进行显式编程。机器学习使用多种算法和技术,其中包括但不限于神经网络。
  • 神经网络(NN):神经网络是一种计算模型,其设计灵感来源于生物神经网络。这种模型由大量的节点(或称为“神经元”)组成,这些节点之间通过连接相互作用,能够对输入的信息进行非线性转换,进而完成如分类、回归等任务。根据网络结构的不同,神经网络可以分为前馈神经网络、循环神经网络(RNN)、卷积神经网络(CNN)等类型。
  • 卷积神经网络(CNN):卷积神经网络是一种特殊的神经网络结构,特别适用于处理具有网格状结构的数据,比如图像。CNN通过局部感受野、权重共享以及池化等机制,有效地减少了模型参数量,并能自动地从原始图像数据中提取出有用的特征。这些特性使得CNN在图像识别、视频分析、医学影像分析等多个领域取得了显著的成功。
  • LeNet:LeNet是卷积神经网络的一个早期实例,由Yann LeCun等人在1990年代开发,最初用于手写数字识别任务,即MNIST数据集上的应用。LeNet的设计引入了多个创新点,例如多层卷积层与子采样层的结合,这为后来更复杂的神经网络架构的发展提供了重要的参考和启示。
  • TinyML:TinyML是将机器学习模型部署到资源受限的设备上的技术。通过优化和压缩模型,TinyML可以在低功耗、低存储的设备上运行,使得图像识别等复杂任务无需依赖云计算即可在设备本地完成。


总之,神经网络是实现机器学习的重要工具之一,而卷积神经网络则是处理图像数据时最常用的神经网络类型。LeNet是早期成功的卷积神经网络模型,它的结构适用于手写识别任务。TinyML则是在边缘计算和物联网时代背景下,将机器学习技术推向更广泛应用场景的关键技术,借助TinyML技术,可以把模型部署在边缘设备。


我对工智能的理解仅限皮毛,能使用它解决一些实际问题,但对其背后的原理也是一知半解。
这篇文章主要描述的是实操,对立理论学习建议看别人的视频。


在学习的过程中,我找到了《动手学深度学习》这本书,Apache 2.0 协议开源,由业界大牛使用中文撰写,这里进行推荐,这本书的主要作者 李沐 在b站有相关视频,另外可以在其官网 https://zh.d2l.ai/ ,或者本帖附件下载完整pdf。
动动手学深度学习.pdf (29.45 MB, 下载次数: 2366)










4 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!

本帖被以下淘专辑推荐:

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:282
  • 最近打卡:2025-05-01 12:48:52

11

主题

37

回帖

1044

积分

荣誉版主

积分
1044
发表于 2024-11-27 00:03:35 | 显示全部楼层
本帖最后由 Legend 于 2024-11-25 23:38 编辑

沙发
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:282
  • 最近打卡:2025-05-01 12:48:52

11

主题

37

回帖

1044

积分

荣誉版主

积分
1044
发表于 2024-11-27 00:03:36 | 显示全部楼层
本帖最后由 Legend 于 2024-11-30 19:25 编辑








怎么在自己的电脑上完成训练过程?

电脑配置需求
模型很小,可以不用用显卡
windows 10 以上是必须的,内存大于8G即可,cpu越快越好。
C盘空间10G

下载项目源码
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=11901

准备python环境
推荐使用 Miniconda 管理python虚拟环境,这样切换 python 版本会非常方便
https://mirrors.tuna.tsinghua.ed ... -Windows-x86_64.exe



切换到国内镜像
避免从默认的国外服务器下载软件包
  1. pip config set global.index-url https://mirrors.ustc.edu.cn/pypi/simple
  2. conda config --set show_channel_urls yes
  3. conda clean -i
  4. notepad %USERPROFILE%\.condarc
复制代码

编辑 `%USERPROFILE%\.condarc` 输入以下内容
  1. channels:
  2.   - defaults
  3. show_channel_urls: true
  4. default_channels:
  5.   - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  6.   - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  7.   - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
  8. custom_channels:
  9.   conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  10.   pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
复制代码

创建python虚拟环境
创建一个python虚拟环境,激活新创建的虚拟环境,安装依赖
conda create --name ai8051u python=3.9
conda activate ai8051u
pip install -r requirements.txt



配置vscode
安装 python c/c++ jupyter 插件



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:282
  • 最近打卡:2025-05-01 12:48:52

11

主题

37

回帖

1044

积分

荣誉版主

积分
1044
发表于 2024-11-27 00:03:37 | 显示全部楼层

构建模型
数字识别使用了一种称为LeNet的网络结构,它包含多层结构,每一层都有其特定的功能和作用。
需要注意的是,综合考虑单片机的运行速度和识别难度,这里的网络是对论文中LeNet的简化。

输入层:
  • 首先,模型接收图像数据作为输入。对于手写数字识别任务,它是28x28像素的灰度图像。
卷积层:
  • 卷积层用于从图像中提取低级特征,如边缘或简单形状。这一层通常包含多个卷积核,每个核负责检测不同的特征。
  • 卷积层可以有多个,再第一个卷积层的基础上进一步提取更复杂的特征,每一层都会基于前一层的特征来构建更加高级的模式。
池化层:
  • 池化层进行下采样,减少特征图的尺寸,同时保留重要特征。
全连接层:
  • 首先将多维的特征图转换成一维向量,以便于接下来的全连接层处理。这是模型中进行决策的地方,它根据前面提取的所有特征来进行分类。
Softmax 层:
  • 将输出转换为概率分布,用于分类。


最终实现输入一个28*28的数组,分别输出它是每种数字的概率。
截图202411212200198206.jpg


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:282
  • 最近打卡:2025-05-01 12:48:52

11

主题

37

回帖

1044

积分

荣誉版主

积分
1044
发表于 2024-11-27 00:03:38 | 显示全部楼层
收集数据集
模型在初始时的参数就像刚出生的婴儿,大脑虽然聪明,但却还没有经历过任何学习和经验的积累。在这个状态下,它的行为几乎是完全随机的,几乎没有办法做出正确的判断。
我们需要为他准备大量的图像数据,给它学习,它才能从海量的数据中学会识别数字。

mnist是机器学习中的经典数据集,它包含6万张手写数字的图片。每张图片内有一个数字,28x28大小,其为黑底白字,8位灰度图,数字居中放置。
这里使用的是数据集包括qmnist,它是mnist的超集,他与mnist结构相同,但数据量从6万张扩充到了12万张。  
  
原始的mnist保存再bin文件中,虽然读取速度快,但不利于后续处理,这里使用[exp_qmnist.py]能把这些图片导出为jpg格式文件。   
除此之外,加减乘除四种图片,从Github上的开源项目[MNIST-Calculator-Handwriting-recognition]项目里下载,原作者收集了5000张加减乘除的图片,使用[invert.py]将其黑白翻转,并入数据集。
上述提到的这些py脚本,都能再script内找到。

合并这两个数据集,我们就拥有十万多张可以用于训练。

最终打包这些图片,可以从 https://file.liux.pro/d/public/ai-arithmetic/mnist14.tar.gz 下载
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:282
  • 最近打卡:2025-05-01 12:48:52

11

主题

37

回帖

1044

积分

荣誉版主

积分
1044
发表于 2024-11-27 00:03:39 | 显示全部楼层
训练

为了让模型能够“学习”和“成长”,我们需要通过训练来调整它的参数。具体来说,这个过程可以分为几个关键的步骤:

随机初始化参数:模型开始时的所有参数(例如卷积层的滤波器、全连接层的权重等)是随机的。就像婴儿一样,什么都不知道,但可以通过学习变得聪明。

前向传播:输入数据(例如手写数字图像)通过模型进行前向传播,经过一系列的卷积、激活、池化等层后,得到一个输出(即模型的预测)。

计算损失:模型输出的结果与真实标签之间会产生一个差距,称为损失。例如,在手写数字识别中,损失函数会计算模型预测的数字与实际数字之间的差异。

反向传播:通过损失函数,我们可以知道模型输出有多远离正确答案。反向传播算法通过计算损失函数对每个参数的梯度,告知模型每个参数需要如何调整,以使得输出更接近真实标签。

更新参数:利用反向传播计算出的梯度,优化器(如 Adam 或 SGD)会根据一定的学习率来更新参数,就像婴儿通过不断地学习、吸收经验逐渐变得聪明一样。每次更新后,模型的预测能力会变得更加精准。

迭代学习:这个过程会不断重复:每次输入数据,计算损失,进行反向传播,更新参数,直到损失足够小,模型的表现达到理想的水平。

所以,尽管模型的初始参数完全是随机的,经过多次训练和调整,它就像一个婴儿在不断成长,最终变得越来越聪明,能够做出准确的判断和预测。

些步骤不需要我们进行一一进行,我们只需要对其主要参数进行调整,Tensorflow能替我们完成这些操作

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:282
  • 最近打卡:2025-05-01 12:48:52

11

主题

37

回帖

1044

积分

荣誉版主

积分
1044
发表于 2024-11-27 00:03:40 | 显示全部楼层
本帖最后由 Legend 于 2024-11-30 16:30 编辑

微调

QMNIST收集的是外国人手写,他们对数字的写法,与我们不同,此外,触摸屏与铅笔笔迹也不同。
截图202411212215324450.jpg              截图202411212216324423.jpg
   外国写法              触摸屏收集,国内写法

我们还需要收集一些数据对模型进行微调,优化最终的识别效果。

我们用手写笔再触摸屏上写一些数字,单片机读取后通过串口发送到电脑,使用python解析发过来的数据,保存为图片。
可以打开宏 COLLECT_MODE ,并且在电脑上 collect.py 即可从单片机接收图片并保存到电脑上。



我手写了1000个数字,可从 https://file.liux.pro/d/public/ai-arithmetic/mymnist14.tar.gz

在收集好用于微调的图片数据集后,我们可以开始对已有的模型进行微调。微调的过程是基于原先已经训练好的模型,通过在新数据上的进一步训练,调整模型的参数,使其适应新的数据分布。

点评

压缩包里没有,自己编译后,在Object文件夹里 @yyx822  详情 回复 发表于 2024-12-1 18:49
大佬,请问35秒那里下载到单片机里的文件在哪里,我看压缩包里没有啊  发表于 2024-12-1 11:36
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:282
  • 最近打卡:2025-05-01 12:48:52

11

主题

37

回帖

1044

积分

荣誉版主

积分
1044
发表于 2024-11-27 00:03:41 | 显示全部楼层
量化
量化是将模型中的浮点数(比如32位)转换为低精度的整数(比如8位),显然,模型参数的大小减少了75%,并且将浮点运算转为整数运算,这样可以极大提高推理速度,尤其适合在计算能力有限的设备上运行,比如嵌入式设备或手机。
虽然量化会减少模型的精度,造成预测结果准确率降低,但综合考虑后,尤其是在TinyML场景,量化带来的负面影响是可被接受的。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:282
  • 最近打卡:2025-05-01 12:48:52

11

主题

37

回帖

1044

积分

荣誉版主

积分
1044
发表于 2024-11-27 00:03:42 | 显示全部楼层
部署

接下来我们需要让训练好的模型跑在单片机上,单片机支持c语言,TinyMaix 是一个c语言写的开源项目,
专为为单片机设计的推理引擎,用它可以运行上边训练好的模型。

TinyMaix 可以提供了把电脑上用tensorflow训练的模型自动量化,并转为c语言头文件的脚本。
这个头文件,包含了模型的结构和参数,TinyMaix 能够读取这些数据,执行推理。
这样,只需要给项目加上 TinyMaix 的核心代码,再包含这个头文件,单片机就能跑神经网络了!




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:282
  • 最近打卡:2025-05-01 12:48:52

11

主题

37

回帖

1044

积分

荣誉版主

积分
1044
发表于 2024-11-27 00:03:43 | 显示全部楼层
本帖最后由 Legend 于 2024-11-21 23:48 编辑

备用
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 23:26 , Processed in 0.131259 second(s), 105 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表