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

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, 下载次数: 119

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

举报

6个回答
strang 回答时间: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
支持下         
知足者常乐 回答时间:2019-6-21 14:03:53
加油楼主,我也在研究这个CUBE AI,进度没有你快
知足者常乐 回答时间:2020-7-30 08:17:50
兄弟,您这个代码运行最后的准确率能达到多少?我今天试了一下,10个数有9个识别错误的。

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

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