打印
[STM32N6]

视觉识别案例1

[复制链接]
2123|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 一路向北lm 于 2025-4-3 16:15 编辑

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

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

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_length] = 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[i] = srcBuf[i];//==1?0:1;
        }
}
神经网络推理
static void AI_Run(float *pIn, float *pOut)
{
        char logStr[100];
        int count = 0;
        float max = 0;
  ai_i32 batch;
  ai_error err;

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

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


使用特权

评论回复
沙发
atl0402| | 2025-4-14 09:50 | 只看该作者
谢谢分享,学习下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

293

主题

3837

帖子

80

粉丝