Tensorflow Lite Micro是tensorflow框架针对微控制器应用场景所专门设计的深度学习推理框架,它占用的资源少,运行时内存最低只需要16KB,同时其兼容tensorflow框架,依托于Tensorflow平台强大的生态背景,使得更多开发者可以方便的集成、使用AI算法,为端侧带来人工智能的新活力。其中Tensorflow Lite模型也被ST的AI工具所支持,但是我们这次是不通过STM32提供的AI工具,而是移植Tensorflow Lite代码去运行其模型。
5 B8 L" S( g. n: g# o
# {2 p. O/ J6 B& g- \7 d7 h% X首先获取Tensorflow LiteMCU版的源代码:https://github.com/tensorflow/tflite-micro
; W, O, _ N6 b/ |4 {" h: J
; v; C6 U" J7 P5 n% F, D" z' {8 w2 F根据教程获取工程代码:TFLITE-micro/new_platform_support.md at Main ·张量流/TFLITE-micro ·吉特哈布 (github.com)
: I( g) B2 `- X2 D( ^% |- l! y! a8 s- {
9 h! P+ w( _/ v4 m$ D, z5 T" {文件都扔工程里面,太多了,截图只是一部分。把CMSIS-NN库(算子加速)也扔进去,加速运算
( |2 n+ f5 q8 e& q- B6 s: K
! I' K4 p9 c y+ w/ e* w/ O
, B! z# V. q) B. ]% |添加相关路径, q- r- Z+ g' u3 _& W: p% F9 I3 j
7 G. S9 E# \$ _/ G; L# u
1 q# F* q o7 f# Q3 @5 _设置工程,使用AC6编译,关闭Keil的Microlib库
/ y- {9 @2 y) h/ j6 l+ {: b1 p5 N
7 V& `- c0 y& ]/ E) K5 g4 l; N
3 L1 r+ Z$ _% [, d) G编译选项使用-Os,这样代码体积小点
( Y: E4 X& Y8 I5 X4 r4 `+ w: K
# K' `' u0 W. N% G; \' e. G' g/ y+ C, t& D! Q
图像预处理函数。模型要求输入神经网络的图像为灰度图,为完成摄像头获取的RGB彩图到模型输入需要的灰度图转换,需从输入的RGB565像素格式中解析出R、G、B三通道的值,再根据心理学公式计算出单个像素点的灰度,具体代码如下:- uint8_t rgb565_to_gray(uint16_t bg_color): T7 c, Z3 r, Y% Z
- {8 G6 S* g; f, M6 j2 }$ e- Q
- uint8_t bg_r = 0;
' o, G2 Q) A. \) E2 S1 _( } - uint8_t bg_g = 0;
" l& O0 m1 C; ~+ T* E% Q4 z N - uint8_t bg_b = 0;( z2 b% y' c! U: p4 R; }& {( s
- bg_r = ((bg_color>>11)&0xff)<<3;) b' c( |: l+ t) e# K( V( d
- bg_g = ((bg_color>>5)&0x3f)<<2;/ F* M. K4 H! ^! t6 J
- bg_b = (bg_color&0x1f)<<2;/ ?4 l# ]6 N6 m
- uint8_t gray = (bg_r*299 + bg_g*587 + bg_b*114 + 500) / 1000;% i7 ~! Z4 j0 M# L% K9 ^+ }" A
- return gray;- L1 I( z" L8 _( F) t
- }
3 _8 l* Y) T K! D b( i6 l, M
& Y# U! n3 P8 U3 r/ A v- void input_convert(uint16_t* camera_buffer , uint8_t* model_buffer)
9 I" [5 j! z$ j - {& k! R) E& V) f& l5 L# G/ ]' ]
- int i,j;
9 E8 _$ t, D; S7 @ - for(i=0; i<96; i++)+ B! l5 ^0 z$ n. E( I9 _( q- U( `
- {7 B1 g! K- A- O" U- C8 H- i
- for(j=0; j<96; j++)- g) ^3 J* T9 X$ n$ F4 R
- {; e, ?9 G5 n' R1 }
- model_buffer[i*96+j] = rgb565_to_gray(camera_buffer[i*2*320 + j*2 + 64 + 320*24]);% a1 P( U( X' f5 ~ a1 n K9 F
- }: K9 M4 q2 k* z0 Z3 C/ Y
- }
3 | b9 K) A" p0 b4 F3 O - }
复制代码
V; I l; D- Z在图像接收中断里面处理识别过程- void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)4 f( N2 x- D! ~2 T0 E; S- r/ [2 Q# X
- {
9 U- t& q: {1 m- A3 z2 _ - uint8_t person_flag; # S3 T& A/ [8 l
3 \( o9 |+ l1 S% r* j- //转换图像为模型可处理的大小
7 r- y6 l& o7 l* s Z - input_convert((uint16_t*)_OV2640->frame->buffer, model_buffer);4 d5 j2 a$ v9 ]/ A3 P( L# `
- person_flag = person_detect(model_buffer); //运行模型
7 \0 Y; I" T, x% j u' ^( I -
4 o; ^0 F3 |/ J% ]7 z0 Q - LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);
5 j m# D* p* H% v - for(int i=0;i<192;i++)# R: z+ @, T2 D {/ ~- w
- {
' Q/ o3 a, }' E) J - LCD_Draw_Point(i+64, 192+24,0xf100);/ k! a: p6 C4 X& Z9 s% X
- LCD_Draw_Point(192+64,i+24, 0xf100);
. f" o6 c& c6 M D0 ?+ R - LCD_Draw_Point(i+64, 0+24, 0xf100);
2 G# j2 m7 X( ]! u5 l" E - LCD_Draw_Point(64, i+24, 0xf100);
" F5 j- ]6 ?( U- {' ?! ^' x8 @2 e - }
$ e5 x1 k' L& E W" A* ` - if(person_flag!=0)LCD_Draw_String(0, 0, 320, 240, 32, "people");
& Z: T6 n b7 R( ]; [ -
3 ]+ O2 T8 Q+ u- e - OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);
( n! V+ A, V- l2 u3 g - }
复制代码 3 G+ @+ e- P9 q& Z
( D$ ^ }. S0 _( h
9 A2 T6 r: I- @
运行效果:
6 G" Z3 f9 s x9 A4 x% D; E8 v3 f6 q识别充电器(无反应)6 B1 g* X; O: N8 O3 H% O
% u/ Y/ I; K) @" i c- M- r/ b
1 K3 W! m3 m8 I2 g' j4 Q
4 ~! O1 j6 R: v( X0 C: F
识别打火机(无反应)
2 v8 @; b9 c4 t' p2 X/ i
6 u" [1 {8 d9 c# [# n) E
: u0 T8 S3 H% h; U. L) V识别人体(显示people)
2 k3 I2 J1 w& c+ M r/ M
2 L N6 q! r$ P
4 }2 {6 H% V5 H) w* K0 S# u- B) T
3 u9 V, g# [' r# {- A% s% I
2 h# j9 c( ~; W) R0 k( d9 R0 |6 S
|
你好,请问有些源文件是重名的,该怎么才能解决冲突
一些是需要删掉的,二选一