请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
lebment 发布时间:2019-5-17 23:14
  写的教程反响平平,可能是晦涩难懂,那就直接上代码(极度粗糙的demo)。
( {  ]) ?- d2 `' R$ l  接上次的软硬件环境,我采用的STemwin(本来想用littlevgl)自带bmp显示(详细代码可参考某某莱教程)。先看看生成的一些代码。6 |1 b8 D/ w. K. H
5 s9 j3 p  Q  C6 z# \  W. a
                GUI_Init();
. m5 H* b6 @/ L8 D  n* @                GUI_SetBkColor(GUI_BLUE_98);
; f9 u3 x! c9 ]; q( }% N                GUI_Clear();6 p+ c/ h$ Z. W
        , [+ M+ \4 x; }2 K
                GUI_DispStringHCenterAt( GUI_GetVersionString() , GUI_GetScreenSizeX()/2, GUI_GetScreenSizeY()/2);9 G: a9 n! R: ?: M0 ], y6 f: y& q
                SDRes=f_mount(&SDFatFS,(TCHAR*)SDPath,0);
7 F7 l. o7 p. z/ C                if(SDRes!=FR_OK)
: }5 Y4 v1 i3 x: |0 z; e                {5 z$ j/ v" h& K7 B
                Error_Handler();
$ ]- x0 ]/ a0 A  P                }' W$ R4 B* [4 r4 D' H
  MX_X_CUBE_AI_Process();
) z2 N2 v0 ^& T; _+ |  /* USER CODE END 2 */! b9 Y# _3 i+ d4 y0 M( k! r. O/ [+ `
  /* Infinite loop */" u( c% _1 u& u( S
  /* USER CODE BEGIN WHILE *// \7 J( i. q8 Z2 U8 K  f8 G
  while (1)+ m7 l5 e* G5 x7 ^1 F$ n/ N2 B
  {
3 r2 ^8 f1 _2 u- O: U/ M7 a" u    /* USER CODE END WHILE */$ g$ n+ B: b' J; k4 _7 ?+ h. F
                         GUI_Delay(10);! ^$ x2 J3 M2 p! C- p6 i6 v  J/ T/ |6 y
    /* USER CODE BEGIN 3 */
& D9 b) c% q' U: ]3 |  }0 x% z1 u- O* w/ {3 W; G

5 Z5 c; w6 r+ S简单的主函数。
7 d2 a9 K; q# T2 v1 R: y5 n) V, ^; Q' p8 T* [! N$ U6 K

, @3 t- {! {2 J  进入MX_X_CUBE_AI_Process();
* w4 o, e+ ]# V$ m! c7 P
& h& T$ W# h8 `: L+ d" F) V2 z  ~. ?9 D7 U. ~2 _, D6 X  j6 ?
    ai_buffer ai_input;% r/ Q9 V3 N7 w7 k; ~2 f1 f4 l
    ai_buffer ai_output;
  _5 D  g% L( [9 ^    ai_i32 batch;
- }. Y) m- y0 O$ r1 O! X    char str_tmp[16];
% g6 Q$ N; o5 Z9 O* c, c5 u+ f' A     for(uint8_t i=0; i<10; i++)
6 r$ F: @! r7 |4 u3 j            {4 Z# r7 T" `! {7 I! K8 K
                                                sprintf(str_tmp,"%1d.bmp",i);
: f( f0 ?0 @# \6 i( p                                          _ShowBMPEx(str_tmp);: K+ z9 b0 p  O9 H1 |
                                                LCD_ShowBMP(str_tmp);
  f# y9 k' J; L                                                for(uint16_t i=0; i<AI_LENET_IN_1_SIZE ; i++ )
4 U  C- Q4 ?; D: J$ I                                                {+ T! O- P  T: Y% D2 V$ g
                                                                in_data[i] = *bmpBuffPtr++;; g* S# ?0 W2 U5 _+ x' Z0 M
                                                }
/ \$ N; p5 J7 m9 C2 ~                                                ai_input.n_batches  = 1;6 `0 \8 b: Q& r) I$ I& B3 @
                                                ai_input.data = AI_HANDLE_PTR(in_data);
3 ?) n7 Z1 b3 S( r) C' a                                                ai_output.n_batches = 1;9 [  f8 Z7 u3 L2 B7 c+ o
                                                ai_output.data = AI_HANDLE_PTR(out_data);+ Y* ?+ K3 D' ^/ n- t
                                                batch = ai_lenet_run(handel, &ai_input, &ai_output);
$ V1 d! Z2 Y  E" @$ h                                                if (batch != 1)
. w% U0 \1 C6 A# }                                                {" {6 d9 q7 V% v4 Q& E. N
                                                                err = ai_lenet_get_error(handel);0 r" Y, E4 n  N
                                                                if( err.code ). ~/ t8 l! U) ?: r7 E$ J
                                                                {. c; a8 ~9 h9 X' d
                                                                                while(1);' i( c: N1 u* c( ]+ ~
                                                                }0 Q% I' n* d" P! i4 c- J
                                                }$ E: x" `5 f. W5 u) V: ~( s! U9 a
                                         uint8_t count=0;
8 x2 _3 s. R. M( ?4 q+ P                                         for(uint8_t i=0; i<AI_MNETWORK_OUT_1_SIZE; i++)1 v; J4 b  f% M: V! w" b+ H9 C  l; |
                                                {' C- a: [. ?2 l' H0 }5 h3 R
                                                  if( out_data[i] >=0.9f)8 O. V- A# _" T9 o
                                                                {4 g6 r) L& s2 S3 H4 R: [* t9 q1 y( K
                                                                         sprintf(str_tmp,"Num:%d",i);
7 }: p- e! K' y5 @0 I/ ^5 }; W                                                                         GUI_SetFont(GUI_FONT_32B_ASCII);
  G. S1 f! E! c' G+ d                                                                  GUI_DispStringAt(str_tmp,200,0);& _& u7 I+ b2 l+ ]' P2 [5 r/ ]+ F
                                                                         GUI_SetFont(GUI_FONT_16B_ASCII);) e" T' V5 L1 ^& B8 V
                                                                         count++;
  j* Z, V, b3 w                                                                }
& ]3 |# A5 a- V7 p% o                                                }
- @) a4 U4 [* Q. p      if(count!=1)
, E: e; H# U- H  |, D& T5 K7 Z& B+ E                                                {7 U, }4 x% q4 g" L6 h  w3 t' v
                                                        GUI_SetFont(GUI_FONT_32B_ASCII);2 X2 x  q' v7 T
                                                        GUI_DispStringAt("err",200,0);
) D* p" ~0 o$ D# c                                                        GUI_SetFont(GUI_FONT_16B_ASCII);$ _+ D) G/ ^% v+ G: N
                                                }8 [/ h& P# h+ f! E# h" e* C$ v
                                                free(bmpBuffPtr);
. G9 M1 O$ o; ~0 {( V' U0 ]6 o                                                HAL_Delay(2000);$ p' o* o9 G  ]8 p
                                        }
4 D+ L" _  H5 Y1 X/ o3 c" J( G6 e, u
      熟悉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 ]6 N% e% q' g: H/ F
- C* q: d! v$ `0 S9 f
       流程介绍完毕,下面说一说cubeAI的主要函数。& L  O3 q* }* B% W4 M7 r) Y! H
       ai_lenet_create(&handel, NULL);
) ~$ R; [. u* ]6 v3 s% W! ]      ai_lenet_get_info(handel, &report);6 _) ^& D- W# c; X; _) O* C4 K: `4 `! V
          ai_network_params params = {( T- F0 G3 k9 a1 f. Z' U% s
                                                          AI_LENET_DATA_WEIGHTS(ai_lenet_data_weights_get()),    //权重的获取0 T( c7 l! ?* x6 X; v: `
                                                        AI_LENET_DATA_ACTIVATIONS(activations)     // 激活函数
+ ]5 U2 T. }; w" A9 n# r6 t                                                };! {6 K7 o' o# w+ l& p5 G, ^
          ai_lenet_init(handel, &params);  //lenet的初始化,估计是申请内存什么的,写flash。
1 M# ]7 n. v, V3 e" ]& K# l                                                                         err = ai_lenet_get_error(handel);
7 n3 s4 u: T: _$ g2 {! I' g( i- p' o# s. Z
         batch = ai_lenet_run(handel, &ai_input, &ai_output); //图片输入以及处理完毕的输出,1batch批0 @1 {% A# c* h! }
$ d9 m4 |6 M3 c8 g1 B( u

+ n& A' a$ D; |' t* x- \         总的来说比较简单的demo,其实也可以做复杂一点,先手写然后STemwin存bmp图片,然后利用加权平均得到BMP颜色数据的灰度,输入到lenet,dedaojieguo。效果会比较酷炫。
7 c$ B7 R$ Z& a$ F( T6 R        这模型被压缩很厉害,能有这样的结果以及不错了,最后祝贺一下ST,半导体前15!  期待MP1,玩玩不用压缩的AI。0 q0 B  g/ O; r
        附件:工程源码。, C  G; u' j# _$ K- Q6 k% @- Q- e
4 L0 j1 T# @0 \3 T4 W
% a3 v4 `2 G- Z- 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: Q2 q  d/ i; a" }) t2 i
支持下

2 o# p9 u5 p( `, c" O: G; d% O- J谢谢支持
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. R' O. d3 A7 ]3 S: e
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版