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

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

[复制链接]
lebment 发布时间:2019-5-17 23:14
  写的教程反响平平,可能是晦涩难懂,那就直接上代码(极度粗糙的demo)。
: J7 t8 j3 S" P' h8 O6 y$ M9 q  接上次的软硬件环境,我采用的STemwin(本来想用littlevgl)自带bmp显示(详细代码可参考某某莱教程)。先看看生成的一些代码。
+ q* |4 u7 ]7 q/ W; {; G) |* O/ z& }2 [
                GUI_Init();: D% H9 L3 E" R* j5 c, I0 y
                GUI_SetBkColor(GUI_BLUE_98);% C& R  t$ t. x  i
                GUI_Clear();+ ~& F: `2 b4 G' I1 A
       
, z) s* @5 p% [$ i# y1 {' N9 S                GUI_DispStringHCenterAt( GUI_GetVersionString() , GUI_GetScreenSizeX()/2, GUI_GetScreenSizeY()/2);
, |) b: _: o/ F- H+ O                SDRes=f_mount(&SDFatFS,(TCHAR*)SDPath,0);
2 Q# q; H# K  H( M                if(SDRes!=FR_OK)
" p3 T! C4 ~# I- r                {6 M# J, g) X& e. t
                Error_Handler();
& s/ `/ r2 M* V' v( U4 x% l                }* I3 K/ I- `& J+ K& {7 h. h+ R& [: h
  MX_X_CUBE_AI_Process();7 q' G3 P) P& M
  /* USER CODE END 2 */- N& Q8 e. Q5 t
  /* Infinite loop */+ m( o. K6 |6 q  Q
  /* USER CODE BEGIN WHILE */! p; P4 O! S6 L# R
  while (1)
8 q2 l9 e- b6 o- b  {. m  O% j! f# g+ J; {
    /* USER CODE END WHILE */2 \* p0 v; l5 c3 K) {9 b  X9 _# N
                         GUI_Delay(10);4 R  A' _% K& \( _+ e0 k6 M  N
    /* USER CODE BEGIN 3 */
3 u4 s! @* s8 v, D  }
. \* [" p) S$ t# r" w
8 X0 O' |4 I9 Y: k& M" C! n简单的主函数。
/ a7 A( ~( s0 ?4 x, q" a5 ^* n) E6 U4 Z" h, z# w
  c) N; {# q0 Q
  进入MX_X_CUBE_AI_Process();( U" t+ g/ }: f& Y) A1 R

) N: j# Y5 D! _. z6 _8 {
+ j" G9 i6 g0 R) ]: d' z    ai_buffer ai_input;! i! c( g9 G8 g
    ai_buffer ai_output;+ q2 h9 B: D) J6 B, b: f; Z
    ai_i32 batch;3 j. X9 J  C8 Y
    char str_tmp[16];
, s0 M& i7 S3 k6 i0 I( F     for(uint8_t i=0; i<10; i++)
4 f5 H3 L8 D$ m/ D( {, r            {" e( D! s& v) E% q6 f
                                                sprintf(str_tmp,"%1d.bmp",i);
, G2 y# l- m% @- ~                                          _ShowBMPEx(str_tmp);9 ?7 `4 Z# I& ~  S+ D' t
                                                LCD_ShowBMP(str_tmp);# @$ w' W( e! S0 T: u
                                                for(uint16_t i=0; i<AI_LENET_IN_1_SIZE ; i++ ). m$ i9 s0 ]" q+ G) r, }6 A
                                                {
3 a& [# l9 C0 _9 _                                                                in_data[i] = *bmpBuffPtr++;5 j$ v; y5 y/ K  J  m$ v
                                                }2 B8 I$ B+ T: q5 n- L' h
                                                ai_input.n_batches  = 1;5 _8 O4 B* i+ X
                                                ai_input.data = AI_HANDLE_PTR(in_data);
  i' u& e4 s- E) u                                                ai_output.n_batches = 1;
: z: S4 y0 Y+ x! @( N( J                                                ai_output.data = AI_HANDLE_PTR(out_data);& [) v8 F6 o; |! s% P; ]7 t
                                                batch = ai_lenet_run(handel, &ai_input, &ai_output);
( b! U8 N3 e0 x0 Q+ J: P                                                if (batch != 1) # Q8 O. I, a% \. {( w6 ~' R: G
                                                {
1 F1 J3 Z- v# o: w1 Q' N                                                                err = ai_lenet_get_error(handel);- R) l2 i$ H' p. E$ u7 C3 J. [. l
                                                                if( err.code )
( H9 s% n8 v$ G$ b1 x                                                                {& g, v* x" E8 @; c6 u6 D) ^
                                                                                while(1);
- B' y, u& ~& M5 e                                                                }
& z! F) k* I* w. J                                                }( g) a: v5 h/ z5 \: B& X
                                         uint8_t count=0;
3 b* P: B& k  [$ E! R. v& k- O) V                                         for(uint8_t i=0; i<AI_MNETWORK_OUT_1_SIZE; i++)6 G8 y: I3 C# q7 v0 \! G
                                                {
$ z0 n: X. D/ R2 h1 |: G6 y                                                  if( out_data[i] >=0.9f)
) E+ i$ N- @( k                                                                {7 g* k9 {( R. I. c: D0 e0 L
                                                                         sprintf(str_tmp,"Num:%d",i);
& W5 u) v' c0 F                                                                         GUI_SetFont(GUI_FONT_32B_ASCII);
. l5 }  }2 {) D( O& B9 D                                                                  GUI_DispStringAt(str_tmp,200,0);
( G1 r" A. y7 {' ~                                                                         GUI_SetFont(GUI_FONT_16B_ASCII);
6 H# `- {- h% X" ~                                                                         count++;* H' L) x( P% F6 d& V
                                                                }  A. h0 A5 D7 \- _( z
                                                }0 i) t- u  W3 S! r+ }% r! z9 y
      if(count!=1)
0 o' c6 E7 h! }2 [0 ^" E                                                {. }5 p- e6 m. V
                                                        GUI_SetFont(GUI_FONT_32B_ASCII);  ]+ `+ \1 e5 u' O/ `4 {& }. G# i
                                                        GUI_DispStringAt("err",200,0);
4 }( o1 U; T& p6 j                                                        GUI_SetFont(GUI_FONT_16B_ASCII);
" h* q& z  }7 w6 z$ b" `                                                }
0 }( @% T' X1 z( d                                                free(bmpBuffPtr);
$ y1 g/ ?* X& k2 `7 w                                                HAL_Delay(2000);. z; K4 e; K5 ^; @  S
                                        }
8 r% E+ _! r0 s5 f7 D1 f
% `: U: P3 z0 o7 [      熟悉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 型 何必不输出 所有的置信度。后面我将继续挖掘。
0 P1 T) Z0 Q' q, h/ |6 \# @/ I2 ?- K1 S+ f4 Q. `' O, F) O
       流程介绍完毕,下面说一说cubeAI的主要函数。
- y7 y  e. l; ], ?       ai_lenet_create(&handel, NULL);% [- s/ O' ~( e( t7 \3 H$ y
      ai_lenet_get_info(handel, &report);
3 R( y: ?; L* F; v          ai_network_params params = {- B) Q' U  T( j1 R% ^
                                                          AI_LENET_DATA_WEIGHTS(ai_lenet_data_weights_get()),    //权重的获取+ }. |) E+ q- n; J! ^  o. M
                                                        AI_LENET_DATA_ACTIVATIONS(activations)     // 激活函数
; J. N' f) g6 q- d, u0 R# @                                                };
. e* p/ L9 w7 B& }/ C5 ]          ai_lenet_init(handel, &params);  //lenet的初始化,估计是申请内存什么的,写flash。0 C4 g2 F( `5 F1 E) a- S; ]
                                                                         err = ai_lenet_get_error(handel);. Q# F- C& O' S1 h) m  y

$ z, p/ C- d- S4 m- ]8 x: U         batch = ai_lenet_run(handel, &ai_input, &ai_output); //图片输入以及处理完毕的输出,1batch批9 F. P: `1 @6 n" [7 O+ k9 p/ Q

3 F0 K9 E% m! T6 b9 ]+ P' u
  q: |8 b7 G& c         总的来说比较简单的demo,其实也可以做复杂一点,先手写然后STemwin存bmp图片,然后利用加权平均得到BMP颜色数据的灰度,输入到lenet,dedaojieguo。效果会比较酷炫。
2 g" y, \% B6 v- h        这模型被压缩很厉害,能有这样的结果以及不错了,最后祝贺一下ST,半导体前15!  期待MP1,玩玩不用压缩的AI。+ K5 t4 W+ s2 g7 J9 H  k
        附件:工程源码。
3 v; q) }2 p) D: }$ A# T2 I8 e1 {% J3 R

$ T# ^4 S3 I0 j( Q& A

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:025 X* P" ]9 Y7 E; V
支持下
7 r; d7 W7 ^' h5 R) ?
谢谢支持
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
学习学习!. T5 t# Z, i# L9 J/ A* f2 `

所属标签

相似分享

官网相关资源

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