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

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

[复制链接]
STMCU-管管 发布时间:2021-8-24 13:10
% {7 {$ A- C) u  z# h/ z5 m
- Y8 v2 u! |; T  [1 j
STM32是在国内非常流行的32位MCU芯片,它价格便宜,功能强大,已经占据国内MCU市场的半壁江山。大家知道,STM32 主打的是 arm-cortex M 芯片,也就我们常说的单片机芯片,它的处理能力不够强大,但它能不能运行对算力要求高的神经网络呢?答案是可以的,因为STM32的M4之上的芯片已经内置了DSP处理器,可以执行高精度浮点运算。正好可以拿来做神经网络计算。但是,神经网络计算除了要求能做浮点运算还要求可以存储大量的参数,这就需要大量的内存和flash空间,这也是单片机类芯片短板的地方。我们这次使用的单片机是M4系列的STM32F407,由于内存有限,我们仅仅实现了一个3层的神经网络,但也可以实现手写数字识别功能。( [% ?! i) u; j1 Z$ g8 `
12.png
' L, M( N+ h% v! U, w! F/ K. ]
理论基础:# w5 U( _5 ?8 A8 I
首先设计一个3层的神经网络:4 L; O) `! P& W3 m+ N, d0 H5 H6 M
结构如下:
/ c& \) V; N7 \7 o
13.png

$ |! |$ c3 X7 W/ H0 F: r三层的神经网络,第一层是输入层,输入图片是28*28的分辨率,每个点作为输入的一个节点,所以总共有28*28=784个节点# e+ F; o9 C9 m5 ~( H

0 S9 i8 N* U. H. X( h4 r3 a8 m5 n神经网络计算公式如下:
; o4 i) ?1 [( Jinputx 为输入矩阵,w1, b1 为第一层的权重和偏移量
& z; ~3 l$ {- Q- X# w; [( ^. h+ Z9 L2 o; T; n
第一层计算
5 a. X2 u1 l, M6 wz1= inputx *w1+b1 , w4 l$ ^' J6 K; g1 {( W% K9 L6 @
y2 =f(z1)   f() 为sigmoid激活函数. h+ [& p1 T0 ?0 J* B- n2 K) f  u

* y* }4 ^' k1 F% |( X' B第二层计算* P2 T! M7 D# N9 w2 F
z2 = y2*w2+b2  y2 为第一层输出,w2, b2 为第一层的权重和偏移量
/ X6 |" H7 T* f- I7 w2 [% Y2 X$ X& @9 Dy3 = f(z2)   f() 为sigmoid激活函数
: V- p' r; i* V1 `1 ky3 为输出结果矩阵
; _! _( P, ~8 T2 x3 z9 f
& U# H% ?' l1 i; I训练模型* n1 A0 N! L2 Z3 j
神经网络的训练使用TensorFlow keras实现- \! h" m4 _9 I' u1 b. n- n3 v
核心的代码如下; T1 _/ V* u$ J3 l0 s
14.png
& V+ r% X& [9 }9 K
激活函数使用sigmoid函数,训练优化使用adam算法,损失函数使用交叉熵。( _- T8 Z1 J5 Z5 x( L+ _
1 ^) y' G6 B) ^6 [0 |: v- ?
经过20次训练得到准确率96%
, C- R* z* K6 F. k7 F% A" n  K
15.png
+ ]+ J# ~1 Q" O2 r0 b) Z. K; f
模型训练好了后把参数导出来。+ U. ^2 u' ~1 Z! Z
16.png
* ]; F1 x- \* t9 t
保存的文件分别是权重文件wight1.txt,weight2.txt,偏移量文件bias1.txt,bias2.txt
2 Z& C) z: J! k6 M* D5 e
% o: |) U: s8 X  I, W# nSTM32实现
4 \, e+ k/ _5 E( U/ u在STM32上使用的是DSP库函数进行矩阵乘法运算
  r1 x: b& L, z. \! v# {
3 w( Y' T6 N3 i% v1 R  }% H核心函数是arm_mat_mult_f32()
; D/ h& K. g1 L! h6 I$ \
7 [; @' R0 T. A5 j# j, @arm_mat_mult_f32(&input,&w1,&z1)表示 矩阵乘法:z1 = input*w1
& F* I) T, F% n; S0 f0 K/ ?2 p+ @% ?% }2 d# i2 Z2 f
核心代码
7 |" E, X2 s) n; q, t0 i
17.png

: Q9 ?6 Y9 \: E& W液晶屏和触摸屏代码移植的野火stm32 例程代码,实现把画的字转换为28*28矩阵输入给DSP函数。
7 s# t2 P" H2 m1 G3 F/ L4 U" ]( i# E8 V  v7 L- J( r
完整项目代码和硬件原理图参考:https://github.com/lvjlcn/NeuralNetwork_STM32_Handwriting.git
( U/ r* V  Q" a! \% S+ F" d2 W5 }% I8 ]+ g
文章出处:物联网电子世界
4 _; _9 }5 K* U5 H

& n- @& q9 `( o6 D# Y
赞 收藏 评论0 发布时间:2021-8-24 13:10

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版