Tensorflow Lite Micro是tensorflow框架针对微控制器应用场景所专门设计的深度学习推理框架,它占用的资源少,运行时内存最低只需要16KB,同时其兼容tensorflow框架,依托于Tensorflow平台强大的生态背景,使得更多开发者可以方便的集成、使用AI算法,为端侧带来人工智能的新活力。其中Tensorflow Lite模型也被ST的AI工具所支持,但是我们这次是不通过STM32提供的AI工具,而是移植Tensorflow Lite代码去运行其模型。
; Z# M# k9 q8 K& |/ u# u
6 X' D& s/ V2 }/ H1 `2 r首先获取Tensorflow LiteMCU版的源代码:https://github.com/tensorflow/tflite-micro0 F: C- G% f) J
; `/ F7 s9 N, i# p根据教程获取工程代码:TFLITE-micro/new_platform_support.md at Main ·张量流/TFLITE-micro ·吉特哈布 (github.com)8 `$ G2 `) B) z/ R- j
: D' a4 M% w3 M# l) m文件都扔工程里面,太多了,截图只是一部分。把CMSIS-NN库(算子加速)也扔进去,加速运算( D4 U) h1 o- f5 c2 U( y( G
w" n& `0 N; E! `4 g
1 X2 W7 Y3 D, X0 O, `添加相关路径4 m* [ A0 j. A& L! k( \0 n8 @
4 `5 \) [: l g/ }, K, b0 h( T" S- o2 y1 |
设置工程,使用AC6编译,关闭Keil的Microlib库7 ?1 A" c; ?1 W
6 i3 l. C9 y, \. W y; K
* e. u$ f$ t' [4 s6 W2 O9 ~编译选项使用-Os,这样代码体积小点) g( U; z+ \+ ]. R, \
" i) s5 c* E2 d4 W7 J! g7 u. F3 a- X u/ H
图像预处理函数。模型要求输入神经网络的图像为灰度图,为完成摄像头获取的RGB彩图到模型输入需要的灰度图转换,需从输入的RGB565像素格式中解析出R、G、B三通道的值,再根据心理学公式计算出单个像素点的灰度,具体代码如下:- uint8_t rgb565_to_gray(uint16_t bg_color)
, N1 D- |% a. T - {0 s M3 d" g% M
- uint8_t bg_r = 0;( N$ j2 S& t/ E3 D0 i3 \4 N
- uint8_t bg_g = 0;: g/ L8 S* W/ K8 P* q
- uint8_t bg_b = 0;
" u1 l; n- P% |4 ` - bg_r = ((bg_color>>11)&0xff)<<3;8 i% |+ d" ?) E2 P% X p) M
- bg_g = ((bg_color>>5)&0x3f)<<2;
3 X1 q8 w# u: @9 U7 s - bg_b = (bg_color&0x1f)<<2;
0 ^$ j2 R% B8 Y7 R* H, g& I1 } - uint8_t gray = (bg_r*299 + bg_g*587 + bg_b*114 + 500) / 1000;5 W" a3 u' g4 _0 r8 x" a
- return gray;
7 F- b4 o- |& R) e - }: y. g, [# R5 \4 O/ ^6 a
- 4 v7 \% f6 W, x: k9 h8 y, R
- void input_convert(uint16_t* camera_buffer , uint8_t* model_buffer)
9 ?& L& e! R* g, q1 `; I - {
2 e9 e* l+ @& [% I2 r- d6 @ - int i,j;
1 d+ k0 ?8 D) {- O) {2 f - for(i=0; i<96; i++) h+ W J# j- H; C
- {
! o6 u) [( B; u - for(j=0; j<96; j++): I- b6 N( S' r x7 o) h8 M* V
- { z0 V: T8 i3 [# N
- model_buffer[i*96+j] = rgb565_to_gray(camera_buffer[i*2*320 + j*2 + 64 + 320*24]);- ~& l0 v+ p, y2 F1 c- {- _+ A
- }( C/ J/ @7 o3 n ~
- }/ ~* G- u. h- `# a2 a/ u2 S
- }
复制代码
* H2 x- n9 F3 b2 J6 J在图像接收中断里面处理识别过程- void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
. k2 \+ _9 f- ]* l1 }$ _ - {
' `: L; o2 k& Z# i/ T - uint8_t person_flag; ' {# [8 i1 s; [9 W: I
- 2 k; x7 n7 F! m3 F
- //转换图像为模型可处理的大小
c3 Y1 |, j( p - input_convert((uint16_t*)_OV2640->frame->buffer, model_buffer);# m! b! R! r1 e# ^4 {. s5 H9 G
- person_flag = person_detect(model_buffer); //运行模型
- t7 |. h9 j/ y3 P( V. w6 V$ f4 r1 n: ? - ) O+ @, V! o% `- n
- LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);6 m J ]9 J& b8 ^7 w* H' q
- for(int i=0;i<192;i++)8 I& d+ C5 B. E, [. l
- {& J: ]" _1 `# Y
- LCD_Draw_Point(i+64, 192+24,0xf100);# }9 A, W4 L; d2 P
- LCD_Draw_Point(192+64,i+24, 0xf100);3 U+ X9 l; S+ ?6 p
- LCD_Draw_Point(i+64, 0+24, 0xf100);( O/ H' P3 a! t& K- p" m4 G& ?
- LCD_Draw_Point(64, i+24, 0xf100);
3 x8 o) v" t, a - }
2 a" i! e5 x' _( J' W- b) v - if(person_flag!=0)LCD_Draw_String(0, 0, 320, 240, 32, "people");
# |) n6 Q6 z2 Y% V/ N# r! u - % H) [. y( i: j' k% q- |* `2 ]( B' s
- OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);8 e9 g5 {9 T4 _- q3 L' O) ?
- }
复制代码
2 U, C, N# z! S9 ?! ]; o" g5 G! b, I
3 h/ N- p6 n @. W运行效果:
$ m# i7 h/ q8 w& s- G识别充电器(无反应)
) {) f) M$ W% a4 o
4 o) }) p/ m7 P2 F4 y0 N" v) }
# }. G' o. C) ]
R, @# r7 j4 }. G O# D7 h; Y识别打火机(无反应)
) c5 k# L3 F- g& R& M4 E2 u" a6 h( d
" l; f: j1 I5 N$ y' x# \
0 O, X& h" m' v6 t, n
识别人体(显示people)3 H- M: ?0 Q' c
* c- c3 {5 A0 Q+ _: _' r
A( @" S; z4 t+ H9 C) V
3 f$ e) I7 [, ?) L% O4 q: l5 X+ ~& j0 s* U
|
你好,请问有些源文件是重名的,该怎么才能解决冲突
一些是需要删掉的,二选一