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

【Wio Lite AI视觉开发套件】人脸识别快速实现

[复制链接]
北方. 发布时间:2022-10-17 10:57
Wio Lite AI视觉开发套件——人脸识别快速实现  _# e2 ]' Z' z$ @
1、在完成基本硬件评测和软件开发环境配置之后,可以快速实现人脸识别的任务
# b8 ^+ e3 X6 F. @0 O! `. J2、首先按照新的ST-link连接,把Nucleo的st-link调试如下图连接,. z. }6 `  p& q' d3 F$ }0 v+ J' I
nucleo_stlink.png
# T9 u* T! F7 N7 U% i采用如下接口对应联络到WIO Lite AI开发板,8 o2 ~' I* k7 N* j- t
: c% O+ @$ q7 X& ~5 t" P9 \
Nu_WIO.png 9 l. `6 g, i# s( `6 Y/ }
使用调试夹子快速连接,就可以,如下图,! o( H: _3 e! I3 E! g% V9 n
353481694.jpg # y% w% a& o* G# ^* f3 M1 p- T% {/ B
在项目的接口可以发现ST-LInk在Port Com8,另一个是COM5,连接WIO Lite AI
9 X$ X+ V7 n& `: }) |  v$ ^; L6 L) r
Nu_WIO_03.PNG
: G3 r; u) L" U% e6 q$ p2、创建模板项目,启动CubeIDE
5 [4 ~, K- e0 D& S, S5 G) e Nu_WIO_02.PNG
$ f* _2 K2 a3 ?; c% |可以找到人脸识别的模型,Person_detect.tflite,这个是用于人脸识别的tensorflow 模型。这个是压缩后的整数型数据,人脸识别在标准情况下,现在已经可以做到90%以上,那么压缩之后,精度下降,识别精度明显下降,但是仍然可以完美实现该功能。" n% ^4 i0 j' e5 }! A3 C+ N
完成编译,执行下载,显示成功完成。: @. R3 n  e# k4 Y+ H
4 G* k9 Z% |, h# a3 t$ N/ L
Nu_WIO_01.PNG
  L) t0 M, [+ ?; P: m# j3、运行模拟
0 B+ ~, {& W! @6 \/ ]8 R( o上电后,摄像头捕捉图像,并显示在LCD屏上,当图片是空白,或者没有发现人的时候,显示No-person,$ o% d* x, Y8 x! q- r
这里用手机摄像头遮挡面部,就显示没发现人脸,显示准确度可以达到80%,
5 v. _4 j! w! [! U* v/ j9 B0 C$ c7 `' h8 {8 [1 a% C* a
Nu_WIO_05.jpg
3 R5 h) i4 m) q) ]0 L移开手机,露出人脸,就迅速监测到人脸,显示Person,同时计算出准确率61%。2 ?# `* W/ e* M. J! S* P

1 ?  f# _1 Z& b, [. A Nu_WIO_06.jpg ; d# u+ [, z! J3 I1 W. d$ r* s+ S
这样快速监测成功。
: }! l; k; }3 i: a' i; i  M7 m$ {4、人工智能实现的分析9 x: Y7 z" z3 o
4.1 硬件平台的能力
8 C- D- P  r- w4 o( c( cWIO LiteAI采用的是STM32H725工作频率高达550 MHz的Arm® Cortex®-M7内核(具有双精度浮点单元),可选扩展室温范围最高为125 °C (*),只有一个内核,仍然展现强大的计算能力,可以无延迟实现图像处理和人脸识别。在图形上采用的高性能的支持,具有以下两个图形实现和加速功能,
! l$ n; l. T' O4 L. x
  • LCD-TFT控制器接口支持双层图形
  • Chrom-ART Accelerator™提高了图形内容创建速度,并为其它应用节省了MCU内核处理带宽. z  {4 a# R* W5 w8 s* p
' F/ O5 P) H4 {* y% R- M
' r+ t9 \/ N9 ^* o; }/ Z
4.2 人脸识别的流程和库的支持
9 h) z- c* A- K% eCubeAI的人脸识别是用如下层次实现& ~' A& Q6 {4 e0 O& c$ A  n) ]
Nu_WIO_07.png / l- l8 }, |9 @' L; f" y8 ?2 P
在底层硬件上,实现板级支持,更上一层是STM32的人脸识别模型,实现具体的应用,实现过程的数据流程如下! G. n6 S# X$ D9 N( e- S+ U4 ?
FaceReco_Dataflow.png
% _; K, x6 P0 P# `+ U1 n( c) i- t数据依次在上述流程中逐级计算,根据人工智能模型实现人脸的识别精度计算,当大于计算值以后就迅速提出结果并显示出来& t: f$ o) A% J5 J3 n6 ?
4.3 程序代码分析/ V* j' ^. \" o% `2 W
首先定义图形数据的交换空间,是一个320x240的采样空间
& G8 D. g9 D5 o* O0 z
  1. static Frame_TypeDef frame ={ .buffer = buffer,
    # q6 S. J2 }% f, `. k0 s
  2.                                                           .length = 320 * 240 * 2,  ]% K" y+ k, f1 R3 K* a
  3.                                                           .width  = 320,4 C; O6 O! |- P* r
  4.                                                           .height = 2408 V, ~2 r8 A" N, Z
  5.                                                         };
复制代码
主程序代码非常精简
: Q5 A6 u: Z1 w
  1. 1 D$ d- F/ O5 O% R( D
  2. int main(void)
    1 x' ]( v& N) ~8 J+ \3 L' O# n
  3. {
    . g4 d) a% M) ~
  4.   MPU_Config();$ e; n# p1 g- e
  5.   SCB_EnableICache();, F# Y/ j& f7 b2 z2 D
  6.   SCB_EnableDCache();- w6 j4 j" H$ T+ ?+ y* F5 b) G. x
  7.   HAL_Init();
      _9 y; z! }: |1 H1 _, M5 R+ g
  8.   SystemClock_Config();
    1 N8 f5 R! h( g& H% v7 z5 U$ F/ ~' b

  9. 3 g; k) m3 m2 M1 u  `( g
  10.   /* Initialize all configured peripherals */" E7 u2 u8 R' B5 v; w  C
  11.   MX_GPIO_Init();" V0 i$ W7 t7 h" }* Q0 V9 I8 ?
  12.   MX_USART3_UART_Init();' s- V% Q) b5 F( p* r! r" C: d' i3 \
  13.   MX_LTDC_Init();2 T# _9 x% D) }
  14.   MX_I2C4_Init();9 `+ b0 y- E. [+ _, o0 ?
  15.   MX_DMA_Init();
    " Z) \& R) l: N" m9 p: E- f
  16.   MX_DCMI_Init();; _5 y0 w- k, ^2 Q( I
  17.   MX_TIM2_Init();6 M8 h& ]$ ]+ a/ K, e- ]
  18.   MX_OCTOSPI1_Init();
    % \; x9 t" _; W7 A- i, a: r9 G
  19.   MX_CRC_Init();
    ) ?- l! s4 M! u& y( ^
  20.         LOG("here");
    % `/ e( O7 s, C4 j1 c# S6 R# ?
  21.         Psram_Init();( e4 I% _+ h$ T+ N8 J4 _! M
  22. 3 b# O5 S0 g5 B' y
  23.         /*OV2640 Init*/
    6 l, f" f$ g1 t
  24.         HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); //XCLK, i) w0 T9 j- U% d# I9 @# r
  25.         OV2640_Init(&OV2640);2 }/ O+ S2 a# A; |! a
  26.         OV2640_ReadID(&(OV2640.ID));# m2 i+ X; _1 E6 {! e: h" Y2 ^  G
  27.         LOG("ID: %02X %02X \r\n", OV2640.ID.PIDH, OV2640.ID.PIDL);
    8 ?+ Q' C" {! w# @0 `' b' K
  28.         OV2640_UXGAConfig();        //flip after all the camera setting ,or camera setting  will change REG04 value.0 n4 `( c7 ?8 y
  29.         OV2640_Flip();( S; K* j! B. @; B$ h: D. B0 T2 i
  30.         OV2640_Start();        //initial IPL and AI
    7 h9 N! \+ G) q' H2 r
  31.         STM32Ipl_InitLib(buffer_ipl, IPL_BUFFER_SIZE);
      r7 y' p- k* q' ~4 d% G
  32.         /* The STM32 CRC IP clock should be enabled to use the network runtime library */+ b5 V5 i0 y' W
  33.         __HAL_RCC_CRC_CLK_ENABLE();+ M  L! y7 q1 D- }. d7 b6 j8 p9 ~! ~9 N
  34.         aiInit();- L# @; }1 Y4 c' O
  35.         frame_rgb565.data = frame.buffer;5 w/ _: Y4 z) F$ u1 I* C- v
  36. 2 m$ z& E: Y0 k9 ?( A1 y3 }
  37.         while (1)
      ~) @8 H* `3 H, \7 y2 D
  38.         {
    9 o4 f0 T) ?  b$ j6 o
  39.                   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
    # @  @4 Z$ w, v' v0 A6 ^4 F+ a+ O3 {: ?
  40.                   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, GPIO_PIN_SET);
    8 R8 ^  m& j1 u7 p: M4 U  T! r  |

  41. 8 v9 K9 E0 Y& y9 l
  42.                   // rgb565 320*240*2 to grayscale 320*240, G2 v9 w3 A0 v9 n0 G
  43.                   if (STM32Ipl_Convert(&frame_rgb565, &frame_rgb565_grayscale) != stm32ipl_err_Ok) {% W3 A8 W' S$ t9 P) V+ w
  44.                           while(1);
    3 `+ S! H8 A. p- b  v& b
  45.                   }
    , F, m: G& m1 v6 S- i
  46.                   // grayscale 320*240 to grayscale 96x96x22 x, _% `2 K2 U  r, `8 Y4 Q
  47.                   if (STM32Ipl_Resize(&frame_rgb565_grayscale, &frame_grayscale_resized, &roi) != stm32ipl_err_Ok) {2 p5 _5 P% B- {- Z8 V! S% F  y
  48.                           while(1);
    - F8 _, z) E6 q- }
  49.                   }) X# k4 q& `7 c2 d  k0 o; J: B8 I
  50. . v) w& j4 x3 i7 G) x
  51.                   //AI
    5 @, |+ T* z- q& e" U& r
  52.                   aiRun(buffer_grayscale_resized, network_output);
    ; Y1 l/ m! l/ t  i, o) Q. Y
  53.                   postprocess(network_output);
    ! h+ K) P, A" E! g( U

  54. # u" {: }% Y7 ]
  55.                   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);* {% `' D; t8 B( M# B) r
  56.                   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, GPIO_PIN_RESET);
    ; E/ U4 a. D; S0 g( J8 [4 `
  57. , H1 C. R; P0 z& D3 U( j) e4 {( H' t
  58.         }- _. E$ W9 ~/ v
  59. }' F+ O! K9 A! j2 C+ x# d
复制代码
在启动硬件初始化之后,就进入识别循环,当识别出人脸就直接把对应的LED点亮,0 B1 d. J# Y" K. A$ j1 Q( F
实现人脸识别的函数是aiRun,对图形交换空间的数据分析,并直接输出神经网络计算的结果
! z# W1 X3 ~) z1 Y6 Y8 n, Y* l* `
  1. aiRun(buffer_grayscale_resized, network_output);
    ) k& r( ^! M1 h7 s8 A
  2. postprocess(network_output);
复制代码
这个函数是在"ai_inference.h"文件中实现的,' X" h2 `, {. s' [, n) j& ^
  1. void aiRun(ai_u8 *pIn, ai_u8 *pOut)4 x, U% l8 j! w! P
  2. {0 _6 H% M+ L& x6 w, H: c+ D
  3.   ai_i32 batch;
    # P5 ~+ v+ R# @. T* x
  4.   ai_error err;0 D! m/ @& `( c6 T

  5. 5 u) _5 ?' b% s" s: a. s! P
  6.   /* 1 - Create the AI buffer IO handlers with the default definition */
    , W9 N6 D( w" y( c* l. W
  7.   ai_buffer ai_input[AI_NETWORK_IN_NUM] = AI_NETWORK_IN;0 g& B! ]; J3 K
  8.   ai_buffer ai_output[AI_NETWORK_OUT_NUM] = AI_NETWORK_OUT;$ k6 N' w! s6 C$ A  F) C8 B$ p! H

  9. & o% `% ~6 F% K1 M9 `% U* D% a
  10.   /* 2 - Update IO handlers with the data payload */
    + F7 ?3 |5 `8 b0 B9 {  h: A5 f
  11.   ai_input[0].n_batches = 1;' g! {- X; @) M! J) i
  12.   ai_input[0].data = AI_HANDLE_PTR(pIn);. P, s5 M  D0 g
  13.   ai_output[0].n_batches = 1;
    / z' |# C; z5 V: w' N: t+ \4 ?: r
  14.   ai_output[0].data = AI_HANDLE_PTR(pOut);
    & [$ W1 T" h$ Y7 R# b" m3 j

  15. # @  E8 o& p" K6 C% c0 k3 N
  16.   batch = ai_network_run(network, ai_input, ai_output);
    . n5 c( c* @1 R- Z; @' A% f0 ~
  17.   if (batch != 1) {. M8 \% k1 C9 `5 Y0 u5 r* g
  18.     err = ai_network_get_error(network);
    , X1 {9 D( ~! x
  19.     printf("AI ai_network_run error - type=%d code=%d\r\n", err.type, err.code);
    5 j2 u/ [' `) \
  20.     Error_Handler();
    : \4 p% h& O1 H: D) j; m
  21.   }- U  {4 F( H& b+ p1 X* S
  22. }6 R' `( k: F8 u" r8 B
复制代码
上述过程就是流程图数据流实现的过程,读取经过预处理的图像数据,然后再ai网络中计算,输出计算结果,. x  g  m' F5 y  S$ _2 ]
  1. ai_i32 ai_network_run(
      [' I7 {& M' j, k9 I( l# M
  2.   ai_handle network, const ai_buffer* input, ai_buffer* output)
    ; |2 w  W2 Y: R, d; x, J& G1 l
  3. {6 K# ]' _, d( F$ e
  4.   return ai_platform_network_process(network, input, output);9 c& P9 D- @9 r; H3 M
  5. }
复制代码
上述处理,需要计算网络,这个是再ai_model中定义的,然后读取输入数据,形成输出数据。' g$ o8 i( E) X0 C3 e
# W' T6 L3 }/ S8 c; Y
5 小结
" U4 |: B3 W+ H" Y    基于STM的cubeAI,通常已经提供了一个快速部署的流程框架。对于开发者,只需要自定义人工智能模型,然后导入到新建的工程中,按照提供的API逐步实现数据流程,就能够在项目中嵌入人工智能的功能。1 ]  h3 Z0 g: P* Q% O8 V- m! A
  在上一个文件中提高的,对应模型的生产,采用CubeAI中的命令行指令,stm32ai就可以完整实现。这个CubeAI极其配套工具,就是一个完整实现人工智能嵌入的工具,虽然安装和使用流程比较多,但是能够实现这样的效果还是非常理想的,在硬件性能和软件功能,达到完美的结合。
7 Z& K" L5 d7 W: V4 U
6 m2 y# d) E9 ?" A+ o6 D5 R5 `8 U) X

( ^  [7 ]5 e5 H* P& v0 t, T% d" D. G0 r. ]

, K# b3 t! v: Q' T0 A$ P- c" \' M: N$ m
, E4 S" P: K! F$ D

; I- F( v" ], s/ ^5 L: V( @5 A) a7 i( F5 m
5 F7 k) |5 O3 p. @  G
收藏 评论7 发布时间:2022-10-17 10:57

举报

7个回答
小样爱捣鼓 回答时间:2022-10-17 19:17:31
这么好的板子不自己训练个模型尝试部署上去就有点浪费了
7 ~; w1 j8 H. F/ U* j* ?
晒太阳的懒猫 回答时间:2022-11-11 09:35:57
照着评测内容,一步一步学习,让自己更快地获取AI视觉开发的知识,谢谢楼主!# G7 C+ |+ Q2 q2 a) h+ L
LN 回答时间:2022-11-16 15:26:25
人脸识别算法,可以直接搞个现成的吗?重新训练是不是很复杂
LN 回答时间:2022-11-16 15:29:29
签到
! n5 f9 Z+ J# A6 q
; v4 Q) t+ B* J) A  ~% C( n& O
stm32_AI2.jpg
stm32_AI.jpg
党国特派员 回答时间:2022-12-22 16:45:47
这个网络模型是什么模型?8 n0 k! ?' R+ o4 L2 C
9 _% @1 t+ X+ |' D/ x. D
萨法 回答时间:2025-1-5 14:38:37

大佬求源码

萨法 回答时间:2025-1-12 11:12:49

UP求驱动程序

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