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

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

[复制链接]
lebment 发布时间:2019-5-17 23:14
  写的教程反响平平,可能是晦涩难懂,那就直接上代码(极度粗糙的demo)。
" @& V# k" G% I  接上次的软硬件环境,我采用的STemwin(本来想用littlevgl)自带bmp显示(详细代码可参考某某莱教程)。先看看生成的一些代码。! z. a/ g/ P: q! M6 ~6 N7 {2 z3 @5 U

( B" H7 W: Y* `# c2 p8 M                GUI_Init();1 |1 r# D# i" R1 h
                GUI_SetBkColor(GUI_BLUE_98);$ ]" o' d& Z. ]0 I1 X1 y
                GUI_Clear();
, W1 h  J& v* h3 O( `; `       
' Q5 `1 S  G( y0 r2 _& C' J                GUI_DispStringHCenterAt( GUI_GetVersionString() , GUI_GetScreenSizeX()/2, GUI_GetScreenSizeY()/2);+ T! p1 f( k* z: b" a6 e/ M$ d
                SDRes=f_mount(&SDFatFS,(TCHAR*)SDPath,0);
+ C+ p' E! C! v% j                if(SDRes!=FR_OK)
/ i9 q$ V, g! Y6 ]4 h7 F4 L                {5 p: S% i2 j" K5 z4 h' \; Z
                Error_Handler();
" `1 c1 L# t$ ^; Z& a                }" w: y* y3 i" N" ]
  MX_X_CUBE_AI_Process();' T$ S* u( D9 D8 L- G7 [
  /* USER CODE END 2 */* I6 q  ~  o5 F7 K+ A/ u
  /* Infinite loop */& A( b! K/ n$ s
  /* USER CODE BEGIN WHILE */% p' _7 j) x. j, W# g  J: m
  while (1)$ G6 ]1 y) O; y0 G! B
  {
6 X; A9 k- F: Y' b! Q# N( V    /* USER CODE END WHILE */
, ?" F, {/ U' `+ s8 X) a                         GUI_Delay(10);6 j2 t; n% n3 N: X, l& P
    /* USER CODE BEGIN 3 */8 S7 j% Q" b. X8 S
  }
4 \2 t! k" u8 w+ |4 F- Q* z
/ {& v& r. r3 f# _/ H' W, z* Q简单的主函数。1 W0 m, ^; w% h' X
$ y) u) s( }; i) m

9 \% \5 Q& {# n! h: n% h  进入MX_X_CUBE_AI_Process();, M' q: f6 ^; p( k% |
- z4 \0 {/ S6 w3 C/ k2 a

& o# N& q4 d7 Q- P2 u$ |% D    ai_buffer ai_input;
8 O6 d- Z  c5 ?7 o3 ^5 w+ J$ {% a    ai_buffer ai_output;! v1 F3 j7 L  W, M
    ai_i32 batch;+ J+ ?& ]6 q7 D; q$ S! N2 b
    char str_tmp[16];# C7 P  ]. h$ w) f
     for(uint8_t i=0; i<10; i++)
0 v/ o$ B' v4 C6 ~1 y            {( q3 H2 I! T- ?2 ]
                                                sprintf(str_tmp,"%1d.bmp",i);
4 U) g3 N& M" c4 l- i" Q5 Q                                          _ShowBMPEx(str_tmp);
* J8 z) |% [- L                                                LCD_ShowBMP(str_tmp);0 A* |: c3 m3 q' s9 Q( K
                                                for(uint16_t i=0; i<AI_LENET_IN_1_SIZE ; i++ )
4 Y0 |, _( q  e7 H; B2 b7 s                                                {* ~2 G8 D. g* n" y
                                                                in_data[i] = *bmpBuffPtr++;3 v  b1 D" f3 z3 ~$ |
                                                }( M# Z: o1 e$ z
                                                ai_input.n_batches  = 1;0 F: O( J& W8 }3 T# T/ g2 y$ W, r
                                                ai_input.data = AI_HANDLE_PTR(in_data);
) R' ]3 P. N, R2 X* t, O' K                                                ai_output.n_batches = 1;
" z0 B7 ?1 j& }: c/ g                                                ai_output.data = AI_HANDLE_PTR(out_data);  Z* U' E8 \+ ^" Z% C
                                                batch = ai_lenet_run(handel, &ai_input, &ai_output); 8 [- e9 x' [) _' z
                                                if (batch != 1)
3 H9 \) `$ F' @  P: r! k                                                {. Z) `; y" f* ^" j% G, Q: n; b
                                                                err = ai_lenet_get_error(handel);
; w% _% b3 o3 T' s                                                                if( err.code )
& s. h# i7 n: _' q) z                                                                {! R: u; s. G& M  y6 V' }) \/ h
                                                                                while(1);
, U! G$ V* @6 b( t' G                                                                }& Y/ B2 [& o/ O) \: L
                                                }
. b! x: ~( K/ b                                         uint8_t count=0;1 E: `1 I" c' j8 r4 W7 U
                                         for(uint8_t i=0; i<AI_MNETWORK_OUT_1_SIZE; i++)
- T- p3 _; `5 T                                                {
$ }# T0 b0 }/ k& k                                                  if( out_data[i] >=0.9f)
! Q/ u1 j" A' w" Q                                                                {
! x+ ?/ W* d* o                                                                         sprintf(str_tmp,"Num:%d",i);1 m; c" m( Q9 i$ L; f
                                                                         GUI_SetFont(GUI_FONT_32B_ASCII);+ I$ [8 m8 H! s/ Y
                                                                  GUI_DispStringAt(str_tmp,200,0);
8 p7 A. S" |3 j6 G, @3 P0 u; c                                                                         GUI_SetFont(GUI_FONT_16B_ASCII);
( |3 ?3 ]- T2 B% q& ^1 n. |                                                                         count++;) g, i) \: W6 s2 P- D; \9 O
                                                                }8 o3 k' w3 U* X1 i) s
                                                }
1 v* m& G& G  \      if(count!=1)+ y* y1 }+ z; d8 @9 \
                                                {
- {- G* [9 q: T% j; v" ]                                                        GUI_SetFont(GUI_FONT_32B_ASCII);
0 h2 z% M: J. \, J                                                        GUI_DispStringAt("err",200,0);3 ]/ g, X9 ?7 a
                                                        GUI_SetFont(GUI_FONT_16B_ASCII);
) _5 H2 y' |6 v1 k5 u% a4 y" A/ @3 P                                                }& C" r% b; w5 E6 t6 n
                                                free(bmpBuffPtr);6 o* v' c" }$ q% J( X
                                                HAL_Delay(2000);. e3 n* P( }, @* z" p9 X8 L: c
                                        }
& t% G  Y" f1 I$ Q  O
/ W2 h$ y& X" l      熟悉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 型 何必不输出 所有的置信度。后面我将继续挖掘。4 o" N2 c' ~+ c# }& k& e, y0 k

" V9 L& S' {7 }; n/ w' `9 ~       流程介绍完毕,下面说一说cubeAI的主要函数。
- ?$ h; Q. j( B& r4 Y0 F       ai_lenet_create(&handel, NULL);/ x# K# f  E4 K  Y  O
      ai_lenet_get_info(handel, &report);) ]# ]2 J: |' f# H) j, A
          ai_network_params params = {- y/ J  q' y$ z) u6 y4 b
                                                          AI_LENET_DATA_WEIGHTS(ai_lenet_data_weights_get()),    //权重的获取
& V" A+ b* H2 G5 r9 _6 q9 P6 U                                                        AI_LENET_DATA_ACTIVATIONS(activations)     // 激活函数1 F# Q( w) P1 J. a5 z
                                                };9 l; A, W0 v0 T
          ai_lenet_init(handel, &params);  //lenet的初始化,估计是申请内存什么的,写flash。# w: m" H7 S2 m; z
                                                                         err = ai_lenet_get_error(handel);4 q+ Q' k3 x5 h

5 ?) Z0 d  ~3 o- ~, u8 H2 s9 _         batch = ai_lenet_run(handel, &ai_input, &ai_output); //图片输入以及处理完毕的输出,1batch批& d, r# k0 i( ~

8 L4 G- j9 B1 n! [3 Q- k, v8 f% o: t+ r, {" v: `# h7 s
         总的来说比较简单的demo,其实也可以做复杂一点,先手写然后STemwin存bmp图片,然后利用加权平均得到BMP颜色数据的灰度,输入到lenet,dedaojieguo。效果会比较酷炫。
9 s1 D% y& _7 }$ t4 Y3 l  o  F        这模型被压缩很厉害,能有这样的结果以及不错了,最后祝贺一下ST,半导体前15!  期待MP1,玩玩不用压缩的AI。- O5 I( I8 B$ L( m6 J- q
        附件:工程源码。1 R, q" W' d5 ^! }8 Z+ X

& |* t. s9 G  x8 s, K! C; d; D( ~/ p( f' g) s. \: ?1 N4 {8 i& [

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
0 K$ J1 |7 @4 q. t* X+ L. ^; j支持下

+ \; P8 |9 d" 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+ |' @4 K$ ?7 h* {8 N

所属标签

相似分享

官网相关资源

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