在经历完各种准备工作后,现在终于来到了正主。直接部署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
. 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
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
' 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 |
" \8 R- b1 P1 B2 D$ X
6 z' L6 {' [- _
这里选择的是量化后的模型(量化可以减少模型的要求,但是精度会下降),点击分析
9 \7 P4 @ u+ C( T- S; }8 K
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
# _$ y( r: ` J9 D1 Z% J/ k+ Y8 b5 G8 _
分析完成会显示是否可以部署到设备上,以及资源使用情况。) m7 W( y) x" D' I
* 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
, }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
% U( s; X: P( \& Z7 s, ? s
" L, b/ k- |( G9 C1 L
头文件路径也有一样的问题: j8 n: C9 i8 K9 t
0 S6 Q! I3 o" A* u x
4 q8 l3 q6 j: s G初始化模型- ai_handle ai_init(void)) X' ]: ^0 d0 I+ R- j
- {
: t" m% \! U3 [! Z- Y& x% ] - network_handle = AI_HANDLE_NULL;
" O7 p; V6 t9 C) ?! ? - 9 c4 H8 b& [7 g& e# s
- /* Creating the network */5 x2 g+ t7 D* T; b6 Z
- ai_network_create(&network_handle, AI_NETWORK_DATA_CONFIG);
6 I0 |" Z& P- { |5 h. b - . ]3 E7 y. Y: f/ u
- /* Initialize param structure for the activation and weight buffers */6 J6 C2 |$ u, A7 O
- const ai_network_params params = AI_NETWORK_PARAMS_INIT(/ t, e( a% M9 D0 N- W6 s
- AI_NETWORK_DATA_WEIGHTS(ai_network_data_weights_get()),$ T, q$ X6 w3 |7 z
- AI_NETWORK_DATA_ACTIVATIONS(activations)
' N- T9 m% T- [1 G) }; ~/ T - );
( y) W2 E$ V8 L. u1 O
% w, \1 f* W2 b' }- /* Initializing the network */$ ?( c& u: b* L: S# J- z
- ai_network_init(network_handle, ¶ms);
c" A! f: B* D# K+ Y, y; `% Z% L" ]# m, ^ - ; h c9 z! ]5 \ m! q
- /*Retrieve network descriptor*/7 O* m0 ]; J) a, _
- ai_network_get_info(network_handle, &desc_report);5 @+ {+ n/ ]( ?/ t c' m! N
-
6 ]+ j( B! O4 z - /*Copy descriptor info*/
1 z1 W; C% ]/ [# u+ A - ai_input[0]= desc_report.inputs[0];
( S" [+ K$ k( i8 P% T8 i! ^. v - ai_output[0]= desc_report.outputs[0];$ ?0 V( \% ?" A- i& b9 ]& \# @) L% f* I
-
/ C$ j3 ~. h5 H/ Y; r( Z' } - return desc_report.inputs->data;
- D, [; a) u( y' b. v8 F; o9 t - }
复制代码
# K% h X( D$ @) q% m, z运行模型' \( B9 i% T$ ~: A
- void ai_run(void* input, void* output)7 o6 `( U# I! o' J, V# Z
- {
3 Z* [7 k$ `7 r, V% w7 n - ai_i32 nbatch;
) _+ i. a, q7 X' Z; \ - 8 @1 f# ?8 H) D- ^. L3 H8 c9 n
- ai_input[0].data = AI_HANDLE_PTR(input);+ l4 ?( a" C. i) X
- ai_output[0].data = AI_HANDLE_PTR(output);- T; {9 A- q1 Y u* _
- 8 ]& V3 u. j2 u8 n
- nbatch = ai_network_run(network_handle, &ai_input[0], &ai_output[0]);. }" w2 o; H2 s0 J5 N
- " N( R8 ?8 y4 m9 V W: e
- if (nbatch != 1) {$ x8 d! O# X3 J
- while(1);
, ]$ V- r8 C$ C - }1 g" s) m" l3 P! M) k
- }
复制代码 7 F7 F( S' r. j6 u* l
图像接收处理,这个模型要求输入224*224的RGB888的图像,把数据转换一下。4 [" n; A" r: q+ f5 P
- void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
8 e* G: e W p) D2 f P - {
4 |4 ^; ?- j2 R' E% a - uint8_t person_flag;( L% k9 }7 e0 a7 P9 R: n
- int i,j;% I- v$ r' v5 p8 T1 [+ \9 T+ d; r
- for(i=0; i<224; i++): I$ |9 j- z8 A7 U; Q
- {
( v( I& w( n9 U- a7 g. ~# J8 t - for(j=0; j<224; j++)4 h `% A# k3 X' [) u8 F
- {
, b$ y$ ]; A! |6 N, w+ e- b5 J - uint16_t bg_color = ((uint16_t *)_OV2640->frame->buffer)[i*320 + j];6 h% g8 U4 g* g% O. t+ K
- network_input[3*i*224 + 3*j + 0] = ((bg_color>>11)&0xff)<<3;4 T4 N* c* J4 V9 q
- network_input[3*i*224 + 3*j + 1] = ((bg_color>>5)&0x3f)<<2;/ S, S+ a9 Y" K; }4 T
- network_input[3*i*224 + 3*j + 2] = (bg_color&0x1f)<<2;5 {& @' |; S6 y5 l7 e) h B" z
- }
6 s$ t D' ^& ~- g3 G5 Q6 k - }
- S! p/ Q% l/ @1 `$ ? - ai_run(network_input, network_output);
% p+ }2 v% q- B5 b1 D$ T& Z
* X1 V$ t2 E: v. o" M% P9 o$ A! K- LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);
r) ]9 }0 g" u9 C. i. W9 B - LCD_Draw_String(0, 0, 320, 240, 32, output_labels[network_max()]);
|1 k4 t% g: G& J/ |, M0 {9 I( j% t - 0 F# Z4 _- i: K, i* G/ e$ F, u5 a
- OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);& X! u i/ `( e) q5 a# X
-
9 F1 V9 N- j5 J! Y& u; ~3 }" j - }
复制代码
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
! [2 ]; V" d& B' x, W) x
可乐
# H9 I" [' f. p$ V: t$ ]
- r: M4 T% n4 j1 ~5 [. a' e g7 Q, Y$ y0 H& _ O9 z
甜甜圈
9 b3 i) Q# W; j5 {
$ 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
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 \
' 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 |
up有没有原理图资料~
求求了
<br /> <br />
好久之前做的了,资料都忘了放哪里了。。。你可以在网上找找,或者找卖家要
<br /> <br />
up 有更详细一点的建文件工程的教程吗? 还有模型怎么弄上去, 求解
<br /> <br />
按这个文章操作就行