你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【Wio Lite AI视觉开发套件】+移植TensorFlow Lite

[复制链接]
奇迹 发布时间:2022-10-29 10:49
Tensorflow Lite Micro是tensorflow框架针对微控制器应用场景所专门设计的深度学习推理框架,它占用的资源少,运行时内存最低只需要16KB,同时其兼容tensorflow框架,依托于Tensorflow平台强大的生态背景,使得更多开发者可以方便的集成、使用AI算法,为端侧带来人工智能的新活力。其中Tensorflow Lite模型也被ST的AI工具所支持,但是我们这次是不通过STM32提供的AI工具,而是移植Tensorflow Lite代码去运行其模型。8 E7 t: S, ?5 ?4 E" ]) f& @7 |

$ q3 [  _7 ?) o$ s) p: u9 ^首先获取
Tensorflow LiteMCU版的源代码:https://github.com/tensorflow/tflite-micro
' G' Z  e! p" g6 y# ?& {6 g" O+ m0 x
# q1 y0 I& T3 r, k) H根据教程获取工程代码:
TFLITE-micro/new_platform_support.md at Main ·张量流/TFLITE-micro ·吉特哈布 (github.com)' @. s+ Q, d* p7 Z: ^8 J& A0 K

+ U9 z6 m/ u" n- t' q文件都扔工程里面,太多了,截图只是一部分。把
CMSIS-NN库(算子加速)
也扔进去,加速运算
1 S/ k, g1 f& O; I2 n. ]% l( e
微信截图_20221029100638.png
' X/ D( p! D4 P( l6 i1 \) Q# A9 o# N$ A" f, i
添加相关路径
. D6 O0 c$ ^0 b 微信截图_20221029100655.png

( D2 V0 `' {& L& D8 y1 X  S% T

; t) l% C0 \* q4 q* t设置工程,使用AC6编译,关闭Keil的Microlib库
, E9 S7 P1 v" c! T1 n& E" b4 K9 |! ?6 F 微信截图_20221029104604.png

* ^, s8 o0 N+ Y& ^" R: `& U
6 @5 m( D" S* [2 ?/ `/ m
编译选项使用-Os,这样代码体积小点
& J& @+ W+ A# u8 G3 V4 l% a5 ^ 微信截图_20221029104615.png 8 `3 ~9 i5 Y" |# k+ y% M
4 V5 G# y5 `% c! @
图像预处理函数。模型要求输入神经网络的图像为灰度图,为完成摄像头获取的RGB彩图到模型输入需要的灰度图转换,需从输入的RGB565像素格式中解析出R、G、B三通道的值,再根据心理学公式计算出单个像素点的灰度,具体代码如下:
  1. uint8_t rgb565_to_gray(uint16_t bg_color)
    7 o+ D0 \4 j( C9 ^. D/ \" E3 P/ t
  2. {
    1 i# w( T! n9 e# a; p  D
  3.     uint8_t bg_r = 0;6 ~" c9 w9 Q- j& p
  4.     uint8_t bg_g = 0;* ]) M. y" a& H4 |6 B6 z: G
  5.     uint8_t bg_b = 0;7 s& Y& w7 L' ?" U9 R3 G
  6.     bg_r = ((bg_color>>11)&0xff)<<3;9 P; l. S, }3 p3 |* L2 A/ t
  7.     bg_g = ((bg_color>>5)&0x3f)<<2;* i8 h6 P) e/ [2 ~1 n  s
  8.     bg_b = (bg_color&0x1f)<<2;
    1 d0 [8 a& t# R9 v, V" [
  9.     uint8_t gray = (bg_r*299 + bg_g*587 + bg_b*114 + 500) / 1000;
    1 o' a! \+ z4 d8 C/ O
  10.     return gray;4 P# g/ I& y7 n- r2 J' x/ Z
  11. }+ _/ ~+ X/ f. A5 v; G  v/ S

  12.   T3 m9 ^1 A4 b) V$ `1 q9 }, ?
  13. void input_convert(uint16_t* camera_buffer , uint8_t* model_buffer)3 F* q  i/ y# g+ K( \( }9 }
  14. {
    : [9 b: ]& I1 T1 @; R. c
  15.     int i,j;
    : V! z4 E; S6 @2 p  Q
  16.     for(i=0; i<96; i++)% q% p3 H/ R  x* s3 B
  17.         {4 l) p+ R  L/ ?$ a
  18.         for(j=0; j<96; j++): C9 p7 F- }0 a- `7 s* K
  19.         {6 Z" r0 u  {  O# Q! A
  20.             model_buffer[i*96+j] = rgb565_to_gray(camera_buffer[i*2*320 + j*2 + 64 + 320*24]);
    6 k' `% [6 O6 W3 o
  21.         }
    4 W7 K7 [$ q$ U4 l$ C
  22.         }
    - ~! M8 Q: N4 W% q" t
  23. }
复制代码
1 ]# x. [: u+ N2 q1 m& s2 i, b
在图像接收中断里面处理识别过程
  1. void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)) C- {( H% y# I/ K' o) t/ A
  2. {
    " o2 C  P6 R1 o# ?5 q& ]
  3.     uint8_t person_flag;   
    ( W5 M) C5 N* S

  4. ! J  k) K( b% Y- v- W
  5.     //转换图像为模型可处理的大小
    ) _7 ^! [' r% {: w* G8 ]5 \
  6.     input_convert((uint16_t*)_OV2640->frame->buffer, model_buffer);8 V  q) J+ z9 b2 K/ {. T
  7.     person_flag = person_detect(model_buffer);  //运行模型
    6 t3 a4 c1 U- j* r+ D" O
  8.    & o# i" `7 v5 ~# q& h
  9.     LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);
    , T- S- f3 D# @. \/ M
  10.     for(int i=0;i<192;i++)
    : N- B# ^/ s/ l6 k# o
  11.     {
    5 ]9 G- X4 J1 m- P. B. k
  12.         LCD_Draw_Point(i+64,  192+24,0xf100);
    + {0 T3 |: N9 ?3 f  b) X
  13.         LCD_Draw_Point(192+64,i+24,  0xf100);9 E3 E& {2 K% H2 ~- \
  14.         LCD_Draw_Point(i+64,  0+24,  0xf100);* t2 t7 R9 s/ o! C3 b& S# ]
  15.         LCD_Draw_Point(64,    i+24,  0xf100);, B& M, Q( @2 S5 A
  16.     }' X7 l/ {5 i: J
  17.     if(person_flag!=0)LCD_Draw_String(0, 0, 320, 240, 32, "people");
    - `% |; z; P( ?& b3 n/ K5 Q* o! J
  18.    6 V; s$ [& f$ S1 n' `6 a8 g
  19.     OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);
    5 \+ F: F, j- ?( g  T8 y1 C
  20. }
复制代码

; M+ Y/ w' V" r; J' @+ f# L& b6 I0 H9 G  Q/ \
/ v6 e% d  ^$ R, C9 u
运行效果:' B0 Q1 P' m# ?4 f" @+ L) z9 s7 |% U
识别充电器(无反应)- A' y- S/ n$ a$ ~
IMG_20221023_162131.jpg
* O7 g. \" l' R# a
% ^1 p8 Z5 C8 b1 T7 V
9 E1 j: c/ I( B1 o5 Y; j; g识别打火机(无反应)
, o0 p1 w" S; X6 l4 S% S IMG_20221023_162402.jpg # R6 U& U5 R( R" E% J

0 H/ x' A$ N' H$ p2 v6 m7 _识别人体(显示people)7 w0 O8 r( E: y( f
IMG_20221027_153235.jpg . W2 Z7 `1 ?5 m

+ I+ ^3 `- E4 h* H, `; p+ e
2 D0 j; @8 [! p& s! s# w6 Q

" G1 J" M% u. i8 o2 l( a. C
收藏 1 评论2 发布时间:2022-10-29 10:49

举报

2个回答
STMCU-管管 回答时间:2022-10-31 08:42:03
打火机相当出境
晒太阳的懒猫 回答时间:2022-11-11 09:44:51
谢谢楼主共享评测,谢谢共享代码!学习了。
, {7 m; Z: Z: e: Z

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版