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

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

[复制链接]
奇迹 发布时间:2022-10-31 11:43
在经历完各种准备工作后,现在终于来到了正主。直接部署Tensorflow Lite Micro那一套玩意确实没啥问题,但是太麻烦,要添加一大堆文件,还得用它家训练生成模型,然后转换,麻烦的很,在ST平台,怎么能不提到用ST自家工具去部署模型,方便快捷,简单实用。
1 ]. |* E5 y: A9 @2 E. z拿出之前准备的工程,选取ai开发需要支持的软件包cue-ai,在software packs点select components( {$ ?" j/ P0 O0 h
微信截图_20221029165303.png , ]& R& v5 p6 r7 g  x' @' A- Z5 L

/ l& V$ A1 V5 R) e, l7 |2 v1 \' t  M) T+ x

% R  F8 C0 Y, D. s/ Z在X-CUBE-AI行下core勾选,点OK完成
) {/ H1 {& f/ ^ 微信截图_20221029165346.png ) M# O- j" B9 v( w; f& P

: y/ D9 L( I, g  i

6 Y- T4 H/ f. P4 c, V回到引脚配置页面,最下方就是上面导入的CUBE-AI工具包" C7 b' g6 S+ t  Y
微信截图_20221029171555.png ; v# D4 }3 w4 J# H* c

$ q' Y! Y" [# j. e! V8 {" [- ?3 |8 \. O. o& N
2 N- S& _' h- W& u
点击+添加,这里要根据自己使用的模型,以及模型特点选择,如下图选择的是原始模型2 ]6 j: G) E9 I
微信截图_20221029171744.png & G# i7 R6 ]3 J2 X4 H4 C

: S/ E8 ?2 P; T" k3 F' t+ P  L这里选择的是量化后的模型(量化可以减少模型的要求,但是精度会下降),点击分析
2 V) y! A2 ]0 Q: i# {7 q0 { 微信截图_20221029172202.png + a1 J2 W! I) k1 v' \9 ?: C
: D. V, q5 l+ ~( \- ~% X' l) ]5 L
分析中- [1 G/ ]' m0 d, N; M
微信截图_20221029171816.png ( q: q: T  E) q' {- O1 D7 c

7 n3 R* }% T) K# \" v! t5 h2 d7 S分析完成会显示是否可以部署到设备上,以及资源使用情况。7 I- N- m6 ]; R5 d/ X; W
微信截图_20221029172246.png * r' T# `9 b* _
) F7 U" O6 p  s* z( i9 i# M
回到工程,有个小bug(使用的STM32CubeMX版本为6.6.1,X-CUBE-AI版本为7.2.0),下图的几个文件路径老是生成错

1 q& {% N3 p" [1 f1 B3 M* V8 D4 N' y8 ]' q* ?) Z; `" V

) W9 ]6 t% d  [- R: Y8 O0 X  X QQ截图20221031110850.png
5 L3 V+ a, m0 Q  I/ _( b& k0 m2 z0 T* O# Y; J  j& ~- Q! r
右键文件打开设置,修改一下路径就行

6 N. d1 `+ L. r# T$ U/ v, g3 D( T/ T+ d
QQ截图20221031110911.png
& t: b) h2 {; i7 U, |
/ @9 f9 x7 X. M# [5 j头文件路径也有一样的问题
. g  o- H3 k9 n2 @ QQ截图20221031111258.png   `, p% W, X% l

; l+ P$ c) i( Y# y, j初始化模型
  1. ai_handle ai_init(void)
    & D1 N* {( m' B' c' G
  2. {
    " h$ R5 T) O, T
  3.   network_handle = AI_HANDLE_NULL;
    & V$ p' g. ^9 q

  4. 0 f7 `* ~3 ^- e& G! b
  5.   /* Creating the network */! s6 k. r3 L+ d
  6.   ai_network_create(&network_handle, AI_NETWORK_DATA_CONFIG);- a* B- I; t7 I: E" m' F
  7. 0 j( V% R. G: S
  8.   /* Initialize param structure for the activation and weight buffers */6 X8 v9 a4 V/ v6 t' L
  9.   const ai_network_params params = AI_NETWORK_PARAMS_INIT(, M, [1 C- r% ^) {% H
  10.     AI_NETWORK_DATA_WEIGHTS(ai_network_data_weights_get()),3 G* y' O$ S" [1 R3 {
  11.     AI_NETWORK_DATA_ACTIVATIONS(activations)* C/ u/ q7 `5 `7 G& r
  12.   );8 a$ v! v/ K; i% Z" T
  13. 9 b% }5 c* w& R) |
  14.   /* Initializing the network */
    " ~' Z' \; X) {6 w+ Z
  15.   ai_network_init(network_handle, ¶ms);$ u1 ^/ n$ e- N3 |% U
  16.   1 ]8 D/ D3 b' a" f/ q# Q1 D
  17.   /*Retrieve network descriptor*/0 \! a( Q: s1 k
  18.   ai_network_get_info(network_handle, &desc_report);& H) }1 w" ~4 ~0 o+ @8 q
  19.   ( Y$ m/ u" q7 y: s: f& w
  20.   /*Copy descriptor info*/
    2 N+ m- h$ }9 i& m  y
  21.   ai_input[0]= desc_report.inputs[0];
    5 @4 K7 v, X" W( e* z6 g5 o
  22.   ai_output[0]= desc_report.outputs[0];
    % I. p! f# }) S
  23.   
    7 Y' o' c9 r; a8 E! n  y+ h( {3 f1 G
  24.   return desc_report.inputs->data;
    ( }' m* C; W; O5 O) `
  25. }
复制代码

/ W  g1 F. u/ e% R8 z, E运行模型
4 l" ]# b0 P  N3 ]% I+ ?5 i7 z6 {
  1. void ai_run(void* input, void* output)
    / Q. f" ]1 B7 C
  2. {
    ' _6 |# O* w& ?8 [8 _( K
  3.   ai_i32 nbatch;
    # Y+ ^6 ~; e/ V2 O
  4.   1 q8 J1 j! p: Z" S) D0 ?: H
  5.   ai_input[0].data = AI_HANDLE_PTR(input);
    5 [- y3 Z( E6 G# F6 {; f0 O" _
  6.   ai_output[0].data = AI_HANDLE_PTR(output);
    / T. v) I/ S7 |* p
  7.   $ z' p. r5 Z. `2 D# Z( V0 Y
  8.   nbatch = ai_network_run(network_handle, &ai_input[0], &ai_output[0]);2 X' v3 [  H( }% v( x: k7 F
  9.   7 L$ e- f1 {1 a1 {1 t5 \0 i! `
  10.   if (nbatch != 1) {
    $ C1 v7 L" f% O( M$ Q
  11.         while(1);) V8 @$ C$ b8 X5 Q1 F
  12.   }8 _) M$ ?- j/ Y9 N6 M/ h
  13. }
复制代码

" x+ E) w6 f  h0 A图像接收处理,这个模型要求输入224*224的RGB888的图像,把数据转换一下。+ v: d. d  @2 ]$ a+ y$ }
  1. void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)% r5 Q( j. A" `, Y/ [( T
  2. {. U& K' e# r/ e' {6 ^  V
  3.     uint8_t person_flag;
    & q7 D0 m% t' ]3 R4 n: l8 _( [
  4.     int i,j;
    . F/ ^6 B4 W1 a; d
  5.     for(i=0; i<224; i++)
    1 G7 o! d7 G+ R( M
  6.         {" u( U; f1 @% y8 o9 V
  7.         for(j=0; j<224; j++)/ T+ P3 l: z( m- v. X4 Q! `) H' N' O
  8.         {4 k& ]6 U# E4 k' @
  9.             uint16_t bg_color = ((uint16_t *)_OV2640->frame->buffer)[i*320 + j];& S0 i1 L# B1 j/ i6 X, [; J; K
  10.             network_input[3*i*224 + 3*j + 0] = ((bg_color>>11)&0xff)<<3;2 q/ T# d: M1 H: v& J+ s  {
  11.             network_input[3*i*224 + 3*j + 1] = ((bg_color>>5)&0x3f)<<2;$ _& s+ V7 T, f8 ~* O* E
  12.             network_input[3*i*224 + 3*j + 2] = (bg_color&0x1f)<<2;
    1 w! ~$ Z- L& t8 \7 d# @) |5 c
  13.         }  O% K% q1 U* [4 E$ L& k# K
  14.         }
    ; z' g$ O$ }. F' S: D* p1 B( o$ u
  15.     ai_run(network_input, network_output);$ ?" \9 G7 z% l4 n% Z% k: f

  16. - D# l3 c& g! R" \- B) t: k
  17.     LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);7 _# m) x9 U7 M1 I% ^
  18.     LCD_Draw_String(0, 0, 320, 240, 32, output_labels[network_max()]);
    9 m9 a2 F. @5 Q) B- m& M
  19.     7 |' g5 L# s% {
  20.     OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);1 g4 Z2 w! N7 u+ h3 m5 X7 w
  21.     * q( ~; a) h9 J$ ^" F" S
  22. }
复制代码
) y; Z7 e' K5 {6 C: N

" i5 S1 A: |% z  x) z3 z6 s& z' x0 H运行效果(一共能识别18种食物,这里选了几个看看)
6 C. R! ]7 J' y

' }' {8 K4 R) d
1 [7 `% I0 n( F3 c; |! d$ ~: R IMG_20221031_113022.jpg 9 u, g4 ]/ f* Y7 q+ y1 y7 K3 Y$ F
可乐( R, q3 [- S# x5 B: A
IMG_20221031_102903.jpg ! T, M2 J6 j2 n8 Y
. D$ p% `* F* a; d5 x
甜甜圈
9 b6 F( J% s* x4 D  f6 A IMG_20221031_103256.jpg ; t) L; k& I" [! Z
1 R1 u; Z1 h! D! V
汉堡包
" }1 i  L  I- M. n IMG_20221031_103432.jpg
: \  K( g8 y0 L, g8 x  W1 S+ E$ Z+ e
% ~/ i+ m" g. m0 C薯条" i: f% ]$ X2 y. P
IMG_20221031_103710.jpg , d8 L/ C- p- b( f1 u7 |& A
, ?3 l& k" M) C' I+ e  M

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

举报

5个回答
wj20180813stm32 回答时间:2022-11-16 10:02:15
很好- V* g4 T1 v+ X
萨法 回答时间: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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版