| Wio Lite AI视觉开发套件——人脸识别快速实现 1、在完成基本硬件评测和软件开发环境配置之后,可以快速实现人脸识别的任务
 2、首先按照新的ST-link连接,把Nucleo的st-link调试如下图连接,
 
   采用如下接口对应联络到WIO Lite AI开发板,
 
 
   使用调试夹子快速连接,就可以,如下图,
 
   在项目的接口可以发现ST-LInk在Port Com8,另一个是COM5,连接WIO Lite AI
 
 
   2、创建模板项目,启动CubeIDE
 
   可以找到人脸识别的模型,Person_detect.tflite,这个是用于人脸识别的tensorflow 模型。这个是压缩后的整数型数据,人脸识别在标准情况下,现在已经可以做到90%以上,那么压缩之后,精度下降,识别精度明显下降,但是仍然可以完美实现该功能。
 完成编译,执行下载,显示成功完成。
 
 
   3、运行模拟
 上电后,摄像头捕捉图像,并显示在LCD屏上,当图片是空白,或者没有发现人的时候,显示No-person,
 这里用手机摄像头遮挡面部,就显示没发现人脸,显示准确度可以达到80%,
 
 
   移开手机,露出人脸,就迅速监测到人脸,显示Person,同时计算出准确率61%。
 
 
   这样快速监测成功。
 4、人工智能实现的分析
 4.1 硬件平台的能力
 WIO LiteAI采用的是STM32H725,工作频率高达550 MHz的Arm® Cortex®-M7内核(具有双精度浮点单元),可选扩展室温范围最高为125 °C (*),只有一个内核,仍然展现强大的计算能力,可以无延迟实现图像处理和人脸识别。在图形上采用的高性能的支持,具有以下两个图形实现和加速功能,
 
 LCD-TFT控制器接口支持双层图形Chrom-ART Accelerator™提高了图形内容创建速度,并为其它应用节省了MCU内核处理带宽
 
 4.2 人脸识别的流程和库的支持
 CubeAI的人脸识别是用如下层次实现
 
   在底层硬件上,实现板级支持,更上一层是STM32的人脸识别模型,实现具体的应用,实现过程的数据流程如下
 
   数据依次在上述流程中逐级计算,根据人工智能模型实现人脸的识别精度计算,当大于计算值以后就迅速提出结果并显示出来
 4.3 程序代码分析
 首先定义图形数据的交换空间,是一个320x240的采样空间
 
 主程序代码非常精简复制代码static Frame_TypeDef frame ={ .buffer = buffer,
                                                          .length = 320 * 240 * 2,
                                                          .width  = 320,
                                                          .height = 240
                                                        };
 在启动硬件初始化之后,就进入识别循环,当识别出人脸就直接把对应的LED点亮,复制代码
int main(void)
{
  MPU_Config();
  SCB_EnableICache();
  SCB_EnableDCache();
  HAL_Init();
  SystemClock_Config();
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART3_UART_Init();
  MX_LTDC_Init();
  MX_I2C4_Init();
  MX_DMA_Init();
  MX_DCMI_Init();
  MX_TIM2_Init();
  MX_OCTOSPI1_Init();
  MX_CRC_Init();
        LOG("here");
        Psram_Init();
        /*OV2640 Init*/
        HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); //XCLK
        OV2640_Init(&OV2640);
        OV2640_ReadID(&(OV2640.ID));
        LOG("ID: %02X %02X \r\n", OV2640.ID.PIDH, OV2640.ID.PIDL);
        OV2640_UXGAConfig();        //flip after all the camera setting ,or camera setting  will change REG04 value.
        OV2640_Flip();
        OV2640_Start();        //initial IPL and AI
        STM32Ipl_InitLib(buffer_ipl, IPL_BUFFER_SIZE);
        /* The STM32 CRC IP clock should be enabled to use the network runtime library */
        __HAL_RCC_CRC_CLK_ENABLE();
        aiInit();
        frame_rgb565.data = frame.buffer;
        while (1)
        {
                  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
                  HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, GPIO_PIN_SET);
                  // rgb565 320*240*2 to grayscale 320*240
                  if (STM32Ipl_Convert(&frame_rgb565, &frame_rgb565_grayscale) != stm32ipl_err_Ok) {
                          while(1);
                  }
                  // grayscale 320*240 to grayscale 96x96x2
                  if (STM32Ipl_Resize(&frame_rgb565_grayscale, &frame_grayscale_resized, &roi) != stm32ipl_err_Ok) {
                          while(1);
                  }
                  //AI
                  aiRun(buffer_grayscale_resized, network_output);
                  postprocess(network_output);
                  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
                  HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, GPIO_PIN_RESET);
        }
}
实现人脸识别的函数是aiRun,对图形交换空间的数据分析,并直接输出神经网络计算的结果
 
 
 这个函数是在"ai_inference.h"文件中实现的,复制代码aiRun(buffer_grayscale_resized, network_output);
postprocess(network_output);
 上述过程就是流程图数据流实现的过程,读取经过预处理的图像数据,然后再ai网络中计算,输出计算结果,复制代码void aiRun(ai_u8 *pIn, ai_u8 *pOut)
{
  ai_i32 batch;
  ai_error err;
  /* 1 - Create the AI buffer IO handlers with the default definition */
  ai_buffer ai_input[AI_NETWORK_IN_NUM] = AI_NETWORK_IN;
  ai_buffer ai_output[AI_NETWORK_OUT_NUM] = AI_NETWORK_OUT;
  /* 2 - Update IO handlers with the data payload */
  ai_input[0].n_batches = 1;
  ai_input[0].data = AI_HANDLE_PTR(pIn);
  ai_output[0].n_batches = 1;
  ai_output[0].data = AI_HANDLE_PTR(pOut);
  batch = ai_network_run(network, ai_input, ai_output);
  if (batch != 1) {
    err = ai_network_get_error(network);
    printf("AI ai_network_run error - type=%d code=%d\r\n", err.type, err.code);
    Error_Handler();
  }
}
 上述处理,需要计算网络,这个是再ai_model中定义的,然后读取输入数据,形成输出数据。复制代码ai_i32 ai_network_run(
  ai_handle network, const ai_buffer* input, ai_buffer* output)
{
  return ai_platform_network_process(network, input, output);
}
 5 小结
 基于STM的cubeAI,通常已经提供了一个快速部署的流程框架。对于开发者,只需要自定义人工智能模型,然后导入到新建的工程中,按照提供的API逐步实现数据流程,就能够在项目中嵌入人工智能的功能。
 在上一个文件中提高的,对应模型的生产,采用CubeAI中的命令行指令,stm32ai就可以完整实现。这个CubeAI极其配套工具,就是一个完整实现人工智能嵌入的工具,虽然安装和使用流程比较多,但是能够实现这样的效果还是非常理想的,在硬件性能和软件功能,达到完美的结合。
 
 
 
 
 
 
 
 
 
 
 
 | 
大佬求源码
UP求驱动程序