Tensorflow Lite Micro是tensorflow框架针对微控制器应用场景所专门设计的深度学习推理框架,它占用的资源少,运行时内存最低只需要16KB,同时其兼容tensorflow框架,依托于Tensorflow平台强大的生态背景,使得更多开发者可以方便的集成、使用AI算法,为端侧带来人工智能的新活力。其中Tensorflow Lite模型也被ST的AI工具所支持,但是我们这次是不通过STM32提供的AI工具,而是移植Tensorflow Lite代码去运行其模型。
9 U) w0 O2 g7 q; }$ [( ?" A% Z! j* `
首先获取Tensorflow LiteMCU版的源代码:https://github.com/tensorflow/tflite-micro
. ~! h. T# e( a+ J9 O" t* e" |& u# c- r7 X3 y
根据教程获取工程代码:TFLITE-micro/new_platform_support.md at Main ·张量流/TFLITE-micro ·吉特哈布 (github.com)
. y; Y0 D% M5 d/ ?4 S
% e- f7 Q' U5 v! |8 R9 f文件都扔工程里面,太多了,截图只是一部分。把CMSIS-NN库(算子加速)也扔进去,加速运算
. u. e# h8 U, Q
; Q4 x# }. |" x; y+ a( u7 f
2 S, l5 E$ C5 x" N& G5 a5 h
添加相关路径& P" Q8 z: E C/ H
& K4 i; ]' N3 C- Z7 S+ m
% s: T8 W! p0 r7 _0 z2 P设置工程,使用AC6编译,关闭Keil的Microlib库
! S' o( L. c0 k; o- t2 h
2 U% T, }" R0 }8 L) n3 c$ ^
& n) \# w" U4 |编译选项使用-Os,这样代码体积小点
2 X: O; j2 o! e# J
* E! L( c) Q6 l& X8 u- c+ `7 ~4 z
; b: T1 m# V1 b& l8 k
图像预处理函数。模型要求输入神经网络的图像为灰度图,为完成摄像头获取的RGB彩图到模型输入需要的灰度图转换,需从输入的RGB565像素格式中解析出R、G、B三通道的值,再根据心理学公式计算出单个像素点的灰度,具体代码如下:- uint8_t rgb565_to_gray(uint16_t bg_color)* @ H$ a+ W9 e* g
- {
c" ]8 `( E( a3 M% Q9 M9 x - uint8_t bg_r = 0;1 m& k8 _9 [; x
- uint8_t bg_g = 0;
0 z) Q+ i2 J% L; n2 y - uint8_t bg_b = 0;
3 L6 V g4 w( O, v - bg_r = ((bg_color>>11)&0xff)<<3;
5 o: d( Y. w0 h - bg_g = ((bg_color>>5)&0x3f)<<2;. T8 M, u( f( W0 \) i, y5 V
- bg_b = (bg_color&0x1f)<<2;
3 ]) l1 o5 n3 L) D' f( J - uint8_t gray = (bg_r*299 + bg_g*587 + bg_b*114 + 500) / 1000;/ L+ V" E- x! N- P' `! b- P. F
- return gray;0 s' N7 `% m i' B
- }& @& Q/ L7 j6 y* T& d
# ]5 |8 R$ c$ M: c. S+ {- void input_convert(uint16_t* camera_buffer , uint8_t* model_buffer)8 J9 U0 E: J) N
- {
) V. G* Z+ W& z/ w" g. J% G - int i,j;0 `- ]% L" t3 h0 w& \& i+ T
- for(i=0; i<96; i++)' |) x7 l* m' [
- {3 y5 `- H0 l& H
- for(j=0; j<96; j++)$ n3 j: S; C& j$ i$ \
- {
+ t$ L$ ?( d, f& X, O- y7 [ - model_buffer[i*96+j] = rgb565_to_gray(camera_buffer[i*2*320 + j*2 + 64 + 320*24]);+ i# T7 m+ p' W
- }9 o5 ^5 i2 C4 T9 z. y$ W, `
- }/ ^! @3 f u5 @% D
- }
复制代码
5 C7 R3 }5 Q7 W/ D% e& k# A在图像接收中断里面处理识别过程- void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)2 D8 g) m+ i* e1 |( Z1 ]
- {" p) @/ `- F# ]
- uint8_t person_flag; 1 Z, F' y8 J6 g- V c; p1 ]) n- l+ \
- ) @. Q8 s2 ~4 N, s: d! N7 V! K4 }
- //转换图像为模型可处理的大小
' ?' F. q) `2 M+ f2 }! n- A - input_convert((uint16_t*)_OV2640->frame->buffer, model_buffer);. t( f: x5 k; L
- person_flag = person_detect(model_buffer); //运行模型" S$ ?9 ^7 s1 s. a0 U1 f# Z" K: C
- 1 R5 p+ r o) |7 P
- LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);
9 \% F' `6 b% j4 X) C% e - for(int i=0;i<192;i++)
% U0 X6 l" p& Q) }. ~) P - {$ R0 y5 Y- J K* J+ U
- LCD_Draw_Point(i+64, 192+24,0xf100);7 I0 A8 h4 F# M$ t0 b$ d: ~
- LCD_Draw_Point(192+64,i+24, 0xf100);
6 z1 Z0 U& @7 h8 c - LCD_Draw_Point(i+64, 0+24, 0xf100);- }- g- \) g8 ]* I3 B4 l, T! h8 |
- LCD_Draw_Point(64, i+24, 0xf100);
: g' I7 r$ m+ B. s - }/ J" i# l1 Y) Y& s# ^
- if(person_flag!=0)LCD_Draw_String(0, 0, 320, 240, 32, "people");; q( E' I" L& W( @1 b
-
9 {% ~% Q8 K7 x% x/ \& q - OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4); E4 m& d" O4 D* m" O% l" D
- }
复制代码 3 z: h; F( r6 G0 I8 z
6 y' A& v$ z/ d3 m. M/ H. ]
3 O# _4 C% d4 h2 h- T0 A% W
运行效果:9 Y1 }, |; p3 a7 ]' m
识别充电器(无反应)
3 ~3 P% P0 I( L9 ]# M- g% Y8 w. H" _
/ ~; ~+ W8 j# K8 h& m$ {
3 T* {5 ?% }- l4 V( V6 f+ G& ^" }$ z0 o
识别打火机(无反应)# a7 O' l% u' U" P- y
6 m, f$ z0 G+ C+ n% [# I( b0 n
6 Y. v/ ^" }% q& c识别人体(显示people)
) g: X5 R5 k9 [
$ Z- V- B% R5 A! d3 F0 v
: l9 \: Y- c v, r2 J% N/ i( R1 X
) \ J7 H4 S* h( ]
- l& D7 f( b) B3 U7 g- t: |
|
你好,请问有些源文件是重名的,该怎么才能解决冲突
一些是需要删掉的,二选一