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

【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代码去运行其模型。, S0 |" m! N& T+ R6 ]* C# P$ ^
5 G5 O$ ?8 o' V/ f
首先获取
Tensorflow LiteMCU版的源代码:https://github.com/tensorflow/tflite-micro# m8 ^3 u0 A1 |5 x! {
" N5 j3 g! O( v$ d
根据教程获取工程代码:
TFLITE-micro/new_platform_support.md at Main ·张量流/TFLITE-micro ·吉特哈布 (github.com)/ P4 i" M" I4 P4 Q8 y( K2 o
- V$ N" u$ V& s8 U( U0 x' \
文件都扔工程里面,太多了,截图只是一部分。把
CMSIS-NN库(算子加速)
也扔进去,加速运算% z4 n; V& C% X- N' @* `# P
微信截图_20221029100638.png
3 P- @& x! p; ~* d! O1 Y  d1 w6 D+ F+ y$ p
添加相关路径
4 p; b( x! F% I& w6 c4 \$ `! z 微信截图_20221029100655.png

: h! O4 w% ?3 Q7 Z- M# {

) r1 `3 a. v' _) z9 n/ }8 y% W设置工程,使用AC6编译,关闭Keil的Microlib库8 N: L/ P+ U7 j9 E- x) q
微信截图_20221029104604.png
& a; l& T" c3 q  O" b/ H( i

: ?( A# R# t$ F# Z8 W9 [
编译选项使用-Os,这样代码体积小点
3 [7 e: ^6 @$ e" r2 K$ ` 微信截图_20221029104615.png
- f7 Y, e  C) }5 ~8 _. t; q- N7 l
图像预处理函数。模型要求输入神经网络的图像为灰度图,为完成摄像头获取的RGB彩图到模型输入需要的灰度图转换,需从输入的RGB565像素格式中解析出R、G、B三通道的值,再根据心理学公式计算出单个像素点的灰度,具体代码如下:
  1. uint8_t rgb565_to_gray(uint16_t bg_color)
    - F1 Y9 ~) A3 L
  2. {
    ) E' j! E7 h8 i  U9 R* A" q8 d
  3.     uint8_t bg_r = 0;
    8 l1 S& D5 y! W3 c) Z
  4.     uint8_t bg_g = 0;. a6 [, e- `4 c8 c: f2 y" x
  5.     uint8_t bg_b = 0;
      H) m' ?9 Y% F( c; ^, m4 D
  6.     bg_r = ((bg_color>>11)&0xff)<<3;
    6 F9 I& \! [% D" E
  7.     bg_g = ((bg_color>>5)&0x3f)<<2;* a1 Y. N; D* v0 V, p; V& |
  8.     bg_b = (bg_color&0x1f)<<2;
    7 E) J) J3 C3 _& a3 b
  9.     uint8_t gray = (bg_r*299 + bg_g*587 + bg_b*114 + 500) / 1000;
      _7 @. Y4 z, R$ {+ W
  10.     return gray;
    6 G* Y* e# Q  B# W. b: o
  11. }
    5 k1 w# l* ~# J& q- p
  12. 3 U' p2 ?$ x6 W( }
  13. void input_convert(uint16_t* camera_buffer , uint8_t* model_buffer)% B2 ?8 X$ J! T
  14. {  m/ g( n! o' q
  15.     int i,j;
    7 ?% Z/ p! h  |4 Y
  16.     for(i=0; i<96; i++)( h( ~. m' D2 p
  17.         {
    5 D3 E2 Q/ B% t* a9 v& o8 W
  18.         for(j=0; j<96; j++)  p- N$ J# M9 P+ \: G9 Q
  19.         {
    % z' N- J7 u% @6 _0 Q
  20.             model_buffer[i*96+j] = rgb565_to_gray(camera_buffer[i*2*320 + j*2 + 64 + 320*24]);0 t* m. G; H: @2 N' Q# Z4 f1 O
  21.         }
    & l7 M2 U: m$ ^3 R
  22.         }* D- U* B) Y" L' e
  23. }
复制代码

: x/ Y  u5 _$ r在图像接收中断里面处理识别过程
  1. void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
    ! J$ s3 F6 b9 c9 d5 E
  2. {
    4 B$ ^1 O8 W. V# S  L" O( o6 d
  3.     uint8_t person_flag;   $ X/ j6 p! W0 {' `. T( H5 M8 `
  4. . z- U3 O- M1 K# O" l: O2 X2 Z
  5.     //转换图像为模型可处理的大小: N6 r; Z( c# Y, r0 m
  6.     input_convert((uint16_t*)_OV2640->frame->buffer, model_buffer);
    " s4 X! g" y, w/ a' D
  7.     person_flag = person_detect(model_buffer);  //运行模型4 |, U9 k7 L4 k
  8.    
    & [; Q. x. [* w5 {3 J, k! `$ ^6 }& R
  9.     LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);
    . m& U- y' }1 @8 Y" k2 @" O/ Z* ~# ~
  10.     for(int i=0;i<192;i++), D8 C7 t: J* p! B3 L$ U5 f
  11.     {( D+ }3 W6 s1 u6 J
  12.         LCD_Draw_Point(i+64,  192+24,0xf100);* S9 v! q  s" B; B
  13.         LCD_Draw_Point(192+64,i+24,  0xf100);3 [! S  L4 Q8 Q
  14.         LCD_Draw_Point(i+64,  0+24,  0xf100);
    ) ^3 H0 r4 N' m! T7 [- n
  15.         LCD_Draw_Point(64,    i+24,  0xf100);
    ' U1 G; u3 J4 w% X2 Z, q) U
  16.     }; F9 i9 }. U+ h0 n' l0 ~* S
  17.     if(person_flag!=0)LCD_Draw_String(0, 0, 320, 240, 32, "people");
    ) {5 j, C  d1 Y7 j2 C
  18.      M; {" l; U/ U) H9 r/ Z: p" F
  19.     OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);0 i' b2 Y( o, h" _6 ~  t( {% O3 B
  20. }
复制代码

' J/ ?& n, a. a) y: _9 m& i0 A& |) b- m& A* q; {7 U# g2 U- |3 N/ G  V

8 N. h& M4 a8 E2 y
运行效果:
; ~$ p5 {5 a, O* ]( R
识别充电器(无反应)& E) W+ r1 o& M# ?2 u
IMG_20221023_162131.jpg   A- l7 I) ]! C1 W3 s6 }

9 o, H2 D7 @' M3 \7 @
; X. \( G9 N$ q6 ?, G+ A$ p识别打火机(无反应)1 P: O- t# z  Z) k1 k
IMG_20221023_162402.jpg 4 A9 j: A& ]9 }0 s+ K) N2 Y% d2 n7 }! O3 i
$ _7 T" Q9 A1 m) k3 G
识别人体(显示people)
! i/ M! R( r% O" A" E: o* v IMG_20221027_153235.jpg
. Z; m' B, W5 S1 R# T
0 w+ }. l% G6 `5 |5 t* m, \" G; Y' ~2 S
; |; p  N5 i1 R
  u  g/ @* s3 C  @1 R6 ^5 P
赞 收藏 1 评论4 发布时间:2022-10-29 10:49

举报

4个回答
STMCU-管管 回答时间:2022-10-31 08:42:03
打火机相当出境
晒太阳的懒猫 回答时间:2022-11-11 09:44:51
谢谢楼主共享评测,谢谢共享代码!学习了。
1 z: `2 k! c+ }" A8 b; A1 `: N+ H
Ender2021 回答时间:2025-4-23 21:46:22

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

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

<br /> <br />

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

所属标签

相似技术帖

官网相关资源

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