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

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

[复制链接]
lebment 发布时间:2019-5-17 23:14
  写的教程反响平平,可能是晦涩难懂,那就直接上代码(极度粗糙的demo)。1 X1 M1 @  D3 }
  接上次的软硬件环境,我采用的STemwin(本来想用littlevgl)自带bmp显示(详细代码可参考某某莱教程)。先看看生成的一些代码。
- h- C6 n/ D$ p" o/ u$ I5 ~# _3 l$ c* j1 g* M" s7 {
                GUI_Init();
& w  {: h  m, |- Z                GUI_SetBkColor(GUI_BLUE_98);
& W8 ]- z0 _0 r4 L5 _                GUI_Clear();
: [8 B* ]$ U* J, f$ i: x        ) n% w& A8 D; b. v( D5 Y0 C, ?
                GUI_DispStringHCenterAt( GUI_GetVersionString() , GUI_GetScreenSizeX()/2, GUI_GetScreenSizeY()/2);; q$ ^- A8 a. w+ S
                SDRes=f_mount(&SDFatFS,(TCHAR*)SDPath,0);
) m0 J& v' E7 P+ u                if(SDRes!=FR_OK)! c3 j  O! X4 b( n& _1 _2 C8 b
                {6 x4 ]+ ^$ ^# k' P& R! ]! ?
                Error_Handler();
; q9 g. q; E! c$ [                }
# g0 r6 u0 L8 L9 R  MX_X_CUBE_AI_Process();
- z& R0 M4 O6 T& [4 y9 p; L: V  /* USER CODE END 2 */
. r: E( r* A6 s9 z  /* Infinite loop */6 ^& A& }: N: i; ~+ Q
  /* USER CODE BEGIN WHILE */
$ A" w/ ]! G& \7 q7 d2 s  while (1)
! {$ s, _+ N5 B  {' {# b( [6 h/ f3 |$ l
    /* USER CODE END WHILE */
, |2 K5 e- N; v/ k1 n2 y/ U* L3 G                         GUI_Delay(10);4 t# W: O2 u0 j$ d$ `4 y* B
    /* USER CODE BEGIN 3 */) F) f0 o1 e+ x- L- L# l) c( Y
  }
) G* t- H* E2 K
* i4 y+ k* x9 N% r简单的主函数。; U" b7 n* i7 ^0 A) l- d" I" v$ W9 M

0 N# K5 Q6 u. Q8 `) y
7 K  F: U1 A- E- T7 M3 N2 `  进入MX_X_CUBE_AI_Process();
2 |6 i3 P4 _4 `* O% \6 `
$ S" Z* c2 x2 s2 c; c0 M, V' l4 ?( @2 `$ M! S0 Y, `5 X
    ai_buffer ai_input;) r. r# m9 O' \. x
    ai_buffer ai_output;" ?1 g! L8 o- c$ [+ M
    ai_i32 batch;
9 g( R  y* [0 B1 ^% I6 p+ m    char str_tmp[16];
7 F# }- A! I! S/ O. w     for(uint8_t i=0; i<10; i++)" M  R0 _, ]. @5 q7 j1 I$ M' f
            {# N, y2 J' t; X) Q. C+ n
                                                sprintf(str_tmp,"%1d.bmp",i);7 _3 {; S" N3 \- O  n+ q+ |1 z, n$ V# `: q
                                          _ShowBMPEx(str_tmp);
: S; w3 l- P8 N' s0 b' D                                                LCD_ShowBMP(str_tmp);
8 ?- R: d' W$ a4 |3 W                                                for(uint16_t i=0; i<AI_LENET_IN_1_SIZE ; i++ )
2 k5 S6 H! g. w" L- d+ S4 |3 }                                                {5 H; y$ b; S5 W2 s+ u
                                                                in_data[i] = *bmpBuffPtr++;
; B: E: M7 l$ k. U1 w+ N3 x  L                                                }1 v7 a$ ]3 `( w
                                                ai_input.n_batches  = 1;  o+ G1 E8 U  n5 e$ e
                                                ai_input.data = AI_HANDLE_PTR(in_data);' P% {4 _; N' K5 J7 }
                                                ai_output.n_batches = 1;
& q% i3 a8 V$ Q$ b6 S/ A. @9 k  o                                                ai_output.data = AI_HANDLE_PTR(out_data);
; ]# ~, K$ h8 f; e5 X, M5 J# Z                                                batch = ai_lenet_run(handel, &ai_input, &ai_output); 6 @& P: z- m. J, R+ c
                                                if (batch != 1)
% E4 [4 b9 L2 b* F9 p2 J3 K                                                {+ [, |( M; e; B* |+ \3 {" ~
                                                                err = ai_lenet_get_error(handel);# K8 Q  K" W1 _# N
                                                                if( err.code )
- z5 v# ~, V2 f. l: P                                                                {
, k8 B2 S) e# M$ H' J                                                                                while(1);
7 J7 s! t/ t9 D$ O. y! n                                                                }
$ m% t! D! I1 C& e. q                                                }
8 M8 o; d: `9 [0 O) J' ~4 K* q                                         uint8_t count=0;% f6 h  I* {1 s5 E% ]
                                         for(uint8_t i=0; i<AI_MNETWORK_OUT_1_SIZE; i++)$ @. I/ x: r8 z3 H
                                                {$ u" ], d% G; ^% @% V
                                                  if( out_data[i] >=0.9f)1 L  p+ {3 Y3 `- ]% D
                                                                {3 }6 ?5 h" k4 P5 A
                                                                         sprintf(str_tmp,"Num:%d",i);5 c. Z. {; Z$ u' \
                                                                         GUI_SetFont(GUI_FONT_32B_ASCII);  {, }. q; ?5 O0 r5 ~9 V
                                                                  GUI_DispStringAt(str_tmp,200,0);! F% ?2 q3 N$ w9 n
                                                                         GUI_SetFont(GUI_FONT_16B_ASCII);* Z2 F2 B) @8 j& |6 \+ \4 Y
                                                                         count++;$ l# u. @2 g. K% T% K
                                                                }3 f( j& e8 H" A. s, A$ u# s' x
                                                }
# Q3 Y, P$ u# `$ s5 i      if(count!=1)/ F8 }! b  r* K8 y+ {2 `
                                                {
  v  M% k8 k  y, a- C0 O$ K% I                                                        GUI_SetFont(GUI_FONT_32B_ASCII);& ^6 u" H7 ?6 d2 f
                                                        GUI_DispStringAt("err",200,0);
9 I& z% X: x5 Y0 F: K+ R) `                                                        GUI_SetFont(GUI_FONT_16B_ASCII);
# E2 h9 W6 d- f! S4 q+ z                                                }# A, F7 }) G& k/ P
                                                free(bmpBuffPtr);
8 U+ c" s$ T2 M0 l4 u' E7 n                                                HAL_Delay(2000);
  ?& j; e0 f( n8 G& W- m& ]                                        }
5 g7 g* a/ g# {9 L; @1 s, v% q
% h/ O1 z9 z+ ~" P      熟悉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 |" W: Z8 A8 O) }# ^

, @3 d8 J  w- n/ Y& e" \5 C       流程介绍完毕,下面说一说cubeAI的主要函数。
5 K+ F5 w' B, c/ I8 X       ai_lenet_create(&handel, NULL);+ ]3 [5 x6 {& W/ Q. ]) }9 ]. X/ C
      ai_lenet_get_info(handel, &report);
- X" F% R% T) ]          ai_network_params params = {
2 q1 {/ V7 ^; K) n+ A                                                          AI_LENET_DATA_WEIGHTS(ai_lenet_data_weights_get()),    //权重的获取6 Y5 X" A9 }0 c
                                                        AI_LENET_DATA_ACTIVATIONS(activations)     // 激活函数9 B* z; S/ r8 N0 }. I7 g' n9 m( r
                                                };  v# _: M! j& e0 \! M
          ai_lenet_init(handel, &params);  //lenet的初始化,估计是申请内存什么的,写flash。
- ^5 t6 E+ K  H1 q, k                                                                         err = ai_lenet_get_error(handel);  {3 L, E% u$ N: A8 n. d
* t1 G" ?  p9 h# V
         batch = ai_lenet_run(handel, &ai_input, &ai_output); //图片输入以及处理完毕的输出,1batch批5 x5 r+ i# [5 A: N7 [2 A) H

( [7 O3 T7 o' D3 K: z4 o* p* U, x( V6 _3 H& h. V4 W" ?+ R$ H1 [6 [
         总的来说比较简单的demo,其实也可以做复杂一点,先手写然后STemwin存bmp图片,然后利用加权平均得到BMP颜色数据的灰度,输入到lenet,dedaojieguo。效果会比较酷炫。3 G/ F+ S; ]& p$ Z9 b
        这模型被压缩很厉害,能有这样的结果以及不错了,最后祝贺一下ST,半导体前15!  期待MP1,玩玩不用压缩的AI。  {* T2 V. I9 r0 m8 O: D
        附件:工程源码。3 y) \9 O' l/ Y, K

6 z( J; B* u/ _* B( _% \, r1 F. j4 C9 _: ~1 u9 ^

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
& d9 x7 j8 o0 d& `4 f, M支持下

2 B0 y3 D/ U' f* m谢谢支持
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
学习学习!# e" Z- z+ |+ T% k. J
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版