Tensorflow Lite Micro是tensorflow框架针对微控制器应用场景所专门设计的深度学习推理框架,它占用的资源少,运行时内存最低只需要16KB,同时其兼容tensorflow框架,依托于Tensorflow平台强大的生态背景,使得更多开发者可以方便的集成、使用AI算法,为端侧带来人工智能的新活力。其中Tensorflow Lite模型也被ST的AI工具所支持,但是我们这次是不通过STM32提供的AI工具,而是移植Tensorflow Lite代码去运行其模型。7 y' Y5 _; L0 Q0 |, P% a
- T2 O2 X# e. ]1 N A9 ~! J% Z
首先获取Tensorflow LiteMCU版的源代码:https://github.com/tensorflow/tflite-micro
# o" l7 M4 h3 `8 G, L K1 ^
0 Z$ @( H9 F; {! D" X" r" K8 p根据教程获取工程代码:TFLITE-micro/new_platform_support.md at Main ·张量流/TFLITE-micro ·吉特哈布 (github.com)
. O9 Y% {# I, K6 |' t; y
' Z7 g: z6 ]0 P文件都扔工程里面,太多了,截图只是一部分。把CMSIS-NN库(算子加速)也扔进去,加速运算9 U7 F, B3 r: R; B1 T
5 i9 Z7 v; T+ a" g/ X1 D- R" G2 I
2 u* [' L4 X! y6 @2 \ L( y; x* N
添加相关路径
5 u8 f& ]8 @7 B- O) W
( n2 v: j+ P5 e7 `3 c1 S, p! v7 Z2 s! `9 F9 S
设置工程,使用AC6编译,关闭Keil的Microlib库
; m; _; d/ o6 n' }* {
, I8 s6 _% K) G4 g+ Z; w5 N ]. p, M4 n7 m' k1 ^
编译选项使用-Os,这样代码体积小点( R; u5 r% q- N5 {! Y% ?
) \( l. s1 L4 |0 `9 @
" P. e$ G" o% K# _图像预处理函数。模型要求输入神经网络的图像为灰度图,为完成摄像头获取的RGB彩图到模型输入需要的灰度图转换,需从输入的RGB565像素格式中解析出R、G、B三通道的值,再根据心理学公式计算出单个像素点的灰度,具体代码如下:- uint8_t rgb565_to_gray(uint16_t bg_color)
( S" }, Z, c: P, g8 m( h - {
7 R. L5 N4 b, f; C. E4 o - uint8_t bg_r = 0;
4 l: o7 T. v8 y* s! o - uint8_t bg_g = 0;
" T" E5 u+ a+ s/ N - uint8_t bg_b = 0;, {# \6 W t( G; {8 q1 ~7 A& F1 G
- bg_r = ((bg_color>>11)&0xff)<<3;
. ~+ W* k6 m' O - bg_g = ((bg_color>>5)&0x3f)<<2;3 I' R' s" [/ o
- bg_b = (bg_color&0x1f)<<2;
0 r$ H/ O3 n; d: T, n9 x b - uint8_t gray = (bg_r*299 + bg_g*587 + bg_b*114 + 500) / 1000;
2 s6 Z5 r6 b! R - return gray;( J7 m+ f9 z( `' L* r# V6 E
- }
& p$ K" |+ m) G2 G9 J* H
$ R6 S" |/ }/ W6 ]' ~- void input_convert(uint16_t* camera_buffer , uint8_t* model_buffer)9 l1 _% ]2 Q9 D8 ^8 w
- {
2 e1 i2 H w/ P2 i6 S - int i,j;! `! O& i6 G2 z
- for(i=0; i<96; i++)9 M# r( v: `' f% G+ q; j; K
- {
5 }0 ?1 t! @$ c& ?% t - for(j=0; j<96; j++)
! r, s# X. p% V+ e) C! p6 ^1 ^ - {
; M# M6 s ^ } - model_buffer[i*96+j] = rgb565_to_gray(camera_buffer[i*2*320 + j*2 + 64 + 320*24]);4 [# g4 z9 h# i7 M4 u- u
- }
/ r% X* d" M; A3 k6 Q - }
8 F, O. P1 R' v: D% Y( W8 K - }
复制代码 9 `2 f1 D- t" Q; }, ~
在图像接收中断里面处理识别过程- void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi); e* w! Y% N2 y% N1 b7 N) r
- {
1 R; V& K7 j, O7 l9 A3 o7 _ - uint8_t person_flag;
4 h3 U5 ?% { s: N; R - ; F' u) g: \4 |' a
- //转换图像为模型可处理的大小
' K( F7 R @9 s( g - input_convert((uint16_t*)_OV2640->frame->buffer, model_buffer);
6 e/ V \2 w, U1 [0 m; |0 N3 i - person_flag = person_detect(model_buffer); //运行模型$ K$ R; e5 u* L+ r; S- U2 ?
-
; P# ^) E. n3 ?9 d0 a0 S7 {6 f4 E3 ` - LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);
1 }9 H. f6 N/ O - for(int i=0;i<192;i++)
5 c6 K; K4 O4 g* G - {
3 {3 {# P* Z8 t% x3 J( s+ z - LCD_Draw_Point(i+64, 192+24,0xf100);
# m1 K( r9 O9 H2 p6 ] - LCD_Draw_Point(192+64,i+24, 0xf100);
, v( Z8 _& c \7 \6 ~ - LCD_Draw_Point(i+64, 0+24, 0xf100);" c4 a9 z3 H3 E8 f6 g" Y
- LCD_Draw_Point(64, i+24, 0xf100);1 K4 [ @; _. S2 e. T$ ?
- }9 K6 H9 l# ?$ O9 B1 A
- if(person_flag!=0)LCD_Draw_String(0, 0, 320, 240, 32, "people");
: W9 W; P( |7 ~/ S) k -
, H8 y6 d' c, e' ^. k4 |$ \0 n- C5 _ - OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);* @4 C: f0 ?/ R4 ~4 ` A
- }
复制代码 4 R1 V; ~# q% ?, q4 ?$ @: {
# h3 Z6 Y% L# f( [9 x3 D; u/ E. V+ H5 G
- R! {& {. M% N3 [; U3 g
运行效果:* y: k! m, r6 E% W% |) O0 ~
识别充电器(无反应)
. i: A3 R: _9 D$ D. ] l/ I
: r3 s$ M. I4 ~: T O; c b
: v' K, m- o9 O
* {- Q( S7 H3 ]4 [- A) u识别打火机(无反应)( {7 F3 e D$ F
9 }# F, e! X; z7 B9 H( K
; j- b% K, ^' _( B! I5 v% Y+ n* j6 l识别人体(显示people)7 H4 K" Y2 J, l2 W* c9 |$ l5 j
, c. x6 P0 t f7 S3 e
- A# Q9 Y/ L! A* m, W/ G, h0 H4 I$ s0 j* b' a2 q9 z
. G- d0 T1 o6 D% [% d% T" |
|
你好,请问有些源文件是重名的,该怎么才能解决冲突
一些是需要删掉的,二选一