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

【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代码去运行其模型。
5 B8 L" S( g. n: g# o
# {2 p. O/ J6 B& g- \7 d7 h% X首先获取
Tensorflow LiteMCU版的源代码:https://github.com/tensorflow/tflite-micro
; W, O, _  N6 b/ |4 {" h: J
; v; C6 U" J7 P5 n% F, D" z' {8 w2 F根据教程获取工程代码:
TFLITE-micro/new_platform_support.md at Main ·张量流/TFLITE-micro ·吉特哈布 (github.com)
: I( g) B2 `- X2 D( ^% |- l! y! a8 s- {
9 h! P+ w( _/ v4 m$ D, z5 T" {文件都扔工程里面,太多了,截图只是一部分。把
CMSIS-NN库(算子加速)
也扔进去,加速运算
( |2 n+ f5 q8 e& q- B6 s: K
微信截图_20221029100638.png ! I' K4 p9 c  y+ w/ e* w/ O

, B! z# V. q) B. ]% |
添加相关路径, q- r- Z+ g' u3 _& W: p% F9 I3 j
微信截图_20221029100655.png
7 G. S9 E# \$ _/ G; L# u

1 q# F* q  o7 f# Q3 @5 _设置工程,使用AC6编译,关闭Keil的Microlib库
/ y- {9 @2 y) h/ j6 l+ {: b1 p5 N 微信截图_20221029104604.png
7 V& `- c0 y& ]/ E) K5 g4 l; N

3 L1 r+ Z$ _% [, d) G
编译选项使用-Os,这样代码体积小点
( Y: E4 X& Y8 I5 X4 r4 `+ w: K 微信截图_20221029104615.png
# K' `' u0 W. N% G; \' e. G' g/ y+ C, t& D! Q
图像预处理函数。模型要求输入神经网络的图像为灰度图,为完成摄像头获取的RGB彩图到模型输入需要的灰度图转换,需从输入的RGB565像素格式中解析出R、G、B三通道的值,再根据心理学公式计算出单个像素点的灰度,具体代码如下:
  1. uint8_t rgb565_to_gray(uint16_t bg_color): T7 c, Z3 r, Y% Z
  2. {8 G6 S* g; f, M6 j2 }$ e- Q
  3.     uint8_t bg_r = 0;
    ' o, G2 Q) A. \) E2 S1 _( }
  4.     uint8_t bg_g = 0;
    " l& O0 m1 C; ~+ T* E% Q4 z  N
  5.     uint8_t bg_b = 0;( z2 b% y' c! U: p4 R; }& {( s
  6.     bg_r = ((bg_color>>11)&0xff)<<3;) b' c( |: l+ t) e# K( V( d
  7.     bg_g = ((bg_color>>5)&0x3f)<<2;/ F* M. K4 H! ^! t6 J
  8.     bg_b = (bg_color&0x1f)<<2;/ ?4 l# ]6 N6 m
  9.     uint8_t gray = (bg_r*299 + bg_g*587 + bg_b*114 + 500) / 1000;% i7 ~! Z4 j0 M# L% K9 ^+ }" A
  10.     return gray;- L1 I( z" L8 _( F) t
  11. }
    3 _8 l* Y) T  K! D  b( i6 l, M

  12. & Y# U! n3 P8 U3 r/ A  v
  13. void input_convert(uint16_t* camera_buffer , uint8_t* model_buffer)
    9 I" [5 j! z$ j
  14. {& k! R) E& V) f& l5 L# G/ ]' ]
  15.     int i,j;
    9 E8 _$ t, D; S7 @
  16.     for(i=0; i<96; i++)+ B! l5 ^0 z$ n. E( I9 _( q- U( `
  17.         {7 B1 g! K- A- O" U- C8 H- i
  18.         for(j=0; j<96; j++)- g) ^3 J* T9 X$ n$ F4 R
  19.         {; e, ?9 G5 n' R1 }
  20.             model_buffer[i*96+j] = rgb565_to_gray(camera_buffer[i*2*320 + j*2 + 64 + 320*24]);% a1 P( U( X' f5 ~  a1 n  K9 F
  21.         }: K9 M4 q2 k* z0 Z3 C/ Y
  22.         }
    3 |  b9 K) A" p0 b4 F3 O
  23. }
复制代码

  V; I  l; D- Z在图像接收中断里面处理识别过程
  1. void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)4 f( N2 x- D! ~2 T0 E; S- r/ [2 Q# X
  2. {
    9 U- t& q: {1 m- A3 z2 _
  3.     uint8_t person_flag;   # S3 T& A/ [8 l

  4. 3 \( o9 |+ l1 S% r* j
  5.     //转换图像为模型可处理的大小
    7 r- y6 l& o7 l* s  Z
  6.     input_convert((uint16_t*)_OV2640->frame->buffer, model_buffer);4 d5 j2 a$ v9 ]/ A3 P( L# `
  7.     person_flag = person_detect(model_buffer);  //运行模型
    7 \0 Y; I" T, x% j  u' ^( I
  8.    
    4 o; ^0 F3 |/ J% ]7 z0 Q
  9.     LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);
    5 j  m# D* p* H% v
  10.     for(int i=0;i<192;i++)# R: z+ @, T2 D  {/ ~- w
  11.     {
    ' Q/ o3 a, }' E) J
  12.         LCD_Draw_Point(i+64,  192+24,0xf100);/ k! a: p6 C4 X& Z9 s% X
  13.         LCD_Draw_Point(192+64,i+24,  0xf100);
    . f" o6 c& c6 M  D0 ?+ R
  14.         LCD_Draw_Point(i+64,  0+24,  0xf100);
    2 G# j2 m7 X( ]! u5 l" E
  15.         LCD_Draw_Point(64,    i+24,  0xf100);
    " F5 j- ]6 ?( U- {' ?! ^' x8 @2 e
  16.     }
    $ e5 x1 k' L& E  W" A* `
  17.     if(person_flag!=0)LCD_Draw_String(0, 0, 320, 240, 32, "people");
    & Z: T6 n  b7 R( ]; [
  18.    
    3 ]+ O2 T8 Q+ u- e
  19.     OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);
    ( n! V+ A, V- l2 u3 g
  20. }
复制代码
3 G+ @+ e- P9 q& Z
( D$ ^  }. S0 _( h
9 A2 T6 r: I- @
运行效果:
6 G" Z3 f9 s  x9 A4 x% D; E8 v3 f6 q
识别充电器(无反应)6 B1 g* X; O: N8 O3 H% O
IMG_20221023_162131.jpg % u/ Y/ I; K) @" i  c- M- r/ b
1 K3 W! m3 m8 I2 g' j4 Q
4 ~! O1 j6 R: v( X0 C: F
识别打火机(无反应)
2 v8 @; b9 c4 t' p2 X/ i IMG_20221023_162402.jpg 6 u" [1 {8 d9 c# [# n) E

: u0 T8 S3 H% h; U. L) V识别人体(显示people)
2 k3 I2 J1 w& c+ M  r/ M IMG_20221027_153235.jpg 2 L  N6 q! r$ P
4 }2 {6 H% V5 H) w* K0 S# u- B) T
3 u9 V, g# [' r# {- A% s% I
2 h# j9 c( ~; W) R0 k( d9 R0 |6 S
收藏 1 评论4 发布时间:2022-10-29 10:49

举报

4个回答
STMCU-管管 回答时间:2022-10-31 08:42:03
打火机相当出境
晒太阳的懒猫 回答时间:2022-11-11 09:44:51
谢谢楼主共享评测,谢谢共享代码!学习了。# ]# z- y" q4 V
Ender2021 回答时间:2025-4-23 21:46:22

你好,请问有些源文件是重名的,该怎么才能解决冲突

奇迹 回答时间:2025-4-23 22:41:00

Ender2021 发表于 2025-4-23 21:46
你好,请问有些源文件是重名的,该怎么才能解决冲突

一些是需要删掉的,二选一

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版