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

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

[复制链接]
北方. 发布时间:2022-10-17 10:57
Wio Lite AI视觉开发套件——人脸识别快速实现" r/ A& d8 x8 F" _0 O. y3 }' W
1、在完成基本硬件评测和软件开发环境配置之后,可以快速实现人脸识别的任务0 ?- h( k$ l) p& g3 d
2、首先按照新的ST-link连接,把Nucleo的st-link调试如下图连接,4 g* E, d$ [) m8 U* @
nucleo_stlink.png 9 T$ N/ _% V$ L- P
采用如下接口对应联络到WIO Lite AI开发板,0 C8 T+ v1 U! ?4 T6 v
) y& q" l, O% O7 M- C
Nu_WIO.png + K! G! b4 O3 K$ \% b9 q. H
使用调试夹子快速连接,就可以,如下图,
$ n8 u4 P; L) |* `* C  d- Q 353481694.jpg
5 {6 ?; B+ O/ w' g在项目的接口可以发现ST-LInk在Port Com8,另一个是COM5,连接WIO Lite AI, T  b( U7 v1 j) B/ Z4 q/ L

" k0 B7 P3 X0 o: Y9 H Nu_WIO_03.PNG ; d, E* r) r; y0 r
2、创建模板项目,启动CubeIDE; I9 R& c0 s( l9 |  m& c4 x! f
Nu_WIO_02.PNG / Z! C) ~3 |$ [" \! [# V7 K
可以找到人脸识别的模型,Person_detect.tflite,这个是用于人脸识别的tensorflow 模型。这个是压缩后的整数型数据,人脸识别在标准情况下,现在已经可以做到90%以上,那么压缩之后,精度下降,识别精度明显下降,但是仍然可以完美实现该功能。+ |! L( I5 z% C9 L3 u
完成编译,执行下载,显示成功完成。
2 H9 O0 |! ~. m# q8 e0 Q. U1 H* l6 x
. J0 p; i% q3 o7 K2 G Nu_WIO_01.PNG
6 o- p  F/ c* J3、运行模拟
0 q5 @- U: J  t! c3 L" I4 \; d上电后,摄像头捕捉图像,并显示在LCD屏上,当图片是空白,或者没有发现人的时候,显示No-person,+ Y0 E. _& _" Z
这里用手机摄像头遮挡面部,就显示没发现人脸,显示准确度可以达到80%,) q7 @, B. x6 n1 D+ C$ N) U! ~
/ [8 F, x) k) u% G9 c
Nu_WIO_05.jpg + q+ d7 |1 I* f2 X. }: p
移开手机,露出人脸,就迅速监测到人脸,显示Person,同时计算出准确率61%。
( T3 a' d; E* v% g
' B- P9 j6 S- }, R+ h4 |0 W Nu_WIO_06.jpg 4 G1 C4 E  |( x. t( A
这样快速监测成功。) m# C! X; y5 v$ B3 e& f
4、人工智能实现的分析
, ]  I. S$ w7 S, R5 C& a7 i1 n: q3 H4.1 硬件平台的能力3 d8 g; ?" Y. W4 O9 a1 D
WIO LiteAI采用的是STM32H725,工作频率高达550 MHz的Arm® Cortex®-M7内核(具有双精度浮点单元),可选扩展室温范围最高为125 °C (*),只有一个内核,仍然展现强大的计算能力,可以无延迟实现图像处理和人脸识别。在图形上采用的高性能的支持,具有以下两个图形实现和加速功能,
2 A( E. g& s. t0 H# r
  • LCD-TFT控制器接口支持双层图形
  • Chrom-ART Accelerator™提高了图形内容创建速度,并为其它应用节省了MCU内核处理带宽
    , f8 J1 g9 C% W% J2 o

- @& o6 b6 _5 g( T' w/ b: e% X& m0 l- c0 f
4.2 人脸识别的流程和库的支持$ Z" `* x4 ]- O9 D
CubeAI的人脸识别是用如下层次实现
. W1 q! `% X4 [% j3 e Nu_WIO_07.png ' W9 O; Y! N7 f& Q  g0 _1 r  L+ g
在底层硬件上,实现板级支持,更上一层是STM32的人脸识别模型,实现具体的应用,实现过程的数据流程如下; o) p3 e# O; G
FaceReco_Dataflow.png : N$ r' k2 f9 y1 y+ \
数据依次在上述流程中逐级计算,根据人工智能模型实现人脸的识别精度计算,当大于计算值以后就迅速提出结果并显示出来  K5 P5 m! s9 ~" ^) h, \, G
4.3 程序代码分析
, F) d2 P* N" h7 ~首先定义图形数据的交换空间,是一个320x240的采样空间: P& B' C) s. I5 N8 ]7 @& i! o
  1. static Frame_TypeDef frame ={ .buffer = buffer,
    , y0 o7 |, C% ~) y$ o
  2.                                                           .length = 320 * 240 * 2,/ W4 t/ |4 |. A$ v  R: b
  3.                                                           .width  = 320,
    : C2 p: L: E4 v. M! ]
  4.                                                           .height = 240* L+ i5 d5 {; `$ A+ X
  5.                                                         };
复制代码
主程序代码非常精简- z  q4 z% j! g- [1 q

  1. / A0 X  \3 E( D3 R! b" a  B
  2. int main(void)# ^* B7 t1 v2 t
  3. {0 g% l9 A8 \( q3 Y1 y+ _0 z3 j3 N5 }
  4.   MPU_Config();
    , s& w; D) [5 K. d; Q$ y( X
  5.   SCB_EnableICache();; e. p5 r' U/ Y- j) t8 L5 M
  6.   SCB_EnableDCache();
    % j# k. {5 ]- [) p
  7.   HAL_Init();9 l* Y) Y! E' f3 s$ m1 L& n2 y4 F  b
  8.   SystemClock_Config();7 f0 g5 W8 U7 T% o

  9. 6 u8 x% F& M4 T: |/ l
  10.   /* Initialize all configured peripherals */# V4 D0 o6 v, I1 f7 K1 E
  11.   MX_GPIO_Init();; j9 I' R9 S, T3 j+ P& ^: i
  12.   MX_USART3_UART_Init();
    0 P) I) Y+ b" \3 T# P4 [
  13.   MX_LTDC_Init();
    * U0 u3 \: f2 f3 G% v, h" _
  14.   MX_I2C4_Init();
      j+ n% f8 M9 ^! v; `5 r6 C
  15.   MX_DMA_Init();8 O+ W# P7 h9 [! V# E5 g. `, v
  16.   MX_DCMI_Init();5 ~" w; o, k1 J! J. u' ?
  17.   MX_TIM2_Init();
    ! |; U5 L. [# Z: [/ e# ~
  18.   MX_OCTOSPI1_Init();7 x, B# S' p, J4 }( ^7 A5 D
  19.   MX_CRC_Init();
    ! W7 Y# F" @/ l) [. [# P$ V2 ]+ l
  20.         LOG("here");6 ~# N9 o. w/ C. n% `
  21.         Psram_Init();/ o1 y& Z) A% Q7 E. b
  22. # c4 Y% o0 V3 v. J
  23.         /*OV2640 Init*/- k" V; W" B3 _/ |) B. s6 _( j
  24.         HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); //XCLK) b9 ^  ^, ~3 u4 b3 R
  25.         OV2640_Init(&OV2640);4 O$ A. ?' E3 L3 d, b$ l- O, v
  26.         OV2640_ReadID(&(OV2640.ID));/ A( q$ D: Z, b( @2 P0 o5 A' C0 [5 G# X
  27.         LOG("ID: %02X %02X \r\n", OV2640.ID.PIDH, OV2640.ID.PIDL);% T1 i2 |8 x: I; B+ \
  28.         OV2640_UXGAConfig();        //flip after all the camera setting ,or camera setting  will change REG04 value.. n$ B3 J4 A0 U
  29.         OV2640_Flip();
    5 i, \. U3 W! `. {5 ]! B
  30.         OV2640_Start();        //initial IPL and AI
    / e8 P! o) D6 p# o! S, I4 h) }; _
  31.         STM32Ipl_InitLib(buffer_ipl, IPL_BUFFER_SIZE);+ N8 r) H0 L: u
  32.         /* The STM32 CRC IP clock should be enabled to use the network runtime library */' a6 B# }, C! R# j0 E  J; ~  p
  33.         __HAL_RCC_CRC_CLK_ENABLE();
    8 z: p! L0 F* V9 C
  34.         aiInit();8 ^9 @# O) {5 J3 j/ ~" {
  35.         frame_rgb565.data = frame.buffer;% R) z  V9 L' S4 l! ]
  36. + b, x+ b8 L, z' Z8 T* ?+ f- }# r
  37.         while (1)% h+ h3 D( [' C) [1 ~
  38.         {+ E) U+ z. e) T* e- M3 {
  39.                   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);# u6 {: ~5 @* y4 C$ J4 }8 f" O
  40.                   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, GPIO_PIN_SET);
    / f7 f, {; i' `4 G+ l1 ]

  41. 9 z& P( d' x' I" E" u- d* c
  42.                   // rgb565 320*240*2 to grayscale 320*240  V8 R4 H! G- }1 \
  43.                   if (STM32Ipl_Convert(&frame_rgb565, &frame_rgb565_grayscale) != stm32ipl_err_Ok) {
    . ^! {; x# T; A0 v, P3 L# ?( e5 j2 g
  44.                           while(1);+ e. o7 A1 e* T' b6 F, X
  45.                   }0 l- t  w7 M  m2 m' ?
  46.                   // grayscale 320*240 to grayscale 96x96x23 m3 l9 k! ], q* B. C% L
  47.                   if (STM32Ipl_Resize(&frame_rgb565_grayscale, &frame_grayscale_resized, &roi) != stm32ipl_err_Ok) {
    4 n$ {: S  M0 j0 t  g" k
  48.                           while(1);
    . m7 }) X& ~( K
  49.                   }, S4 [, H: L6 S( i$ }
  50. . J; B# Z) h$ Y3 d1 T
  51.                   //AI1 ?& Y. P( I* f$ [/ y, z
  52.                   aiRun(buffer_grayscale_resized, network_output);
    % k: @5 h; r  D- O
  53.                   postprocess(network_output);, _! r. t  ?% ?5 e9 D: E: O( V

  54. 1 s- l7 W% ]0 \3 F  Z7 u. T
  55.                   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);. H" T7 o0 _7 @# i6 h" H
  56.                   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, GPIO_PIN_RESET);
    : n1 \* o* n6 \- E, [# a' P

  57. # q5 C& {6 Y, [- z1 y- [+ N
  58.         }3 s; g0 J' R$ k, s& W  s
  59. }( C7 K) W6 y$ e; A( G' B7 F
复制代码
在启动硬件初始化之后,就进入识别循环,当识别出人脸就直接把对应的LED点亮,, y% o. s  W" Q$ H, \* Z$ u
实现人脸识别的函数是aiRun,对图形交换空间的数据分析,并直接输出神经网络计算的结果
& u& w. ?5 I% a4 X/ u: X& }5 a
2 A, s8 {" @6 p  C# y
  1. aiRun(buffer_grayscale_resized, network_output);
    - v2 c1 O% H# \
  2. postprocess(network_output);
复制代码
这个函数是在"ai_inference.h"文件中实现的,
0 y7 [  @* T  q; x, n0 ]
  1. void aiRun(ai_u8 *pIn, ai_u8 *pOut)
    ! H: U% b% e( a% A& V$ p: t
  2. {
    - F; r# e, y# {2 H4 r
  3.   ai_i32 batch;, d! ^, S. h' R- f
  4.   ai_error err;/ h& {+ _/ a" [& y+ M

  5. ! A6 J$ X$ N, X5 |( S  W; r
  6.   /* 1 - Create the AI buffer IO handlers with the default definition */' i, A8 j9 d" z  U* R
  7.   ai_buffer ai_input[AI_NETWORK_IN_NUM] = AI_NETWORK_IN;7 I) S4 \! j  V
  8.   ai_buffer ai_output[AI_NETWORK_OUT_NUM] = AI_NETWORK_OUT;
    # B) V4 T$ b( G% J5 i2 X
  9. 1 K) o! O4 L& u# F$ C% b7 R9 r! W" \: p
  10.   /* 2 - Update IO handlers with the data payload */
    $ C" l" d6 i6 q, {
  11.   ai_input[0].n_batches = 1;# M3 X1 L3 V$ f( @$ U
  12.   ai_input[0].data = AI_HANDLE_PTR(pIn);. D/ Y% a8 |' c+ j7 o
  13.   ai_output[0].n_batches = 1;
    ! h2 F  s& j4 g( @
  14.   ai_output[0].data = AI_HANDLE_PTR(pOut);6 z8 q: _4 ~7 f& |; v

  15. / p9 x& L: ~( d. t5 N
  16.   batch = ai_network_run(network, ai_input, ai_output);
    . s5 }" P. o: a6 A1 b% X: ?
  17.   if (batch != 1) {
    3 B7 _8 e1 L0 B5 i. b7 B0 J
  18.     err = ai_network_get_error(network);: o7 z6 u% ?+ i/ {! B3 O- ~# j8 D+ s- `
  19.     printf("AI ai_network_run error - type=%d code=%d\r\n", err.type, err.code);
    ' M  T& o* O  H2 \# c$ a
  20.     Error_Handler();, T5 B$ S) y& m/ Q
  21.   }5 q: V8 R; L1 [% S, i/ p# E
  22. }# h2 d' }$ h' f. j
复制代码
上述过程就是流程图数据流实现的过程,读取经过预处理的图像数据,然后再ai网络中计算,输出计算结果,' T) |' G$ J' N3 F6 ?( O
  1. ai_i32 ai_network_run(
    & m9 R7 b* {& m
  2.   ai_handle network, const ai_buffer* input, ai_buffer* output)/ ?' R9 U# ^- h" o! g. k
  3. {9 l. I/ P0 X+ n
  4.   return ai_platform_network_process(network, input, output);
    8 \# j/ Z% Q) G) @5 q: o' f
  5. }
复制代码
上述处理,需要计算网络,这个是再ai_model中定义的,然后读取输入数据,形成输出数据。
' K# x( }* j6 M! P% M+ ^" n5 t2 ^7 Z, d9 ]  u
5 小结4 H* Q6 Q/ @/ C* X# @
    基于STM的cubeAI,通常已经提供了一个快速部署的流程框架。对于开发者,只需要自定义人工智能模型,然后导入到新建的工程中,按照提供的API逐步实现数据流程,就能够在项目中嵌入人工智能的功能。
# X* m+ A! {- @  在上一个文件中提高的,对应模型的生产,采用CubeAI中的命令行指令,stm32ai就可以完整实现。这个CubeAI极其配套工具,就是一个完整实现人工智能嵌入的工具,虽然安装和使用流程比较多,但是能够实现这样的效果还是非常理想的,在硬件性能和软件功能,达到完美的结合。
$ b# n2 Q' ?- P8 [4 V( j1 m2 t: e2 a  i3 u) Q

5 ^# p2 F8 N- C# `) U5 y
  O- S3 S8 F( F+ F5 ~/ j2 U% i( |! {. n) a- G

5 c( j1 J' G; o( p* y# L9 o/ v
1 e: L2 |" I3 K$ w: X# [9 S* q  v# b7 `' a
- j! [: N' z7 `

2 C) b* t* @4 F& C5 u6 D- e: E7 R0 e3 ~9 N1 u8 c2 @
赞 收藏 评论7 发布时间:2022-10-17 10:57

举报

7个回答
小样爱捣鼓 回答时间:2022-10-17 19:17:31
这么好的板子不自己训练个模型尝试部署上去就有点浪费了
! X' [) O5 b/ E2 s- R+ o0 Z
晒太阳的懒猫 回答时间:2022-11-11 09:35:57
照着评测内容,一步一步学习,让自己更快地获取AI视觉开发的知识,谢谢楼主!
, V8 T" `+ Z# o" a, w2 \
LN 回答时间:2022-11-16 15:26:25
人脸识别算法,可以直接搞个现成的吗?重新训练是不是很复杂
LN 回答时间:2022-11-16 15:29:29
签到
) f- B8 o- Q: S" h4 G$ w
. l1 m6 t  X# U) N
stm32_AI2.jpg
stm32_AI.jpg
党国特派员 回答时间:2022-12-22 16:45:47
这个网络模型是什么模型?
# P( h6 m0 ]+ h! A5 l& U: x: A  x
萨法 回答时间:2025-1-5 14:38:37

大佬求源码

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

UP求驱动程序

所属标签

相似技术帖

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