一路向北lm 发表于 2025-4-3 16:11

视觉识别案例1

本帖最后由 一路向北lm 于 2025-4-3 16:15 编辑

利用上位机将手写数据通过串口发送给单片机。2.单片机进行获取数据利用神经网络进行判断3.将输出结果发送给上位机。上位机链接https://github.com/colin2135/HandWriteApp,下载源码后,找到这个文件路径。

定义网络句柄、输入、输出和激活缓冲区数据buf 和管理输入和输出数据的指针ai_handle network;
float aiInData;
float aiOutData;
ai_u8 activations;

ai_buffer * ai_input;
ai_buffer * ai_output;
通过串口获取数据void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
      if(goRunning ==0)
      {
                if (uart_rx_length < UART_BUFF_LEN)
                {
                        uart_rx_buffer = uart_rx_byte;
                        uart_rx_length++;

                        if (uart_rx_byte == '\n')
                        {
                              goRunning = 1;
                        }
                }
                else
                {
                        //rt_kprintf("rx len over");
                        uart_rx_length = 0;
                }
      }
      HAL_UART_Receive_IT(&huart1, (uint8_t *)&uart_rx_byte, 1);
}
处理数据,通过上位机发送的数据是8位数据,由于模型参数是32位浮点数因此输入数据要转换成32位浮点数void PictureCharArrayToFloat(uint8_t *srcBuf,float *dstBuf,int len)
{
      for(int i=0;i<len;i++)
      {
                dstBuf = srcBuf;//==1?0:1;
      }
}
神经网络推理static void AI_Run(float *pIn, float *pOut)
{
      char logStr;
      int count = 0;
      float max = 0;
ai_i32 batch;
ai_error err;

/* Update IO handlers with the data payload */
ai_input.data = AI_HANDLE_PTR(pIn);
ai_output.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();
}
for (uint32_t i = 0; i < AI_NETWORK_OUT_1_SIZE; i++) {

          sprintf(logStr,"%d%8.6f\r\n",i,aiOutData);
          Uart_send(logStr);
          if(max<aiOutData)
          {
                  count = i;
                  max= aiOutData;
          }
}
sprintf(logStr,"current number is %d\r\n",count);
Uart_send(logStr);
}
将输出结果和最大值通过串口进行发送 for (uint32_t i = 0; i < AI_NETWORK_OUT_1_SIZE; i++) {

          sprintf(logStr,"%d%8.6f\r\n",i,aiOutData);
          Uart_send(logStr);
          if(max<aiOutData)
          {
                  count = i;
                  max= aiOutData;
          }
}
实验效果,通过上位机上传图像到单片机识**返回识别结果


atl0402 发表于 2025-4-14 09:50

谢谢分享,学习下
页: [1]
查看完整版本: 视觉识别案例1