Tensorflow Lite Micro是tensorflow框架针对微控制器应用场景所专门设计的深度学习推理框架,它占用的资源少,运行时内存最低只需要16KB,同时其兼容tensorflow框架,依托于Tensorflow平台强大的生态背景,使得更多开发者可以方便的集成、使用AI算法,为端侧带来人工智能的新活力。其中Tensorflow Lite模型也被ST的AI工具所支持,但是我们这次是不通过STM32提供的AI工具,而是移植Tensorflow Lite代码去运行其模型。7 H* f: T& O/ J3 @7 H3 z. c
9 y! D5 a6 K2 N r( h& X% A: Z
首先获取Tensorflow LiteMCU版的源代码:https://github.com/tensorflow/tflite-micro$ y9 o( S0 i& _+ A9 N
/ n( h% ~' y7 ?根据教程获取工程代码:TFLITE-micro/new_platform_support.md at Main ·张量流/TFLITE-micro ·吉特哈布 (github.com)
* }1 d7 {" S* y+ a/ @4 W L
" _; D4 \2 [- h6 n# P文件都扔工程里面,太多了,截图只是一部分。把CMSIS-NN库(算子加速)也扔进去,加速运算. M$ G7 a" _2 Q* b1 H: G
# s& _, u8 `, K+ }" Q, E t4 V0 v+ G1 O( @7 ~8 q
添加相关路径/ u/ Y, D4 J4 G! M
( l- I* I4 h- F$ o8 w) I. h* T5 J4 T# s0 X
设置工程,使用AC6编译,关闭Keil的Microlib库9 _+ s& v4 I- w$ x8 g( ?
6 w8 }, n3 {2 m6 J b/ |
G0 G; Z& e7 {) \/ Q
编译选项使用-Os,这样代码体积小点
6 q2 ]: J! `5 ?% w+ G- P
1 ^9 B4 S) _' |" i1 O/ U
: A8 P! G/ o, g7 e图像预处理函数。模型要求输入神经网络的图像为灰度图,为完成摄像头获取的RGB彩图到模型输入需要的灰度图转换,需从输入的RGB565像素格式中解析出R、G、B三通道的值,再根据心理学公式计算出单个像素点的灰度,具体代码如下:- uint8_t rgb565_to_gray(uint16_t bg_color)& `- i4 f% a8 A% s! ?
- {
, }2 e5 ?" @2 b( ^0 F: A. V1 f+ i - uint8_t bg_r = 0;! \' [4 h/ q# g$ `
- uint8_t bg_g = 0;( T+ X s; j/ J; t6 q
- uint8_t bg_b = 0;$ @% N: A& v8 N* J1 i6 h
- bg_r = ((bg_color>>11)&0xff)<<3;
; D! X) g3 g4 ^( X - bg_g = ((bg_color>>5)&0x3f)<<2; Y& |4 p9 [+ F) g7 J4 r2 B
- bg_b = (bg_color&0x1f)<<2;
1 W0 N0 E9 {! b- p0 W/ a* P - uint8_t gray = (bg_r*299 + bg_g*587 + bg_b*114 + 500) / 1000;4 }' {5 | N. |+ ?2 I6 }
- return gray;( R$ ~* U0 R- u" z2 H
- }
( C8 `+ @& Q7 q
, S3 R+ q4 E- U+ }' p1 w4 M& u! t- void input_convert(uint16_t* camera_buffer , uint8_t* model_buffer)2 t/ y9 z# [7 C: X
- {
$ t! E+ y- t! O i; N! h - int i,j;- \, U, j6 w; e" R" K `* G
- for(i=0; i<96; i++)9 n9 D0 R5 `! f: ~) u( V* Q% F' ^
- {9 {/ p& Z* I. L, N9 z% G; i
- for(j=0; j<96; j++)
5 O0 }+ T8 o- d+ w& j - {
9 v: s8 a+ d6 c% |/ x - model_buffer[i*96+j] = rgb565_to_gray(camera_buffer[i*2*320 + j*2 + 64 + 320*24]);
; |8 q5 \$ h V1 T6 `+ J - }
! e, M3 |9 o1 d; O. }* X, I - }
1 p4 V6 e) K& X) F7 Q - }
复制代码 & r8 o3 ~4 l0 z* y. |' P# D( ^9 n
在图像接收中断里面处理识别过程- void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
3 i' D; r0 K3 ]/ N6 n4 P( E2 w - { Z! |8 u3 ^: ^: u7 f. m
- uint8_t person_flag;
+ G" f& }0 f8 F' f2 ?2 f - 8 j( F& {$ U7 U. ?5 x* e
- //转换图像为模型可处理的大小! B- ?( Q& V C" C A
- input_convert((uint16_t*)_OV2640->frame->buffer, model_buffer); X- y- |$ Q& A3 s# V9 h0 P4 s
- person_flag = person_detect(model_buffer); //运行模型
: I1 ^/ \, _- s4 `$ d7 W7 X - $ S% |( w I8 l1 w, T( s. s
- LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);
3 T' e* r, t4 J. v2 _! h) K- ^) a - for(int i=0;i<192;i++)
' e7 |! B# m1 s) @ - {
- H9 z0 U- @' t# l6 o0 l2 D" I; Z - LCD_Draw_Point(i+64, 192+24,0xf100);' W) }0 r2 E. u% m# |! H
- LCD_Draw_Point(192+64,i+24, 0xf100);+ _" h) i% O/ p( @) l1 R& x
- LCD_Draw_Point(i+64, 0+24, 0xf100);
0 \. U4 c: c) u5 B( @: a7 d) A - LCD_Draw_Point(64, i+24, 0xf100);& S% l8 U* n' u$ s3 a2 b5 i; n
- }: m, u1 u+ T' K. J6 _
- if(person_flag!=0)LCD_Draw_String(0, 0, 320, 240, 32, "people");
1 q+ i& d- i% O! {6 h. b - : a7 d B1 p! P
- OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);
, ~" d/ h* I( [ - }
复制代码
+ m- _8 y! }) ^6 U0 h
' s+ c% m: W' C/ E- d' s4 ~* O; t- d' s; X- T$ N
运行效果:7 ^: K5 Y, T T6 D
识别充电器(无反应)- Y8 F- H; c$ c
/ R; [- p+ Z+ |/ T. k
1 v/ b- ` J0 f7 v9 G7 F5 h5 `3 `. {) p- V
识别打火机(无反应)
. }0 q d/ R2 ]1 ]! s3 @
5 G; S$ H: \9 Q
) E9 Q8 P& M* t* _. s识别人体(显示people)
% E& _, E7 `7 z7 }3 I8 V( K
& e- _) k' \8 j$ z
+ U$ [% `* p" I" M. N# k8 m
8 _* N e" }* }7 n+ e x! O5 \8 \+ E" n* a* ~. z; [$ v# u" i+ D
|
你好,请问有些源文件是重名的,该怎么才能解决冲突
一些是需要删掉的,二选一