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

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

[复制链接]
奇迹 发布时间:2022-10-31 11:43
在经历完各种准备工作后,现在终于来到了正主。直接部署Tensorflow Lite Micro那一套玩意确实没啥问题,但是太麻烦,要添加一大堆文件,还得用它家训练生成模型,然后转换,麻烦的很,在ST平台,怎么能不提到用ST自家工具去部署模型,方便快捷,简单实用。3 a* r# a# E; v8 x: m! T
拿出之前准备的工程,选取ai开发需要支持的软件包cue-ai,在software packs点select components
# L9 o8 u" N' I* H 微信截图_20221029165303.png . D9 N: x3 p; w4 t! o& i# S$ K* c8 J
; @: k+ M2 `+ U! p
8 }+ M, ]1 K/ i: H
4 g- M3 Y/ S/ J7 t$ a/ J
在X-CUBE-AI行下core勾选,点OK完成
0 o8 l6 c7 ?3 n: ?+ w 微信截图_20221029165346.png
5 V9 {7 R# o% S. z8 ~# K/ Z8 B! E2 j
$ |7 C+ p, z! n3 X, S, P6 Z* W$ }
! Z0 m: N$ O/ `, N6 c# u0 U8 C
回到引脚配置页面,最下方就是上面导入的CUBE-AI工具包8 j3 [9 k9 R. I3 x$ X% d
微信截图_20221029171555.png
' B  t* y0 R9 G+ w2 }& a7 K7 G  T; G# J8 j: f
2 e3 p9 h8 Q. U* r! b" j. S
* s, l4 A' p) ?0 S
点击+添加,这里要根据自己使用的模型,以及模型特点选择,如下图选择的是原始模型5 L( ]/ ]& L6 `' q! O+ o5 B; Q: R% d  |
微信截图_20221029171744.png " \8 R- b1 P1 B2 D$ X
6 z' L6 {' [- _
这里选择的是量化后的模型(量化可以减少模型的要求,但是精度会下降),点击分析
9 \7 P4 @  u+ C( T- S; }8 K 微信截图_20221029172202.png
6 e0 Q; |8 i( G# j' }/ [
0 N  P: U& b$ Q7 \7 c' B2 S1 C分析中$ k& T% _2 a' S, S$ q! s/ q. e) N
微信截图_20221029171816.png
# _$ y( r: `  J9 D1 Z% J/ k+ Y8 b5 G8 _
分析完成会显示是否可以部署到设备上,以及资源使用情况。) m7 W( y) x" D' I
微信截图_20221029172246.png * w2 m1 F& p! S6 K
- j* R) l$ S3 x0 M
回到工程,有个小bug(使用的STM32CubeMX版本为6.6.1,X-CUBE-AI版本为7.2.0),下图的几个文件路径老是生成错

9 E. K  o; {- J
5 e1 ?, K/ y, O. I/ p8 X+ o
! R2 d( ~9 n, ]5 A( T
QQ截图20221031110850.png , }4 B3 e) [; Z% m) z

7 K% K( ]1 W- P; ~, T右键文件打开设置,修改一下路径就行
+ V$ X% V* A9 A4 }. d0 Y0 k
* ~- t% O" M* f& ?9 ~) d
QQ截图20221031110911.png % U( s; X: P( \& Z7 s, ?  s
" L, b/ k- |( G9 C1 L
头文件路径也有一样的问题: j8 n: C9 i8 K9 t
QQ截图20221031111258.png
0 S6 Q! I3 o" A* u  x
4 q8 l3 q6 j: s  G初始化模型
  1. ai_handle ai_init(void)) X' ]: ^0 d0 I+ R- j
  2. {
    : t" m% \! U3 [! Z- Y& x% ]
  3.   network_handle = AI_HANDLE_NULL;
    " O7 p; V6 t9 C) ?! ?
  4. 9 c4 H8 b& [7 g& e# s
  5.   /* Creating the network */5 x2 g+ t7 D* T; b6 Z
  6.   ai_network_create(&network_handle, AI_NETWORK_DATA_CONFIG);
    6 I0 |" Z& P- {  |5 h. b
  7. . ]3 E7 y. Y: f/ u
  8.   /* Initialize param structure for the activation and weight buffers */6 J6 C2 |$ u, A7 O
  9.   const ai_network_params params = AI_NETWORK_PARAMS_INIT(/ t, e( a% M9 D0 N- W6 s
  10.     AI_NETWORK_DATA_WEIGHTS(ai_network_data_weights_get()),$ T, q$ X6 w3 |7 z
  11.     AI_NETWORK_DATA_ACTIVATIONS(activations)
    ' N- T9 m% T- [1 G) }; ~/ T
  12.   );
    ( y) W2 E$ V8 L. u1 O

  13. % w, \1 f* W2 b' }
  14.   /* Initializing the network */$ ?( c& u: b* L: S# J- z
  15.   ai_network_init(network_handle, ¶ms);
      c" A! f: B* D# K+ Y, y; `% Z% L" ]# m, ^
  16.   ; h  c9 z! ]5 \  m! q
  17.   /*Retrieve network descriptor*/7 O* m0 ]; J) a, _
  18.   ai_network_get_info(network_handle, &desc_report);5 @+ {+ n/ ]( ?/ t  c' m! N
  19.   
    6 ]+ j( B! O4 z
  20.   /*Copy descriptor info*/
    1 z1 W; C% ]/ [# u+ A
  21.   ai_input[0]= desc_report.inputs[0];
    ( S" [+ K$ k( i8 P% T8 i! ^. v
  22.   ai_output[0]= desc_report.outputs[0];$ ?0 V( \% ?" A- i& b9 ]& \# @) L% f* I
  23.   
    / C$ j3 ~. h5 H/ Y; r( Z' }
  24.   return desc_report.inputs->data;
    - D, [; a) u( y' b. v8 F; o9 t
  25. }
复制代码

# K% h  X( D$ @) q% m, z运行模型' \( B9 i% T$ ~: A
  1. void ai_run(void* input, void* output)7 o6 `( U# I! o' J, V# Z
  2. {
    3 Z* [7 k$ `7 r, V% w7 n
  3.   ai_i32 nbatch;
    ) _+ i. a, q7 X' Z; \
  4.   8 @1 f# ?8 H) D- ^. L3 H8 c9 n
  5.   ai_input[0].data = AI_HANDLE_PTR(input);+ l4 ?( a" C. i) X
  6.   ai_output[0].data = AI_HANDLE_PTR(output);- T; {9 A- q1 Y  u* _
  7.   8 ]& V3 u. j2 u8 n
  8.   nbatch = ai_network_run(network_handle, &ai_input[0], &ai_output[0]);. }" w2 o; H2 s0 J5 N
  9.   " N( R8 ?8 y4 m9 V  W: e
  10.   if (nbatch != 1) {$ x8 d! O# X3 J
  11.         while(1);
    , ]$ V- r8 C$ C
  12.   }1 g" s) m" l3 P! M) k
  13. }
复制代码
7 F7 F( S' r. j6 u* l
图像接收处理,这个模型要求输入224*224的RGB888的图像,把数据转换一下。4 [" n; A" r: q+ f5 P
  1. void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
    8 e* G: e  W  p) D2 f  P
  2. {
    4 |4 ^; ?- j2 R' E% a
  3.     uint8_t person_flag;( L% k9 }7 e0 a7 P9 R: n
  4.     int i,j;% I- v$ r' v5 p8 T1 [+ \9 T+ d; r
  5.     for(i=0; i<224; i++): I$ |9 j- z8 A7 U; Q
  6.         {
    ( v( I& w( n9 U- a7 g. ~# J8 t
  7.         for(j=0; j<224; j++)4 h  `% A# k3 X' [) u8 F
  8.         {
    , b$ y$ ]; A! |6 N, w+ e- b5 J
  9.             uint16_t bg_color = ((uint16_t *)_OV2640->frame->buffer)[i*320 + j];6 h% g8 U4 g* g% O. t+ K
  10.             network_input[3*i*224 + 3*j + 0] = ((bg_color>>11)&0xff)<<3;4 T4 N* c* J4 V9 q
  11.             network_input[3*i*224 + 3*j + 1] = ((bg_color>>5)&0x3f)<<2;/ S, S+ a9 Y" K; }4 T
  12.             network_input[3*i*224 + 3*j + 2] = (bg_color&0x1f)<<2;5 {& @' |; S6 y5 l7 e) h  B" z
  13.         }
    6 s$ t  D' ^& ~- g3 G5 Q6 k
  14.         }
    - S! p/ Q% l/ @1 `$ ?
  15.     ai_run(network_input, network_output);
    % p+ }2 v% q- B5 b1 D$ T& Z

  16. * X1 V$ t2 E: v. o" M% P9 o$ A! K
  17.     LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);
      r) ]9 }0 g" u9 C. i. W9 B
  18.     LCD_Draw_String(0, 0, 320, 240, 32, output_labels[network_max()]);
      |1 k4 t% g: G& J/ |, M0 {9 I( j% t
  19.     0 F# Z4 _- i: K, i* G/ e$ F, u5 a
  20.     OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);& X! u  i/ `( e) q5 a# X
  21.    
    9 F1 V9 N- j5 J! Y& u; ~3 }" j
  22. }
复制代码

  N  z8 [6 `& G* }7 w
" h5 \1 ]/ e: a5 S% ~运行效果(一共能识别18种食物,这里选了几个看看)
4 u9 @* H3 P0 P) c% B
2 R0 R7 q4 ]9 E1 U: X/ A, J# J! x
空* a+ S8 B) K/ h% {/ g' C- N
IMG_20221031_113022.jpg ! [2 ]; V" d& B' x, W) x
可乐
# H9 I" [' f. p$ V: t$ ] IMG_20221031_102903.jpg
- r: M4 T% n4 j1 ~5 [. a' e  g7 Q, Y$ y0 H& _  O9 z
甜甜圈
9 b3 i) Q# W; j5 { IMG_20221031_103256.jpg
$ D$ I! ~4 |2 w" g' B6 [% c& E& x, d2 Z7 z  s! L$ G
汉堡包2 X# Q& H2 v; t7 u0 I; ?1 V. K
IMG_20221031_103432.jpg 3 H' n, W9 k7 m9 R' d  i& B
9 O9 k7 l+ B& }4 y5 p  F
薯条2 }3 T. U0 b" B% M5 V5 Y: L0 W8 \
IMG_20221031_103710.jpg
' O  W( P# L% Z9 P
& d( U5 ~. ?1 d/ v# u$ Y9 T5 c3 S% j5 b* v" W( `
小结:STM32Cube.AI工具真的太香了,这里仅仅演示了模型的部署,其实可以快速验证AI模型在目标板上的运行情况,只用串口连接,直接把输入发送到单片机,然后运行完后把结果返回来,全部都集成到了一起,快速验证模型运行情况。很是方便(本文未涉及,有需要的可以在X-CUBE-AI行下勾选时,application里面选择validation,回到配置界面后设置通信接口即可)" y& d3 Y: m4 U
Wio Lite AI视觉开发套件确实是开发AI的很好的选择之一,板子虽小五脏俱全,拿来做单片机视觉绰绰有余,但是不得不吐槽的一点是资料支持太差了,原理图,代码全都藏起来,前期调驱动花了很长的时间,后来管管给了一个例程后好转了一些(但是已经晚了。。。),Ai在单片机上应用已经有很多厂商都推出类似的解决方案了,ST这一个环境很优秀,就是如果相关的培训跟资料再多一点就好了。
% ?" k! D6 f. o5 I* p/ U/ Y: X
赞 收藏 评论5 发布时间:2022-10-31 11:43

举报

5个回答
wj20180813stm32 回答时间:2022-11-16 10:02:15
很好
  q9 d& C+ Q# p6 t
萨法 回答时间:2024-11-24 21:35:02

up有没有原理图资料~

求求了

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

<br /> <br />

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

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

<br /> <br />

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

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

<br /> <br />

按这个文章操作就行

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版