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
- };
复制代码 主程序代码非常精简
- 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);
- }
- }
复制代码 在启动硬件初始化之后,就进入识别循环,当识别出人脸就直接把对应的LED点亮,
实现人脸识别的函数是aiRun,对图形交换空间的数据分析,并直接输出神经网络计算的结果
- aiRun(buffer_grayscale_resized, network_output);
- postprocess(network_output);
复制代码 这个函数是在"ai_inference.h"文件中实现的,
- 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网络中计算,输出计算结果,
- ai_i32 ai_network_run(
- ai_handle network, const ai_buffer* input, ai_buffer* output)
- {
- return ai_platform_network_process(network, input, output);
- }
复制代码 上述处理,需要计算网络,这个是再ai_model中定义的,然后读取输入数据,形成输出数据。
5 小结
基于STM的cubeAI,通常已经提供了一个快速部署的流程框架。对于开发者,只需要自定义人工智能模型,然后导入到新建的工程中,按照提供的API逐步实现数据流程,就能够在项目中嵌入人工智能的功能。
在上一个文件中提高的,对应模型的生产,采用CubeAI中的命令行指令,stm32ai就可以完整实现。这个CubeAI极其配套工具,就是一个完整实现人工智能嵌入的工具,虽然安装和使用流程比较多,但是能够实现这样的效果还是非常理想的,在硬件性能和软件功能,达到完美的结合。
|
大佬求源码
UP求驱动程序