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

Cube.AI【3】——手写识别demo代码

[复制链接]
lebment 发布时间:2019-5-17 23:14
  写的教程反响平平,可能是晦涩难懂,那就直接上代码(极度粗糙的demo)。
- w& `& ]& u* V$ `8 _& g2 ]3 K  接上次的软硬件环境,我采用的STemwin(本来想用littlevgl)自带bmp显示(详细代码可参考某某莱教程)。先看看生成的一些代码。
: q2 V, A9 b8 w* x6 b. b9 R
( R3 ^) U+ P. K                GUI_Init();# L- X) j# O5 `8 s; f
                GUI_SetBkColor(GUI_BLUE_98);
  z7 a, `4 i4 D' D5 T9 P                GUI_Clear();
+ J0 @& w; w6 A* i. }1 X4 Z       
9 T" q) j' u9 C. ]  X. L1 J                GUI_DispStringHCenterAt( GUI_GetVersionString() , GUI_GetScreenSizeX()/2, GUI_GetScreenSizeY()/2);
) c$ c4 f) r7 {# k, \$ U                SDRes=f_mount(&SDFatFS,(TCHAR*)SDPath,0);
4 C1 Q0 d" X: R) F3 R* R                if(SDRes!=FR_OK)9 a2 \: Z! }$ `, ?& O; ^
                {! N0 W0 p7 Q, }7 @( j. F9 i! z
                Error_Handler();
2 ?: }2 l- a& [# d, O& b' w                }
$ E. ?$ `2 u* a0 a# A0 M* M  MX_X_CUBE_AI_Process();
2 C5 V) _9 R) t1 t+ V  /* USER CODE END 2 */% u% X& m3 P3 \' Z. z
  /* Infinite loop */* X/ p% |% z" d
  /* USER CODE BEGIN WHILE */1 v0 ^0 F3 {/ t, P) t2 |$ r% [0 ]
  while (1)
$ L: [$ l: |1 b* E; W  {6 z1 _; M7 T5 j6 d( L  i
    /* USER CODE END WHILE */, O" T) |. B0 o: k6 n% X
                         GUI_Delay(10);. {; J8 Z/ V- {8 d4 s
    /* USER CODE BEGIN 3 */$ ~5 o. L4 f( x+ m" H& \
  }3 `- d6 F$ D; X) P

: Y9 Y# u/ m+ g6 B简单的主函数。
# l: p+ J1 B7 _/ U5 U+ G/ a, ~  N! @5 W( f) N( k

4 N+ l8 D/ t% r  进入MX_X_CUBE_AI_Process();2 p$ e, J5 [8 p: g( M- L

2 z' e+ f" f! Q" L; l2 a- K! K8 ]: L. \; J
    ai_buffer ai_input;
) O' r" w: m8 f, D6 c    ai_buffer ai_output;( \# P! N3 P) K; Z  F: f( b
    ai_i32 batch;
( e  T3 s( Z* e3 G' A    char str_tmp[16];$ N  H" u) U9 _
     for(uint8_t i=0; i<10; i++)( {, A5 j' Y1 z: D
            {
0 B7 J  a! o* ]/ I; e7 e- g  e                                                sprintf(str_tmp,"%1d.bmp",i);% o9 h5 C7 e6 v# V0 ^* ~: M/ e
                                          _ShowBMPEx(str_tmp);
+ d& l3 G% O( Z9 G5 a                                                LCD_ShowBMP(str_tmp);
7 d2 ]2 w7 e% ~( u( T5 h" ~                                                for(uint16_t i=0; i<AI_LENET_IN_1_SIZE ; i++ )
; d% x9 `7 p( c2 N                                                {/ t5 [  x" @" s: f1 w
                                                                in_data[i] = *bmpBuffPtr++;9 i8 I. @  K& Y( \& V$ @
                                                }, I; s9 Y, f) R4 ^7 h+ @
                                                ai_input.n_batches  = 1;3 u4 c1 f' \+ q6 r
                                                ai_input.data = AI_HANDLE_PTR(in_data);7 Q. Q  L% Q0 q  E% Q" O$ m
                                                ai_output.n_batches = 1;9 G6 _0 Z- \) J
                                                ai_output.data = AI_HANDLE_PTR(out_data);
/ D8 x! r  W) m0 `                                                batch = ai_lenet_run(handel, &ai_input, &ai_output);
& m/ ]# Y, F# u# V+ o3 [$ g                                                if (batch != 1)
' R) E8 G  [  }( M- b5 j4 x' g/ h                                                {& @% \: ?5 P+ D9 B; Z- L$ V* f) v
                                                                err = ai_lenet_get_error(handel);
/ m. @  _& z) ^; `: r! E( o                                                                if( err.code )
5 [" x+ k1 O# {6 F                                                                {% u! H) Z1 h; E, x* K5 O
                                                                                while(1);
& C* a+ {5 y; |5 l$ B                                                                }+ a8 c  q8 L. g, S
                                                }) ]4 h0 d+ K0 |
                                         uint8_t count=0;
3 M0 M7 G' [* z+ \  G1 R8 _+ W                                         for(uint8_t i=0; i<AI_MNETWORK_OUT_1_SIZE; i++)2 i: u5 H+ A7 \! n5 h
                                                {: R8 x' y9 B* D; N
                                                  if( out_data[i] >=0.9f); y( T0 A8 d( P5 s8 u
                                                                {
2 D- x0 k& |0 B! k" k                                                                         sprintf(str_tmp,"Num:%d",i);
5 F6 U5 H) m3 E+ R4 A8 \2 |+ v' k                                                                         GUI_SetFont(GUI_FONT_32B_ASCII);
5 _/ b+ o, v- ^% B9 A) B4 B                                                                  GUI_DispStringAt(str_tmp,200,0);
) L6 N) \/ f9 u1 o* i# Z. K3 ?                                                                         GUI_SetFont(GUI_FONT_16B_ASCII);
. ?! ^: {% E* v, |0 e% A                                                                         count++;* j# c. v0 R/ F3 B- k! ]5 L, j
                                                                }% F0 `% y* Z! p8 }( a% i! I
                                                }
4 S& l$ r& m5 b/ A      if(count!=1)# _# @/ N+ s* ~+ k
                                                {# G& e$ N0 m* L" J/ }
                                                        GUI_SetFont(GUI_FONT_32B_ASCII);
0 E! b$ e6 O5 W1 a4 m4 `4 _8 N                                                        GUI_DispStringAt("err",200,0);' z8 H5 k2 @3 }
                                                        GUI_SetFont(GUI_FONT_16B_ASCII);
8 h( I. j' A% M; y2 S% W                                                }: d- L, C% T0 o, D
                                                free(bmpBuffPtr);
1 r4 Z, ^, ?' {/ `. u                                                HAL_Delay(2000);
' i. V7 a. ^; p$ V- t                                        }
0 ~) p) g) g6 R- a2 Q% D8 C* d) Y# P7 R/ Y; f' ~
      熟悉STemwin的大佬肯定知道我在干嘛,不断的读取SD卡中的bmp文件,然后显示,并且通过ai_lenet_run函数得到识别结果,输出是static ai_float out_data[AI_MNETWORK_OUT_1_SIZE]; 0-9有十个识别结果,这个向量大小是十。调试程序时,输出不像是我在PC ubuntu caffe环境中的输出结果,PC上主要是以softmax得到每个类别的置信度,所以PC上向量肯定全部都有值,置信度最高即为模型结果。在MCU上,输出结果只有零和一。让我很奇怪,既然是ai_float 型 何必不输出 所有的置信度。后面我将继续挖掘。
. `6 g5 f% u. o  A% T/ N% ?4 E# ]$ `
       流程介绍完毕,下面说一说cubeAI的主要函数。
% E: P' x8 b" c       ai_lenet_create(&handel, NULL);% m) X' n9 ^; z5 ~1 d: U
      ai_lenet_get_info(handel, &report);
: Q* e4 P+ z8 x' W          ai_network_params params = {& g! n+ d2 [8 N4 |
                                                          AI_LENET_DATA_WEIGHTS(ai_lenet_data_weights_get()),    //权重的获取) N2 R  W9 x' x& x0 c5 l
                                                        AI_LENET_DATA_ACTIVATIONS(activations)     // 激活函数8 j" V! L9 O7 T" J1 A/ U/ G
                                                };
- }6 r; u% E+ y! A6 x% |& E          ai_lenet_init(handel, &params);  //lenet的初始化,估计是申请内存什么的,写flash。, T3 h( E  V+ e4 x- X
                                                                         err = ai_lenet_get_error(handel);5 s, [4 _5 Q' ]' t' b, w' V+ K9 X

9 k" f8 ~! \( E$ Y6 {         batch = ai_lenet_run(handel, &ai_input, &ai_output); //图片输入以及处理完毕的输出,1batch批
2 \" s1 N2 v# [% b9 l' \! z  h  W3 y8 i: f% ?

9 N( y- q+ ^( V         总的来说比较简单的demo,其实也可以做复杂一点,先手写然后STemwin存bmp图片,然后利用加权平均得到BMP颜色数据的灰度,输入到lenet,dedaojieguo。效果会比较酷炫。
2 J( m9 i& C0 N  J8 n1 n0 E$ r) @9 w        这模型被压缩很厉害,能有这样的结果以及不错了,最后祝贺一下ST,半导体前15!  期待MP1,玩玩不用压缩的AI。1 C" {, B; v$ u
        附件:工程源码。& x$ e0 \, {/ D

" U/ ]* K8 K$ c: E1 m% q
0 |; g8 f7 s- @, T

Minist.rar

下载

10.2 MB, 下载次数: 150

收藏 评论7 发布时间:2019-5-17 23:14

举报

7个回答
happier_1995 回答时间:2020-7-30 08:17:50
兄弟,您这个代码运行最后的准确率能达到多少?我今天试了一下,10个数有9个识别错误的。
Bowen 回答时间:2019-5-18 09:02:09
支持下
lebment 回答时间:2019-5-18 10:34:28
strang 发表于 2019-5-18 09:02  l7 p- M+ E$ Q/ _/ B' c7 P
支持下
3 v6 U/ `; A0 f7 s4 Y4 n
谢谢支持
STMCU-管管 回答时间:2019-6-3 15:31:26
支持支持
TLLED 回答时间:2019-6-11 09:40:41
支持下         
happier_1995 回答时间:2019-6-21 14:03:53
加油楼主,我也在研究这个CUBE AI,进度没有你快
sumoon 回答时间:2021-9-11 11:11:24
学习学习!# o* H) k7 r" f) a  R, o* q7 i

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版