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

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

[复制链接]
北方. 发布时间:2022-10-17 10:57
Wio Lite AI视觉开发套件——人脸识别快速实现  T# k# m6 a1 V7 T7 o
1、在完成基本硬件评测和软件开发环境配置之后,可以快速实现人脸识别的任务; R& }, S8 n) s) l% M1 [3 \
2、首先按照新的ST-link连接,把Nucleo的st-link调试如下图连接,) Q  {* k! e$ Z+ u) a
nucleo_stlink.png 7 e7 a, f" h6 F. l- X( L
采用如下接口对应联络到WIO Lite AI开发板,, ^; c, m* l4 `9 v/ ~2 H
6 y! H; F" B; b# @
Nu_WIO.png
4 S( N6 A) w' t/ D5 U使用调试夹子快速连接,就可以,如下图,2 r) @6 B, n& W
353481694.jpg
3 \$ `* \: C' P) R6 |在项目的接口可以发现ST-LInk在Port Com8,另一个是COM5,连接WIO Lite AI
- m7 ]! g- f" L* p) P
& q' y9 k- ]- h; M2 s- x; ? Nu_WIO_03.PNG + _2 U7 s, Y. z$ ?
2、创建模板项目,启动CubeIDE
  h8 r) Q; z! p! H# e0 h; a) b Nu_WIO_02.PNG
6 C+ Y1 b! m8 R: x可以找到人脸识别的模型,Person_detect.tflite,这个是用于人脸识别的tensorflow 模型。这个是压缩后的整数型数据,人脸识别在标准情况下,现在已经可以做到90%以上,那么压缩之后,精度下降,识别精度明显下降,但是仍然可以完美实现该功能。
4 t, i/ w8 m2 Y) h' D2 W  c& t完成编译,执行下载,显示成功完成。" X# W' ]3 r( M$ h1 V
0 l% a) W6 b* J( f( z( a9 ?
Nu_WIO_01.PNG
0 s8 o  f% X' J1 W$ }  F5 x* H3、运行模拟0 p6 w4 n2 i  n1 t) l+ W! e
上电后,摄像头捕捉图像,并显示在LCD屏上,当图片是空白,或者没有发现人的时候,显示No-person,
, A' Q/ m; c  Q3 x& G# W这里用手机摄像头遮挡面部,就显示没发现人脸,显示准确度可以达到80%,1 R; z  s) f' H: O$ s
4 z" ~5 u+ j; a2 B/ j. Y4 v! P5 _4 e
Nu_WIO_05.jpg # ?3 g9 z" Z( u  e3 l8 Y8 e
移开手机,露出人脸,就迅速监测到人脸,显示Person,同时计算出准确率61%。
8 t  X! _( `" o: c7 V* f0 U6 u; I. ]# B' i: p4 P1 ^& j$ G
Nu_WIO_06.jpg 2 _) U  h9 {- U  |
这样快速监测成功。, x2 v1 }% U3 l
4、人工智能实现的分析
0 c- X# ~; N& @' U$ r7 A4.1 硬件平台的能力& s4 d! M6 m+ a) e( O
WIO LiteAI采用的是STM32H725,工作频率高达550 MHz的Arm® Cortex®-M7内核(具有双精度浮点单元),可选扩展室温范围最高为125 °C (*),只有一个内核,仍然展现强大的计算能力,可以无延迟实现图像处理和人脸识别。在图形上采用的高性能的支持,具有以下两个图形实现和加速功能,4 c* }5 \9 S" N9 u( W5 w
  • LCD-TFT控制器接口支持双层图形
  • Chrom-ART Accelerator™提高了图形内容创建速度,并为其它应用节省了MCU内核处理带宽8 X" L+ k. p4 U) ?3 U& B9 O( u
4 m) a6 y; t7 d4 g) D4 {

0 o/ S6 {: L( x+ D7 I4.2 人脸识别的流程和库的支持( `4 _) c" \0 B# [' r4 {
CubeAI的人脸识别是用如下层次实现$ u& B. w# y- R8 \
Nu_WIO_07.png : [/ f1 t) L# S9 s* c2 I
在底层硬件上,实现板级支持,更上一层是STM32的人脸识别模型,实现具体的应用,实现过程的数据流程如下' H: y" K. A8 w/ ]
FaceReco_Dataflow.png : I3 _4 t0 g; I& |' z
数据依次在上述流程中逐级计算,根据人工智能模型实现人脸的识别精度计算,当大于计算值以后就迅速提出结果并显示出来
% i5 a1 q2 }, z# y$ [4.3 程序代码分析
# L) ^, }* q# {3 Q6 A' l* @! D首先定义图形数据的交换空间,是一个320x240的采样空间
, W1 Q6 {9 `3 q2 j( K
  1. static Frame_TypeDef frame ={ .buffer = buffer," \0 h( o5 {9 c3 R0 F
  2.                                                           .length = 320 * 240 * 2,
    , V" B$ a0 q& ]$ V! K$ r' ^* X
  3.                                                           .width  = 320,
    3 C- U2 v6 b, Q1 _1 @# k% o, r
  4.                                                           .height = 240' \  F# g/ ]6 F5 E
  5.                                                         };
复制代码
主程序代码非常精简
7 E" {: \4 x( Z) O7 R
  1.   R" c8 z9 d# D7 O
  2. int main(void)
    9 g6 r$ A2 r! o
  3. {0 K! Z' i4 `8 O9 ^, B" D0 B6 }
  4.   MPU_Config();
    ; j! Z! f3 l  P4 w
  5.   SCB_EnableICache();  H, Z% }0 ?! ~4 R0 @4 n
  6.   SCB_EnableDCache();; [% x; M& `+ k* ~4 @
  7.   HAL_Init();; p1 i0 a- ~* Y
  8.   SystemClock_Config();0 d4 I: {5 ~) o4 ~% u
  9. 3 P" b. {3 c* z1 \$ b  ~
  10.   /* Initialize all configured peripherals */7 N  I) V5 D; t0 u6 i
  11.   MX_GPIO_Init();+ H" I. {9 j+ _6 ?& G' {
  12.   MX_USART3_UART_Init();
    6 d" k, A2 \0 [, _2 E' L5 }0 z
  13.   MX_LTDC_Init();  ?2 Y" q6 Z# F/ z9 v& v
  14.   MX_I2C4_Init();
    ! \4 e$ B/ Q* B. ~( w8 j. \
  15.   MX_DMA_Init();8 @: `! v+ ^& Z' p3 q8 w
  16.   MX_DCMI_Init();9 {; M  @0 h/ |1 t- s; L
  17.   MX_TIM2_Init();3 S; F6 \# H) o  v! ?
  18.   MX_OCTOSPI1_Init();
    " |, G0 H. Y; c5 [+ ?. i
  19.   MX_CRC_Init();9 O: s3 R5 M( q
  20.         LOG("here");) ^5 _4 I* ~, \2 n
  21.         Psram_Init();( V' c5 M9 j& p$ @

  22. 8 z8 B( ^- ~; \/ K+ c$ E
  23.         /*OV2640 Init*/
    . y; G( b8 J9 p5 o
  24.         HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); //XCLK
      }8 n* Z; r, O" a1 v
  25.         OV2640_Init(&OV2640);
    8 X% D" Q+ _: V  {& \; v
  26.         OV2640_ReadID(&(OV2640.ID));
    ! M# F: r5 H, K; `' o, h
  27.         LOG("ID: %02X %02X \r\n", OV2640.ID.PIDH, OV2640.ID.PIDL);
    " y5 i: D/ a$ a: s# w9 W' V, L* F& S
  28.         OV2640_UXGAConfig();        //flip after all the camera setting ,or camera setting  will change REG04 value.
    4 m1 ~- G* O4 b* q+ d' ?
  29.         OV2640_Flip();7 [$ D8 s, j% r( D
  30.         OV2640_Start();        //initial IPL and AI0 C& H8 o5 r1 O: z5 r$ S) A5 p" d
  31.         STM32Ipl_InitLib(buffer_ipl, IPL_BUFFER_SIZE);) N8 W# B4 K% T& N# o3 e
  32.         /* The STM32 CRC IP clock should be enabled to use the network runtime library */0 r0 j( A9 ^# A, k) z9 h/ R
  33.         __HAL_RCC_CRC_CLK_ENABLE();
      G7 X% S; X, X0 y
  34.         aiInit();1 ?$ b& b: H) ]/ @, |. _; v0 u
  35.         frame_rgb565.data = frame.buffer;
    , L3 ?* \  D3 B" C- `( N/ k
  36. 5 N7 Y' J+ k' J5 A' |
  37.         while (1)
    % c7 D3 l3 [* q, B. h
  38.         {9 a% I3 S' [  Z2 j9 z9 ^" A! J
  39.                   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);" D9 Q; |0 v6 S9 |
  40.                   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, GPIO_PIN_SET);
    + u& I! d6 b% ]* \0 n% @' v) @8 y

  41. " T* ~9 D. [2 k
  42.                   // rgb565 320*240*2 to grayscale 320*240- T8 w# k; |1 m3 U9 v7 m/ \1 G- N1 v
  43.                   if (STM32Ipl_Convert(&frame_rgb565, &frame_rgb565_grayscale) != stm32ipl_err_Ok) {& ]) r7 l; H! \9 h( t
  44.                           while(1);
    - Q1 o2 Y3 m! f( a) x
  45.                   }
    8 z# B7 r* D7 m  U. N
  46.                   // grayscale 320*240 to grayscale 96x96x29 A6 D4 c! d5 d& s& P8 W
  47.                   if (STM32Ipl_Resize(&frame_rgb565_grayscale, &frame_grayscale_resized, &roi) != stm32ipl_err_Ok) {
    2 ~3 {# e/ ~- q% z. u( V$ A# z5 l# o/ H
  48.                           while(1);- {2 q0 b5 ~- a: ~  Z; {, e$ T
  49.                   }
    6 B: ?7 f) U8 O

  50. " C3 @7 e9 [8 W! C) j
  51.                   //AI; a! G7 l5 z9 F3 N# l) J
  52.                   aiRun(buffer_grayscale_resized, network_output);
    , s1 o% a  X7 ]
  53.                   postprocess(network_output);
    & L/ [9 a- f( }# s3 A% x% ?* m4 V
  54. + @, q9 ]6 ^3 x. ~% l
  55.                   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);& \. u% d& r3 ?5 u8 v
  56.                   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, GPIO_PIN_RESET);
    ) u1 P" p' J6 v3 ~. A/ c* t
  57. 4 h6 E5 ?# p& y) |% o
  58.         }
    , x! }' x6 i: w/ S/ C/ n% T. E
  59. }
    " p. z; x* L0 V. f0 q! w- h4 |+ G
复制代码
在启动硬件初始化之后,就进入识别循环,当识别出人脸就直接把对应的LED点亮,) T7 S2 T7 j6 C0 {
实现人脸识别的函数是aiRun,对图形交换空间的数据分析,并直接输出神经网络计算的结果
) C: A/ I3 X( _) I0 i
1 K; F+ Q: z" x0 i/ B. Z* }0 l* A  @
  1. aiRun(buffer_grayscale_resized, network_output);
    ! l( j( c, {. \
  2. postprocess(network_output);
复制代码
这个函数是在"ai_inference.h"文件中实现的,! t8 [6 ^5 R& W' ]( ^2 _
  1. void aiRun(ai_u8 *pIn, ai_u8 *pOut)
    * u9 U8 A2 a( w$ `# Y
  2. {
    $ i  f/ |3 O+ h
  3.   ai_i32 batch;8 b# k. U( b- H) P/ l" O0 Y% }3 {
  4.   ai_error err;
    & T8 X# s$ H+ z3 y
  5. : K, Z+ k5 J. Z- `2 p, ^; j
  6.   /* 1 - Create the AI buffer IO handlers with the default definition */4 |% b% T; S8 e: j* D1 M8 J
  7.   ai_buffer ai_input[AI_NETWORK_IN_NUM] = AI_NETWORK_IN;
    * n9 z! ^2 |  V- }- k+ f
  8.   ai_buffer ai_output[AI_NETWORK_OUT_NUM] = AI_NETWORK_OUT;) K3 C1 m8 j: L( Z( G$ j

  9. . ]" _, A$ I- v+ J
  10.   /* 2 - Update IO handlers with the data payload */+ v4 p3 `7 d% t( Z. A1 D0 o
  11.   ai_input[0].n_batches = 1;7 E  ~. B  I* c, d( m1 n
  12.   ai_input[0].data = AI_HANDLE_PTR(pIn);  S* s: ~9 A& ~: d
  13.   ai_output[0].n_batches = 1;
    % M: {, ], a7 S, B5 z
  14.   ai_output[0].data = AI_HANDLE_PTR(pOut);
    2 O+ y  Y/ p" O+ M) f/ b/ A
  15. ) h8 V  ^, j. u# t
  16.   batch = ai_network_run(network, ai_input, ai_output);6 L' z. K$ k. M) V& ~6 S0 G
  17.   if (batch != 1) {0 t9 F, G) n3 v+ f% r8 a9 K
  18.     err = ai_network_get_error(network);3 `) \, V& a/ Y% C1 c8 P4 N
  19.     printf("AI ai_network_run error - type=%d code=%d\r\n", err.type, err.code);
    1 S. r5 R7 ^) Q: U
  20.     Error_Handler();
    ( l, b4 N: T% F( f; W% O2 K' k
  21.   }
    : _+ Q8 |" m6 t8 i% G
  22. }
    % T" |, l# b) v5 q
复制代码
上述过程就是流程图数据流实现的过程,读取经过预处理的图像数据,然后再ai网络中计算,输出计算结果,
  n1 M5 m" {$ m# X8 W, k' T6 D+ ]8 v$ k/ n# G
  1. ai_i32 ai_network_run(( k2 j5 o+ n7 B' O: S2 W! {! u
  2.   ai_handle network, const ai_buffer* input, ai_buffer* output)
    * O& q" g! j$ B
  3. {8 ~  E. d# ]7 h7 ]. I
  4.   return ai_platform_network_process(network, input, output);% Q8 x. o* Z: @5 U% L0 L# @+ [/ b
  5. }
复制代码
上述处理,需要计算网络,这个是再ai_model中定义的,然后读取输入数据,形成输出数据。
( a* S( b3 |1 h* S* j0 D" x6 q8 G* M$ b& B- W3 {% e& z7 V2 D4 z& @
5 小结
- ^: l; g- Y" r1 i3 c    基于STM的cubeAI,通常已经提供了一个快速部署的流程框架。对于开发者,只需要自定义人工智能模型,然后导入到新建的工程中,按照提供的API逐步实现数据流程,就能够在项目中嵌入人工智能的功能。
9 O- \  O; W, e6 M4 H! j! R! v  在上一个文件中提高的,对应模型的生产,采用CubeAI中的命令行指令,stm32ai就可以完整实现。这个CubeAI极其配套工具,就是一个完整实现人工智能嵌入的工具,虽然安装和使用流程比较多,但是能够实现这样的效果还是非常理想的,在硬件性能和软件功能,达到完美的结合。3 ^/ V" b, `# t2 a8 C2 o5 D

. t) }! r- ^& i% p+ p, }% L0 V1 N
2 n  ^! @$ ~9 v6 l+ q# f3 ~3 N/ k9 n% F- H0 g' }& a

0 F8 S: f6 e; X  S# x  h1 A4 Q
! I/ M* s# B5 s2 y; w: b5 w2 ], P! u3 W% b8 M5 g7 j% R

- A3 p' V- q3 S9 h. ^' P! `3 t
$ x# g$ A# O2 |6 i& _5 c. }( G* [. m( D% I; Q+ f" Q
$ W1 b; L& B- ]  M1 s4 E4 H% M
赞 收藏 评论7 发布时间:2022-10-17 10:57

举报

7个回答
小样爱捣鼓 回答时间:2022-10-17 19:17:31
这么好的板子不自己训练个模型尝试部署上去就有点浪费了
. p& S4 w& V* i* r% {
晒太阳的懒猫 回答时间:2022-11-11 09:35:57
照着评测内容,一步一步学习,让自己更快地获取AI视觉开发的知识,谢谢楼主!
2 M6 k3 [( x* S6 F; `& |4 u3 u" j
LN 回答时间:2022-11-16 15:26:25
人脸识别算法,可以直接搞个现成的吗?重新训练是不是很复杂
LN 回答时间:2022-11-16 15:29:29
签到
6 N& J6 m/ u) ], r8 L
4 Y; s- G% t) E% h7 J3 q9 a  ^
stm32_AI2.jpg
stm32_AI.jpg
党国特派员 回答时间:2022-12-22 16:45:47
这个网络模型是什么模型?2 o  v: p8 M+ O4 r
- J  m( x& G! V$ j: F5 T& Y
萨法 回答时间:2025-1-5 14:38:37

大佬求源码

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

UP求驱动程序

所属标签

相似技术帖

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