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

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

[复制链接]
奇迹 发布时间:2022-10-31 11:43
在经历完各种准备工作后,现在终于来到了正主。直接部署Tensorflow Lite Micro那一套玩意确实没啥问题,但是太麻烦,要添加一大堆文件,还得用它家训练生成模型,然后转换,麻烦的很,在ST平台,怎么能不提到用ST自家工具去部署模型,方便快捷,简单实用。
: r9 I- M6 m; m1 }0 n& b拿出之前准备的工程,选取ai开发需要支持的软件包cue-ai,在software packs点select components
, C" D5 {5 I$ S) T3 B+ h' |) ~5 o 微信截图_20221029165303.png   L& ~( V9 D. q+ V3 {3 z3 F; ?$ T' a

/ H- o6 b# S8 z: _$ T, h
+ x$ A( m) I' W0 T

( x" x0 d: k$ C: S; K在X-CUBE-AI行下core勾选,点OK完成
& c3 q& G2 {7 Z1 H  V 微信截图_20221029165346.png
2 r0 w8 Y) a+ U; U9 J4 g/ M( Y8 m8 c; {0 H
! m$ }$ \! F, L) Q$ }2 S
回到引脚配置页面,最下方就是上面导入的CUBE-AI工具包
- {1 U& S, j/ J( _0 w8 e3 `$ v1 A 微信截图_20221029171555.png
, m+ \" V' p5 Z. o4 G$ _; s
8 F4 Z0 \3 B1 q1 L& X) {' k& F$ K, \) \6 X+ S. o3 D* G

2 h6 `6 t5 Q6 o9 ~+ q4 J" K点击+添加,这里要根据自己使用的模型,以及模型特点选择,如下图选择的是原始模型
$ M1 P* P2 j' t7 O$ P 微信截图_20221029171744.png 1 i- r4 d8 a! p$ r& M; i. L: g0 `
. `, w! @* d, v! \
这里选择的是量化后的模型(量化可以减少模型的要求,但是精度会下降),点击分析
& |# @5 |% H. E 微信截图_20221029172202.png ; s+ t  A  {- d4 K; ~

: s" A/ Q/ }9 c9 C2 `0 t分析中
1 Z3 Q3 [: I2 [+ u 微信截图_20221029171816.png $ @: a" Q: I4 C- Q/ A/ f1 }
+ {: U0 S! f7 v( N
分析完成会显示是否可以部署到设备上,以及资源使用情况。% ?1 |. `, A' Y8 K
微信截图_20221029172246.png . \1 b) `$ `- v) h: N1 q0 K, c

5 a( m8 a8 ?; w9 p! y4 q回到工程,有个小bug(使用的STM32CubeMX版本为6.6.1,X-CUBE-AI版本为7.2.0),下图的几个文件路径老是生成错
( }8 V" ^1 F+ ?; B# [( q: i, ]
6 ?7 j) m( Z# U$ l! E1 [9 A5 s

# s: C$ m& E& a* L( ~, b. c! y QQ截图20221031110850.png # b& F5 @( \( T" l
% t9 z& @- Q% ?2 M" N
右键文件打开设置,修改一下路径就行
% P5 d' L! @+ N8 T" r
* X& h0 ^- H; O5 t; q/ G4 {
QQ截图20221031110911.png
' N5 F# G9 h6 T% J& k; }$ Q' {1 }
' f  f( p8 b7 W" p头文件路径也有一样的问题
/ x' Y- r. I/ }) S# Z# K5 W- d QQ截图20221031111258.png
0 H$ r% Q5 y7 ?7 n& ~/ z1 k+ i2 B* O, Y% r: X* L
初始化模型
  1. ai_handle ai_init(void)
    2 t3 q7 D+ c! T  i3 F
  2. {; v! X, ]# m" q& T
  3.   network_handle = AI_HANDLE_NULL;; |8 t$ n9 n" G! ?8 E6 ^( F

  4. # z0 V) z3 V  f9 n
  5.   /* Creating the network */
    8 B  H6 o; Y3 ]/ g3 f
  6.   ai_network_create(&network_handle, AI_NETWORK_DATA_CONFIG);
    # H+ W' Z) n1 ~4 A8 q# R

  7. + f: Q* i7 U- n  i# S# G6 H' K
  8.   /* Initialize param structure for the activation and weight buffers */
    * p% j5 C0 A/ y+ M  V  I- B0 [
  9.   const ai_network_params params = AI_NETWORK_PARAMS_INIT(
    . x# _  F7 N6 U: u6 C6 w/ {! U
  10.     AI_NETWORK_DATA_WEIGHTS(ai_network_data_weights_get()),7 L. h3 j/ l& y; ~
  11.     AI_NETWORK_DATA_ACTIVATIONS(activations)
    # D4 a4 K! G; @- |) p3 ]
  12.   );
    # [' _0 Q- N6 |, v7 Y, H
  13. " o# o& r# I. D5 V4 i  u/ R
  14.   /* Initializing the network */8 O1 f) c- T: P% \+ `" _
  15.   ai_network_init(network_handle, ¶ms);# S; s' V: v- b. \2 b6 A( p1 S
  16.   + w1 I) A$ i1 O& \1 J
  17.   /*Retrieve network descriptor*/
    ' l4 \* q6 d# `6 |1 p+ `, f
  18.   ai_network_get_info(network_handle, &desc_report);4 y1 v: |2 q1 y, c0 Q% e8 Z7 i
  19.   ; M9 o& H3 U: o. N$ E
  20.   /*Copy descriptor info*/
    3 g) V! i- C) A; _
  21.   ai_input[0]= desc_report.inputs[0];2 ^/ O: t7 c0 m2 G
  22.   ai_output[0]= desc_report.outputs[0];  h: z; |6 ?8 f! a  a% P: h2 L
  23.   ' q7 U1 f/ ~) y% i7 y
  24.   return desc_report.inputs->data;: V, x7 o  t6 B; R5 v( p/ o0 `
  25. }
复制代码
9 o2 |! w0 P! m
运行模型# l& [% o& n7 ?( s( c# g; B
  1. void ai_run(void* input, void* output)
    2 y& X5 ]8 ?! A# [4 X
  2. {
    $ }0 c4 J5 g+ R0 X+ @
  3.   ai_i32 nbatch;  i. q" h1 M1 r  y' x9 j  q2 b5 G' t
  4.   5 S8 N; O- H' s4 [
  5.   ai_input[0].data = AI_HANDLE_PTR(input);
    9 ~/ v8 e: @0 Q! Z. e
  6.   ai_output[0].data = AI_HANDLE_PTR(output);0 O5 Y+ l% b$ D# p4 f
  7.   
    " b4 r* s- ?: H/ D
  8.   nbatch = ai_network_run(network_handle, &ai_input[0], &ai_output[0]);# ?; V; e3 O9 @( x! C# T
  9.   
    0 [6 O7 h* Q, Q. |; ]+ T: B8 h
  10.   if (nbatch != 1) {! g- v$ A! u# h
  11.         while(1);
    4 j8 N  D! a7 L1 ?' t) _3 D
  12.   }
    ' L0 o# A+ A( B- t
  13. }
复制代码

/ B0 k* c/ W$ \: V图像接收处理,这个模型要求输入224*224的RGB888的图像,把数据转换一下。$ X+ P! u: y0 J0 Q* U8 p
  1. void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)/ i8 S% Y- n- B" D
  2. {+ M$ H' b5 W% h+ m* |/ A* {
  3.     uint8_t person_flag;
    " |8 m0 o0 J: e# O( _- q$ n
  4.     int i,j;
    # d" p5 L+ W6 J/ o3 r; K
  5.     for(i=0; i<224; i++)
    - p! _) {/ f7 c. e. t$ u
  6.         {
    / L' S$ i, \! y1 U$ ^- h
  7.         for(j=0; j<224; j++)2 Y7 I2 w% `$ M+ [
  8.         {
    4 U# q- c+ n% l1 @2 d
  9.             uint16_t bg_color = ((uint16_t *)_OV2640->frame->buffer)[i*320 + j];: T  @$ E# \3 s6 q
  10.             network_input[3*i*224 + 3*j + 0] = ((bg_color>>11)&0xff)<<3;4 x! ^0 V. m, }; f  r- H
  11.             network_input[3*i*224 + 3*j + 1] = ((bg_color>>5)&0x3f)<<2;) L0 ?7 o; ^. p* T0 x
  12.             network_input[3*i*224 + 3*j + 2] = (bg_color&0x1f)<<2;  ?4 B4 _0 R, b$ t) ?
  13.         }% t7 V+ O( r3 C4 y1 m8 e
  14.         }3 p: w! j+ V% @" V8 J. [
  15.     ai_run(network_input, network_output);
    / f6 H5 X& X! P7 x5 k
  16. - s( a3 h' q: i" |5 @- \- ~8 T
  17.     LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);
    2 f+ B9 m- D: i7 q! J
  18.     LCD_Draw_String(0, 0, 320, 240, 32, output_labels[network_max()]);! ~$ V" A1 C2 x5 s+ N8 {, N+ X/ O
  19.     7 i% Y8 i; ~, |: p! W  |
  20.     OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);/ T1 S/ v, u3 z+ }+ ?0 X8 ~) Y
  21.     . C, e" g% T' _! h; F1 L
  22. }
复制代码

/ {2 d% k1 _: P
) ~0 o7 o7 V/ M运行效果(一共能识别18种食物,这里选了几个看看)

4 O1 B' [. k1 m

) y$ B6 A* K8 ?  `* s3 f2 ?4 V: g' C0 C0 n! I; v* m1 h; y) r; S  N
IMG_20221031_113022.jpg
% O/ v6 N& F1 I  F3 |. p' D. D可乐3 }4 [- z0 q  U) R" |$ F$ S5 _
IMG_20221031_102903.jpg ! O  K1 v, H( s% r  F5 |

" J- _/ Z0 L7 F" @: q甜甜圈
3 I4 Y5 K% P$ m2 { IMG_20221031_103256.jpg * d/ A8 H& r' b( |5 x
2 y4 _. R: t3 H' H
汉堡包( l/ b& y0 `# l- k
IMG_20221031_103432.jpg 6 [. o0 _# T2 ]- Y" x4 P
) @* w/ L. N0 J0 V7 b/ v
薯条
# d9 \) P2 F$ b. c7 h3 x IMG_20221031_103710.jpg   F) s0 f# b" E2 h& b
5 y% |+ Z/ n0 s/ V+ R, n4 g5 a& S

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

举报

2个回答
wj20180813stm32 回答时间:2022-11-16 10:02:15
很好
9 S0 |8 ?. F0 J2 A, w2 b5 r
萨法 回答时间:昨天 21:35

up有没有原理图资料~

求求了

所属标签

相似分享

官网相关资源

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