
写的教程反响平平,可能是晦涩难懂,那就直接上代码(极度粗糙的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, ¶ms); //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
实战经验 | STM32 AFCI方案TensorBoard的使用介绍
【STM32N6570-DK评测】1.你好N6
【STM32N6570-DK评测】1.开箱测评
实战经验 | STM32 AI Model Zoo 的安装及实例介绍
【STM32H7S78-DK评测】移植AI框架TensorFlow【DSP指令加速篇】
【STM32H7S78-DK评测】移植AI框架TensorFlow【下篇】
【STM32H7S78-DK评测】移植AI框架TensorFlow Lite【上篇】
【STM32H7S78-DK评测】移植边缘AI推理框架——TFLM(TensorFlow Lite for Microcontrollers)上篇
破解边缘AI硬件与软件挑战,意法半导体解读三大创新要点
意法半导体助力企业产品智能化,加快边缘人工智能应用
谢谢支持