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

【Wio Lite AI视觉开发套件】+cube.ai与食物识别

[复制链接]
奇迹 发布时间:2022-10-31 11:43
在经历完各种准备工作后,现在终于来到了正主。直接部署Tensorflow Lite Micro那一套玩意确实没啥问题,但是太麻烦,要添加一大堆文件,还得用它家训练生成模型,然后转换,麻烦的很,在ST平台,怎么能不提到用ST自家工具去部署模型,方便快捷,简单实用。
& ]) i( A8 ]2 x( u( M9 v$ V拿出之前准备的工程,选取ai开发需要支持的软件包cue-ai,在software packs点select components
/ r( r) X7 U; {" x+ w- f 微信截图_20221029165303.png
% v3 R9 Q3 z3 i1 ], G
4 x! t& M; Y% t3 P8 }
# O/ [4 h" h. f$ ^7 X
; E1 l7 z% J/ B; G0 p6 b* Q
在X-CUBE-AI行下core勾选,点OK完成% m* N% y( P1 w1 p0 j( {% x
微信截图_20221029165346.png
  @4 H# s0 U# v/ Z# f9 m) A6 m, k; z
. B( {0 S  w' A. C7 n9 m& r+ q
回到引脚配置页面,最下方就是上面导入的CUBE-AI工具包
* E9 M& ~# ~6 a' g1 K% T( _ 微信截图_20221029171555.png
9 L  D" Y( c5 q, f& n3 C, u; w  _; V8 b

3 x% S4 _: r4 W0 Q& i! X
* X$ d3 R* _9 g8 U# r9 V
点击+添加,这里要根据自己使用的模型,以及模型特点选择,如下图选择的是原始模型
/ t* M; A0 P) w 微信截图_20221029171744.png : n2 g: l9 w. B! C) e# P' G1 b
# v7 ~: E# I7 g& T" \. N7 Q
这里选择的是量化后的模型(量化可以减少模型的要求,但是精度会下降),点击分析
. P6 y3 q$ l4 l 微信截图_20221029172202.png
* J8 A. Y* g, z. P8 ?8 [
8 X* l# w. r, {' U4 l+ y7 i' j: M. [分析中( u* ]! _1 f- R
微信截图_20221029171816.png 3 C" J0 u8 P0 S6 F! K

( Z5 k1 S$ _  u/ C4 T分析完成会显示是否可以部署到设备上,以及资源使用情况。
4 o% e1 e3 U8 e9 u! ?$ m 微信截图_20221029172246.png
  Q1 M5 Q& j5 e, k! [4 T  r$ P' T, R# x7 R& Q
回到工程,有个小bug(使用的STM32CubeMX版本为6.6.1,X-CUBE-AI版本为7.2.0),下图的几个文件路径老是生成错

# B& A( c; D* P+ V; F; ^
8 V# ^3 k6 c% T8 S
' X. L0 ^# X2 _
QQ截图20221031110850.png
- Y0 h, N1 Z% ]. a9 o* O; U
: [7 G* f( e) e9 O右键文件打开设置,修改一下路径就行
8 L' Y0 {; A( r& j* T- f) j

& ~' j9 O( h; I& W7 ~5 d QQ截图20221031110911.png 4 X  e8 K6 M! o
) h7 N# i; z; C; ^
头文件路径也有一样的问题, V* y  s7 S) I" b
QQ截图20221031111258.png - e* _# I, J8 e) N: @) g. b! W

# p9 C6 e: u8 `% @  ^- U初始化模型
  1. ai_handle ai_init(void)
    1 Q2 }9 ?) o3 o  N  l: @& F* ~: Q
  2. {; q: s$ a2 K0 ^# a3 m1 F  N2 y( ]
  3.   network_handle = AI_HANDLE_NULL;
    . o" P8 E; T+ S* `8 Q

  4. % T- `, z+ A, l
  5.   /* Creating the network */4 B3 D/ i* h1 m4 U% X4 A$ A5 ]* L+ V
  6.   ai_network_create(&network_handle, AI_NETWORK_DATA_CONFIG);
    ) v( X( z5 |) i) }. v& N
  7. 0 L5 _; K, Y+ J+ p
  8.   /* Initialize param structure for the activation and weight buffers */
    % ?+ g0 ^" ]7 v! |
  9.   const ai_network_params params = AI_NETWORK_PARAMS_INIT($ W. ]* n. a7 h, |
  10.     AI_NETWORK_DATA_WEIGHTS(ai_network_data_weights_get()),
    % W% e3 ]$ q4 L9 U. i0 ~* g8 E
  11.     AI_NETWORK_DATA_ACTIVATIONS(activations)
    . F! Q+ C- K9 ]3 z: Y
  12.   );+ G) U) E! ?9 k& p/ E& Y

  13. 0 n) n* i' F" t9 W' T
  14.   /* Initializing the network */
    , Z0 ?" k1 Q& H
  15.   ai_network_init(network_handle, ¶ms);
    & S7 ^3 w3 ]1 E: |
  16.   2 B  H6 e% [' \8 U. p
  17.   /*Retrieve network descriptor*/4 T, M- k; m8 Z1 S' N  n
  18.   ai_network_get_info(network_handle, &desc_report);  ~1 J" `3 `3 p4 V6 V, j4 T8 V
  19.   
    ! q5 q* i0 @- r' T
  20.   /*Copy descriptor info*/
    - I  s$ o* v6 O! X
  21.   ai_input[0]= desc_report.inputs[0];) v: z! `% b( X, O5 N
  22.   ai_output[0]= desc_report.outputs[0];
    0 Y' |3 \: R! `! P: t( V
  23.   
    # `8 n+ Z2 o. L+ O3 a" J8 b
  24.   return desc_report.inputs->data;
    $ f/ C  \* s- c% {" b# T; o9 o
  25. }
复制代码

$ Q9 C* z" ~' @  w) t! S- w运行模型
" n- O4 ^% G- D9 v9 T
  1. void ai_run(void* input, void* output)
    ' O2 k6 X  c$ [2 q2 I
  2. {
    $ B7 Z$ E' b+ t$ N
  3.   ai_i32 nbatch;
    % |2 V0 L+ B, E/ P2 N
  4.   4 b: W0 z/ y. v' i# L9 r
  5.   ai_input[0].data = AI_HANDLE_PTR(input);
    + G- j2 H8 M" i- P8 k
  6.   ai_output[0].data = AI_HANDLE_PTR(output);& E) H6 D1 X" p; A
  7.   
      ]* U- n1 {7 K
  8.   nbatch = ai_network_run(network_handle, &ai_input[0], &ai_output[0]);
    7 [  D/ e' f! G/ D' Z
  9.   % N2 j, u+ q: y) F
  10.   if (nbatch != 1) {" L1 j- Z. M! j$ T. E
  11.         while(1);7 B' [8 T* ]9 D" j$ p
  12.   }! `: m. P0 `' ]: L3 C- v5 n
  13. }
复制代码
" Z; I! i1 \" c2 p' N. c& \
图像接收处理,这个模型要求输入224*224的RGB888的图像,把数据转换一下。0 P; d, ~$ V) B6 I- D8 ]# ^, q
  1. void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
    6 ]5 q8 l/ a; ?8 e# N/ c- L$ k
  2. {( Q( w$ \- ^( R3 ~! f
  3.     uint8_t person_flag;! j' O1 k* ]6 M7 k% m% _
  4.     int i,j;! }3 \+ A9 L% _; ^
  5.     for(i=0; i<224; i++)
    ; O- x* ~9 f' ~
  6.         {6 Z- A' E, ^) H: m0 P
  7.         for(j=0; j<224; j++)8 b: G: I! M% d1 `' g
  8.         {
    9 y' k# L, i3 F# w9 g
  9.             uint16_t bg_color = ((uint16_t *)_OV2640->frame->buffer)[i*320 + j];
    ; Y+ _* T6 U  w6 s0 }$ }8 J& U
  10.             network_input[3*i*224 + 3*j + 0] = ((bg_color>>11)&0xff)<<3;- n7 `& {0 t- b- U$ W& s% V4 x! J8 f
  11.             network_input[3*i*224 + 3*j + 1] = ((bg_color>>5)&0x3f)<<2;9 X/ w: ?. k1 |) w# e3 Y
  12.             network_input[3*i*224 + 3*j + 2] = (bg_color&0x1f)<<2;
    + X, l, O$ ^! u1 @6 M- W1 F) ?5 @$ @
  13.         }& X; w9 Y; v* B6 F6 q
  14.         }
    , p7 {3 A) a7 D: {" L5 |8 C' o
  15.     ai_run(network_input, network_output);
    4 [0 L; l1 B, Q- _3 |8 ]

  16. / F' Q' }8 {3 P( M  a
  17.     LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);
    $ \9 b# c& O9 @* i
  18.     LCD_Draw_String(0, 0, 320, 240, 32, output_labels[network_max()]);; x. p: g* m& A; G
  19.    
    - y* ]7 E4 r3 Y$ Y" l; Q1 B
  20.     OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);
    3 l- d9 Y3 ^5 @1 Y( e, @$ `6 F
  21.    
    0 y3 o( k( h! O$ ^* L/ j
  22. }
复制代码
/ D4 q1 p& L1 b# o8 f+ N
* _* X7 E# x$ U. R
运行效果(一共能识别18种食物,这里选了几个看看)

- Z1 ]2 s" g- u' U5 v6 Z4 P

1 n- U7 h4 a4 o3 E! i0 e" `+ U
' Q& `7 A" E" h# k IMG_20221031_113022.jpg 8 R, B7 c& G" g- b. ~+ I  h
可乐
. Z- W+ F3 ?+ N% u5 x/ Y$ {1 \ IMG_20221031_102903.jpg
/ p/ n" o/ @2 n$ n$ _; C, P: j! R/ w% G8 y! X* ?# L+ \7 P
甜甜圈
: d3 P& b$ p+ L5 P8 V5 A! k IMG_20221031_103256.jpg
0 T1 V2 A" T+ i9 R- |. K4 f( g: r4 L# }
汉堡包8 a; J) m$ y7 ^4 w( k; u8 f/ h9 P
IMG_20221031_103432.jpg
5 M8 g6 F, \( x9 o, c, a8 M$ V+ s3 |$ _+ V7 R
薯条
( c; n7 ?0 X: _% a IMG_20221031_103710.jpg . w5 P0 r( }& [7 R) F
$ j0 @5 O4 |" u5 Y/ F

7 F  Y$ e+ s  p7 g  s1 v: u3 u
小结:STM32Cube.AI工具真的太香了,这里仅仅演示了模型的部署,其实可以快速验证AI模型在目标板上的运行情况,只用串口连接,直接把输入发送到单片机,然后运行完后把结果返回来,全部都集成到了一起,快速验证模型运行情况。很是方便(本文未涉及,有需要的可以在X-CUBE-AI行下勾选时,application里面选择validation,回到配置界面后设置通信接口即可): j4 i& U+ c8 l( X" ?/ G
Wio Lite AI视觉开发套件确实是开发AI的很好的选择之一,板子虽小五脏俱全,拿来做单片机视觉绰绰有余,但是不得不吐槽的一点是资料支持太差了,原理图,代码全都藏起来,前期调驱动花了很长的时间,后来管管给了一个例程后好转了一些(但是已经晚了。。。),Ai在单片机上应用已经有很多厂商都推出类似的解决方案了,ST这一个环境很优秀,就是如果相关的培训跟资料再多一点就好了。
7 k/ w" e- O  i% a+ x7 p
收藏 评论5 发布时间:2022-10-31 11:43

举报

5个回答
wj20180813stm32 回答时间:2022-11-16 10:02:15
很好: C0 d. I9 d" e# B* q! d
萨法 回答时间:2024-11-24 21:35:02

up有没有原理图资料~

求求了

奇迹 回答时间:2024-11-25 10:35:50

萨法 发表于 2024-11-24 21:35
up有没有原理图资料~</p>
<p>求求了

[md]好久之前做的了,资料都忘了放哪里了。。。你可以在网上找找,或者找卖家要

黄涛12345 回答时间:2024-12-9 20:55:34

奇迹 发表于 2024-11-25 10:35
好久之前做的了,资料都忘了放哪里了。。。你可以在网上找找,或者找卖家要
...

up 有更详细一点的建文件工程的教程吗? 还有模型怎么弄上去, 求解

奇迹 回答时间:2024-12-10 18:48:00

黄涛12345 发表于 2024-12-9 20:55
up 有更详细一点的建文件工程的教程吗? 还有模型怎么弄上去, 求解
...

按这个文章操作就行

所属标签

相似分享

官网相关资源

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