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

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

[复制链接]
lebment 发布时间:2019-5-17 23:14
  写的教程反响平平,可能是晦涩难懂,那就直接上代码(极度粗糙的demo)。+ z2 J/ _$ u) D' @
  接上次的软硬件环境,我采用的STemwin(本来想用littlevgl)自带bmp显示(详细代码可参考某某莱教程)。先看看生成的一些代码。- S7 d7 X) U; y8 B
: A) g& e! q, K5 Z2 I
                GUI_Init();+ q3 i- q. k% B% C  a4 A& e- R
                GUI_SetBkColor(GUI_BLUE_98);
+ N( W* m$ w- C+ W8 X7 N& C" ~                GUI_Clear();2 k6 c5 d/ w; f; B. }
        : F2 P& \2 E! s5 J; b
                GUI_DispStringHCenterAt( GUI_GetVersionString() , GUI_GetScreenSizeX()/2, GUI_GetScreenSizeY()/2);
9 W( R% K' ?6 c( F                SDRes=f_mount(&SDFatFS,(TCHAR*)SDPath,0);  D, n* R+ [* z% I
                if(SDRes!=FR_OK)# d! Z1 I# c8 p) Z% a- N( M9 M
                {/ F% B$ `9 A/ S% _9 l
                Error_Handler();
1 P0 W1 F4 u8 q% H: h. p5 ~8 U                }2 k* b! Q: w7 F1 H2 R' z1 q7 z1 k
  MX_X_CUBE_AI_Process();  [; s- _; o& W  |1 w( ]
  /* USER CODE END 2 */7 V% ^- o! O1 |" P5 i  \# G- h
  /* Infinite loop */0 J) U( k$ O% x3 Y" y
  /* USER CODE BEGIN WHILE */$ l5 Q9 [, ]2 w4 m* T  i7 t' B
  while (1)8 X/ s" {9 e7 P, `( k* ~8 o! H& g3 \& H- U
  {
7 Q% f) E1 e* j( G" f    /* USER CODE END WHILE */4 K- }# H1 A2 {! r5 D4 ^
                         GUI_Delay(10);' P7 k4 T* v5 b. X  b1 ~, p1 `8 l
    /* USER CODE BEGIN 3 */
% y2 V& e) v; }; D  }
3 \7 N( Q+ o9 T$ o5 J) k- E; w1 R; {/ m; D) {3 u  ^
简单的主函数。
0 o1 x. A/ i) w5 K# e2 n
: D" H; U3 {  G# B* g$ x8 j% U3 j2 d
  进入MX_X_CUBE_AI_Process();
) I& K3 }9 A+ U# W* \( q( G8 f) B' z3 B. f* S+ Y: D
' E4 N' h! ?" N$ e( ~' L
    ai_buffer ai_input;
! X$ x% L' X, \0 g    ai_buffer ai_output;
2 k5 e; _# y# T% g    ai_i32 batch;/ J% E$ U) n3 d$ v0 E! l+ j
    char str_tmp[16];# R3 r4 ~( j$ z, M% Y0 X
     for(uint8_t i=0; i<10; i++)
  |$ p4 ^: m2 E' f            {) ~3 c0 G+ z5 M3 M
                                                sprintf(str_tmp,"%1d.bmp",i);6 o% O) K6 o" k/ M! I! D
                                          _ShowBMPEx(str_tmp);
5 ]/ N4 D2 ?# f2 I/ E! M                                                LCD_ShowBMP(str_tmp);! K$ [; r( b* Q9 R. d
                                                for(uint16_t i=0; i<AI_LENET_IN_1_SIZE ; i++ )
$ ~( a& ]9 w6 x* y+ j% a8 N                                                {8 A/ A, t( V9 B! F8 f( @
                                                                in_data[i] = *bmpBuffPtr++;
  l2 p' s: f& k9 T8 u8 M6 W" U4 ~                                                }) f" O1 L( [4 x1 m8 F
                                                ai_input.n_batches  = 1;/ a1 z. h2 j! q4 Y2 v9 J# i3 l
                                                ai_input.data = AI_HANDLE_PTR(in_data);* R# B; t5 C9 @
                                                ai_output.n_batches = 1;
- h2 K: T& _: Y                                                ai_output.data = AI_HANDLE_PTR(out_data);( K; |4 X3 r  O
                                                batch = ai_lenet_run(handel, &ai_input, &ai_output);
+ u" I  z0 k0 s1 b! V2 F' l" _. h                                                if (batch != 1) 1 r) C; f" Z* o# o7 m
                                                {  P* Y% |: Q' e% D
                                                                err = ai_lenet_get_error(handel);& e( z; L6 w9 N! C8 A: M5 c
                                                                if( err.code )
; k; i* ]. C# s6 K  u5 ?( Z                                                                {& H' z! i. a1 x: j
                                                                                while(1);% k0 W0 f  o* Q7 F; U
                                                                }
% o" [; M3 y" a- @) l) c, p3 M, }                                                }
4 _7 R; M) N! Y+ j& f                                         uint8_t count=0;
% D! ^# E* r1 V' F2 K0 C                                         for(uint8_t i=0; i<AI_MNETWORK_OUT_1_SIZE; i++)8 A. w5 G4 B/ g
                                                {' j1 j5 z% N1 b  o: w  c
                                                  if( out_data[i] >=0.9f)
- b5 X5 S9 u0 `! Z                                                                {
4 @6 m* a3 F' u/ E) D: ?" x                                                                         sprintf(str_tmp,"Num:%d",i);- R( }' ]1 A  X8 \( l8 w" o1 w
                                                                         GUI_SetFont(GUI_FONT_32B_ASCII);
" F4 m& g5 ]" c: t                                                                  GUI_DispStringAt(str_tmp,200,0);
3 ?+ A* O/ o! }7 H& O# P                                                                         GUI_SetFont(GUI_FONT_16B_ASCII);- L6 ~3 N6 H/ V
                                                                         count++;3 o1 T6 m5 r, j9 i5 q$ i
                                                                }
2 I& Z' b8 [& y8 P( C2 ^                                                }) t- O* O& h, E/ ^! K1 a/ N
      if(count!=1)
, G5 I: O, q$ \. k, \0 o* p                                                {
% R( ^2 o6 M1 b& _7 `                                                        GUI_SetFont(GUI_FONT_32B_ASCII);+ r/ r, x0 k! r! J) s
                                                        GUI_DispStringAt("err",200,0);( ^0 P% `( H1 f. m8 z, D$ I) E
                                                        GUI_SetFont(GUI_FONT_16B_ASCII);: d1 t$ G! D5 x9 w
                                                }3 I" \, b( N, {& s( E; ?* q
                                                free(bmpBuffPtr);
+ ?4 H- e" B8 N" W1 R- M                                                HAL_Delay(2000);2 w  v$ s+ X8 m  S2 e: D3 N
                                        }
- [$ \9 O9 q4 n% P( ?+ l, w, V
4 J3 O8 Y) J" k! k, 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 型 何必不输出 所有的置信度。后面我将继续挖掘。/ }3 g0 r* {, |! e9 \6 W
# ^- v, n& ?6 G- _7 B
       流程介绍完毕,下面说一说cubeAI的主要函数。
/ o3 S% d. Z( s8 K. I: @       ai_lenet_create(&handel, NULL);
* ]$ G* L$ L* [* C. u      ai_lenet_get_info(handel, &report);
" B1 i0 S( O. y1 v& W          ai_network_params params = {# |. F& |- n1 ^& U$ H$ O
                                                          AI_LENET_DATA_WEIGHTS(ai_lenet_data_weights_get()),    //权重的获取' }% P# L: P! v+ ]; p
                                                        AI_LENET_DATA_ACTIVATIONS(activations)     // 激活函数" Z6 u) o1 f) ~
                                                };. }7 l4 l( i% @/ r, K
          ai_lenet_init(handel, &params);  //lenet的初始化,估计是申请内存什么的,写flash。
$ o; z( [9 v) R5 M: Z( K/ q                                                                         err = ai_lenet_get_error(handel);5 f: b' _* c! H( \( A5 L0 r

/ J3 e0 N2 Z0 C" n% V! L" w) u$ @         batch = ai_lenet_run(handel, &ai_input, &ai_output); //图片输入以及处理完毕的输出,1batch批
4 A3 K8 P3 y0 b8 X0 g2 G0 B. G# o% M9 G; \$ Y& N
% L# l( Z& E9 E1 p$ r6 C$ v
         总的来说比较简单的demo,其实也可以做复杂一点,先手写然后STemwin存bmp图片,然后利用加权平均得到BMP颜色数据的灰度,输入到lenet,dedaojieguo。效果会比较酷炫。! p. I8 [7 P# N$ B
        这模型被压缩很厉害,能有这样的结果以及不错了,最后祝贺一下ST,半导体前15!  期待MP1,玩玩不用压缩的AI。9 {3 g: H4 e1 i6 u
        附件:工程源码。- ?' L6 z3 x- Q  r& ?+ Q
3 N9 F9 j! h2 D, C% g) {3 l* }2 X

, @8 K' L& w* _- V) m

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
3 ]2 U2 G, Y6 h# A3 q& w) j1 y- [支持下

/ K* X/ ]- T0 Q7 a谢谢支持
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- n. m" m7 l! C% ^: L, M6 q  T
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版