请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
北方. 发布时间:2022-10-17 10:57
Wio Lite AI视觉开发套件——人脸识别快速实现+ y5 o, G) X# D7 f/ o- u: O) w
1、在完成基本硬件评测和软件开发环境配置之后,可以快速实现人脸识别的任务
; A  R# H+ b3 j! E2、首先按照新的ST-link连接,把Nucleo的st-link调试如下图连接,
4 J0 b6 B5 n- v* f( B! n nucleo_stlink.png . f  m6 A5 E. k6 y9 z! D
采用如下接口对应联络到WIO Lite AI开发板," o: s* X6 i7 g( S0 v  N: U6 N
, ~% Z4 q3 c  f# N2 s5 N
Nu_WIO.png ! v8 v  ]5 R) L8 ~6 z0 ]3 G
使用调试夹子快速连接,就可以,如下图,
1 E- l# _& m# M! n3 `2 ] 353481694.jpg / L4 b  ^. D! f, M" x0 C
在项目的接口可以发现ST-LInk在Port Com8,另一个是COM5,连接WIO Lite AI
7 M( c+ t6 r4 ]. Y7 B% H; F) D2 z$ F, y0 B
Nu_WIO_03.PNG
  K, o( A9 j7 V* v7 m2、创建模板项目,启动CubeIDE0 y0 J7 z" n+ U& o. _
Nu_WIO_02.PNG
( S+ y/ X8 \2 W" i可以找到人脸识别的模型,Person_detect.tflite,这个是用于人脸识别的tensorflow 模型。这个是压缩后的整数型数据,人脸识别在标准情况下,现在已经可以做到90%以上,那么压缩之后,精度下降,识别精度明显下降,但是仍然可以完美实现该功能。
6 q5 D, @; i; C. W4 Y# _5 K1 M& Z6 r完成编译,执行下载,显示成功完成。
$ f" ?* ]7 N  t/ x7 v3 n
2 q) g: A5 }' p Nu_WIO_01.PNG ) Y- g+ H$ a7 k' |6 I
3、运行模拟
. a0 _, B" e* C& A上电后,摄像头捕捉图像,并显示在LCD屏上,当图片是空白,或者没有发现人的时候,显示No-person,
) Q' F, k/ f- Z% [这里用手机摄像头遮挡面部,就显示没发现人脸,显示准确度可以达到80%,
. y4 D* f) G8 a
% I) `1 y: f% B$ Y8 S3 t3 v; d, v$ ^ Nu_WIO_05.jpg $ l2 O/ f1 y1 \' O
移开手机,露出人脸,就迅速监测到人脸,显示Person,同时计算出准确率61%。* a9 G# |- n; [# L% ^
1 j0 `# [$ }/ }  }& S5 U7 e8 o- P! p
Nu_WIO_06.jpg
1 Q" X$ U+ C$ j6 {: j这样快速监测成功。
! ~2 d4 m9 M6 B  i4、人工智能实现的分析
5 ^4 E% z1 Z: J3 _- Q0 L: }4 p! L4.1 硬件平台的能力( w+ s1 j' l5 y0 x3 Z$ S$ ^
WIO LiteAI采用的是STM32H725工作频率高达550 MHz的Arm® Cortex®-M7内核(具有双精度浮点单元),可选扩展室温范围最高为125 °C (*),只有一个内核,仍然展现强大的计算能力,可以无延迟实现图像处理和人脸识别。在图形上采用的高性能的支持,具有以下两个图形实现和加速功能,
! w  v, [: U5 Y2 h% R. F# n
  • LCD-TFT控制器接口支持双层图形
  • Chrom-ART Accelerator™提高了图形内容创建速度,并为其它应用节省了MCU内核处理带宽
    6 u0 {; ^' q. A- X! z% Y9 Q# K
7 w; p( v" K% R# ]
! L* {) j6 ~  g( Z- \
4.2 人脸识别的流程和库的支持
+ G3 q2 L8 i6 V5 PCubeAI的人脸识别是用如下层次实现
; U- m$ o: [* t5 C3 |7 z Nu_WIO_07.png 2 {& X4 P8 R0 D+ H
在底层硬件上,实现板级支持,更上一层是STM32的人脸识别模型,实现具体的应用,实现过程的数据流程如下
+ U, Z5 S+ {' H8 f7 [3 K FaceReco_Dataflow.png
5 v; `9 I0 ^  S1 f5 `数据依次在上述流程中逐级计算,根据人工智能模型实现人脸的识别精度计算,当大于计算值以后就迅速提出结果并显示出来( |: @' u: q6 i8 `- Z
4.3 程序代码分析
% r; A  W+ J; u首先定义图形数据的交换空间,是一个320x240的采样空间% c; W& K8 F7 z; o1 x* ?! J  E! Q
  1. static Frame_TypeDef frame ={ .buffer = buffer,: j: N8 i1 b- o! I+ i7 v, F; c& c; t
  2.                                                           .length = 320 * 240 * 2,& J- p4 ^2 |- d- u2 C8 ]5 m
  3.                                                           .width  = 320,
    4 U' L1 `) x7 O: V
  4.                                                           .height = 2402 q4 q  B4 z/ H' }6 n6 U- ]
  5.                                                         };
复制代码
主程序代码非常精简
# \/ \& H: r7 t- D2 N: C

  1. " |. U' m% Q, o9 z; [8 k. x
  2. int main(void)0 D5 N- Y- t" Z( Y5 e3 V
  3. {& {) F2 I( m( w) z6 l8 ?9 J
  4.   MPU_Config();
    1 t" i0 L& r2 d& j4 r: p
  5.   SCB_EnableICache();6 E# t- d, u% j; a8 z
  6.   SCB_EnableDCache();6 {; \2 {3 W3 }  }  `# O% |
  7.   HAL_Init();
    4 K0 w1 M: @1 \' [2 n
  8.   SystemClock_Config();
    6 {0 W$ k, c4 v- ~0 D" x
  9. % j+ T* ]! ^2 P& Y/ s- V; a; U, Z
  10.   /* Initialize all configured peripherals */
    4 L  d8 D  z& n& K
  11.   MX_GPIO_Init();) Y# U1 B/ C8 p$ s" Q  S
  12.   MX_USART3_UART_Init();
    ! p: {/ p( r! ]5 d
  13.   MX_LTDC_Init();5 t5 G4 _: q; X( ^: l* U* y
  14.   MX_I2C4_Init();
    - ]- V' l$ b. ^3 R
  15.   MX_DMA_Init();! G* w: U2 e8 B' C2 o+ S
  16.   MX_DCMI_Init();% N/ V" z2 {$ u* T( Y, X( f
  17.   MX_TIM2_Init();
    8 t5 n. ^, A0 L* _' w7 a& P( S1 k1 _
  18.   MX_OCTOSPI1_Init();
    2 f, ]% a: v( C3 _
  19.   MX_CRC_Init();
    9 I  B5 n- [1 F% w$ G
  20.         LOG("here");! ^8 f5 r* J; w" h- G
  21.         Psram_Init();
    , w! V1 V$ o1 u- a) S% Y5 l5 B

  22. 9 H; Z1 z5 f- Q, p+ t; |
  23.         /*OV2640 Init*/
    # a% \% O. P- L: r
  24.         HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); //XCLK/ l9 X( x9 J' j* }  X4 T
  25.         OV2640_Init(&OV2640);! ?+ W, F: T9 g  C
  26.         OV2640_ReadID(&(OV2640.ID));+ \& D% L. b: B: C7 @2 k
  27.         LOG("ID: %02X %02X \r\n", OV2640.ID.PIDH, OV2640.ID.PIDL);- D" |/ b8 F" H. s8 [( K+ O8 O& v
  28.         OV2640_UXGAConfig();        //flip after all the camera setting ,or camera setting  will change REG04 value.& M) b( p6 W8 z- R- M& ?0 A
  29.         OV2640_Flip();* [! N( ~+ [1 Q! S6 }
  30.         OV2640_Start();        //initial IPL and AI
    8 N# a7 S7 p! m2 W4 H
  31.         STM32Ipl_InitLib(buffer_ipl, IPL_BUFFER_SIZE);9 q1 E. g& a* ~6 c6 ]- @4 S& o
  32.         /* The STM32 CRC IP clock should be enabled to use the network runtime library */: r/ N% S8 x* m* m* P9 S) \4 Q
  33.         __HAL_RCC_CRC_CLK_ENABLE();
    , j3 Y+ S3 ~4 g* |9 _& H# Y
  34.         aiInit();
    1 s7 c) Z, C! D9 @+ ?- z" }4 n( S
  35.         frame_rgb565.data = frame.buffer;1 y; \& F' V- Q' r) H% a  V
  36. 1 v/ F' @( m3 `3 x1 {
  37.         while (1)3 }6 K8 ~$ _5 [0 j
  38.         {, b5 s# n5 `1 H+ J, m: U! f6 l
  39.                   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);! }: `( ?( H: i- d* `. m
  40.                   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, GPIO_PIN_SET);. m* ]: ?: \4 U' B0 B6 t9 U. s
  41. 1 R9 `1 K! V, ]& {+ u
  42.                   // rgb565 320*240*2 to grayscale 320*2405 O' k2 @( r, o2 \" E% c9 C
  43.                   if (STM32Ipl_Convert(&frame_rgb565, &frame_rgb565_grayscale) != stm32ipl_err_Ok) {
    5 q1 U. H/ R, F1 o
  44.                           while(1);/ M. q3 v5 Y; P. j
  45.                   }# ?) r# g( Z/ a
  46.                   // grayscale 320*240 to grayscale 96x96x2: r6 `6 W4 U/ T
  47.                   if (STM32Ipl_Resize(&frame_rgb565_grayscale, &frame_grayscale_resized, &roi) != stm32ipl_err_Ok) {
    ; H& e; H* a, W
  48.                           while(1);5 W+ b' z! n1 D" W& w8 F; b
  49.                   }
    5 ~, M. F/ G& D! U' `3 j

  50. , {+ Q, O! \( S( ]/ G" B
  51.                   //AI  R1 F- v# Y7 c
  52.                   aiRun(buffer_grayscale_resized, network_output);# I! E$ S2 G1 X- T" Z
  53.                   postprocess(network_output);
    ' a* [# C# Z. a

  54. 5 c: U$ r& w4 e
  55.                   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
    ) x# p7 j; `0 W! W) H. k# z3 E$ ^
  56.                   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, GPIO_PIN_RESET);. b! ?- K3 |1 U5 |" i* [$ n" A2 j8 Q; A

  57. 1 s# q' l; u0 \2 D% B
  58.         }* R$ S1 m6 l' L6 Q. b0 o" f
  59. }; t/ j: n9 m# ]3 u0 n
复制代码
在启动硬件初始化之后,就进入识别循环,当识别出人脸就直接把对应的LED点亮,
$ V+ A  u* C) g. ?: q( \. l5 X实现人脸识别的函数是aiRun,对图形交换空间的数据分析,并直接输出神经网络计算的结果3 w) M' ]/ R, E- Z- S
9 P) A9 r" T5 J( E. }6 e/ A
  1. aiRun(buffer_grayscale_resized, network_output);% d5 V1 G5 D& E, C
  2. postprocess(network_output);
复制代码
这个函数是在"ai_inference.h"文件中实现的,9 K9 d' k& q! H3 e# I5 @7 d4 C
  1. void aiRun(ai_u8 *pIn, ai_u8 *pOut)
    1 L# [- _  {/ A1 D) T
  2. {7 ^% ?+ i! \  R  n" b& t/ H
  3.   ai_i32 batch;2 O6 E5 c3 _) T/ I7 d
  4.   ai_error err;
    ' {, x  J) f8 Q# Y6 A; c8 K7 h

  5. ) j2 L- y' M2 [, |; F- ^
  6.   /* 1 - Create the AI buffer IO handlers with the default definition */
    5 g5 P. b0 P% \6 q2 o' U( ~; n
  7.   ai_buffer ai_input[AI_NETWORK_IN_NUM] = AI_NETWORK_IN;
    + h3 w- A, G) i5 P! Y, Z' Q! o2 i
  8.   ai_buffer ai_output[AI_NETWORK_OUT_NUM] = AI_NETWORK_OUT;# f' O, |0 D% S# [- a; I2 p

  9. 6 p( d3 r; ^/ R7 r
  10.   /* 2 - Update IO handlers with the data payload */3 D( j% h+ X- T$ g
  11.   ai_input[0].n_batches = 1;
    : x% n' n/ z" q' ]0 T
  12.   ai_input[0].data = AI_HANDLE_PTR(pIn);3 a* G4 v& T4 {1 ^" i4 [2 }" g. x4 V
  13.   ai_output[0].n_batches = 1;  h; W; @6 B: |4 P& a' j
  14.   ai_output[0].data = AI_HANDLE_PTR(pOut);
    ; g' s' N$ l+ j! z1 e  J$ k% f; i

  15. & W  E- ^6 G" v$ a! b4 y0 \
  16.   batch = ai_network_run(network, ai_input, ai_output);6 \4 Z" _/ F* c% M( [. I( \$ l4 c
  17.   if (batch != 1) {
    2 z! T0 B/ y6 a7 {. F6 Z. r$ z
  18.     err = ai_network_get_error(network);
    # g% S& D) c9 A4 z; m6 v
  19.     printf("AI ai_network_run error - type=%d code=%d\r\n", err.type, err.code);
    # {6 C- b4 d) h  {; T' r# e
  20.     Error_Handler();( X* O; v* s: e+ p, n) k* v6 @/ H
  21.   }
    0 T/ ?4 k1 _/ d7 Z9 t2 }2 g
  22. }6 b+ ?6 ]3 r, S4 H3 P0 S
复制代码
上述过程就是流程图数据流实现的过程,读取经过预处理的图像数据,然后再ai网络中计算,输出计算结果,! {8 s# ^3 o6 g7 Z/ e
  1. ai_i32 ai_network_run(
    0 K9 b: G" B, n; {
  2.   ai_handle network, const ai_buffer* input, ai_buffer* output)
    7 S4 a4 J) F+ \" D4 k
  3. {4 S1 W) y8 ]- a3 }4 i
  4.   return ai_platform_network_process(network, input, output);* o: z& N5 G. N; h+ f! H2 H  W" A
  5. }
复制代码
上述处理,需要计算网络,这个是再ai_model中定义的,然后读取输入数据,形成输出数据。5 L  s( J  S5 d7 x2 h( q

" u& ]/ ]" M" b% V$ {* F4 F5 小结
. y& r' ~, D. ?" t6 g4 A% T7 J    基于STM的cubeAI,通常已经提供了一个快速部署的流程框架。对于开发者,只需要自定义人工智能模型,然后导入到新建的工程中,按照提供的API逐步实现数据流程,就能够在项目中嵌入人工智能的功能。
& _1 Q7 v; a+ ~% J; S  在上一个文件中提高的,对应模型的生产,采用CubeAI中的命令行指令,stm32ai就可以完整实现。这个CubeAI极其配套工具,就是一个完整实现人工智能嵌入的工具,虽然安装和使用流程比较多,但是能够实现这样的效果还是非常理想的,在硬件性能和软件功能,达到完美的结合。
* H1 a. g# r+ l' ]4 L8 x
3 }/ b0 j0 d1 Y% m3 b  q% L# a+ t6 o4 U

% [; N% u$ @5 `: A9 t/ _: E1 \* h* a4 s2 v: O- {
7 m+ b3 Z& |' A  n! T. _7 {

! z: R0 Z$ ]- q$ m
. `; n0 ~. b' x* J3 q& p& o1 c1 t. a; l0 s) F: ?8 x% u% F

- F5 `- M4 ^' s+ U3 c
2 X: c5 o7 }; y  W2 P+ f. N5 T0 N
收藏 评论5 发布时间:2022-10-17 10:57

举报

5个回答
小样爱捣鼓 回答时间:2022-10-17 19:17:31
这么好的板子不自己训练个模型尝试部署上去就有点浪费了
3 g* U5 W7 Q, o+ a+ {# J- o& f$ _$ }
晒太阳的懒猫 回答时间:2022-11-11 09:35:57
照着评测内容,一步一步学习,让自己更快地获取AI视觉开发的知识,谢谢楼主!
2 k; ~! t7 ]/ c+ J+ W
LN 回答时间:2022-11-16 15:26:25
人脸识别算法,可以直接搞个现成的吗?重新训练是不是很复杂
LN 回答时间:2022-11-16 15:29:29
签到; ~6 T! Y2 o8 W) B

# P( k7 j0 Y' K5 z
stm32_AI2.jpg
stm32_AI.jpg
党国特派员 回答时间:2022-12-22 16:45:47
这个网络模型是什么模型?
9 [9 b1 o2 `5 T6 U9 h" ?
' }: |" m' a* z2 T; H
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版