Tensorflow Lite Micro是tensorflow框架针对微控制器应用场景所专门设计的深度学习推理框架,它占用的资源少,运行时内存最低只需要16KB,同时其兼容tensorflow框架,依托于Tensorflow平台强大的生态背景,使得更多开发者可以方便的集成、使用AI算法,为端侧带来人工智能的新活力。其中Tensorflow Lite模型也被ST的AI工具所支持,但是我们这次是不通过STM32提供的AI工具,而是移植Tensorflow Lite代码去运行其模型。# P2 O9 `/ \: ?6 w
4 W) G0 S6 s+ Y$ W9 t- M首先获取Tensorflow LiteMCU版的源代码:https://github.com/tensorflow/tflite-micro
& T" {7 f4 z7 N7 H) I5 u) f, O. u9 U2 \
根据教程获取工程代码:TFLITE-micro/new_platform_support.md at Main ·张量流/TFLITE-micro ·吉特哈布 (github.com)0 S( ~7 B# C% ^; w' J" D: R4 Q: t
/ ^) R6 Z9 u# Z% i/ n M
文件都扔工程里面,太多了,截图只是一部分。把CMSIS-NN库(算子加速)也扔进去,加速运算
/ l: f n ]& r' }5 p
7 S; V- y+ U. ?! u3 _/ {
. F: v4 p! i) }' o; X) s0 Z添加相关路径4 _% J8 n) k% u e. f4 i
& ?4 j, L4 ?' a v: q% W, `- ], q5 Z
设置工程,使用AC6编译,关闭Keil的Microlib库
+ A9 x3 T1 U& ]0 G6 u
* P, q$ |$ K V( N( E
6 A4 N7 F* o% y; ]" Y# {
编译选项使用-Os,这样代码体积小点: l6 _% e) J4 } N8 |& n
. P* f" c3 t4 P) ]$ `2 Y
+ y: R3 y. t/ d- e4 }; d
图像预处理函数。模型要求输入神经网络的图像为灰度图,为完成摄像头获取的RGB彩图到模型输入需要的灰度图转换,需从输入的RGB565像素格式中解析出R、G、B三通道的值,再根据心理学公式计算出单个像素点的灰度,具体代码如下:- uint8_t rgb565_to_gray(uint16_t bg_color)+ Q. C/ M3 c, F/ b; o# a
- {+ y6 x! g+ ]0 x) n" ^- P8 e
- uint8_t bg_r = 0;7 f2 ?% T4 J3 d6 y. q: K
- uint8_t bg_g = 0;
* a8 J9 ~2 b' p; Q) j - uint8_t bg_b = 0;# x6 E. t) M1 f
- bg_r = ((bg_color>>11)&0xff)<<3;$ y4 t# }7 L& U; Q
- bg_g = ((bg_color>>5)&0x3f)<<2;
' N A) t- J1 r9 i; u I9 E* r - bg_b = (bg_color&0x1f)<<2;3 F3 d( P+ S! k
- uint8_t gray = (bg_r*299 + bg_g*587 + bg_b*114 + 500) / 1000;
7 s5 I7 m9 n4 S3 H8 M - return gray;
5 x' J3 c/ V8 [6 l8 Z" { - }
h2 D! m2 e6 ^0 o. U1 F1 `
3 l: D# l4 H0 Q* n$ N5 s- void input_convert(uint16_t* camera_buffer , uint8_t* model_buffer)5 a2 G- d3 c0 e2 U! p+ J6 F9 x K+ h
- {
% A2 w* F2 Y/ E$ Z; {" q8 k8 j - int i,j;
3 V' l. r# W2 C: L - for(i=0; i<96; i++)
9 D! S+ P1 k% q! c" w3 k8 ]5 G - {. l2 x# e) f q0 E# ^% G
- for(j=0; j<96; j++)* M* h% Z6 D" q+ `7 D. [# [
- {
2 d+ f& i. x0 ]( N7 { - model_buffer[i*96+j] = rgb565_to_gray(camera_buffer[i*2*320 + j*2 + 64 + 320*24]);
+ \6 F% \: \( b7 H% m - }
! v. C+ F6 R& t% D3 W - }
4 V* T4 ~2 E1 U m+ P8 d - }
复制代码 4 h" @ o- v9 D2 `4 J. b1 `
在图像接收中断里面处理识别过程- void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
Q* P3 Z2 ?( W% k - {
3 D1 l6 }8 d5 k! ?: E* ^3 c: b - uint8_t person_flag;
# _# r2 _- {7 L D
* `8 v$ ^/ |/ `+ ?- //转换图像为模型可处理的大小
1 O" ]! A6 J/ I' \5 ~9 N5 W/ Z - input_convert((uint16_t*)_OV2640->frame->buffer, model_buffer);
9 _6 {' a' K( B# v' p - person_flag = person_detect(model_buffer); //运行模型
, R7 q( B7 ^; P6 D% c( M - [1 s* P, N" C/ f
- LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);: K' Q* l) N/ C7 V7 o; D" l3 d
- for(int i=0;i<192;i++)
# m; F- a$ ]0 F( H: W. e' | - {
7 f3 ]1 a. c5 J( k - LCD_Draw_Point(i+64, 192+24,0xf100);
6 m4 O' H! F+ G - LCD_Draw_Point(192+64,i+24, 0xf100);
3 E5 V0 a* M$ A - LCD_Draw_Point(i+64, 0+24, 0xf100);
( B/ M; i4 ]$ k( R- ~) F& o - LCD_Draw_Point(64, i+24, 0xf100);
) c# f |) T+ q" G& ^1 u - }1 o# D2 d$ @4 k: d, ~5 ?1 z2 S
- if(person_flag!=0)LCD_Draw_String(0, 0, 320, 240, 32, "people");* X6 R v' _2 U
-
! V( s/ J, I$ `2 z5 q+ z$ ?- X( }# q% f - OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);
# w6 Z. p! m5 m3 N9 z - }
复制代码 0 B, a- a/ C. ] ?6 M( ~
7 x- T6 V1 H* X; |) t
8 [, v. ^. k$ c# U/ R运行效果:* P* N: D! o+ s" J5 f7 M/ Q
识别充电器(无反应)" P; `7 _* g# Z4 F3 b7 v
, M4 ?) V% z0 I3 |2 |4 x5 X }' ^- H% s" Y
# \" }) D% j1 t& m* @
识别打火机(无反应)6 ]) T2 X; u) W {" u
' S( D$ q' M9 T" @! [
4 h; l2 d0 ?* }/ ?3 x8 A识别人体(显示people)$ L+ M( x+ u. ~
% h9 {$ E- w1 [5 b5 q" y. h ]( ?3 E# A) s$ P1 d5 Y
% @8 ]( [/ v2 k! R2 ]0 c9 D
0 q) t9 k5 l& ^) g. h9 Y0 | |
你好,请问有些源文件是重名的,该怎么才能解决冲突
一些是需要删掉的,二选一