Tensorflow Lite Micro是tensorflow框架针对微控制器应用场景所专门设计的深度学习推理框架,它占用的资源少,运行时内存最低只需要16KB,同时其兼容tensorflow框架,依托于Tensorflow平台强大的生态背景,使得更多开发者可以方便的集成、使用AI算法,为端侧带来人工智能的新活力。其中Tensorflow Lite模型也被ST的AI工具所支持,但是我们这次是不通过STM32提供的AI工具,而是移植Tensorflow Lite代码去运行其模型。, S0 |" m! N& T+ R6 ]* C# P$ ^
5 G5 O$ ?8 o' V/ f
首先获取Tensorflow LiteMCU版的源代码:https://github.com/tensorflow/tflite-micro# m8 ^3 u0 A1 |5 x! {
" N5 j3 g! O( v$ d
根据教程获取工程代码:TFLITE-micro/new_platform_support.md at Main ·张量流/TFLITE-micro ·吉特哈布 (github.com)/ P4 i" M" I4 P4 Q8 y( K2 o
- V$ N" u$ V& s8 U( U0 x' \
文件都扔工程里面,太多了,截图只是一部分。把CMSIS-NN库(算子加速)也扔进去,加速运算% z4 n; V& C% X- N' @* `# P
3 P- @& x! p; ~* d! O1 Y d1 w6 D+ F+ y$ p
添加相关路径
4 p; b( x! F% I& w6 c4 \$ `! z
: h! O4 w% ?3 Q7 Z- M# {
) r1 `3 a. v' _) z9 n/ }8 y% W设置工程,使用AC6编译,关闭Keil的Microlib库8 N: L/ P+ U7 j9 E- x) q
& a; l& T" c3 q O" b/ H( i
: ?( A# R# t$ F# Z8 W9 [编译选项使用-Os,这样代码体积小点
3 [7 e: ^6 @$ e" r2 K$ `
- f7 Y, e C) }5 ~8 _. t; q- N7 l
图像预处理函数。模型要求输入神经网络的图像为灰度图,为完成摄像头获取的RGB彩图到模型输入需要的灰度图转换,需从输入的RGB565像素格式中解析出R、G、B三通道的值,再根据心理学公式计算出单个像素点的灰度,具体代码如下:- uint8_t rgb565_to_gray(uint16_t bg_color)
- F1 Y9 ~) A3 L - {
) E' j! E7 h8 i U9 R* A" q8 d - uint8_t bg_r = 0;
8 l1 S& D5 y! W3 c) Z - uint8_t bg_g = 0;. a6 [, e- `4 c8 c: f2 y" x
- uint8_t bg_b = 0;
H) m' ?9 Y% F( c; ^, m4 D - bg_r = ((bg_color>>11)&0xff)<<3;
6 F9 I& \! [% D" E - bg_g = ((bg_color>>5)&0x3f)<<2;* a1 Y. N; D* v0 V, p; V& |
- bg_b = (bg_color&0x1f)<<2;
7 E) J) J3 C3 _& a3 b - uint8_t gray = (bg_r*299 + bg_g*587 + bg_b*114 + 500) / 1000;
_7 @. Y4 z, R$ {+ W - return gray;
6 G* Y* e# Q B# W. b: o - }
5 k1 w# l* ~# J& q- p - 3 U' p2 ?$ x6 W( }
- void input_convert(uint16_t* camera_buffer , uint8_t* model_buffer)% B2 ?8 X$ J! T
- { m/ g( n! o' q
- int i,j;
7 ?% Z/ p! h |4 Y - for(i=0; i<96; i++)( h( ~. m' D2 p
- {
5 D3 E2 Q/ B% t* a9 v& o8 W - for(j=0; j<96; j++) p- N$ J# M9 P+ \: G9 Q
- {
% z' N- J7 u% @6 _0 Q - model_buffer[i*96+j] = rgb565_to_gray(camera_buffer[i*2*320 + j*2 + 64 + 320*24]);0 t* m. G; H: @2 N' Q# Z4 f1 O
- }
& l7 M2 U: m$ ^3 R - }* D- U* B) Y" L' e
- }
复制代码
: x/ Y u5 _$ r在图像接收中断里面处理识别过程- void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
! J$ s3 F6 b9 c9 d5 E - {
4 B$ ^1 O8 W. V# S L" O( o6 d - uint8_t person_flag; $ X/ j6 p! W0 {' `. T( H5 M8 `
- . z- U3 O- M1 K# O" l: O2 X2 Z
- //转换图像为模型可处理的大小: N6 r; Z( c# Y, r0 m
- input_convert((uint16_t*)_OV2640->frame->buffer, model_buffer);
" s4 X! g" y, w/ a' D - person_flag = person_detect(model_buffer); //运行模型4 |, U9 k7 L4 k
-
& [; Q. x. [* w5 {3 J, k! `$ ^6 }& R - LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);
. m& U- y' }1 @8 Y" k2 @" O/ Z* ~# ~ - for(int i=0;i<192;i++), D8 C7 t: J* p! B3 L$ U5 f
- {( D+ }3 W6 s1 u6 J
- LCD_Draw_Point(i+64, 192+24,0xf100);* S9 v! q s" B; B
- LCD_Draw_Point(192+64,i+24, 0xf100);3 [! S L4 Q8 Q
- LCD_Draw_Point(i+64, 0+24, 0xf100);
) ^3 H0 r4 N' m! T7 [- n - LCD_Draw_Point(64, i+24, 0xf100);
' U1 G; u3 J4 w% X2 Z, q) U - }; F9 i9 }. U+ h0 n' l0 ~* S
- if(person_flag!=0)LCD_Draw_String(0, 0, 320, 240, 32, "people");
) {5 j, C d1 Y7 j2 C - M; {" l; U/ U) H9 r/ Z: p" F
- OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);0 i' b2 Y( o, h" _6 ~ t( {% O3 B
- }
复制代码
' J/ ?& n, a. a) y: _9 m& i0 A& |) b- m& A* q; {7 U# g2 U- |3 N/ G V
8 N. h& M4 a8 E2 y运行效果:
; ~$ p5 {5 a, O* ]( R识别充电器(无反应)& E) W+ r1 o& M# ?2 u
A- l7 I) ]! C1 W3 s6 }
9 o, H2 D7 @' M3 \7 @
; X. \( G9 N$ q6 ?, G+ A$ p识别打火机(无反应)1 P: O- t# z Z) k1 k
4 A9 j: A& ]9 }0 s+ K) N2 Y% d2 n7 }! O3 i
$ _7 T" Q9 A1 m) k3 G
识别人体(显示people)
! i/ M! R( r% O" A" E: o* v
. Z; m' B, W5 S1 R# T
0 w+ }. l% G6 `5 |5 t* m, \" G; Y' ~2 S; |; p N5 i1 R
u g/ @* s3 C @1 R6 ^5 P
|
你好,请问有些源文件是重名的,该怎么才能解决冲突
<br /> <br />
一些是需要删掉的,二选一