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

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

[复制链接]
lebment 发布时间:2019-5-17 23:14
  写的教程反响平平,可能是晦涩难懂,那就直接上代码(极度粗糙的demo)。: W) f: N/ \# u+ S
  接上次的软硬件环境,我采用的STemwin(本来想用littlevgl)自带bmp显示(详细代码可参考某某莱教程)。先看看生成的一些代码。
' `# {7 p( `' H- e. m. k2 P# I* R0 e" H! C1 ?$ A" y6 v
                GUI_Init();
- t* ?5 x! }- @6 v' D" `' B2 y0 q                GUI_SetBkColor(GUI_BLUE_98);
0 b, x( P) l4 \5 s! F6 V  C                GUI_Clear();
' P5 T+ M5 ?! U+ w! }        ! d- {( N/ \! x* z7 w) t
                GUI_DispStringHCenterAt( GUI_GetVersionString() , GUI_GetScreenSizeX()/2, GUI_GetScreenSizeY()/2);
" \' y4 _! p$ @; L" D                SDRes=f_mount(&SDFatFS,(TCHAR*)SDPath,0);
% }0 e& v* @4 v0 d% h) f' W, p5 p                if(SDRes!=FR_OK)
: ]6 l" m0 L) y6 \  @& |9 ~                {; e  e6 }( \5 {3 \' `( d' L
                Error_Handler();
( @& i) H6 B# y9 u) f                }
7 }( g4 w& X) v) A3 r6 s/ B  MX_X_CUBE_AI_Process();2 v' v& V6 H+ `3 ]/ s+ Y9 Q  x. f
  /* USER CODE END 2 */; R3 E" C3 a* ]+ K' D
  /* Infinite loop */* w% [4 [* K- k% p
  /* USER CODE BEGIN WHILE */
) m! ~6 Z2 t7 R3 s! a# Q9 h  while (1)
; M# m3 q3 Y7 i( Q- H# p) K  k  {7 W' Z# C2 |, }  T/ q1 H2 Y4 p
    /* USER CODE END WHILE */# [! n7 n9 d# P& f( l4 Y
                         GUI_Delay(10);! s- V0 Y" r3 d0 U9 v
    /* USER CODE BEGIN 3 *// g9 q* m; n9 ~/ `; Z
  }
) G6 l* Z/ w' ~3 ^5 }) r) e4 ^! G& K
' q' V( w/ u7 |( c) d简单的主函数。
0 ~: g/ q/ Q0 G6 r" z9 _" g' g: `3 O" C
4 ?& A! P  a8 \) F/ \
  进入MX_X_CUBE_AI_Process();9 H9 m* q4 z2 z' y. M4 K

" f( _. x, s- L/ J( V- ]
+ @: c4 A- C+ b1 W    ai_buffer ai_input;. G2 L4 ]3 g& c  l+ d0 h9 ^
    ai_buffer ai_output;
: @" @: \: q5 M2 G9 J% n0 h% T    ai_i32 batch;
6 K$ s  h# }, I; P5 c3 n    char str_tmp[16];2 R4 g0 M- N) w; ~
     for(uint8_t i=0; i<10; i++)# Y) h4 d2 A8 k% ?. T
            {
: g* w0 k) F; ]- A! `$ O$ m                                                sprintf(str_tmp,"%1d.bmp",i);  T( i' g4 }: d( |+ t' @
                                          _ShowBMPEx(str_tmp);4 ?" }& _8 o' ~( b) c
                                                LCD_ShowBMP(str_tmp);
. ~# T" i2 r+ g; B! S' l$ q                                                for(uint16_t i=0; i<AI_LENET_IN_1_SIZE ; i++ )" J$ z  Z3 R. [# l$ K' c! h
                                                {
( j& m0 q) Q5 G0 Z7 V1 i                                                                in_data[i] = *bmpBuffPtr++;/ X! }4 `4 k' d4 E( d3 C& }
                                                }- ~8 K  P0 R* d" B
                                                ai_input.n_batches  = 1;
! O( q1 L" [* ~) s1 _' s% _                                                ai_input.data = AI_HANDLE_PTR(in_data);2 B$ @* V- q4 o! T" D! D
                                                ai_output.n_batches = 1;
. g+ V# X' {1 c                                                ai_output.data = AI_HANDLE_PTR(out_data);. F" c; P! B# A" e- \6 j
                                                batch = ai_lenet_run(handel, &ai_input, &ai_output);
; o% B3 \0 Z$ u, b" Y1 ~% F" O1 h8 ^                                                if (batch != 1) & c0 {! V9 `4 P3 q' S/ C
                                                {
8 \, t8 T0 A( @; e& j* k                                                                err = ai_lenet_get_error(handel);
# J  M0 e% f; z, Y3 h5 v9 `                                                                if( err.code ): Y( `% ^" C# Z' _. [+ X
                                                                {
% I/ E6 k/ c- V, s& v1 G                                                                                while(1);/ _) i$ X. P- X- \
                                                                }
! t1 K& v$ P8 c3 v# _                                                }
& H; y; u- |4 `1 }                                         uint8_t count=0;  A/ C% G) A2 O/ v3 y
                                         for(uint8_t i=0; i<AI_MNETWORK_OUT_1_SIZE; i++)
) l' u  w5 H8 u9 \. N2 {- }2 g                                                {
. ~" j$ b& w: g$ \/ R- v; R3 G! f                                                  if( out_data[i] >=0.9f)% P: I5 _9 u1 K2 Y7 E2 B' j+ M
                                                                {+ w4 }+ ?4 Q/ ~& P# c. V/ `0 S1 o
                                                                         sprintf(str_tmp,"Num:%d",i);" M0 g: x$ a4 ~; O+ b& P* q
                                                                         GUI_SetFont(GUI_FONT_32B_ASCII);' {5 m, ~+ K  i; w5 C2 C  F
                                                                  GUI_DispStringAt(str_tmp,200,0);
. W) @& }- z+ e9 C, }9 a* A7 Q                                                                         GUI_SetFont(GUI_FONT_16B_ASCII);2 x8 _$ [" `" p$ E$ c$ v
                                                                         count++;
# s. i& l- B% q' b! C" t4 x                                                                }
- x* c) ~, s; P1 H  _                                                }0 J0 v- t8 ^2 H4 U  }
      if(count!=1)
' ^: [  g' O, p9 i% ?6 Q( I: b                                                {' \! ~1 R2 J5 ~- O0 `. A
                                                        GUI_SetFont(GUI_FONT_32B_ASCII);2 |, H6 S8 M, z
                                                        GUI_DispStringAt("err",200,0);
# O7 ?$ x8 L5 ^% D9 v. C8 _                                                        GUI_SetFont(GUI_FONT_16B_ASCII);: A* S: ]. U. r# c$ A" c
                                                }
* j- g# [& d1 @                                                free(bmpBuffPtr);  B! C1 u. m$ \0 m7 U. ^% R
                                                HAL_Delay(2000);
8 h+ Q6 ~) t  `# K                                        }1 A, I  i  f; ^
0 k5 K5 \: e3 N3 z) ^$ s) {; _
      熟悉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 型 何必不输出 所有的置信度。后面我将继续挖掘。$ y* j# t) r( o2 @' f) B+ b+ B( n

; @; t. m0 T9 F( R       流程介绍完毕,下面说一说cubeAI的主要函数。1 m% U- Z& P6 U2 W% A5 V' C
       ai_lenet_create(&handel, NULL);  j! P) _; }6 ^2 g( n! }* g' [
      ai_lenet_get_info(handel, &report);
- C( |2 T+ ?9 Q! P0 C          ai_network_params params = {% V: y$ x; [! q7 T5 ^% @
                                                          AI_LENET_DATA_WEIGHTS(ai_lenet_data_weights_get()),    //权重的获取
/ y1 j4 M; O8 u/ [4 N2 C                                                        AI_LENET_DATA_ACTIVATIONS(activations)     // 激活函数5 Z, P* ^; f1 I& d' o* b
                                                };, Q/ L  ~. V' \) w6 t
          ai_lenet_init(handel, &params);  //lenet的初始化,估计是申请内存什么的,写flash。: [* N! i, E5 `
                                                                         err = ai_lenet_get_error(handel);
5 s$ u' \& i  j" _2 ^+ K& G/ i; L6 m: }7 D  _1 h5 R3 ?
         batch = ai_lenet_run(handel, &ai_input, &ai_output); //图片输入以及处理完毕的输出,1batch批
8 h/ z+ B) R; A" ?# q
- z0 H3 ?% v! F7 x
& h( @2 G5 @2 K0 h/ O4 Z         总的来说比较简单的demo,其实也可以做复杂一点,先手写然后STemwin存bmp图片,然后利用加权平均得到BMP颜色数据的灰度,输入到lenet,dedaojieguo。效果会比较酷炫。
4 i. E0 l! X# L- M. Z( \  G( z        这模型被压缩很厉害,能有这样的结果以及不错了,最后祝贺一下ST,半导体前15!  期待MP1,玩玩不用压缩的AI。
  \1 _8 |" S7 m# m8 I. ~9 h  ~        附件:工程源码。7 p+ F: L- H+ k/ s4 T

! k$ T3 v. J: n" G" {0 T3 M; O( f6 S" A! a4 @8 `

Minist.rar

下载

10.2 MB, 下载次数: 150

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

举报

7个回答
happier_1995 回答时间:2020-7-30 08:17:50
兄弟,您这个代码运行最后的准确率能达到多少?我今天试了一下,10个数有9个识别错误的。
Bowen1028 回答时间:2019-5-18 09:02:09
支持下
lebment 回答时间:2019-5-18 10:34:28
strang 发表于 2019-5-18 09:02  N& X* d) e6 }7 O" a2 ^2 \
支持下
/ m: |3 U; j+ h2 N7 m6 b  `: b9 J' C
谢谢支持
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
学习学习!) F4 D6 i( F6 g5 d9 M& g

所属标签

相似技术帖

官网相关资源

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