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

【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代码去运行其模型。
; Z# M# k9 q8 K& |/ u# u
6 X' D& s/ V2 }/ H1 `2 r首先获取
Tensorflow LiteMCU版的源代码:https://github.com/tensorflow/tflite-micro0 F: C- G% f) J

; `/ F7 s9 N, i# p根据教程获取工程代码:
TFLITE-micro/new_platform_support.md at Main ·张量流/TFLITE-micro ·吉特哈布 (github.com)8 `$ G2 `) B) z/ R- j

: D' a4 M% w3 M# l) m文件都扔工程里面,太多了,截图只是一部分。把
CMSIS-NN库(算子加速)
也扔进去,加速运算( D4 U) h1 o- f5 c2 U( y( G
微信截图_20221029100638.png   w" n& `0 N; E! `4 g

1 X2 W7 Y3 D, X0 O, `
添加相关路径4 m* [  A0 j. A& L! k( \0 n8 @
微信截图_20221029100655.png

4 `5 \) [: l  g/ }, K
, b0 h( T" S- o2 y1 |
设置工程,使用AC6编译,关闭Keil的Microlib库7 ?1 A" c; ?1 W
微信截图_20221029104604.png
6 i3 l. C9 y, \. W  y; K

* e. u$ f$ t' [4 s6 W2 O9 ~
编译选项使用-Os,这样代码体积小点) g( U; z+ \+ ]. R, \
微信截图_20221029104615.png
" i) s5 c* E2 d4 W7 J! g7 u. F3 a- X  u/ H
图像预处理函数。模型要求输入神经网络的图像为灰度图,为完成摄像头获取的RGB彩图到模型输入需要的灰度图转换,需从输入的RGB565像素格式中解析出R、G、B三通道的值,再根据心理学公式计算出单个像素点的灰度,具体代码如下:
  1. uint8_t rgb565_to_gray(uint16_t bg_color)
    , N1 D- |% a. T
  2. {0 s  M3 d" g% M
  3.     uint8_t bg_r = 0;( N$ j2 S& t/ E3 D0 i3 \4 N
  4.     uint8_t bg_g = 0;: g/ L8 S* W/ K8 P* q
  5.     uint8_t bg_b = 0;
    " u1 l; n- P% |4 `
  6.     bg_r = ((bg_color>>11)&0xff)<<3;8 i% |+ d" ?) E2 P% X  p) M
  7.     bg_g = ((bg_color>>5)&0x3f)<<2;
    3 X1 q8 w# u: @9 U7 s
  8.     bg_b = (bg_color&0x1f)<<2;
    0 ^$ j2 R% B8 Y7 R* H, g& I1 }
  9.     uint8_t gray = (bg_r*299 + bg_g*587 + bg_b*114 + 500) / 1000;5 W" a3 u' g4 _0 r8 x" a
  10.     return gray;
    7 F- b4 o- |& R) e
  11. }: y. g, [# R5 \4 O/ ^6 a
  12. 4 v7 \% f6 W, x: k9 h8 y, R
  13. void input_convert(uint16_t* camera_buffer , uint8_t* model_buffer)
    9 ?& L& e! R* g, q1 `; I
  14. {
    2 e9 e* l+ @& [% I2 r- d6 @
  15.     int i,j;
    1 d+ k0 ?8 D) {- O) {2 f
  16.     for(i=0; i<96; i++)  h+ W  J# j- H; C
  17.         {
    ! o6 u) [( B; u
  18.         for(j=0; j<96; j++): I- b6 N( S' r  x7 o) h8 M* V
  19.         {  z0 V: T8 i3 [# N
  20.             model_buffer[i*96+j] = rgb565_to_gray(camera_buffer[i*2*320 + j*2 + 64 + 320*24]);- ~& l0 v+ p, y2 F1 c- {- _+ A
  21.         }( C/ J/ @7 o3 n  ~
  22.         }/ ~* G- u. h- `# a2 a/ u2 S
  23. }
复制代码

* H2 x- n9 F3 b2 J6 J在图像接收中断里面处理识别过程
  1. void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
    . k2 \+ _9 f- ]* l1 }$ _
  2. {
    ' `: L; o2 k& Z# i/ T
  3.     uint8_t person_flag;   ' {# [8 i1 s; [9 W: I
  4. 2 k; x7 n7 F! m3 F
  5.     //转换图像为模型可处理的大小
      c3 Y1 |, j( p
  6.     input_convert((uint16_t*)_OV2640->frame->buffer, model_buffer);# m! b! R! r1 e# ^4 {. s5 H9 G
  7.     person_flag = person_detect(model_buffer);  //运行模型
    - t7 |. h9 j/ y3 P( V. w6 V$ f4 r1 n: ?
  8.    ) O+ @, V! o% `- n
  9.     LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);6 m  J  ]9 J& b8 ^7 w* H' q
  10.     for(int i=0;i<192;i++)8 I& d+ C5 B. E, [. l
  11.     {& J: ]" _1 `# Y
  12.         LCD_Draw_Point(i+64,  192+24,0xf100);# }9 A, W4 L; d2 P
  13.         LCD_Draw_Point(192+64,i+24,  0xf100);3 U+ X9 l; S+ ?6 p
  14.         LCD_Draw_Point(i+64,  0+24,  0xf100);( O/ H' P3 a! t& K- p" m4 G& ?
  15.         LCD_Draw_Point(64,    i+24,  0xf100);
    3 x8 o) v" t, a
  16.     }
    2 a" i! e5 x' _( J' W- b) v
  17.     if(person_flag!=0)LCD_Draw_String(0, 0, 320, 240, 32, "people");
    # |) n6 Q6 z2 Y% V/ N# r! u
  18.    % H) [. y( i: j' k% q- |* `2 ]( B' s
  19.     OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);8 e9 g5 {9 T4 _- q3 L' O) ?
  20. }
复制代码

2 U, C, N# z! S9 ?! ]; o" g5 G! b, I

3 h/ N- p6 n  @. W
运行效果:
$ m# i7 h/ q8 w& s- G
识别充电器(无反应)
) {) f) M$ W% a4 o IMG_20221023_162131.jpg 4 o) }) p/ m7 P2 F4 y0 N" v) }

# }. G' o. C) ]
  R, @# r7 j4 }. G  O# D7 h; Y识别打火机(无反应)
) c5 k# L3 F- g& R& M4 E2 u" a6 h( d IMG_20221023_162402.jpg " l; f: j1 I5 N$ y' x# \
0 O, X& h" m' v6 t, n
识别人体(显示people)3 H- M: ?0 Q' c
IMG_20221027_153235.jpg * c- c3 {5 A0 Q+ _: _' r

  A( @" S; z4 t+ H9 C) V

3 f$ e) I7 [, ?) L% O4 q: l5 X+ ~& j0 s* U
收藏 1 评论4 发布时间:2022-10-29 10:49

举报

4个回答
STMCU-管管 回答时间:2022-10-31 08:42:03
打火机相当出境
晒太阳的懒猫 回答时间:2022-11-11 09:44:51
谢谢楼主共享评测,谢谢共享代码!学习了。
% H7 K, `. D! j9 P! ?" W7 V  [
Ender2021 回答时间:2025-4-23 21:46:22

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

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

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

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

所属标签

相似分享

官网相关资源

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