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

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

[复制链接]
北方. 发布时间:2022-10-17 10:57
Wio Lite AI视觉开发套件——人脸识别快速实现
1、在完成基本硬件评测和软件开发环境配置之后,可以快速实现人脸识别的任务
2、首先按照新的ST-link连接,把Nucleo的st-link调试如下图连接,
nucleo_stlink.png
采用如下接口对应联络到WIO Lite AI开发板,

Nu_WIO.png
使用调试夹子快速连接,就可以,如下图,
353481694.jpg
在项目的接口可以发现ST-LInk在Port Com8,另一个是COM5,连接WIO Lite AI

Nu_WIO_03.PNG
2、创建模板项目,启动CubeIDE
Nu_WIO_02.PNG
可以找到人脸识别的模型,Person_detect.tflite,这个是用于人脸识别的tensorflow 模型。这个是压缩后的整数型数据,人脸识别在标准情况下,现在已经可以做到90%以上,那么压缩之后,精度下降,识别精度明显下降,但是仍然可以完美实现该功能。
完成编译,执行下载,显示成功完成。

Nu_WIO_01.PNG
3、运行模拟
上电后,摄像头捕捉图像,并显示在LCD屏上,当图片是空白,或者没有发现人的时候,显示No-person,
这里用手机摄像头遮挡面部,就显示没发现人脸,显示准确度可以达到80%,

Nu_WIO_05.jpg
移开手机,露出人脸,就迅速监测到人脸,显示Person,同时计算出准确率61%。

Nu_WIO_06.jpg
这样快速监测成功。
4、人工智能实现的分析
4.1 硬件平台的能力
WIO LiteAI采用的是STM32H725工作频率高达550 MHz的Arm® Cortex®-M7内核(具有双精度浮点单元),可选扩展室温范围最高为125 °C (*),只有一个内核,仍然展现强大的计算能力,可以无延迟实现图像处理和人脸识别。在图形上采用的高性能的支持,具有以下两个图形实现和加速功能,
  • LCD-TFT控制器接口支持双层图形
  • Chrom-ART Accelerator™提高了图形内容创建速度,并为其它应用节省了MCU内核处理带宽


4.2 人脸识别的流程和库的支持
CubeAI的人脸识别是用如下层次实现
Nu_WIO_07.png
在底层硬件上,实现板级支持,更上一层是STM32的人脸识别模型,实现具体的应用,实现过程的数据流程如下
FaceReco_Dataflow.png
数据依次在上述流程中逐级计算,根据人工智能模型实现人脸的识别精度计算,当大于计算值以后就迅速提出结果并显示出来
4.3 程序代码分析
首先定义图形数据的交换空间,是一个320x240的采样空间
  1. static Frame_TypeDef frame ={ .buffer = buffer,
  2.                                                           .length = 320 * 240 * 2,
  3.                                                           .width  = 320,
  4.                                                           .height = 240
  5.                                                         };
复制代码
主程序代码非常精简

  1. int main(void)
  2. {
  3.   MPU_Config();
  4.   SCB_EnableICache();
  5.   SCB_EnableDCache();
  6.   HAL_Init();
  7.   SystemClock_Config();

  8.   /* Initialize all configured peripherals */
  9.   MX_GPIO_Init();
  10.   MX_USART3_UART_Init();
  11.   MX_LTDC_Init();
  12.   MX_I2C4_Init();
  13.   MX_DMA_Init();
  14.   MX_DCMI_Init();
  15.   MX_TIM2_Init();
  16.   MX_OCTOSPI1_Init();
  17.   MX_CRC_Init();
  18.         LOG("here");
  19.         Psram_Init();

  20.         /*OV2640 Init*/
  21.         HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); //XCLK
  22.         OV2640_Init(&OV2640);
  23.         OV2640_ReadID(&(OV2640.ID));
  24.         LOG("ID: %02X %02X \r\n", OV2640.ID.PIDH, OV2640.ID.PIDL);
  25.         OV2640_UXGAConfig();        //flip after all the camera setting ,or camera setting  will change REG04 value.
  26.         OV2640_Flip();
  27.         OV2640_Start();        //initial IPL and AI
  28.         STM32Ipl_InitLib(buffer_ipl, IPL_BUFFER_SIZE);
  29.         /* The STM32 CRC IP clock should be enabled to use the network runtime library */
  30.         __HAL_RCC_CRC_CLK_ENABLE();
  31.         aiInit();
  32.         frame_rgb565.data = frame.buffer;

  33.         while (1)
  34.         {
  35.                   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
  36.                   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, GPIO_PIN_SET);

  37.                   // rgb565 320*240*2 to grayscale 320*240
  38.                   if (STM32Ipl_Convert(&frame_rgb565, &frame_rgb565_grayscale) != stm32ipl_err_Ok) {
  39.                           while(1);
  40.                   }
  41.                   // grayscale 320*240 to grayscale 96x96x2
  42.                   if (STM32Ipl_Resize(&frame_rgb565_grayscale, &frame_grayscale_resized, &roi) != stm32ipl_err_Ok) {
  43.                           while(1);
  44.                   }

  45.                   //AI
  46.                   aiRun(buffer_grayscale_resized, network_output);
  47.                   postprocess(network_output);

  48.                   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
  49.                   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, GPIO_PIN_RESET);

  50.         }
  51. }
复制代码
在启动硬件初始化之后,就进入识别循环,当识别出人脸就直接把对应的LED点亮,
实现人脸识别的函数是aiRun,对图形交换空间的数据分析,并直接输出神经网络计算的结果

  1. aiRun(buffer_grayscale_resized, network_output);
  2. postprocess(network_output);
复制代码
这个函数是在"ai_inference.h"文件中实现的,
  1. void aiRun(ai_u8 *pIn, ai_u8 *pOut)
  2. {
  3.   ai_i32 batch;
  4.   ai_error err;

  5.   /* 1 - Create the AI buffer IO handlers with the default definition */
  6.   ai_buffer ai_input[AI_NETWORK_IN_NUM] = AI_NETWORK_IN;
  7.   ai_buffer ai_output[AI_NETWORK_OUT_NUM] = AI_NETWORK_OUT;

  8.   /* 2 - Update IO handlers with the data payload */
  9.   ai_input[0].n_batches = 1;
  10.   ai_input[0].data = AI_HANDLE_PTR(pIn);
  11.   ai_output[0].n_batches = 1;
  12.   ai_output[0].data = AI_HANDLE_PTR(pOut);

  13.   batch = ai_network_run(network, ai_input, ai_output);
  14.   if (batch != 1) {
  15.     err = ai_network_get_error(network);
  16.     printf("AI ai_network_run error - type=%d code=%d\r\n", err.type, err.code);
  17.     Error_Handler();
  18.   }
  19. }
复制代码
上述过程就是流程图数据流实现的过程,读取经过预处理的图像数据,然后再ai网络中计算,输出计算结果,
  1. ai_i32 ai_network_run(
  2.   ai_handle network, const ai_buffer* input, ai_buffer* output)
  3. {
  4.   return ai_platform_network_process(network, input, output);
  5. }
复制代码
上述处理,需要计算网络,这个是再ai_model中定义的,然后读取输入数据,形成输出数据。

5 小结
    基于STM的cubeAI,通常已经提供了一个快速部署的流程框架。对于开发者,只需要自定义人工智能模型,然后导入到新建的工程中,按照提供的API逐步实现数据流程,就能够在项目中嵌入人工智能的功能。
  在上一个文件中提高的,对应模型的生产,采用CubeAI中的命令行指令,stm32ai就可以完整实现。这个CubeAI极其配套工具,就是一个完整实现人工智能嵌入的工具,虽然安装和使用流程比较多,但是能够实现这样的效果还是非常理想的,在硬件性能和软件功能,达到完美的结合。










收藏 评论7 发布时间:2022-10-17 10:57

举报

7个回答
小样爱捣鼓 回答时间:2022-10-17 19:17:31
这么好的板子不自己训练个模型尝试部署上去就有点浪费了
晒太阳的懒猫 回答时间:2022-11-11 09:35:57
照着评测内容,一步一步学习,让自己更快地获取AI视觉开发的知识,谢谢楼主!
LN 回答时间:2022-11-16 15:26:25
人脸识别算法,可以直接搞个现成的吗?重新训练是不是很复杂
LN 回答时间:2022-11-16 15:29:29
签到

stm32_AI2.jpg
stm32_AI.jpg
党国特派员 回答时间:2022-12-22 16:45:47
这个网络模型是什么模型?

萨法 回答时间: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 手机版