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

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

[复制链接]
STMCU-管管 发布时间:2021-8-24 13:10

5 A  w; M& C+ u% H7 b0 G( P2 m

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

$ n2 d& q) H; ~; }理论基础:5 |; d5 T1 l( }1 p
首先设计一个3层的神经网络:
. Q7 j$ ]6 e) U, {' z结构如下:" }/ M7 A0 W% J- D5 {  U# B  E
13.png
' x) t' X. D. L) H* G
三层的神经网络,第一层是输入层,输入图片是28*28的分辨率,每个点作为输入的一个节点,所以总共有28*28=784个节点
4 h( @/ X5 B6 u" o0 z, ^
9 v2 d4 Q9 r3 }. V6 S$ @# b神经网络计算公式如下:; s4 ^$ p3 r: X
inputx 为输入矩阵,w1, b1 为第一层的权重和偏移量
$ W8 u  ?" }1 z: V! j+ \9 \, u4 k) X  Y* t6 ^, [. N; C
第一层计算' M) B+ H6 G; }; [1 ?: Z) H) n1 R$ V
z1= inputx *w1+b1 0 o; |. T: f8 ]' U, E/ b+ h
y2 =f(z1)   f() 为sigmoid激活函数3 F  N( R" l6 Q7 Y1 _" h3 E3 M1 q7 x
/ o7 }" S- G; T# `0 P/ ]0 \9 I
第二层计算7 y6 w8 t! L; d5 X& f
z2 = y2*w2+b2  y2 为第一层输出,w2, b2 为第一层的权重和偏移量/ D0 h2 N1 u& D
y3 = f(z2)   f() 为sigmoid激活函数9 \- H0 M7 c: N1 e, m- r% y& Y4 \+ {
y3 为输出结果矩阵0 J9 h. _& w7 P# G

. H, r; D0 e. O$ D训练模型
0 c& N- o+ c; Q4 q( s% E& m9 d* g5 g神经网络的训练使用TensorFlow keras实现
. J5 X! P& _2 P) _6 x, L核心的代码如下3 y0 r3 A0 a- ~- Q& W
14.png
4 s0 Z  b. Y; X/ c+ b
激活函数使用sigmoid函数,训练优化使用adam算法,损失函数使用交叉熵。
: q+ T" W4 ?( T* }8 {
" ?% j- A$ P4 G& R) M# `经过20次训练得到准确率96%
0 O  z6 k, _& s- i
15.png

# e& `/ X  [1 W模型训练好了后把参数导出来。
3 w, S& v/ Z1 g$ Q8 I0 \6 I# z
16.png

7 J5 x7 F  o$ U8 h7 m保存的文件分别是权重文件wight1.txt,weight2.txt,偏移量文件bias1.txt,bias2.txt6 y/ J8 J( L4 F7 c5 }2 l

6 a) \, k, e8 N  q$ {" RSTM32实现" T* m6 Q* _* ?  W0 X0 B
在STM32上使用的是DSP库函数进行矩阵乘法运算
, _4 ~3 @5 |6 T0 p$ T9 `* ]4 s, f+ E3 y# t
核心函数是arm_mat_mult_f32()
4 p, b; O3 u( c3 W$ W
% M0 [8 d& u0 d. Warm_mat_mult_f32(&input,&w1,&z1)表示 矩阵乘法:z1 = input*w1
7 ?2 X: \; |* q& s; Q
& a; {3 n" H) j+ D2 F/ V  e核心代码" C' C* v) w5 z' G
17.png

' C5 k8 Z% z4 R: }+ w2 A液晶屏和触摸屏代码移植的野火stm32 例程代码,实现把画的字转换为28*28矩阵输入给DSP函数。
$ a( r2 `& R& d3 i0 b- T! _
5 `; H5 v0 p& ~/ q. c- t3 G完整项目代码和硬件原理图参考:https://github.com/lvjlcn/NeuralNetwork_STM32_Handwriting.git* o; N4 _# L; V. L/ J* F

) |  y, L; N1 F/ [文章出处:物联网电子世界$ W. z% H) j6 @9 `( {) v
- d8 R6 y1 B1 U& B3 Q
收藏 评论0 发布时间:2021-8-24 13:10

举报

0个回答

所属标签

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