[STM32N6] 视觉识别案例1

[复制链接]
3176|1
 楼主| 一路向北lm 发表于 2025-4-3 16:11 | 显示全部楼层 |阅读模式
本帖最后由 一路向北lm 于 2025-4-3 16:15 编辑

利用上位机将手写数据通过串口发送给单片机。2.单片机进行获取数据利用神经网络进行判断3.将输出结果发送给上位机。上位机链接https://github.com/colin2135/HandWriteApp,下载源码后,找到这个文件路径。
9171667ee42b2d8c6d.png
定义网络句柄、输入、输出和激活缓冲区数据buf 和管理输入和输出数据的指针
  1. ai_handle network;
  2. float aiInData[AI_NETWORK_IN_1_SIZE];
  3. float aiOutData[AI_NETWORK_OUT_1_SIZE];
  4. ai_u8 activations[AI_NETWORK_DATA_ACTIVATIONS_SIZE];

  5. ai_buffer * ai_input;
  6. ai_buffer * ai_output;
通过串口获取数据
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
  2. {
  3.         if(goRunning ==0)
  4.         {
  5.                 if (uart_rx_length < UART_BUFF_LEN)
  6.                 {
  7.                         uart_rx_buffer[uart_rx_length] = uart_rx_byte;
  8.                         uart_rx_length++;

  9.                         if (uart_rx_byte == '\n')
  10.                         {
  11.                                 goRunning = 1;
  12.                         }
  13.                 }
  14.                 else
  15.                 {
  16.                         //rt_kprintf("rx len over");
  17.                         uart_rx_length = 0;
  18.                 }
  19.         }
  20.         HAL_UART_Receive_IT(&huart1, (uint8_t *)&uart_rx_byte, 1);
  21. }
处理数据,通过上位机发送的数据是8位数据,由于模型参数是32位浮点数因此输入数据要转换成32位浮点数
  1. void PictureCharArrayToFloat(uint8_t *srcBuf,float *dstBuf,int len)
  2. {
  3.         for(int i=0;i<len;i++)
  4.         {
  5.                 dstBuf[i] = srcBuf[i];//==1?0:1;
  6.         }
  7. }
神经网络推理
  1. static void AI_Run(float *pIn, float *pOut)
  2. {
  3.         char logStr[100];
  4.         int count = 0;
  5.         float max = 0;
  6.   ai_i32 batch;
  7.   ai_error err;

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

  11.   batch = ai_network_run(network, ai_input, ai_output);
  12.   if (batch != 1) {
  13.     err = ai_network_get_error(network);
  14.     printf("AI ai_network_run error - type=%d code=%d\r\n", err.type, err.code);
  15.     Error_Handler();
  16.   }
  17.   for (uint32_t i = 0; i < AI_NETWORK_OUT_1_SIZE; i++) {

  18.           sprintf(logStr,"%d  %8.6f\r\n",i,aiOutData[i]);
  19.           Uart_send(logStr);
  20.           if(max<aiOutData[i])
  21.           {
  22.                   count = i;
  23.                   max= aiOutData[i];
  24.           }
  25.   }
  26.   sprintf(logStr,"current number is %d\r\n",count);
  27.   Uart_send(logStr);
  28. }
将输出结果和最大值通过串口进行发送
  1. for (uint32_t i = 0; i < AI_NETWORK_OUT_1_SIZE; i++) {

  2.           sprintf(logStr,"%d  %8.6f\r\n",i,aiOutData[i]);
  3.           Uart_send(logStr);
  4.           if(max<aiOutData[i])
  5.           {
  6.                   count = i;
  7.                   max= aiOutData[i];
  8.           }
  9.   }
实验效果,通过上位机上传图像到单片机识**返回识别结果 217135fdea79b2d2deb1599285a618ea.gif


atl0402 发表于 2025-4-14 09:50 | 显示全部楼层
谢谢分享,学习下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

293

主题

3837

帖子

81

粉丝
快速回复 在线客服 返回列表 返回顶部