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

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

[复制链接]
北方. 发布时间:2022-10-17 10:57
Wio Lite AI视觉开发套件——人脸识别快速实现, W- s) K5 w% r+ Y" P0 d2 ~  s
1、在完成基本硬件评测和软件开发环境配置之后,可以快速实现人脸识别的任务
! `0 n) G6 c! H! h5 @2、首先按照新的ST-link连接,把Nucleo的st-link调试如下图连接,
$ j/ U5 F* d8 `. E" n nucleo_stlink.png : ^3 ?# A: O+ d+ Z8 j8 v
采用如下接口对应联络到WIO Lite AI开发板,
8 c4 O% G0 M9 P! S
7 Z; n1 x- ?6 L& c+ P: y1 k6 Z5 R Nu_WIO.png & m+ ]6 o. Y3 C
使用调试夹子快速连接,就可以,如下图,& l: \4 j) Y3 V, X9 d. Z) j) x
353481694.jpg
4 _2 g' `" {6 j: \" x" F5 s3 Q8 A1 {在项目的接口可以发现ST-LInk在Port Com8,另一个是COM5,连接WIO Lite AI
- f- {, h- O6 I
  @2 A: e1 f6 @+ o1 C3 k% \ Nu_WIO_03.PNG ) u8 G1 s* C: H
2、创建模板项目,启动CubeIDE2 D8 p+ g$ r4 k& Z2 j
Nu_WIO_02.PNG 2 y4 k' o6 \0 i8 A- @% D- O0 s
可以找到人脸识别的模型,Person_detect.tflite,这个是用于人脸识别的tensorflow 模型。这个是压缩后的整数型数据,人脸识别在标准情况下,现在已经可以做到90%以上,那么压缩之后,精度下降,识别精度明显下降,但是仍然可以完美实现该功能。/ j, ~" k: m# P' N' j
完成编译,执行下载,显示成功完成。
. C  f( y2 X1 q  t1 C* y4 l! R* W3 u. A: S- ^
Nu_WIO_01.PNG
7 V7 h" I9 }4 [3、运行模拟" ?% |" d0 X1 Q" {  |. H" ~
上电后,摄像头捕捉图像,并显示在LCD屏上,当图片是空白,或者没有发现人的时候,显示No-person,2 F2 c9 m( @. C; ?
这里用手机摄像头遮挡面部,就显示没发现人脸,显示准确度可以达到80%,
5 W- [* q: ~$ p, E5 G( r9 R
0 T  ~' |9 d6 H% d- B) V Nu_WIO_05.jpg 0 b/ g, T- R" d3 _' _
移开手机,露出人脸,就迅速监测到人脸,显示Person,同时计算出准确率61%。$ d7 F5 a& C9 M$ A5 s, }3 b8 f+ ~

+ [* V, I5 T& P: N0 V Nu_WIO_06.jpg 5 Z( P, d# y5 v9 F+ Z
这样快速监测成功。
5 S$ }6 D6 `' X5 `3 x: b8 N# I3 r4、人工智能实现的分析+ A/ x0 Y8 k+ [5 y7 a
4.1 硬件平台的能力
# ]4 o& m6 ]1 b+ U; D' `WIO LiteAI采用的是STM32H725工作频率高达550 MHz的Arm® Cortex®-M7内核(具有双精度浮点单元),可选扩展室温范围最高为125 °C (*),只有一个内核,仍然展现强大的计算能力,可以无延迟实现图像处理和人脸识别。在图形上采用的高性能的支持,具有以下两个图形实现和加速功能,1 I. m; _% u! u% k1 Z9 M6 L; F$ c
  • LCD-TFT控制器接口支持双层图形
  • Chrom-ART Accelerator™提高了图形内容创建速度,并为其它应用节省了MCU内核处理带宽# k( h. `" b* S; n" x. j2 Z* K4 i

: {9 M2 ]2 C; `4 ?% L( a4 E# X* S# [$ @
4.2 人脸识别的流程和库的支持
$ d0 ^: \6 m, w, nCubeAI的人脸识别是用如下层次实现+ A. d2 u( w* ]
Nu_WIO_07.png - N+ ?3 w8 \! C) z+ e( f5 c
在底层硬件上,实现板级支持,更上一层是STM32的人脸识别模型,实现具体的应用,实现过程的数据流程如下5 }) |: @4 q8 i( f3 D
FaceReco_Dataflow.png 9 @8 a4 [# M! n% Q% y, P
数据依次在上述流程中逐级计算,根据人工智能模型实现人脸的识别精度计算,当大于计算值以后就迅速提出结果并显示出来2 I# ~# m/ K) U9 C$ _# O; e0 t1 y
4.3 程序代码分析  B. Z% ?; T: Y( U
首先定义图形数据的交换空间,是一个320x240的采样空间
& g# s- {# A) ~0 r. L! G- }
  1. static Frame_TypeDef frame ={ .buffer = buffer,- A) @! e) d- s( O3 B' C
  2.                                                           .length = 320 * 240 * 2,
    3 N; Y& @. l2 p3 N9 s6 S+ t* W
  3.                                                           .width  = 320,
    0 D% y' f0 Q& @, a, l- k
  4.                                                           .height = 240
    $ S2 n& h- B8 P. q
  5.                                                         };
复制代码
主程序代码非常精简
2 l9 m6 m6 O1 r  U7 D
  1. 3 M2 ]1 Y5 t1 `7 V& Q+ {% P
  2. int main(void)
    / H3 z" M9 j2 s3 p) S( k9 P
  3. {% f  z8 H: G: {6 F8 Y6 ]
  4.   MPU_Config();6 w  E, C. U: G* p3 g  t7 V5 Z8 m% |
  5.   SCB_EnableICache();
    ' H) W+ Q2 Q# X5 G/ {* \+ A5 V( Q
  6.   SCB_EnableDCache();  B8 H- k5 p# d  `1 E
  7.   HAL_Init();9 f8 n5 t; j# |3 ^
  8.   SystemClock_Config();. n5 C  R. d1 I
  9. $ f& o, \: B- w4 X
  10.   /* Initialize all configured peripherals */
    - J) K# S* p% d; D
  11.   MX_GPIO_Init();! U8 o( K3 Z. ?+ P5 ]
  12.   MX_USART3_UART_Init();) x$ \( Z& E; j* X, J9 ?8 e3 t
  13.   MX_LTDC_Init();4 X, }( [1 X( h; l7 B) I0 `
  14.   MX_I2C4_Init();
    & B0 S0 v7 h& ^4 [4 n4 ?( ?
  15.   MX_DMA_Init();
    8 \: m& @$ B8 `* \7 M6 }$ T& i
  16.   MX_DCMI_Init();' ~( _4 E; V; [0 F2 A; ?, Y1 V
  17.   MX_TIM2_Init();  d  H6 X2 H0 \$ ^2 U7 H$ K) e
  18.   MX_OCTOSPI1_Init();
    : L7 k( W: j+ q3 k  I  p. {8 D( p
  19.   MX_CRC_Init();" ?: U# z6 \: T/ A1 P) X
  20.         LOG("here");
    % x/ @( R. t3 e6 j& t+ Y3 E
  21.         Psram_Init();
    6 J. u2 I6 J5 R+ N. a+ c7 [
  22. & d0 y' F4 S# p9 A* b' x6 n8 R
  23.         /*OV2640 Init*/
    6 l3 X, Y8 }4 k$ `
  24.         HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); //XCLK
    9 N) N9 m, P2 J5 K+ C, D' A9 f- i
  25.         OV2640_Init(&OV2640);
    0 B' c3 L6 l7 c/ @5 J: u6 t
  26.         OV2640_ReadID(&(OV2640.ID));& @$ @9 g% W' W5 u. f0 M- ?9 g% ~
  27.         LOG("ID: %02X %02X \r\n", OV2640.ID.PIDH, OV2640.ID.PIDL);
    3 V: K$ Y3 P+ L$ D* S6 }
  28.         OV2640_UXGAConfig();        //flip after all the camera setting ,or camera setting  will change REG04 value.; G% j+ U5 Z* S4 v' `9 H4 \0 R
  29.         OV2640_Flip();
    5 n  n6 n" O( \5 {$ w
  30.         OV2640_Start();        //initial IPL and AI( {- Y$ R+ S- f' X# B+ d
  31.         STM32Ipl_InitLib(buffer_ipl, IPL_BUFFER_SIZE);
    5 ]1 O" }/ ~4 t
  32.         /* The STM32 CRC IP clock should be enabled to use the network runtime library */
    " J" q/ @& o' ?- I0 q/ R! q
  33.         __HAL_RCC_CRC_CLK_ENABLE();
    1 @4 l( f4 F& ~* O
  34.         aiInit();: Z4 w; L# d3 _" F" j
  35.         frame_rgb565.data = frame.buffer;, B7 ?" j" @8 G0 d/ w+ R

  36. , a9 f& b3 b& A
  37.         while (1)3 B% R/ ?6 i; N& @+ }/ w
  38.         {
    " k: ~. x/ h, C, r) V
  39.                   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
    6 [9 [3 p! N: ^' v/ A
  40.                   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, GPIO_PIN_SET);
    7 m6 c- T9 [1 b7 P8 y4 b
  41. . A- N/ }7 z! u2 _8 z
  42.                   // rgb565 320*240*2 to grayscale 320*240
    4 r, \$ p1 C/ U! e3 t* a
  43.                   if (STM32Ipl_Convert(&frame_rgb565, &frame_rgb565_grayscale) != stm32ipl_err_Ok) {
    & a9 Z  B+ X9 ]% U* w
  44.                           while(1);
    # Q4 r  E4 R# ~7 \$ N
  45.                   }
    , U# X6 z! X4 B) B6 V
  46.                   // grayscale 320*240 to grayscale 96x96x26 n" _, W, K0 u; q
  47.                   if (STM32Ipl_Resize(&frame_rgb565_grayscale, &frame_grayscale_resized, &roi) != stm32ipl_err_Ok) {5 H. T9 f8 V9 C
  48.                           while(1);
    ) R4 R9 t  i" g
  49.                   }
    $ I8 h) T  }$ P; i9 G

  50. 4 v6 c4 h+ a) N+ k4 R8 J: F
  51.                   //AI/ ?9 ?% O8 ^, @. e% p  \2 l% o
  52.                   aiRun(buffer_grayscale_resized, network_output);
    4 V: b$ U: a6 O0 S3 O6 M; M
  53.                   postprocess(network_output);4 v3 p4 e/ y1 m2 p& o: |

  54. $ {/ d! l5 A) s; }
  55.                   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);# G5 l  `5 G- n* y/ ?: E
  56.                   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, GPIO_PIN_RESET);# D9 f) O+ M: v

  57. 7 ]7 w" X. J, g1 W, l
  58.         }
    + t8 L0 [- S6 w3 E: J; q
  59. }
    ; A* ^7 V1 b4 H4 w( E
复制代码
在启动硬件初始化之后,就进入识别循环,当识别出人脸就直接把对应的LED点亮,! }' U. @! R1 N& B; _4 U: w
实现人脸识别的函数是aiRun,对图形交换空间的数据分析,并直接输出神经网络计算的结果
0 _# X$ m7 D# s( D7 m1 j' \
; v! g. Y2 ~, g+ `( M
  1. aiRun(buffer_grayscale_resized, network_output);
    : M9 U. y1 ^% Q$ {' s
  2. postprocess(network_output);
复制代码
这个函数是在"ai_inference.h"文件中实现的,
$ [& h, j. U! q1 A3 I' k
  1. void aiRun(ai_u8 *pIn, ai_u8 *pOut)
    6 ?' p& P& Y7 V6 w1 Q5 n+ B
  2. {
    2 E9 t1 `& j/ T( Y- m4 _* |
  3.   ai_i32 batch;' ]& Y' G: R% z# [+ c
  4.   ai_error err;
    ! U0 M; ~: w* H: \* ~( v0 W: J

  5. 8 {6 Y- e% q& }4 z$ }7 {
  6.   /* 1 - Create the AI buffer IO handlers with the default definition */
    9 x1 s5 L) S" c; F3 o0 Q: n; x/ `
  7.   ai_buffer ai_input[AI_NETWORK_IN_NUM] = AI_NETWORK_IN;
    1 O# s2 f; N" b0 J, g
  8.   ai_buffer ai_output[AI_NETWORK_OUT_NUM] = AI_NETWORK_OUT;
    ; O1 k+ b. F, f* H" d

  9. $ \5 x" {" C4 y/ c& L# u' o1 s
  10.   /* 2 - Update IO handlers with the data payload */
    7 v# G7 O9 C1 h3 U& r
  11.   ai_input[0].n_batches = 1;
    2 ^' J2 j1 u/ M4 y& C7 q$ w
  12.   ai_input[0].data = AI_HANDLE_PTR(pIn);
    ) Y( m3 j/ L$ p/ P7 h, E% e
  13.   ai_output[0].n_batches = 1;: ^/ X: S4 }" _3 g1 w7 R! O' {  i
  14.   ai_output[0].data = AI_HANDLE_PTR(pOut);  Z$ U* C- H0 Q3 T4 l
  15. 0 N4 U5 }# X8 t& j& a& s
  16.   batch = ai_network_run(network, ai_input, ai_output);# A6 V" E* |: N: Q( f
  17.   if (batch != 1) {$ S( M8 Q/ X: x" C' R/ W( W8 h2 W
  18.     err = ai_network_get_error(network);
    1 f$ e& U# a# j0 \
  19.     printf("AI ai_network_run error - type=%d code=%d\r\n", err.type, err.code);  y. M1 S! W5 w$ F8 y- K; _
  20.     Error_Handler();2 `4 e: M( T! b4 }  D# b5 {
  21.   }; P0 _' W4 v3 y- S& {9 e5 _
  22. }
    ) G, m- U6 T# q# {( a, U
复制代码
上述过程就是流程图数据流实现的过程,读取经过预处理的图像数据,然后再ai网络中计算,输出计算结果,: q8 B. |& s1 Q  H3 [% J
  1. ai_i32 ai_network_run(
    / c5 y5 w0 B3 c
  2.   ai_handle network, const ai_buffer* input, ai_buffer* output)
    1 b' x  y1 ^1 C' _9 l( H5 f
  3. {
    / x$ j% f1 I: e, u- |- Z
  4.   return ai_platform_network_process(network, input, output);/ l. }7 [7 s3 Y: w& J6 U* h
  5. }
复制代码
上述处理,需要计算网络,这个是再ai_model中定义的,然后读取输入数据,形成输出数据。3 b# v* f; i3 D; Z! ?

$ D! O3 y0 N6 o2 C# o5 小结
) G. F. ]3 N5 v: i4 U: c7 T    基于STM的cubeAI,通常已经提供了一个快速部署的流程框架。对于开发者,只需要自定义人工智能模型,然后导入到新建的工程中,按照提供的API逐步实现数据流程,就能够在项目中嵌入人工智能的功能。; a" |) I+ r, X1 I. u5 R
  在上一个文件中提高的,对应模型的生产,采用CubeAI中的命令行指令,stm32ai就可以完整实现。这个CubeAI极其配套工具,就是一个完整实现人工智能嵌入的工具,虽然安装和使用流程比较多,但是能够实现这样的效果还是非常理想的,在硬件性能和软件功能,达到完美的结合。% T4 y1 ~( X; j$ L% ^

9 z. q- r$ m5 }
  y3 [# q& T4 t. ^8 k6 D; b+ D- J$ I5 U! Y  `3 D& G. s7 `5 @
8 y0 X* ?# ?' R
8 G/ U' T5 H# s2 N( f
6 ?+ K, R( C3 o9 @

9 |$ ^) C$ F& m: N4 I( T0 Y0 ~( v6 C% a% b0 e

8 Z" K1 a* V1 g% v/ V5 B- {( f' {& l1 m
收藏 评论7 发布时间:2022-10-17 10:57

举报

7个回答
小样爱捣鼓 回答时间:2022-10-17 19:17:31
这么好的板子不自己训练个模型尝试部署上去就有点浪费了
% h2 y4 M" Y/ o
晒太阳的懒猫 回答时间:2022-11-11 09:35:57
照着评测内容,一步一步学习,让自己更快地获取AI视觉开发的知识,谢谢楼主!' ~( i- K9 {# S/ c1 ~" X5 Z0 X2 J
LN 回答时间:2022-11-16 15:26:25
人脸识别算法,可以直接搞个现成的吗?重新训练是不是很复杂
LN 回答时间:2022-11-16 15:29:29
签到) {& Y9 u8 a/ w9 \: M1 S7 X

5 E' z: l* }% e0 p4 z
stm32_AI2.jpg
stm32_AI.jpg
党国特派员 回答时间:2022-12-22 16:45:47
这个网络模型是什么模型?
& f7 X% }/ Y+ m! g5 P$ k* L6 q$ B, T$ F) w- @& M/ l
萨法 回答时间: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 手机版