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

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

[复制链接]
lebment 发布时间:2019-5-17 23:14
  写的教程反响平平,可能是晦涩难懂,那就直接上代码(极度粗糙的demo)。
* X; v& j( ]  Y9 E2 q1 X  接上次的软硬件环境,我采用的STemwin(本来想用littlevgl)自带bmp显示(详细代码可参考某某莱教程)。先看看生成的一些代码。
9 {9 o  n* |. ~1 z$ V8 q) g4 x2 U0 r9 E7 x' W; r
                GUI_Init();  l# j, z. }" ], r' W# Y
                GUI_SetBkColor(GUI_BLUE_98);
- O4 y6 Y/ K- A7 O4 R" t" t                GUI_Clear();( Y4 H: j0 C; ?7 O6 _( [
        7 u9 G  f* u4 q3 f4 J2 N5 }8 [2 a
                GUI_DispStringHCenterAt( GUI_GetVersionString() , GUI_GetScreenSizeX()/2, GUI_GetScreenSizeY()/2);6 j' b; ]$ c" c4 Y% y
                SDRes=f_mount(&SDFatFS,(TCHAR*)SDPath,0);
& C4 T' a, H7 \2 g0 w                if(SDRes!=FR_OK)
+ w) c* e  G0 f" I- n                {
5 \4 z8 Z- ~5 r, {+ D                Error_Handler();0 {4 Y7 ?7 ?; P( b
                }
/ g& D$ _' A; V- V  F+ H+ }& [  MX_X_CUBE_AI_Process();
( M" x5 @7 }5 h6 M+ O4 t( R  /* USER CODE END 2 */
& l# F0 B2 `" Y( s( l  /* Infinite loop */
3 h$ r' B, W( d1 W7 @4 E  /* USER CODE BEGIN WHILE */! o- u; j, i5 w6 p  W
  while (1)! @. J& V' K, ?( J0 L' l7 s
  {6 H7 _% e4 u1 E
    /* USER CODE END WHILE */: t* j1 v, \  x& P5 h+ [  G
                         GUI_Delay(10);" W; H, z, i/ h/ n/ K
    /* USER CODE BEGIN 3 */
4 e+ s% L. i9 r& H4 [: X" m  }3 A* d1 K, i) A8 s

5 l( U( L$ v& _7 Q3 f6 ]简单的主函数。: t7 g3 j8 t( ?6 h' @
7 K- {( l1 u( y: L) K1 K$ V
4 X4 N# X* d) l8 j2 i2 E
  进入MX_X_CUBE_AI_Process();
2 i2 Y  V$ `% {. X0 `) i3 S2 f( H5 Y

9 I8 k) I/ v6 y* ]  P; ]$ ]2 U    ai_buffer ai_input;) ~. B% y" q1 b; h- I! R: |. w/ O
    ai_buffer ai_output;2 b  w" Z$ V- K  I
    ai_i32 batch;( `7 `2 o  G, f: i- _+ R
    char str_tmp[16];
% J9 i" m- B- ^. S     for(uint8_t i=0; i<10; i++)
/ c- g1 d' f% M6 r1 _            {
0 o7 B  v+ j3 y/ y: w, ]5 E! T                                                sprintf(str_tmp,"%1d.bmp",i);
4 [' F/ h4 E8 C3 h5 K                                          _ShowBMPEx(str_tmp);! Q1 P+ h8 l- P8 u2 v
                                                LCD_ShowBMP(str_tmp);3 k; |' M4 x( p: n  W
                                                for(uint16_t i=0; i<AI_LENET_IN_1_SIZE ; i++ )% U& Z" C. S: ]. T6 m! b0 t
                                                {# w/ w3 R  |0 X) u, M. y
                                                                in_data[i] = *bmpBuffPtr++;
6 n0 ?) |/ U9 x+ T                                                }  e! x  \8 p0 h& i* c
                                                ai_input.n_batches  = 1;* U' E* w4 Z/ |8 Y$ G. }; P* b4 D) A
                                                ai_input.data = AI_HANDLE_PTR(in_data);
5 r' t+ J* t5 s4 C                                                ai_output.n_batches = 1;
0 r& _: ^& K7 }0 \% }                                                ai_output.data = AI_HANDLE_PTR(out_data);/ J+ z( {9 z9 e0 G
                                                batch = ai_lenet_run(handel, &ai_input, &ai_output);
5 o: _: k  W+ D- ~4 j$ K7 G0 _                                                if (batch != 1)
- W# D; l7 f+ t0 p8 f                                                {: R. I9 c& R, {8 Q2 h$ N
                                                                err = ai_lenet_get_error(handel);
/ G. Z. q) x8 p8 A% j: V/ c                                                                if( err.code )5 n2 R' }9 u7 Y4 L* \! @; l4 d
                                                                {$ Y5 P. x# ^$ N
                                                                                while(1);5 q' W/ R. p+ }: w' F& u- ]3 q
                                                                }
; }5 M4 m0 ~& F4 F6 y9 I                                                }4 H: K1 O2 @1 \4 Q6 y' s' J
                                         uint8_t count=0;* {' G/ H* V3 \7 r- f6 N
                                         for(uint8_t i=0; i<AI_MNETWORK_OUT_1_SIZE; i++)9 D$ V9 ^3 e7 L. ~* }! D: o8 Y* v9 w
                                                {2 I9 U- A7 Q9 _4 T' V
                                                  if( out_data[i] >=0.9f)
0 l2 }( U' k/ P& P- o                                                                {7 I! R2 V& l. p8 A
                                                                         sprintf(str_tmp,"Num:%d",i);
( B7 R& J( E: d( q$ \7 N; {, k! l                                                                         GUI_SetFont(GUI_FONT_32B_ASCII);* d4 |& }5 v4 O$ n0 x5 U
                                                                  GUI_DispStringAt(str_tmp,200,0);3 h# O0 S& L2 v4 {
                                                                         GUI_SetFont(GUI_FONT_16B_ASCII);
' H# b3 I. v% d1 u' V9 c7 u8 X                                                                         count++;
6 o7 z& `! I+ q                                                                }5 i, `! a1 a" r: p& _
                                                }: `& N7 [$ v' M
      if(count!=1); ^$ B; z: [' f& }% q* {0 s
                                                {. D% _) b' ?+ A8 ^: p7 ?
                                                        GUI_SetFont(GUI_FONT_32B_ASCII);! l- p. F! ?7 l' P) V8 c
                                                        GUI_DispStringAt("err",200,0);/ z- R. C6 k5 V+ q" N
                                                        GUI_SetFont(GUI_FONT_16B_ASCII);& f( z) t* e- j# d; A4 [
                                                }
- {$ n) c3 }% e$ U" V! @                                                free(bmpBuffPtr);2 _3 k- U% l  ]/ v2 Z' d+ O
                                                HAL_Delay(2000);
8 b. f1 Q! B1 s: I, q                                        }
. H* u; P8 ^* w4 h! O
+ V3 s0 C* X* `' a      熟悉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 型 何必不输出 所有的置信度。后面我将继续挖掘。
. w5 c6 `) d- V, k; ]% y6 H8 e8 t4 K9 B& h
       流程介绍完毕,下面说一说cubeAI的主要函数。/ t. @3 g6 d7 c: N
       ai_lenet_create(&handel, NULL);
/ Z: U8 Z* k2 J3 z9 Z      ai_lenet_get_info(handel, &report);
' r& n* T; Y. @) {0 J* Y% J          ai_network_params params = {  Q4 u/ q1 Y: a) T4 J
                                                          AI_LENET_DATA_WEIGHTS(ai_lenet_data_weights_get()),    //权重的获取& q: N+ {. M; G$ [8 A: s2 D" \7 S
                                                        AI_LENET_DATA_ACTIVATIONS(activations)     // 激活函数
9 R$ Q) L$ S  N( I3 f9 u                                                };
# c  F' s$ z& \' a          ai_lenet_init(handel, &params);  //lenet的初始化,估计是申请内存什么的,写flash。# Q  U& I( c0 u' ^1 K  A1 Q0 P
                                                                         err = ai_lenet_get_error(handel);
, I7 M5 a2 @/ X$ w9 K1 C+ ~' A' J; H3 H0 \" g! s
         batch = ai_lenet_run(handel, &ai_input, &ai_output); //图片输入以及处理完毕的输出,1batch批
  K8 t4 k% ~9 b1 g
4 ~6 T4 ?0 E3 T" l' G
; U. D! ]; T; b2 D1 r3 H: O- t" [         总的来说比较简单的demo,其实也可以做复杂一点,先手写然后STemwin存bmp图片,然后利用加权平均得到BMP颜色数据的灰度,输入到lenet,dedaojieguo。效果会比较酷炫。
! E1 ~$ Q) y# \7 l* P        这模型被压缩很厉害,能有这样的结果以及不错了,最后祝贺一下ST,半导体前15!  期待MP1,玩玩不用压缩的AI。; |  g: \" I5 R% w5 X$ }8 X
        附件:工程源码。
! F/ d% X! W5 \: |3 y. E9 L. a% M0 [5 d0 s7 ]+ J( u% K# {! N
: y4 A. B2 F3 S

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
+ X( x, c6 ]9 o0 q: i8 b支持下
5 {* W6 k# K+ r, W$ V
谢谢支持
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
学习学习!! H/ h, M: m( j

所属标签

相似分享

官网相关资源

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