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

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

[复制链接]
lebment 发布时间:2019-5-17 23:14
  写的教程反响平平,可能是晦涩难懂,那就直接上代码(极度粗糙的demo)。
& O9 D4 u* s2 I2 B, t  接上次的软硬件环境,我采用的STemwin(本来想用littlevgl)自带bmp显示(详细代码可参考某某莱教程)。先看看生成的一些代码。4 ^* k' N# ^) |+ |( a4 A" ^
. a# j) W1 k* ^
                GUI_Init();6 V! P* R' E5 L* f8 i* K
                GUI_SetBkColor(GUI_BLUE_98);' [: {5 C. b; `
                GUI_Clear();5 x" g0 W: z, r2 q0 J, j3 ^% Y
        / u, U- \' D" i3 F6 \, _, Z1 |
                GUI_DispStringHCenterAt( GUI_GetVersionString() , GUI_GetScreenSizeX()/2, GUI_GetScreenSizeY()/2);8 N" G) B: Z6 y
                SDRes=f_mount(&SDFatFS,(TCHAR*)SDPath,0);
- }% F2 c) J$ n8 A8 ?) |                if(SDRes!=FR_OK)' Y+ \. o! [. K- \* r$ e
                {
4 [, K1 u2 c7 K' N: t  f( G                Error_Handler();
" J  k" z- J" r' O" M$ M                }8 M' w  |$ _" S! N9 [
  MX_X_CUBE_AI_Process();$ G5 R4 U" l; i. K0 t6 K0 |" @
  /* USER CODE END 2 */
" [9 Z, {0 L. V8 L  /* Infinite loop */
: e/ p  c# j2 i5 E) z* t  /* USER CODE BEGIN WHILE */+ z1 Z) w6 @6 |/ j, r" x/ ?5 m! @
  while (1)9 v/ I% L5 Q9 M8 k
  {
/ e' l: h2 l- _; B& m( O0 M    /* USER CODE END WHILE */! i+ H+ J- K: u9 h: g9 }
                         GUI_Delay(10);( q5 Y7 S+ R" R! X! k) M& b
    /* USER CODE BEGIN 3 */
/ U& B3 P6 f6 U0 T/ e* ]0 }9 Z8 O  }* `4 \; ]" p3 }8 O
( i' \$ T( y1 F- R$ S9 |( M
简单的主函数。
+ e$ N$ z% [# j5 x: |$ g, N2 c/ x+ p) B9 `

# G7 \1 p. F4 o$ ^6 m9 ~* r  进入MX_X_CUBE_AI_Process();3 y4 w  _  u8 m) R* r, i: L& U
9 w# X0 v" i* O

; E$ {4 C5 l3 `9 l4 Z3 H. }    ai_buffer ai_input;2 R. H! A& \5 N: t7 Y
    ai_buffer ai_output;
( p1 z% Y3 P" n; S  O  p    ai_i32 batch;% G0 V/ I3 G$ A& N) n5 |1 y
    char str_tmp[16];
, `1 ?! J5 H6 l0 B     for(uint8_t i=0; i<10; i++)( P( z$ R2 t9 I5 X  ^% `1 R; K
            {
9 J( R; Q! \. r/ F                                                sprintf(str_tmp,"%1d.bmp",i);
; l5 V( i+ c' Q) T( v( P                                          _ShowBMPEx(str_tmp);$ T* z3 C( K( A$ D4 \% x
                                                LCD_ShowBMP(str_tmp);+ c! _& c4 V2 ^" r' g
                                                for(uint16_t i=0; i<AI_LENET_IN_1_SIZE ; i++ )6 |# c- @5 G. ?
                                                {( _; c# h5 N% H! F7 P5 w
                                                                in_data[i] = *bmpBuffPtr++;
& N+ n3 V/ _- v8 P# m' \2 Z                                                }
/ d; E: `& q% {  {8 a. a8 s, ^                                                ai_input.n_batches  = 1;
- ^2 k/ j8 L. S; d, i( w6 y                                                ai_input.data = AI_HANDLE_PTR(in_data);$ t, \# N( J# U! Y' d! G. |
                                                ai_output.n_batches = 1;
' k6 S6 x9 N* z+ ]7 D6 x                                                ai_output.data = AI_HANDLE_PTR(out_data);  f, o6 r4 u% ^# V' P% X- C3 s; {
                                                batch = ai_lenet_run(handel, &ai_input, &ai_output);
7 ]8 f% F0 O5 L' h, R                                                if (batch != 1) + r! U& e0 L* b
                                                {
) ?# _( w2 e% J                                                                err = ai_lenet_get_error(handel);# m9 G% o6 s; c  Z! S8 x
                                                                if( err.code )
  }0 X* {! m2 y( `3 t                                                                {
' c$ z, I. m- _  J! ~                                                                                while(1);
$ Y* L! d  V$ a7 Z0 R) f                                                                }
( a: A- G8 {' t) |                                                }
0 a( }* s" h# a/ Y5 b                                         uint8_t count=0;0 v$ P( X4 }. V! a
                                         for(uint8_t i=0; i<AI_MNETWORK_OUT_1_SIZE; i++)
1 k* b/ ]: G$ q- e                                                {! f& l0 b: P9 S
                                                  if( out_data[i] >=0.9f)
, z1 z4 `" m$ G7 d' A8 N1 k$ q# m                                                                {
1 e6 C1 g4 |% @* P3 G% N% Y                                                                         sprintf(str_tmp,"Num:%d",i);" D7 [  q% o0 i5 j6 d" C; C  h! _
                                                                         GUI_SetFont(GUI_FONT_32B_ASCII);0 u& |7 e3 d! V1 D" d9 ^
                                                                  GUI_DispStringAt(str_tmp,200,0);
9 H  o; |# {5 c* V9 w1 W                                                                         GUI_SetFont(GUI_FONT_16B_ASCII);
& ^8 E2 Y: ^; e+ S6 z                                                                         count++;
$ ?9 E1 l# S3 b  T8 ?& m% w                                                                }1 f! ?/ a  B+ Q& P7 \$ R; a# j8 G
                                                }
4 N5 n# F2 |5 i+ E# C! b) S      if(count!=1)8 B- U, {8 S0 c3 U, v' P/ }
                                                {+ ~% s0 c: c8 w* F
                                                        GUI_SetFont(GUI_FONT_32B_ASCII);+ q- i" ^. d, f) m% J
                                                        GUI_DispStringAt("err",200,0);
5 N/ _% `% N/ d  s, i1 H  {                                                        GUI_SetFont(GUI_FONT_16B_ASCII);. o5 Z& ^4 \) G& D
                                                }
2 }. k; M% ?0 }2 c                                                free(bmpBuffPtr);
% d* ~/ {6 u. Q: O; J, o                                                HAL_Delay(2000);
' Y" O8 T8 g0 g( \5 u- M% C                                        }$ X$ H) X' J% ~7 N4 e5 @

- M( f: K1 n/ ^      熟悉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 型 何必不输出 所有的置信度。后面我将继续挖掘。+ c; Y. Y& K1 Z4 d! d
5 f8 \0 O9 F# w7 [' _
       流程介绍完毕,下面说一说cubeAI的主要函数。! P1 |& z0 N' @- S
       ai_lenet_create(&handel, NULL);$ M* w2 Y% S6 A8 z* Q* f  h
      ai_lenet_get_info(handel, &report);
/ i' r  L( X  S* t# f1 q) W          ai_network_params params = {9 t" q* \4 v- g8 b# V; d. U7 {6 |
                                                          AI_LENET_DATA_WEIGHTS(ai_lenet_data_weights_get()),    //权重的获取2 h( m  @: w3 t7 A+ V( g
                                                        AI_LENET_DATA_ACTIVATIONS(activations)     // 激活函数
) k4 ]# c" r% p7 ^, o                                                };
; T1 [3 f3 E4 {+ ]0 t          ai_lenet_init(handel, &params);  //lenet的初始化,估计是申请内存什么的,写flash。( R% q- E* E, U
                                                                         err = ai_lenet_get_error(handel);
  m7 n) J( A, Y7 ~& H. p, H2 W
6 ]2 L  }1 v$ [8 i         batch = ai_lenet_run(handel, &ai_input, &ai_output); //图片输入以及处理完毕的输出,1batch批
0 ^" ]% v7 d" y( ~4 L8 n. N% t. }+ |6 W' _# H6 a5 S( c% z! E

6 L6 T! R: ?* {7 n: R8 z         总的来说比较简单的demo,其实也可以做复杂一点,先手写然后STemwin存bmp图片,然后利用加权平均得到BMP颜色数据的灰度,输入到lenet,dedaojieguo。效果会比较酷炫。
7 ?) \. Z7 ?8 d, I        这模型被压缩很厉害,能有这样的结果以及不错了,最后祝贺一下ST,半导体前15!  期待MP1,玩玩不用压缩的AI。5 V8 u! G: z6 _! i, N& i
        附件:工程源码。+ c* q+ F) g2 ]9 \, t, G+ R+ j: x

9 c- T2 k1 ]3 \% ~7 N+ U7 {
3 ?3 g8 J# t/ s$ t. N0 ?; {( r

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
  V6 U7 Z# I% s; x8 W  R/ k支持下
  ?+ [& K8 Z" M( @, Q! f( b
谢谢支持
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
学习学习!- ?2 z6 j# ~0 d, {. B7 a# p- _

所属标签

相似分享

官网相关资源

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