你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32的神经网络手写识别

[复制链接]
STMCU-管管 发布时间:2021-8-24 13:10
0 X, P# H: Y% K& U' Q! _2 s: D

7 W2 a# y* S# h$ c" d. U  M8 w; {STM32是在国内非常流行的32位MCU芯片,它价格便宜,功能强大,已经占据国内MCU市场的半壁江山。大家知道,STM32 主打的是 arm-cortex M 芯片,也就我们常说的单片机芯片,它的处理能力不够强大,但它能不能运行对算力要求高的神经网络呢?答案是可以的,因为STM32的M4之上的芯片已经内置了DSP处理器,可以执行高精度浮点运算。正好可以拿来做神经网络计算。但是,神经网络计算除了要求能做浮点运算还要求可以存储大量的参数,这就需要大量的内存和flash空间,这也是单片机类芯片短板的地方。我们这次使用的单片机是M4系列的STM32F407,由于内存有限,我们仅仅实现了一个3层的神经网络,但也可以实现手写数字识别功能。1 A1 m$ q! ^3 P% g
12.png

# b$ @7 J) Q& I1 X! l2 X9 W- \& p理论基础:
: V8 {! ~0 }6 g2 |/ q; C3 ]: e! y首先设计一个3层的神经网络:2 Z# v* n5 m  z% g- M3 M
结构如下:; L" ?2 J+ ~+ E( [
13.png

# `/ g  o9 R# F. i/ P三层的神经网络,第一层是输入层,输入图片是28*28的分辨率,每个点作为输入的一个节点,所以总共有28*28=784个节点
1 k' P2 n5 ^& m' Z: B
" M1 i- C% D& T& e2 ~; d神经网络计算公式如下:; r( A0 F" p! X9 K
inputx 为输入矩阵,w1, b1 为第一层的权重和偏移量
* x3 N' x- f- D+ L" o* y8 w9 N9 `- j! E' f& ]6 h& m1 a, a
第一层计算3 [8 ~2 }9 {% @5 W5 w1 c% j
z1= inputx *w1+b1
! k8 A+ h/ a9 L. }/ W) iy2 =f(z1)   f() 为sigmoid激活函数
* d2 T; T/ V" X9 Q5 T$ G" L2 v7 w: t8 a  C; B$ }, q9 U. M
第二层计算
* h, I0 Q# {' w; B9 h" U% Bz2 = y2*w2+b2  y2 为第一层输出,w2, b2 为第一层的权重和偏移量
$ v, s) E0 C6 t& d0 P4 py3 = f(z2)   f() 为sigmoid激活函数8 b$ K# f9 P8 U/ o+ _
y3 为输出结果矩阵! y' O- b8 x& c7 H) Y" ]; g, X9 O

( q9 c5 R  V7 S! e1 v/ @% d) Q( N训练模型0 _/ v3 G+ j& U+ C$ L8 B+ e
神经网络的训练使用TensorFlow keras实现1 t; U1 `; q& E( z
核心的代码如下+ q7 T* V  i" U+ p/ J' ?' D, X
14.png
% }. v! }! }  Z
激活函数使用sigmoid函数,训练优化使用adam算法,损失函数使用交叉熵。
% E* W3 ^! X2 J2 @% k, O1 e9 t) B8 A' `; Q: O$ Y# \( ~* C% i+ h
经过20次训练得到准确率96%
3 @8 ~( y2 H$ l5 ?
15.png

- V+ f* P; x& S& p! T" ^' z# @+ h模型训练好了后把参数导出来。
) b/ P" g" C, K/ H2 l# \
16.png
8 e" Q; `- K% {0 J0 i1 j% I
保存的文件分别是权重文件wight1.txt,weight2.txt,偏移量文件bias1.txt,bias2.txt2 U! A$ o* J0 x( b
; z0 Z; S6 r" S# ^& r, u
STM32实现
/ r! D( s0 |9 f在STM32上使用的是DSP库函数进行矩阵乘法运算  Q8 R7 B2 o' f& I: t4 M) Q) @
6 h) R# z8 L  N% _& C% o+ Z& g
核心函数是arm_mat_mult_f32()
% j6 b7 ?* Z" z! q" R- m# j8 ]
+ E: Y( [' I' o/ warm_mat_mult_f32(&input,&w1,&z1)表示 矩阵乘法:z1 = input*w1
% e% U1 J( y! K5 `$ s& y% B" \( T  V* z4 Q0 D
核心代码7 R0 ?! V1 F( |  }# S/ w1 @
17.png
" h1 A6 v6 N* ?. j1 J% D
液晶屏和触摸屏代码移植的野火stm32 例程代码,实现把画的字转换为28*28矩阵输入给DSP函数。* R+ F. s9 {; w" ~* y; {& K

, w- \8 j+ |+ j& f* }完整项目代码和硬件原理图参考:https://github.com/lvjlcn/NeuralNetwork_STM32_Handwriting.git( Z0 p: O8 u9 |
6 E5 Q6 _$ I7 M: j7 P
文章出处:物联网电子世界
. J5 m% X$ i2 N4 a* L. {/ e( T

" I/ i9 q& @/ I5 c! z
收藏 评论0 发布时间:2021-8-24 13:10

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版