请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
奇迹 发布时间:2022-10-31 11:43
在经历完各种准备工作后,现在终于来到了正主。直接部署Tensorflow Lite Micro那一套玩意确实没啥问题,但是太麻烦,要添加一大堆文件,还得用它家训练生成模型,然后转换,麻烦的很,在ST平台,怎么能不提到用ST自家工具去部署模型,方便快捷,简单实用。
, w2 R* j$ u' P  i# T! M拿出之前准备的工程,选取ai开发需要支持的软件包cue-ai,在software packs点select components" R  y/ ^' p" u- a5 M% h
微信截图_20221029165303.png 3 M5 ^  b2 q( }- s$ a4 S

5 W& K" I  n% O" D5 x1 u& H% ~/ ]# C/ B7 W% u' {% |
- f9 P7 ?0 w: g- \! \
在X-CUBE-AI行下core勾选,点OK完成, i9 I% L, Z! n7 U4 z( B
微信截图_20221029165346.png - t/ ]9 h; Y) B" m5 H- O
- l0 I3 s& }) Q. p  ]

( j. P' G$ T$ c/ E- w回到引脚配置页面,最下方就是上面导入的CUBE-AI工具包
6 P- B% M/ F9 A 微信截图_20221029171555.png
& u9 R' f" o7 G; J' A# o5 E' C, `* ?. R9 ?# j- H
: p8 S. {3 a9 C9 b

( I0 J9 R  m  f% e/ S! q点击+添加,这里要根据自己使用的模型,以及模型特点选择,如下图选择的是原始模型! q0 Z& A  {% d" J  `# K  [
微信截图_20221029171744.png 2 u: N+ l4 `4 ?/ l$ [' c5 [3 ^
  p( s7 @5 {3 R* z1 Y6 k( ?+ v
这里选择的是量化后的模型(量化可以减少模型的要求,但是精度会下降),点击分析1 \! q6 y9 \' z! N% n( V5 y7 N3 V
微信截图_20221029172202.png
6 h) P" Y% v$ F+ l. R& }% G2 z
8 t/ s+ o. J0 d9 Y6 x8 @分析中- x. J3 g  u! a' b. o+ s" P
微信截图_20221029171816.png 1 _6 R5 {3 A, G7 y7 m  [

8 D3 A/ `2 W- c' ^: e分析完成会显示是否可以部署到设备上,以及资源使用情况。
$ l; j& ~. p0 ]; H* k+ I% D3 ?9 r 微信截图_20221029172246.png
( P( [1 [& r, ]; f9 K7 [! T
; y1 Q- H! }7 f% H回到工程,有个小bug(使用的STM32CubeMX版本为6.6.1,X-CUBE-AI版本为7.2.0),下图的几个文件路径老是生成错

; I+ f4 t% R3 {1 l( z: f- q; B5 ~5 z1 P$ k$ B2 f# Q

. \$ k  c' c' G, w1 T$ ` QQ截图20221031110850.png 8 Y" h3 Q3 K5 ^
$ m; c& H9 {' `9 [
右键文件打开设置,修改一下路径就行

* R8 g% M: s" K5 D; `1 t$ y3 ]+ b- t$ o9 G1 ?  s, h. m# t
QQ截图20221031110911.png ; m) L% Q5 x  _" M8 n4 l

2 ~3 u* c! d2 q头文件路径也有一样的问题
+ c" M+ a) \1 e2 y QQ截图20221031111258.png
$ E) G0 W$ T( Z7 Q" m
  F' }: o2 H8 N- @+ r' T初始化模型
  1. ai_handle ai_init(void)
    : f0 ?7 C$ p/ p0 u
  2. {
    5 `9 o4 ^5 P' b. F$ [  a
  3.   network_handle = AI_HANDLE_NULL;
    ( v2 A7 l4 w% ^3 Y) a6 I

  4. : _; a: R" o' _- n8 Z7 b
  5.   /* Creating the network */  z9 _) b3 {9 t9 u
  6.   ai_network_create(&network_handle, AI_NETWORK_DATA_CONFIG);
    ( D0 I0 b' a- v# A/ E

  7. ) J* r+ H* S+ z" K( k+ f" U
  8.   /* Initialize param structure for the activation and weight buffers */
    8 M  e9 S9 K, a8 v/ N# [! Y/ ^
  9.   const ai_network_params params = AI_NETWORK_PARAMS_INIT(
    3 i- d: o- i$ l% P0 P
  10.     AI_NETWORK_DATA_WEIGHTS(ai_network_data_weights_get()),
    , x0 m6 s# y# z1 l& J
  11.     AI_NETWORK_DATA_ACTIVATIONS(activations)
      x6 s: c8 h. h
  12.   );  q: p' }) D( T
  13. # F- E) A8 W. s: o. g( E. |* k
  14.   /* Initializing the network */+ Z' o7 F+ y+ H; {6 W6 t' i
  15.   ai_network_init(network_handle, ¶ms);3 r. X) N$ ^7 v! f* H$ v, J" Q+ E
  16.   6 C1 a6 X2 j3 K* O# c6 ^: s
  17.   /*Retrieve network descriptor*/
      {. q+ g0 |- v- o. D
  18.   ai_network_get_info(network_handle, &desc_report);
    " J4 B( I3 ?/ V  I% P6 b  p
  19.   
    5 @4 O0 c' ^+ [0 x% J3 r% N
  20.   /*Copy descriptor info*/% S& @* T& {4 s
  21.   ai_input[0]= desc_report.inputs[0];
    ) I0 m" C. w. o4 N! ~
  22.   ai_output[0]= desc_report.outputs[0];
      f. x( M) }1 A  d
  23.   1 \  C) P' V" h
  24.   return desc_report.inputs->data;
    0 w$ ]6 J7 b2 B" t0 E1 O& n) y
  25. }
复制代码

; z- H* j% L# x7 F' `: H运行模型
$ m( e3 T3 a) K' K* Y% ?
  1. void ai_run(void* input, void* output)
    9 c6 t" E/ j+ ^2 [
  2. {
    : g$ @' g& h0 ?* P$ O% S6 \; X
  3.   ai_i32 nbatch;: ?* F9 U. {7 W( c
  4.   9 W3 S* Q- O  q0 y+ Z2 E
  5.   ai_input[0].data = AI_HANDLE_PTR(input);* a4 X% [0 c' X# U! K. Z. B0 Y
  6.   ai_output[0].data = AI_HANDLE_PTR(output);
    9 i& L0 J! ~  L
  7.   
    % L. Q. S6 b( W0 F
  8.   nbatch = ai_network_run(network_handle, &ai_input[0], &ai_output[0]);
    # J: K7 d& n8 [! B& y- W9 Z9 {3 R4 l
  9.   ; O  {! @5 n* r6 C" X0 U2 i0 }
  10.   if (nbatch != 1) {4 Q! d' D5 u' G
  11.         while(1);" A+ R! B5 M, a+ ?& @
  12.   }& Q0 V) n5 E" f# }; f, M, n
  13. }
复制代码

1 a2 T  k9 d$ O; z/ |% ^' U4 ?- ?图像接收处理,这个模型要求输入224*224的RGB888的图像,把数据转换一下。
% k0 q  a* M/ [, W6 K
  1. void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)! m: a! q+ d7 p5 t
  2. {2 o' s2 v% c$ q3 W3 T( l
  3.     uint8_t person_flag;
    ( t7 K7 g# K, N# p0 }
  4.     int i,j;
    0 u9 v" o1 M5 _8 l: h+ |
  5.     for(i=0; i<224; i++)
    . r) a! ~  T) e- }  M6 Z
  6.         {" i* [8 a. C5 ?( I4 D& F5 U
  7.         for(j=0; j<224; j++)  g$ K, T( v" F! y/ `/ u- [* g
  8.         {1 P( s  l" o/ m3 v& j/ J/ M
  9.             uint16_t bg_color = ((uint16_t *)_OV2640->frame->buffer)[i*320 + j];
    # o4 m* g' l3 V4 n
  10.             network_input[3*i*224 + 3*j + 0] = ((bg_color>>11)&0xff)<<3;9 ^1 R' S# I. s8 Y0 r' s, V- `
  11.             network_input[3*i*224 + 3*j + 1] = ((bg_color>>5)&0x3f)<<2;$ v( S4 F/ Z: K( j+ z& F
  12.             network_input[3*i*224 + 3*j + 2] = (bg_color&0x1f)<<2;
    ( X" G! o. u6 X- h/ d: I
  13.         }
    4 r3 _% d9 w5 e6 C
  14.         }
    ( C5 w( f/ W+ g  @
  15.     ai_run(network_input, network_output);
    * z- P7 o' {( E, q8 ]* G* N  f

  16. + I/ h3 o% V' e6 K
  17.     LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);6 x+ z) {( @. N4 i! i
  18.     LCD_Draw_String(0, 0, 320, 240, 32, output_labels[network_max()]);
    0 W' \4 A3 b: S# c! Q
  19.     $ @+ [0 Z* S8 m: @# V
  20.     OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);
    4 P+ {( c2 Q- e6 M+ h+ L
  21.     / E( k3 R4 A/ x/ N9 ^
  22. }
复制代码

! o( D- g5 k( h8 z5 O' m  U% ], A; G& K8 [5 `! N
运行效果(一共能识别18种食物,这里选了几个看看)

6 x: ~6 O6 c! c0 e+ X7 \4 V3 m

# `4 W1 W' D* _: X
+ T0 C1 S( i9 A3 ^$ @. U0 k$ E IMG_20221031_113022.jpg ' s: n, M  o' V1 y7 C
可乐3 ~' j! W2 v) C0 j2 L$ _/ r
IMG_20221031_102903.jpg
; [& A6 g/ N% v- A
. o9 W: R5 j0 c6 U+ S; j# ~甜甜圈( i1 ~, q) C( s9 T" f
IMG_20221031_103256.jpg
3 m0 F( M5 ~2 o+ W9 h0 T, S7 n8 l3 D8 r2 ?7 @
汉堡包1 F, W9 f7 f4 l0 A+ t4 t
IMG_20221031_103432.jpg
2 H4 t& b# {. F; k  {6 L2 ]7 d
; ]! T; T( I7 y6 d薯条% @  N3 M( _) {* J# ]
IMG_20221031_103710.jpg
5 {6 R6 V6 ?4 ~  H5 K! R
( w! H7 {) i/ ^/ @# j. W9 r4 E% s( @/ H/ i3 K6 E
小结:STM32Cube.AI工具真的太香了,这里仅仅演示了模型的部署,其实可以快速验证AI模型在目标板上的运行情况,只用串口连接,直接把输入发送到单片机,然后运行完后把结果返回来,全部都集成到了一起,快速验证模型运行情况。很是方便(本文未涉及,有需要的可以在X-CUBE-AI行下勾选时,application里面选择validation,回到配置界面后设置通信接口即可)
  @$ {6 H" b5 h: w- m- vWio Lite AI视觉开发套件确实是开发AI的很好的选择之一,板子虽小五脏俱全,拿来做单片机视觉绰绰有余,但是不得不吐槽的一点是资料支持太差了,原理图,代码全都藏起来,前期调驱动花了很长的时间,后来管管给了一个例程后好转了一些(但是已经晚了。。。),Ai在单片机上应用已经有很多厂商都推出类似的解决方案了,ST这一个环境很优秀,就是如果相关的培训跟资料再多一点就好了。% _5 U% |$ o; x  p0 j5 Y0 y
收藏 评论1 发布时间:2022-10-31 11:43

举报

1个回答
wj20180813stm32 回答时间:2022-11-16 10:02:15
很好
0 H. U& n; ?4 [
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版