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

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

[复制链接]
lebment 发布时间:2019-5-17 23:14
  写的教程反响平平,可能是晦涩难懂,那就直接上代码(极度粗糙的demo)。# q+ M3 v& u3 z2 m; g& E
  接上次的软硬件环境,我采用的STemwin(本来想用littlevgl)自带bmp显示(详细代码可参考某某莱教程)。先看看生成的一些代码。2 S  O$ |. c; u& d
' `5 t( @4 t0 Q. r& R
                GUI_Init();$ p; _$ v  y  w. g9 {! G
                GUI_SetBkColor(GUI_BLUE_98);
5 N7 {8 N" A1 ?: B! L- t                GUI_Clear();
0 G: u1 \& F# c4 Z* E* Y3 @        5 Q6 _' N/ R5 F) o& m
                GUI_DispStringHCenterAt( GUI_GetVersionString() , GUI_GetScreenSizeX()/2, GUI_GetScreenSizeY()/2);% q/ ?8 L/ y& @  s5 k' M
                SDRes=f_mount(&SDFatFS,(TCHAR*)SDPath,0);5 Q* G4 y; e5 L- g. z; |& p. _
                if(SDRes!=FR_OK)
1 f# w, e, L& D+ R" K& m1 B1 j                {
( [; S4 M# {: I. t, Y% M3 a                Error_Handler();
& G% ^+ y+ f3 C+ ~. f7 I                }. Y& ]5 E6 K9 A5 b6 p
  MX_X_CUBE_AI_Process();) M8 b6 x* S8 c1 T- [4 e1 U/ U
  /* USER CODE END 2 */
$ E+ f1 z2 l+ |" Y( A  /* Infinite loop */: G/ x- N/ M6 I
  /* USER CODE BEGIN WHILE */
: u# A3 {1 H* Z; f7 c  while (1)5 b  x! X. `: G: ], r
  {+ G! H4 j! @/ z. R  Q9 O
    /* USER CODE END WHILE */
8 T( N/ H2 l1 ^4 h! \2 H3 ~# b                         GUI_Delay(10);2 H' j0 I: G# K  z
    /* USER CODE BEGIN 3 */
# I" Y6 {! B- z3 f: W: K- M  }
, K- g: h% o2 P3 a: L4 {  x* o7 j$ j  \! Q
简单的主函数。6 `* a+ j5 `% l  O% {

2 l& K" V/ H; o1 x5 d3 _* w
: c. }% m$ S, A9 m4 [: E: ?4 U4 {7 k  进入MX_X_CUBE_AI_Process();" A4 s2 z$ o) j3 F! h( ^. I
+ J- h* C+ F& }/ |0 Q# a. s

, a( I$ H# A& i/ B9 a; i2 j    ai_buffer ai_input;
" |1 Z7 x/ F* l1 m3 j0 r    ai_buffer ai_output;
9 s& H5 R% X8 K0 R, Y# a/ N    ai_i32 batch;: u  ^- Q+ |- |  b0 H- q6 C
    char str_tmp[16];8 U' E7 `" @( X6 G7 t" t! ^' d
     for(uint8_t i=0; i<10; i++)
- K4 b) k, T3 H7 B: u: {            {. F3 |. D6 Q" @2 |
                                                sprintf(str_tmp,"%1d.bmp",i);
0 w1 F" j1 u, Y7 W; }' f( h' m9 R2 h                                          _ShowBMPEx(str_tmp);& F& H6 k* a* S* B9 R/ H# \
                                                LCD_ShowBMP(str_tmp);
& c' o1 {, n  v4 p                                                for(uint16_t i=0; i<AI_LENET_IN_1_SIZE ; i++ ). N+ g% {" `4 [. b6 d% u
                                                {% q! H; Y7 s- X  Y2 L
                                                                in_data[i] = *bmpBuffPtr++;
9 c2 Q! c2 o' t1 S% r8 C                                                }
) X7 E# j1 t1 h0 F                                                ai_input.n_batches  = 1;/ t5 x+ F4 m6 Y0 o
                                                ai_input.data = AI_HANDLE_PTR(in_data);
+ D& V( `! F" P& y6 w                                                ai_output.n_batches = 1;+ p  T) K/ i, Q6 L6 G* {
                                                ai_output.data = AI_HANDLE_PTR(out_data);, e+ Y8 p; Y2 @: |% O5 \0 s
                                                batch = ai_lenet_run(handel, &ai_input, &ai_output); . [. k, M8 J' D9 }* ?
                                                if (batch != 1) ) O( o( z6 s3 L: q& N0 D3 N
                                                {' o5 ~- q( K# O& r, R
                                                                err = ai_lenet_get_error(handel);3 A, B; b2 j8 N& j1 T
                                                                if( err.code )6 F/ {, J4 \) n* k( z
                                                                {
7 [2 L' e( u6 Z, W4 ~                                                                                while(1);9 y) `' m' J: ?
                                                                }
6 ~) m4 t5 H/ M3 h/ \& v  L/ S                                                }7 J: o! L* H9 H( u4 @) \& v
                                         uint8_t count=0;# R5 t  B2 g5 D( L  t+ @, x2 Y( W
                                         for(uint8_t i=0; i<AI_MNETWORK_OUT_1_SIZE; i++)
) T' e/ E$ [1 S5 [6 K                                                {
7 \! h  `$ n1 H5 W: R: N                                                  if( out_data[i] >=0.9f)
; |. \2 b! ~6 b4 ?6 P- A/ ^# b                                                                {
  _' H- L# A$ u, I3 a                                                                         sprintf(str_tmp,"Num:%d",i);
0 X/ {$ Y3 r' T& }& `3 {                                                                         GUI_SetFont(GUI_FONT_32B_ASCII);
9 h. N$ Q# ?' v/ r& H9 Q, }/ A                                                                  GUI_DispStringAt(str_tmp,200,0);9 M0 k! |9 F  u
                                                                         GUI_SetFont(GUI_FONT_16B_ASCII);
! p. v$ E; z7 z. A                                                                         count++;
2 H, N8 T# _+ T% [' `                                                                }* B" N0 c+ L8 p5 H( n
                                                }% |, y* m' n$ i+ u
      if(count!=1)+ d! m2 \; q. K4 W3 W
                                                {
. H# R& R" Z6 @9 L                                                        GUI_SetFont(GUI_FONT_32B_ASCII);
7 C! W, e$ `  a4 Q" l                                                        GUI_DispStringAt("err",200,0);
: f  I9 j$ [" L$ J4 R" M                                                        GUI_SetFont(GUI_FONT_16B_ASCII);
) R( {: s5 @2 I1 _' E/ g                                                }
* [* }' j7 ?( T2 m% b                                                free(bmpBuffPtr);
( d1 k2 ^9 d0 [  C                                                HAL_Delay(2000);
1 w7 y7 j; d, u                                        }5 Y* B2 x# C. o, b& H* C+ W: n
0 ~  y1 W7 c* C& f
      熟悉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 c3 m/ F6 a8 T
3 x- m0 u- g$ B0 `: L. W* d       流程介绍完毕,下面说一说cubeAI的主要函数。
7 j% P- h+ M6 f7 F9 J! I       ai_lenet_create(&handel, NULL);7 u7 M' y7 ]* z3 E3 o
      ai_lenet_get_info(handel, &report);1 x( V% r7 b! ]( X( M# L
          ai_network_params params = {
5 m: x3 P+ g/ H9 n  Z0 I                                                          AI_LENET_DATA_WEIGHTS(ai_lenet_data_weights_get()),    //权重的获取
0 j1 e2 Q% N, B( X4 F                                                        AI_LENET_DATA_ACTIVATIONS(activations)     // 激活函数
3 Y$ ~, m) g9 @; c                                                };
+ G) u- |" ]5 o0 h* {. w          ai_lenet_init(handel, &params);  //lenet的初始化,估计是申请内存什么的,写flash。# ^) z! O6 I0 t* P
                                                                         err = ai_lenet_get_error(handel);
+ e6 X2 o$ p5 |8 N, U; O
1 H* Z- y; ~' x         batch = ai_lenet_run(handel, &ai_input, &ai_output); //图片输入以及处理完毕的输出,1batch批2 H. V1 y: C* f9 ~1 X& H0 v
/ M  e% \& R/ {) R" H

7 ?$ ]7 H7 c: v% P+ X) ^# u- p' d         总的来说比较简单的demo,其实也可以做复杂一点,先手写然后STemwin存bmp图片,然后利用加权平均得到BMP颜色数据的灰度,输入到lenet,dedaojieguo。效果会比较酷炫。, [0 K; ]) r1 f- T! S
        这模型被压缩很厉害,能有这样的结果以及不错了,最后祝贺一下ST,半导体前15!  期待MP1,玩玩不用压缩的AI。  |% ~( A- R8 i! K
        附件:工程源码。3 w) C( D, J+ M. p* T. S8 L
) M' a+ n  N- K5 }) }
( G0 y! n5 J! n. z( N4 H( b

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
  w( B4 b2 Q4 t8 z支持下

0 _0 z! V: t2 m# L- {5 H# w+ f& K谢谢支持
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
学习学习!
" r8 J  o% ~2 {1 W- i8 }

所属标签

相似技术帖

官网相关资源

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