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

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

[复制链接]
奇迹 发布时间:2022-10-31 11:43
在经历完各种准备工作后,现在终于来到了正主。直接部署Tensorflow Lite Micro那一套玩意确实没啥问题,但是太麻烦,要添加一大堆文件,还得用它家训练生成模型,然后转换,麻烦的很,在ST平台,怎么能不提到用ST自家工具去部署模型,方便快捷,简单实用。
( c1 F! F' l( }* w7 K* c拿出之前准备的工程,选取ai开发需要支持的软件包cue-ai,在software packs点select components9 u/ _  N/ X0 ^' K: k& o" ?
微信截图_20221029165303.png ( d" h7 }5 e8 s$ L( n2 F

/ k  k* q8 w( `3 ~7 h( H6 g" K& s% J( s* e. H- l8 S

: \6 d# W3 r+ }5 s9 p在X-CUBE-AI行下core勾选,点OK完成; n* ^, a& r! L/ b5 h$ c8 N0 F. I
微信截图_20221029165346.png 1 s# g5 v/ q8 P* t, g# A

8 u$ B; x7 Q4 n0 ^

  f$ N9 _/ k7 O; O! \% L) j回到引脚配置页面,最下方就是上面导入的CUBE-AI工具包
' ~7 N. d9 z1 R6 m( {3 ~3 b6 p 微信截图_20221029171555.png
7 J6 a& T" [9 _
# c* B  {; S2 \2 h4 Y# _- m
2 ?4 ^4 @5 w9 I$ G7 g- u/ x' M# \

9 v( V$ l4 I& R0 m1 y3 c' Z- y点击+添加,这里要根据自己使用的模型,以及模型特点选择,如下图选择的是原始模型
6 y; \6 I6 @8 r" _0 ^$ R 微信截图_20221029171744.png ) E: n, _, x- V. D

; V4 v: Q, y0 e5 ^5 y: F1 N这里选择的是量化后的模型(量化可以减少模型的要求,但是精度会下降),点击分析
  Q; `! m2 }9 _" X0 m 微信截图_20221029172202.png
3 r( z1 [/ N. i' ~1 e$ d- N3 p7 m7 e  K2 }5 s8 A
分析中; s- F; n, R0 P+ e8 q3 p0 {( h
微信截图_20221029171816.png 9 _4 h* M" J5 E+ w; L1 c" b8 \( {

- W* d; M# n  F4 |2 @分析完成会显示是否可以部署到设备上,以及资源使用情况。7 x+ |% U, F4 Y& J" s0 j! z
微信截图_20221029172246.png : z( y% X, Y( j- R& Y- S

4 X% X& z0 F. B1 j4 G* q回到工程,有个小bug(使用的STM32CubeMX版本为6.6.1,X-CUBE-AI版本为7.2.0),下图的几个文件路径老是生成错
5 Q" f( w" f: A" A( `6 `

! m' B. H! }) {/ f5 J* W

( Q& C2 @' A' P( q* O7 Y. K QQ截图20221031110850.png
0 }6 T1 x* t# f& y0 F5 i8 g: ]0 o$ H* j- r6 O/ I: u- O4 S9 Z# r
右键文件打开设置,修改一下路径就行

/ W; z2 @( C6 j4 N! `- X
! Z5 p+ F8 [8 Y" V$ E' W QQ截图20221031110911.png + g( T* c7 @! W

% O2 G. h9 t. B1 i; h% }头文件路径也有一样的问题4 Q/ P( T& ^2 F* c+ W
QQ截图20221031111258.png
6 p) @' V/ P9 I6 \# q8 ?2 f0 W* s! x; B1 i
初始化模型
  1. ai_handle ai_init(void)4 i0 [' J% Q0 Z9 {* o! c7 _: z! M
  2. {4 u& o2 a8 A% h" |; p% V$ x
  3.   network_handle = AI_HANDLE_NULL;$ S; S0 [& ^" }4 u8 n% s6 W

  4. ! G) ~: m' N% s: t0 u
  5.   /* Creating the network */
    8 `. ?9 ]3 q. Y+ J% q
  6.   ai_network_create(&network_handle, AI_NETWORK_DATA_CONFIG);* R, p. G, j& V0 t, d
  7. - W- ?8 F7 F& @4 R
  8.   /* Initialize param structure for the activation and weight buffers */1 d+ V' L. q% [2 M  G& F! q  ?3 Z
  9.   const ai_network_params params = AI_NETWORK_PARAMS_INIT(
    1 G. ^  |9 `. ?9 L% ?( N
  10.     AI_NETWORK_DATA_WEIGHTS(ai_network_data_weights_get()),' W# @: U; b+ i8 t/ U9 _3 F) T/ L
  11.     AI_NETWORK_DATA_ACTIVATIONS(activations)) k, H" e$ M& Z3 V3 O. h$ ~
  12.   );) m1 p# k$ a" t; ]+ A

  13. # t9 [* U5 A! I3 C& K& x
  14.   /* Initializing the network */
    4 H9 ?9 n' U( q- e+ k
  15.   ai_network_init(network_handle, ¶ms);
    4 w5 @( s( {8 v0 [! \5 W
  16.   2 c  |+ V2 g' g1 k5 c# @
  17.   /*Retrieve network descriptor*/' Y3 j; t" A* y4 Q, P" k. ~
  18.   ai_network_get_info(network_handle, &desc_report);* |+ {' _& o: D  R
  19.   
    9 u- P. c+ ~" g4 r
  20.   /*Copy descriptor info*// b/ o& c- H, U9 \% S
  21.   ai_input[0]= desc_report.inputs[0];$ X( M5 J0 W, M+ U8 P$ H
  22.   ai_output[0]= desc_report.outputs[0];
    1 n( R* s! g, ^- S" N: @$ F
  23.   
    7 ^: G2 c# S3 t0 N9 X" ?" H& a! W
  24.   return desc_report.inputs->data;
    / n6 q$ f( K4 I: K
  25. }
复制代码

! Z( P) K0 k$ H- T7 e运行模型
" ~! R: v! S( }  j
  1. void ai_run(void* input, void* output)* `  |2 F. s6 ~' E# J
  2. {! d' Q3 u8 D* z/ _! J2 v9 T7 m
  3.   ai_i32 nbatch;# y1 }8 ~" U) ^5 Y0 ^
  4.   
    $ U- y! ~4 w' l5 U
  5.   ai_input[0].data = AI_HANDLE_PTR(input);$ H/ C6 @- y3 n/ U1 b
  6.   ai_output[0].data = AI_HANDLE_PTR(output);
    $ Z& Z+ ]% y# x6 Q5 j
  7.   
    ) P1 t: U- z/ }+ {- i
  8.   nbatch = ai_network_run(network_handle, &ai_input[0], &ai_output[0]);
    4 Y  @% {  k" k6 d4 w
  9.   
    7 j0 {- {! C$ e7 o/ `1 ~7 d' V
  10.   if (nbatch != 1) {
    : @4 W3 `! ]( }9 g- B
  11.         while(1);
    * S: l% o+ Q; E! k0 w; n8 j
  12.   }
    % D0 K* ^2 n8 |' ]- d1 x( {
  13. }
复制代码

3 a3 Z) t; g) }图像接收处理,这个模型要求输入224*224的RGB888的图像,把数据转换一下。
- [7 O8 R* I6 H/ b; O5 o& f7 Q" \  Q
  1. void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)* k1 ?) H7 {7 O& y0 P, l; t1 O
  2. {
    4 {7 L3 h) k  z7 B2 p
  3.     uint8_t person_flag;
    " [% K# N2 y  F
  4.     int i,j;
    ( K# N7 |* c4 Q
  5.     for(i=0; i<224; i++)
    . ?2 s) M, }1 B" e6 L. N4 F$ u
  6.         {: h* `7 E& n9 U3 r: h1 a
  7.         for(j=0; j<224; j++)
    $ q: s+ N: G$ v+ \! t# a- j
  8.         {! {+ b  i$ I4 r/ F' J9 t
  9.             uint16_t bg_color = ((uint16_t *)_OV2640->frame->buffer)[i*320 + j];3 z- }6 x: i+ N) v
  10.             network_input[3*i*224 + 3*j + 0] = ((bg_color>>11)&0xff)<<3;  C6 Q5 l. g7 v3 e3 l5 c
  11.             network_input[3*i*224 + 3*j + 1] = ((bg_color>>5)&0x3f)<<2;
    * `8 v, s9 d  W  U- K
  12.             network_input[3*i*224 + 3*j + 2] = (bg_color&0x1f)<<2;
    $ y, s+ g& s$ j3 u
  13.         }: z0 L- q7 @5 b& Z. _8 _3 v
  14.         }
    8 N4 ^, T' M  j) V7 L
  15.     ai_run(network_input, network_output);) ]- `% K8 B0 K6 q% X2 Q/ B3 V

  16. & [8 i/ D! u* p0 u4 N' @
  17.     LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);2 F- k+ y: G( N
  18.     LCD_Draw_String(0, 0, 320, 240, 32, output_labels[network_max()]);
    5 R2 l( p! D3 ?
  19.     ' Q; J0 I3 g- N) a& o
  20.     OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);
    ( R. V4 q) N3 j8 Y8 K$ t2 g
  21.    
    / }4 z. c9 H" L& u1 P
  22. }
复制代码

& n( B" W3 i! d% o: B
8 s# {5 `- d) }6 W运行效果(一共能识别18种食物,这里选了几个看看)

9 S3 C  C2 |$ c0 Z6 p. E* U3 s
/ ?' L, w9 f+ W/ }* H) n; Z% J
空8 {: w# H- b( c0 M9 X4 D% H: Q
IMG_20221031_113022.jpg : ^& f+ h5 U2 w5 T1 h4 T
可乐
9 S, X3 p4 n* C IMG_20221031_102903.jpg 4 D# \! k9 q; c  c8 ~( `
2 l9 j" B) M- i/ Q  ]+ {
甜甜圈5 b/ s! |5 _( z8 d* W; }4 o' }
IMG_20221031_103256.jpg 2 J$ W' ]' @0 g5 I  z, n8 ?/ Y
  }' f* |+ T4 s* V
汉堡包
6 u: E: q7 j' d+ j2 r% N  Q8 i8 Q IMG_20221031_103432.jpg 6 r; B8 X9 U0 p

0 _/ [7 Q% D  R1 T& v) d  F. V薯条$ ?3 I( ?7 B3 e) \0 P! D& t
IMG_20221031_103710.jpg
  m% v+ Q" ], l' o5 N. Q1 G/ Z. X  `  s

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

举报

5个回答
wj20180813stm32 回答时间:2022-11-16 10:02:15
很好
5 _) V6 t; L; |+ y0 [7 a
萨法 回答时间: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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版