你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Cube.AI【3】——手写识别demo代码

[复制链接]
lebment 发布时间:2019-5-17 23:14
  写的教程反响平平,可能是晦涩难懂,那就直接上代码(极度粗糙的demo)。
  接上次的软硬件环境,我采用的STemwin(本来想用littlevgl)自带bmp显示(详细代码可参考某某莱教程)。先看看生成的一些代码。

                GUI_Init();
                GUI_SetBkColor(GUI_BLUE_98);
                GUI_Clear();
       
                GUI_DispStringHCenterAt( GUI_GetVersionString() , GUI_GetScreenSizeX()/2, GUI_GetScreenSizeY()/2);
                SDRes=f_mount(&SDFatFS,(TCHAR*)SDPath,0);
                if(SDRes!=FR_OK)
                {
                Error_Handler();
                }
  MX_X_CUBE_AI_Process();
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
                         GUI_Delay(10);
    /* USER CODE BEGIN 3 */
  }

简单的主函数。


  进入MX_X_CUBE_AI_Process();


    ai_buffer ai_input;
    ai_buffer ai_output;
    ai_i32 batch;
    char str_tmp[16];
     for(uint8_t i=0; i<10; i++)
            {
                                                sprintf(str_tmp,"%1d.bmp",i);
                                          _ShowBMPEx(str_tmp);
                                                LCD_ShowBMP(str_tmp);
                                                for(uint16_t i=0; i<AI_LENET_IN_1_SIZE ; i++ )
                                                {
                                                                in_data[i] = *bmpBuffPtr++;
                                                }
                                                ai_input.n_batches  = 1;
                                                ai_input.data = AI_HANDLE_PTR(in_data);
                                                ai_output.n_batches = 1;
                                                ai_output.data = AI_HANDLE_PTR(out_data);
                                                batch = ai_lenet_run(handel, &ai_input, &ai_output);
                                                if (batch != 1)
                                                {
                                                                err = ai_lenet_get_error(handel);
                                                                if( err.code )
                                                                {
                                                                                while(1);
                                                                }
                                                }
                                         uint8_t count=0;
                                         for(uint8_t i=0; i<AI_MNETWORK_OUT_1_SIZE; i++)
                                                {
                                                  if( out_data[i] >=0.9f)
                                                                {
                                                                         sprintf(str_tmp,"Num:%d",i);
                                                                         GUI_SetFont(GUI_FONT_32B_ASCII);
                                                                  GUI_DispStringAt(str_tmp,200,0);
                                                                         GUI_SetFont(GUI_FONT_16B_ASCII);
                                                                         count++;
                                                                }
                                                }
      if(count!=1)
                                                {
                                                        GUI_SetFont(GUI_FONT_32B_ASCII);
                                                        GUI_DispStringAt("err",200,0);
                                                        GUI_SetFont(GUI_FONT_16B_ASCII);
                                                }
                                                free(bmpBuffPtr);
                                                HAL_Delay(2000);
                                        }

      熟悉STemwin的大佬肯定知道我在干嘛,不断的读取SD卡中的bmp文件,然后显示,并且通过ai_lenet_run函数得到识别结果,输出是static ai_float out_data[AI_MNETWORK_OUT_1_SIZE]; 0-9有十个识别结果,这个向量大小是十。调试程序时,输出不像是我在PC ubuntu caffe环境中的输出结果,PC上主要是以softmax得到每个类别的置信度,所以PC上向量肯定全部都有值,置信度最高即为模型结果。在MCU上,输出结果只有零和一。让我很奇怪,既然是ai_float 型 何必不输出 所有的置信度。后面我将继续挖掘。

       流程介绍完毕,下面说一说cubeAI的主要函数。
       ai_lenet_create(&handel, NULL);
      ai_lenet_get_info(handel, &report);
          ai_network_params params = {
                                                          AI_LENET_DATA_WEIGHTS(ai_lenet_data_weights_get()),    //权重的获取
                                                        AI_LENET_DATA_ACTIVATIONS(activations)     // 激活函数
                                                };
          ai_lenet_init(handel, &params);  //lenet的初始化,估计是申请内存什么的,写flash。
                                                                         err = ai_lenet_get_error(handel);

         batch = ai_lenet_run(handel, &ai_input, &ai_output); //图片输入以及处理完毕的输出,1batch批


         总的来说比较简单的demo,其实也可以做复杂一点,先手写然后STemwin存bmp图片,然后利用加权平均得到BMP颜色数据的灰度,输入到lenet,dedaojieguo。效果会比较酷炫。
        这模型被压缩很厉害,能有这样的结果以及不错了,最后祝贺一下ST,半导体前15!  期待MP1,玩玩不用压缩的AI。
        附件:工程源码。


Minist.rar

下载

10.2 MB, 下载次数: 150

收藏 评论7 发布时间:2019-5-17 23:14

举报

7个回答
happier_1995 回答时间:2020-7-30 08:17:50
兄弟,您这个代码运行最后的准确率能达到多少?我今天试了一下,10个数有9个识别错误的。
Bowen 回答时间:2019-5-18 09:02:09
支持下
lebment 回答时间:2019-5-18 10:34:28

谢谢支持
STMCU-管管 回答时间:2019-6-3 15:31:26
支持支持
TLLED 回答时间:2019-6-11 09:40:41
支持下         
happier_1995 回答时间:2019-6-21 14:03:53
加油楼主,我也在研究这个CUBE AI,进度没有你快
sumoon 回答时间:2021-9-11 11:11:24
学习学习!

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版