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

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

[复制链接]
lebment 发布时间:2019-5-17 23:14
  写的教程反响平平,可能是晦涩难懂,那就直接上代码(极度粗糙的demo)。
- G2 I5 {0 N$ n5 \- l" n  @  接上次的软硬件环境,我采用的STemwin(本来想用littlevgl)自带bmp显示(详细代码可参考某某莱教程)。先看看生成的一些代码。3 `! Q2 D0 Q" k) H' d4 G8 F" C- K' n

+ `/ `/ e) m: p7 ?3 w                GUI_Init();
( A8 a7 A% m/ D5 p! f                GUI_SetBkColor(GUI_BLUE_98);/ u( y3 r1 _  V" N5 `" u# Y$ e
                GUI_Clear();
/ J8 ~( `# X  g/ k5 F) Z( B        : Z4 k1 X6 E! R- M8 y. ^% x4 v
                GUI_DispStringHCenterAt( GUI_GetVersionString() , GUI_GetScreenSizeX()/2, GUI_GetScreenSizeY()/2);# y1 V4 C% o- `# ?
                SDRes=f_mount(&SDFatFS,(TCHAR*)SDPath,0);3 _0 J+ u/ G  b3 ?/ `+ f( s
                if(SDRes!=FR_OK)
+ E7 v. k8 y9 P2 q3 @                {
4 m' l5 u9 F" l/ B. ^                Error_Handler();
) F; l% F9 n1 a' k) n& m. X                }
) G$ n4 l' J5 {& V2 x0 D  MX_X_CUBE_AI_Process();) F! A9 f& t" {/ Z0 O- S
  /* USER CODE END 2 */3 X. z- f7 P" [! W' U! O
  /* Infinite loop */6 @  j! r+ e3 Y. L; ]7 f
  /* USER CODE BEGIN WHILE */5 w  e& p4 C: m& h' q$ Z
  while (1)
" \9 o; _" O  E0 K' m! @6 H2 @  {. r( _( w+ q, V! u' o1 R+ {
    /* USER CODE END WHILE */
: s$ U- i9 W. O, ]# r. a                         GUI_Delay(10);% Y, E2 Y9 v# j' ]0 ~
    /* USER CODE BEGIN 3 */7 {! q6 G  t( Y6 `" o) S
  }. o: E( t) o9 ^0 a1 o

* q- P! \/ R, x: e, i, J4 Z简单的主函数。
5 l: g: e7 j! P4 c* w2 I6 H/ P. p8 m' N) ]

$ X( q. m* h3 B( I- F  进入MX_X_CUBE_AI_Process();
$ l- c) l4 R3 W' P0 L9 \# V9 x- i7 o1 c
4 x- H' Z( ?/ }* C8 _/ U! W/ d( J4 d
    ai_buffer ai_input;) ~; z2 R% a, U8 l
    ai_buffer ai_output;
, g" L8 J- w6 M/ ?" F% N3 A+ B: _. ~    ai_i32 batch;& y5 E, D# |# _" r$ U, t+ `8 _
    char str_tmp[16];0 m/ u5 S8 D# E8 L/ v8 f
     for(uint8_t i=0; i<10; i++)1 t2 q- x- _( U( t# b
            {/ Z- J5 ?( W9 P; Z; I2 N0 y
                                                sprintf(str_tmp,"%1d.bmp",i);
; |+ a4 Z1 O5 X- e( s1 [                                          _ShowBMPEx(str_tmp);2 W0 ?3 y: }8 m. R. }0 A
                                                LCD_ShowBMP(str_tmp);0 A+ y8 H7 E3 G. g
                                                for(uint16_t i=0; i<AI_LENET_IN_1_SIZE ; i++ ): y0 P. N; I  H: s8 R* W5 a! p# W& q
                                                {- g0 r! A# j; f, V8 l
                                                                in_data[i] = *bmpBuffPtr++;. z' z# q5 z/ q4 c8 ^
                                                }2 E% z- M, M& L  n9 H: k
                                                ai_input.n_batches  = 1;4 w/ f! o! b+ P- k) W8 b# }9 ~4 }
                                                ai_input.data = AI_HANDLE_PTR(in_data);
( u. }) m( u$ [. l' G                                                ai_output.n_batches = 1;
- A& u* ^1 m0 t                                                ai_output.data = AI_HANDLE_PTR(out_data);
. ^; V. Q' [. h4 G" c' f, O3 S: T                                                batch = ai_lenet_run(handel, &ai_input, &ai_output);
3 W6 e- ]- N- C! \0 x: q                                                if (batch != 1) / u0 F4 M1 s, [7 q
                                                {! \8 j' L* c  Z. m
                                                                err = ai_lenet_get_error(handel);& A$ W( o" E' o) z1 g5 O, P* v
                                                                if( err.code )+ k( a4 m1 {0 x! s1 E% D
                                                                {
* a" i+ ^  _$ r( n% [  F                                                                                while(1);6 {  E* `2 d1 ?9 ?3 o
                                                                }& o! k5 i5 z; B+ b: {* c
                                                }5 \0 q0 A4 L( x$ t5 a9 a0 v
                                         uint8_t count=0;
7 p  S7 v: I, _0 M* J/ H" y3 a                                         for(uint8_t i=0; i<AI_MNETWORK_OUT_1_SIZE; i++)
% H: g4 Q# U  |9 S( d4 S4 V                                                {1 g  x0 x4 m1 `
                                                  if( out_data[i] >=0.9f)
+ W  p4 A) G* t7 Y3 C( ]                                                                {9 v; X/ S, j7 l, g  I7 r7 w  k
                                                                         sprintf(str_tmp,"Num:%d",i);
2 ~  S# |& u& l; s$ F" U                                                                         GUI_SetFont(GUI_FONT_32B_ASCII);- E. z, b6 U9 o# r" K: \
                                                                  GUI_DispStringAt(str_tmp,200,0);: {- k. g1 }1 B# A% H7 c& I
                                                                         GUI_SetFont(GUI_FONT_16B_ASCII);/ U4 e+ v" w2 v
                                                                         count++;  p  `4 s/ t( n( \5 C
                                                                }! t* K4 p. c/ X( |9 |* v/ p6 M
                                                }
- q, L6 f. E7 @      if(count!=1)
" e1 ?. E3 M4 H" X6 F; ]1 C9 c* u$ A                                                {5 S/ N- H' X$ f# A7 d
                                                        GUI_SetFont(GUI_FONT_32B_ASCII);" b! j. ^0 V) [) ~6 E0 J+ r
                                                        GUI_DispStringAt("err",200,0);: g0 [" I' L, U* a, P
                                                        GUI_SetFont(GUI_FONT_16B_ASCII);; `, t2 u' z. K" u) G+ P
                                                }, ]  q5 Q# [+ k) W# E% r9 q2 t3 G
                                                free(bmpBuffPtr);
& S& k1 u- F# U: q                                                HAL_Delay(2000);6 p# k& U' z; n8 P- ?
                                        }( W4 }# r$ N1 M1 Q

7 d9 D+ ~6 O6 W      熟悉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 型 何必不输出 所有的置信度。后面我将继续挖掘。
- A6 k9 z5 a2 x  d+ T. Y, o' F: t0 x8 W
       流程介绍完毕,下面说一说cubeAI的主要函数。
# y7 ~1 q( E0 ~       ai_lenet_create(&handel, NULL);
/ i1 _; x" I) [! g# Z/ F; M: o( M% Z      ai_lenet_get_info(handel, &report);
! K3 I( H: v6 l& S) ^. L% j          ai_network_params params = {
5 p* n6 l# v( O) X2 `" r                                                          AI_LENET_DATA_WEIGHTS(ai_lenet_data_weights_get()),    //权重的获取( m* h# Z2 a( y$ B6 P
                                                        AI_LENET_DATA_ACTIVATIONS(activations)     // 激活函数
5 v9 A. {. c' c! J- ^8 W1 \                                                };
' j4 Z& K; t2 S( _2 a- s          ai_lenet_init(handel, &params);  //lenet的初始化,估计是申请内存什么的,写flash。0 f, E. x" t2 w. x
                                                                         err = ai_lenet_get_error(handel);
  E" A! v2 Y. R' k3 y+ S0 P& b
$ J1 {6 {4 b7 t; j! Z* M         batch = ai_lenet_run(handel, &ai_input, &ai_output); //图片输入以及处理完毕的输出,1batch批/ U6 k2 s$ a+ c) z

" a3 h5 s- l  k) ^/ p% f) V, I" @" l1 A- r7 o9 U
         总的来说比较简单的demo,其实也可以做复杂一点,先手写然后STemwin存bmp图片,然后利用加权平均得到BMP颜色数据的灰度,输入到lenet,dedaojieguo。效果会比较酷炫。9 e+ n2 F  v+ P. ^/ j2 i
        这模型被压缩很厉害,能有这样的结果以及不错了,最后祝贺一下ST,半导体前15!  期待MP1,玩玩不用压缩的AI。" r& m* o, J8 ~! X! [; N) v
        附件:工程源码。$ Z8 J; Z; C+ m5 ~$ ]* ^( z2 X+ V
" k3 k4 ~0 J1 l

( X% e  P5 a) ~# ]

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$ c' [9 w6 p7 h3 [1 R/ D" a( X8 H
支持下

- s9 k- M" @7 Y7 h+ s谢谢支持
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
学习学习!: X, q2 d* z+ x2 q

所属标签

相似技术帖

官网相关资源

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