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

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

[复制链接]
lebment 发布时间:2019-5-17 23:14
  写的教程反响平平,可能是晦涩难懂,那就直接上代码(极度粗糙的demo)。1 x& q8 H- e' f4 i
  接上次的软硬件环境,我采用的STemwin(本来想用littlevgl)自带bmp显示(详细代码可参考某某莱教程)。先看看生成的一些代码。
" t; y; T% s" c
9 |) W+ @) i9 r- Y# W6 i                GUI_Init();+ s- |" t6 \$ f" ?/ h1 n
                GUI_SetBkColor(GUI_BLUE_98);
% V4 y) ~) O& t. P- s                GUI_Clear();
, m6 |9 `- l- h1 {       
2 O. F' }. m9 o; p                GUI_DispStringHCenterAt( GUI_GetVersionString() , GUI_GetScreenSizeX()/2, GUI_GetScreenSizeY()/2);" G; B. n  V( W- G6 U5 t
                SDRes=f_mount(&SDFatFS,(TCHAR*)SDPath,0);
/ p! P! M: H( ^                if(SDRes!=FR_OK)! B% g1 K1 i5 q
                {4 a) i7 Z) }- c% Z% [& Y# U
                Error_Handler();9 T% _5 n) `6 F6 g5 `8 K5 \
                }
4 q) {6 s% T2 s- m3 ^/ F  MX_X_CUBE_AI_Process();
* @  g8 ], C$ F* O: c  /* USER CODE END 2 */) C" H3 U+ X1 {9 B& ]  r
  /* Infinite loop */
6 B% g& A3 w  O9 P( Z" Q  /* USER CODE BEGIN WHILE */
+ R5 g* h) H6 b8 j( ]  while (1)/ L/ a1 j* L# A0 P  z- ~
  {
: v, Y% l! S- y, ~" Y1 h    /* USER CODE END WHILE */
" L  c7 `/ |; O, X4 s, L1 x                         GUI_Delay(10);
, r( u8 y) _# {7 Y+ q    /* USER CODE BEGIN 3 */
5 `& D6 f5 A  z& e/ s9 o- W8 Y% W  }
" J( N: y* z+ E1 D: U  ^  O7 N# w* z" _: I! \. K5 t: s
简单的主函数。
- x( x" U$ h4 H" [& J" `  c. L6 r) `$ l
) L3 E1 G$ J- Y7 D
  进入MX_X_CUBE_AI_Process();' ?  p) C4 V' }; h+ o" q
: p% Y( w4 d& R' j$ J

3 \2 w: K4 ^* g* k  D7 W    ai_buffer ai_input;
, R2 W, |+ w8 ?    ai_buffer ai_output;
7 D$ T* ^8 y0 _4 a- D    ai_i32 batch;
) y. U3 k) n2 ~  \# h    char str_tmp[16];. b8 K0 A) @# B4 L& X% _  ~
     for(uint8_t i=0; i<10; i++)
, }1 [3 ]5 u9 `( @            {
$ i$ }, P! H9 g% I& x7 i2 H" `                                                sprintf(str_tmp,"%1d.bmp",i);
' e( ?+ _$ l1 I* }5 d                                          _ShowBMPEx(str_tmp);
5 B: }* ~. G, _( O9 W- p1 P7 N2 ?                                                LCD_ShowBMP(str_tmp);% d( s8 h0 A, d
                                                for(uint16_t i=0; i<AI_LENET_IN_1_SIZE ; i++ )
1 K! R! E% E* t- m4 x                                                {; l4 R" W! N. K, Z
                                                                in_data[i] = *bmpBuffPtr++;# `) q+ t, U' g& W. d& k
                                                }5 N# l* B: {1 {2 C3 d
                                                ai_input.n_batches  = 1;
# W& ^7 x+ s$ R; F# e0 m* ^) c                                                ai_input.data = AI_HANDLE_PTR(in_data);$ k$ {" @: x( o, m, l
                                                ai_output.n_batches = 1;9 E( Y' A, S8 N* k0 D( }1 w
                                                ai_output.data = AI_HANDLE_PTR(out_data);, \9 A4 G8 g( }1 `* {" f
                                                batch = ai_lenet_run(handel, &ai_input, &ai_output); # ]% Q; k& D! ~  W' n
                                                if (batch != 1) & Y4 |1 d' \4 [6 F3 H2 ^% _  \; n
                                                {5 E8 _2 b% L9 D, E
                                                                err = ai_lenet_get_error(handel);) q' y0 W' E2 p" K/ S- Z+ r+ A
                                                                if( err.code )6 g, ~) L! a; F' w' g5 P9 E
                                                                {% @9 n4 f$ m! e. {/ J/ s
                                                                                while(1);
; Z7 w6 ^% h1 _: C                                                                }
8 U/ J2 {4 n8 n$ H1 p                                                }
0 A4 \: S2 f- c* {                                         uint8_t count=0;
0 T* t1 b: o6 N0 S# u8 v' a+ f                                         for(uint8_t i=0; i<AI_MNETWORK_OUT_1_SIZE; i++)% \" o/ [9 Y& Z9 J. \
                                                {
4 x" X( k/ h5 r* f' A- T4 |: c9 t                                                  if( out_data[i] >=0.9f)1 q! u4 E7 ~( a% v( q+ y
                                                                {
& r  S  ^1 t: A0 o                                                                         sprintf(str_tmp,"Num:%d",i);
- w2 O4 J- ?) c( ~. y1 p- D                                                                         GUI_SetFont(GUI_FONT_32B_ASCII);
! U* D) a7 H" K5 i                                                                  GUI_DispStringAt(str_tmp,200,0);
( H, U( K) H% r$ k5 X& d" L6 n                                                                         GUI_SetFont(GUI_FONT_16B_ASCII);5 E2 x* W: w" p- g; U! Z# [
                                                                         count++;# \& ?; U4 C! S  h% G( Q5 k
                                                                }
- U2 z& K! x; Z& Y2 O                                                }* q1 N5 P! m1 Y# w
      if(count!=1)9 V2 B; Z6 z! d4 s0 V+ L
                                                {& q- P0 S$ c' [' y$ Q% W
                                                        GUI_SetFont(GUI_FONT_32B_ASCII);  Q8 J3 N) Z5 r' U8 h1 o
                                                        GUI_DispStringAt("err",200,0);, z2 \5 u" A" h4 q
                                                        GUI_SetFont(GUI_FONT_16B_ASCII);
) V# ]- Y" P/ Q* l                                                }2 ]5 R7 l* Z$ f2 K# H6 I
                                                free(bmpBuffPtr);
0 P  B7 r' N: u8 L" B4 p% q9 M/ R                                                HAL_Delay(2000);
& q" u  G. p: a! a% `4 P% E4 z0 k7 E                                        }' I' D6 c: P+ s) `2 [

; E) H: T# g  q+ ~/ O* x( n% Y( h      熟悉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 型 何必不输出 所有的置信度。后面我将继续挖掘。7 q) y/ d9 p! T

+ d) H* E3 L7 q3 a       流程介绍完毕,下面说一说cubeAI的主要函数。: W0 K8 f* R. @2 l# t: j9 S/ }
       ai_lenet_create(&handel, NULL);! y" {. ?) Y% ?$ ~/ D
      ai_lenet_get_info(handel, &report);
- I" ~! G! o% T. u1 ^4 J          ai_network_params params = {9 h3 U: Y0 t7 Y, E  W
                                                          AI_LENET_DATA_WEIGHTS(ai_lenet_data_weights_get()),    //权重的获取& t2 u% ?8 p1 v+ Y
                                                        AI_LENET_DATA_ACTIVATIONS(activations)     // 激活函数( P; O( q) s  E* h8 M
                                                };. n& y. B8 Q" X! `
          ai_lenet_init(handel, &params);  //lenet的初始化,估计是申请内存什么的,写flash。
$ M) F5 s0 W' h: u, K/ z: V; [                                                                         err = ai_lenet_get_error(handel);( k9 H, c- s% X5 A  n" R5 L
6 N! T2 i  [& r( t4 x5 Y5 U
         batch = ai_lenet_run(handel, &ai_input, &ai_output); //图片输入以及处理完毕的输出,1batch批+ j, W) [# c( u- L- u

$ H3 W7 j6 v$ G  {* j+ X1 R; q0 K$ T1 t& U5 y3 h% I4 ~4 j
         总的来说比较简单的demo,其实也可以做复杂一点,先手写然后STemwin存bmp图片,然后利用加权平均得到BMP颜色数据的灰度,输入到lenet,dedaojieguo。效果会比较酷炫。0 R. [# l$ V/ Y3 Y
        这模型被压缩很厉害,能有这样的结果以及不错了,最后祝贺一下ST,半导体前15!  期待MP1,玩玩不用压缩的AI。( C0 ]. Z( }* q2 X$ G# I9 E
        附件:工程源码。
( ]& }/ s& C& a: X: n9 }9 y- R& C# ~7 `$ i- {7 U1 ^
. k/ u- S0 H5 O: `

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
$ [/ r/ B3 A5 a( a9 h支持下
5 p$ [  c/ `0 [- X2 t7 t$ @, c- B  r
谢谢支持
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
学习学习!+ p2 I4 e* U2 K" h) f3 h' W, s

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版