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

【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 H* f: T& O/ J3 @7 H3 z. c
9 y! D5 a6 K2 N  r( h& X% A: Z
首先获取
Tensorflow LiteMCU版的源代码:https://github.com/tensorflow/tflite-micro$ y9 o( S0 i& _+ A9 N

/ n( h% ~' y7 ?根据教程获取工程代码:
TFLITE-micro/new_platform_support.md at Main ·张量流/TFLITE-micro ·吉特哈布 (github.com)
* }1 d7 {" S* y+ a/ @4 W  L
" _; D4 \2 [- h6 n# P文件都扔工程里面,太多了,截图只是一部分。把
CMSIS-NN库(算子加速)
也扔进去,加速运算. M$ G7 a" _2 Q* b1 H: G
微信截图_20221029100638.png
# s& _, u8 `, K+ }" Q, E  t4 V0 v+ G1 O( @7 ~8 q
添加相关路径/ u/ Y, D4 J4 G! M
微信截图_20221029100655.png

( l- I* I4 h- F$ o8 w
) I. h* T5 J4 T# s0 X
设置工程,使用AC6编译,关闭Keil的Microlib库9 _+ s& v4 I- w$ x8 g( ?
微信截图_20221029104604.png
6 w8 }, n3 {2 m6 J  b/ |
  G0 G; Z& e7 {) \/ Q
编译选项使用-Os,这样代码体积小点
6 q2 ]: J! `5 ?% w+ G- P 微信截图_20221029104615.png 1 ^9 B4 S) _' |" i1 O/ U

: A8 P! G/ o, g7 e
图像预处理函数。模型要求输入神经网络的图像为灰度图,为完成摄像头获取的RGB彩图到模型输入需要的灰度图转换,需从输入的RGB565像素格式中解析出R、G、B三通道的值,再根据心理学公式计算出单个像素点的灰度,具体代码如下:
  1. uint8_t rgb565_to_gray(uint16_t bg_color)& `- i4 f% a8 A% s! ?
  2. {
    , }2 e5 ?" @2 b( ^0 F: A. V1 f+ i
  3.     uint8_t bg_r = 0;! \' [4 h/ q# g$ `
  4.     uint8_t bg_g = 0;( T+ X  s; j/ J; t6 q
  5.     uint8_t bg_b = 0;$ @% N: A& v8 N* J1 i6 h
  6.     bg_r = ((bg_color>>11)&0xff)<<3;
    ; D! X) g3 g4 ^( X
  7.     bg_g = ((bg_color>>5)&0x3f)<<2;  Y& |4 p9 [+ F) g7 J4 r2 B
  8.     bg_b = (bg_color&0x1f)<<2;
    1 W0 N0 E9 {! b- p0 W/ a* P
  9.     uint8_t gray = (bg_r*299 + bg_g*587 + bg_b*114 + 500) / 1000;4 }' {5 |  N. |+ ?2 I6 }
  10.     return gray;( R$ ~* U0 R- u" z2 H
  11. }
    ( C8 `+ @& Q7 q

  12. , S3 R+ q4 E- U+ }' p1 w4 M& u! t
  13. void input_convert(uint16_t* camera_buffer , uint8_t* model_buffer)2 t/ y9 z# [7 C: X
  14. {
    $ t! E+ y- t! O  i; N! h
  15.     int i,j;- \, U, j6 w; e" R" K  `* G
  16.     for(i=0; i<96; i++)9 n9 D0 R5 `! f: ~) u( V* Q% F' ^
  17.         {9 {/ p& Z* I. L, N9 z% G; i
  18.         for(j=0; j<96; j++)
    5 O0 }+ T8 o- d+ w& j
  19.         {
    9 v: s8 a+ d6 c% |/ x
  20.             model_buffer[i*96+j] = rgb565_to_gray(camera_buffer[i*2*320 + j*2 + 64 + 320*24]);
    ; |8 q5 \$ h  V1 T6 `+ J
  21.         }
    ! e, M3 |9 o1 d; O. }* X, I
  22.         }
    1 p4 V6 e) K& X) F7 Q
  23. }
复制代码
& r8 o3 ~4 l0 z* y. |' P# D( ^9 n
在图像接收中断里面处理识别过程
  1. void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
    3 i' D; r0 K3 ]/ N6 n4 P( E2 w
  2. {  Z! |8 u3 ^: ^: u7 f. m
  3.     uint8_t person_flag;   
    + G" f& }0 f8 F' f2 ?2 f
  4. 8 j( F& {$ U7 U. ?5 x* e
  5.     //转换图像为模型可处理的大小! B- ?( Q& V  C" C  A
  6.     input_convert((uint16_t*)_OV2640->frame->buffer, model_buffer);  X- y- |$ Q& A3 s# V9 h0 P4 s
  7.     person_flag = person_detect(model_buffer);  //运行模型
    : I1 ^/ \, _- s4 `$ d7 W7 X
  8.    $ S% |( w  I8 l1 w, T( s. s
  9.     LCD_Draw_Image(0, 0, 320, 240, (uint16_t *)_OV2640->frame->buffer);
    3 T' e* r, t4 J. v2 _! h) K- ^) a
  10.     for(int i=0;i<192;i++)
    ' e7 |! B# m1 s) @
  11.     {
    - H9 z0 U- @' t# l6 o0 l2 D" I; Z
  12.         LCD_Draw_Point(i+64,  192+24,0xf100);' W) }0 r2 E. u% m# |! H
  13.         LCD_Draw_Point(192+64,i+24,  0xf100);+ _" h) i% O/ p( @) l1 R& x
  14.         LCD_Draw_Point(i+64,  0+24,  0xf100);
    0 \. U4 c: c) u5 B( @: a7 d) A
  15.         LCD_Draw_Point(64,    i+24,  0xf100);& S% l8 U* n' u$ s3 a2 b5 i; n
  16.     }: m, u1 u+ T' K. J6 _
  17.     if(person_flag!=0)LCD_Draw_String(0, 0, 320, 240, 32, "people");
    1 q+ i& d- i% O! {6 h. b
  18.    : a7 d  B1 p! P
  19.     OV2640_DMA_Config(_OV2640->frame->buffer, (_OV2640->frame->length)/4);
    , ~" d/ h* I( [
  20. }
复制代码

+ m- _8 y! }) ^6 U0 h
' s+ c% m: W' C/ E- d' s4 ~* O; t- d' s; X- T$ N
运行效果:7 ^: K5 Y, T  T6 D
识别充电器(无反应)- Y8 F- H; c$ c
IMG_20221023_162131.jpg
/ R; [- p+ Z+ |/ T. k
1 v/ b- `  J0 f7 v9 G7 F5 h5 `3 `. {) p- V
识别打火机(无反应)
. }0 q  d/ R2 ]1 ]! s3 @ IMG_20221023_162402.jpg
5 G; S$ H: \9 Q
) E9 Q8 P& M* t* _. s识别人体(显示people)
% E& _, E7 `7 z7 }3 I8 V( K IMG_20221027_153235.jpg & e- _) k' \8 j$ z

+ U$ [% `* p" I" M. N# k8 m

8 _* N  e" }* }7 n+ e  x! O5 \8 \+ E" n* a* ~. z; [$ v# u" i+ D
收藏 1 评论4 发布时间:2022-10-29 10:49

举报

4个回答
STMCU-管管 回答时间:2022-10-31 08:42:03
打火机相当出境
晒太阳的懒猫 回答时间:2022-11-11 09:44:51
谢谢楼主共享评测,谢谢共享代码!学习了。: k8 W) Y+ k1 T- Q
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 手机版