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

【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代码去运行其模型。7 y' Y5 _; L0 Q0 |, P% a
- T2 O2 X# e. ]1 N  A9 ~! J% Z
首先获取
Tensorflow LiteMCU版的源代码:https://github.com/tensorflow/tflite-micro
# o" l7 M4 h3 `8 G, L  K1 ^
0 Z$ @( H9 F; {! D" X" r" K8 p根据教程获取工程代码:
TFLITE-micro/new_platform_support.md at Main ·张量流/TFLITE-micro ·吉特哈布 (github.com)
. O9 Y% {# I, K6 |' t; y
' Z7 g: z6 ]0 P文件都扔工程里面,太多了,截图只是一部分。把
CMSIS-NN库(算子加速)
也扔进去,加速运算9 U7 F, B3 r: R; B1 T
微信截图_20221029100638.png 5 i9 Z7 v; T+ a" g/ X1 D- R" G2 I
2 u* [' L4 X! y6 @2 \  L( y; x* N
添加相关路径
5 u8 f& ]8 @7 B- O) W 微信截图_20221029100655.png

( n2 v: j+ P5 e7 `3 c1 S, p
! v7 Z2 s! `9 F9 S
设置工程,使用AC6编译,关闭Keil的Microlib库
; m; _; d/ o6 n' }* { 微信截图_20221029104604.png

, I8 s6 _% K) G4 g+ Z; w5 N  ]. p, M4 n7 m' k1 ^
编译选项使用-Os,这样代码体积小点( R; u5 r% q- N5 {! Y% ?
微信截图_20221029104615.png
) \( l. s1 L4 |0 `9 @
" P. e$ G" o% K# _
图像预处理函数。模型要求输入神经网络的图像为灰度图,为完成摄像头获取的RGB彩图到模型输入需要的灰度图转换,需从输入的RGB565像素格式中解析出R、G、B三通道的值,再根据心理学公式计算出单个像素点的灰度,具体代码如下:
  1. uint8_t rgb565_to_gray(uint16_t bg_color)
    ( S" }, Z, c: P, g8 m( h
  2. {
    7 R. L5 N4 b, f; C. E4 o
  3.     uint8_t bg_r = 0;
    4 l: o7 T. v8 y* s! o
  4.     uint8_t bg_g = 0;
    " T" E5 u+ a+ s/ N
  5.     uint8_t bg_b = 0;, {# \6 W  t( G; {8 q1 ~7 A& F1 G
  6.     bg_r = ((bg_color>>11)&0xff)<<3;
    . ~+ W* k6 m' O
  7.     bg_g = ((bg_color>>5)&0x3f)<<2;3 I' R' s" [/ o
  8.     bg_b = (bg_color&0x1f)<<2;
    0 r$ H/ O3 n; d: T, n9 x  b
  9.     uint8_t gray = (bg_r*299 + bg_g*587 + bg_b*114 + 500) / 1000;
    2 s6 Z5 r6 b! R
  10.     return gray;( J7 m+ f9 z( `' L* r# V6 E
  11. }
    & p$ K" |+ m) G2 G9 J* H

  12. $ R6 S" |/ }/ W6 ]' ~
  13. void input_convert(uint16_t* camera_buffer , uint8_t* model_buffer)9 l1 _% ]2 Q9 D8 ^8 w
  14. {
    2 e1 i2 H  w/ P2 i6 S
  15.     int i,j;! `! O& i6 G2 z
  16.     for(i=0; i<96; i++)9 M# r( v: `' f% G+ q; j; K
  17.         {
    5 }0 ?1 t! @$ c& ?% t
  18.         for(j=0; j<96; j++)
    ! r, s# X. p% V+ e) C! p6 ^1 ^
  19.         {
    ; M# M6 s  ^  }
  20.             model_buffer[i*96+j] = rgb565_to_gray(camera_buffer[i*2*320 + j*2 + 64 + 320*24]);4 [# g4 z9 h# i7 M4 u- u
  21.         }
    / r% X* d" M; A3 k6 Q
  22.         }
    8 F, O. P1 R' v: D% Y( W8 K
  23. }
复制代码
9 `2 f1 D- t" Q; }, ~
在图像接收中断里面处理识别过程
  1. void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi); e* w! Y% N2 y% N1 b7 N) r
  2. {
    1 R; V& K7 j, O7 l9 A3 o7 _
  3.     uint8_t person_flag;   
    4 h3 U5 ?% {  s: N; R
  4. ; F' u) g: \4 |' a
  5.     //转换图像为模型可处理的大小
    ' K( F7 R  @9 s( g
  6.     input_convert((uint16_t*)_OV2640->frame->buffer, model_buffer);
    6 e/ V  \2 w, U1 [0 m; |0 N3 i
  7.     person_flag = person_detect(model_buffer);  //运行模型$ K$ R; e5 u* L+ r; S- U2 ?
  8.    
    ; P# ^) E. n3 ?9 d0 a0 S7 {6 f4 E3 `
  9.     LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);
    1 }9 H. f6 N/ O
  10.     for(int i=0;i<192;i++)
    5 c6 K; K4 O4 g* G
  11.     {
    3 {3 {# P* Z8 t% x3 J( s+ z
  12.         LCD_Draw_Point(i+64,  192+24,0xf100);
    # m1 K( r9 O9 H2 p6 ]
  13.         LCD_Draw_Point(192+64,i+24,  0xf100);
    , v( Z8 _& c  \7 \6 ~
  14.         LCD_Draw_Point(i+64,  0+24,  0xf100);" c4 a9 z3 H3 E8 f6 g" Y
  15.         LCD_Draw_Point(64,    i+24,  0xf100);1 K4 [  @; _. S2 e. T$ ?
  16.     }9 K6 H9 l# ?$ O9 B1 A
  17.     if(person_flag!=0)LCD_Draw_String(0, 0, 320, 240, 32, "people");
    : W9 W; P( |7 ~/ S) k
  18.    
    , H8 y6 d' c, e' ^. k4 |$ \0 n- C5 _
  19.     OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);* @4 C: f0 ?/ R4 ~4 `  A
  20. }
复制代码
4 R1 V; ~# q% ?, q4 ?$ @: {
# h3 Z6 Y% L# f( [9 x3 D; u/ E. V+ H5 G
- R! {& {. M% N3 [; U3 g
运行效果:* y: k! m, r6 E% W% |) O0 ~
识别充电器(无反应)
. i: A3 R: _9 D$ D. ]  l/ I IMG_20221023_162131.jpg : r3 s$ M. I4 ~: T  O; c  b
: v' K, m- o9 O

* {- Q( S7 H3 ]4 [- A) u识别打火机(无反应)( {7 F3 e  D$ F
IMG_20221023_162402.jpg 9 }# F, e! X; z7 B9 H( K

; j- b% K, ^' _( B! I5 v% Y+ n* j6 l识别人体(显示people)7 H4 K" Y2 J, l2 W* c9 |$ l5 j
IMG_20221027_153235.jpg , c. x6 P0 t  f7 S3 e

- A# Q9 Y/ L! A* m
, W/ G, h0 H4 I$ s0 j* b' a2 q9 z
. G- d0 T1 o6 D% [% d% T" |
赞 收藏 1 评论4 发布时间:2022-10-29 10:49

举报

4个回答
STMCU-管管 回答时间:2022-10-31 08:42:03
打火机相当出境
晒太阳的懒猫 回答时间:2022-11-11 09:44:51
谢谢楼主共享评测,谢谢共享代码!学习了。
! {+ {5 m: y* Z2 v0 Z9 \! T
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 手机版