STM32运行深度学习指南基础篇(3)(STM32CubeMX.AI+Tensorflow)

在上一篇文章中我们已经有训练好的tflite模型,接下来我们要在Clion中实现,如果是Keil的朋友可以跳转至这篇文章
STM32运行深度学习指南基础篇(4)(STM32CubeMX.AI+Tensorflow)
在我们新建好的STM32CubeMX中勾选,我们的AI包:

打开串口:

激活AI模块,载入模型,点击analyze

我们修改生成的main代码

​ 在/* USER CODE BEGIN Includes / …/ USER CODE END Includes */中添加需要的头文件

/* USER CODE BEGIN Includes */
#include "ai_platform.h"
#include "network.h"
#include "network_data.h"
#include "stdio.h"
/* USER CODE END Includes */

​ 在/* USER CODE BEGIN PTD /…/ USER CODE END PTD */,添加printf相关函数

/* USER CODE BEGIN PTD */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{HAL_UART_Transmit(&huart1,(uint8_t*)&ch, 1, 0xFFFF);return ch;
}
/* USER CODE END PTD */

​ 在/* USER CODE BEGIN PV /…/ USER CODE END PV */中添加需要的相关变量

/* USER CODE BEGIN PV *//* 输入数据 */
float aiInData[16][AI_NETWORK_IN_1_SIZE] = {{1,    1,  1,  0},{1,  1,  0,  1},{1,  1,  1,  1},{1,  1,  0,  0},{1,  0,  1,  0},{1,  0,  0,  1},{1,  0,  1,  1},{1,  0,  0,  0},{0,  1,  1,  0},{0,  1,  0,  1},{0,  1,  1,  1},{0,  1,  0,  0},{0,  0,  1,  0},{0,  0,  0,  1},{0,  0,  1,  1},{0,  0,  0,  0},};/* 正确值 */
uint8_t test_data[16] = {1,    1,  1,  1,  0,  0,  1,  0,  0,  0,  1,  0,  0,  0,  1,  0};ai_handle network;
float aiOutData[AI_NETWORK_OUT_1_SIZE];
uint8_t activations[AI_NETWORK_DATA_ACTIVATIONS_SIZE];
/* USER CODE END PV */

​ 在/* USER CODE BEGIN 0 /…/ USER CODE END 0 */中添加初始化和运行模型的代码

/* USER CODE BEGIN 0 *//* 初始化函数 */
void Init(ai_handle w_addr, ai_handle act_addr)
{ai_error err;err = ai_network_create(&network, AI_NETWORK_DATA_CONFIG);if (err.type != AI_ERROR_NONE) {printf("创建失败 - code=%d code=%d\r\n", err.type, err.code);Error_Handler();}const ai_network_params params = AI_NETWORK_PARAMS_INIT(AI_NETWORK_DATA_WEIGHTS(w_addr),AI_NETWORK_DATA_ACTIVATIONS(act_addr));if (!ai_network_init(network, &params)) {err = ai_network_get_error(network);printf("初始化失败 - code=%d code=%d\r\n", err.type, err.code);Error_Handler();}
}/* 运行函数 */
void Run(float *pIn, float *pOut)
{ai_i32 batch;ai_error err;ai_buffer ai_input[AI_NETWORK_IN_NUM] = AI_NETWORK_IN;ai_buffer ai_output[AI_NETWORK_OUT_NUM] = AI_NETWORK_OUT;ai_input[0].n_batches = 1;ai_input[0].data = AI_HANDLE_PTR(pIn);ai_output[0].n_batches = 1;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("运行失败 - code=%d code=%d\r\n", err.type, err.code);Error_Handler();}
}/* USER CODE END 0 */

​ 在/* USER CODE BEGIN 2 /…/ USER CODE END 2 */中添加运行函数

  /* USER CODE BEGIN 2 */printf("测试开始: \r\n");uint8_t correct = 0;Init(ai_network_data_weights_get(), activations);printf("===========\r\n");for (int i = 0; i < 16; ++i) {Run(aiInData[i], aiOutData);if ((int)(aiOutData[0]+0.5f)==test_data[i]){printf("%d    |    %d     相符\r\n",(int)(aiOutData[0]+0.5f),test_data[i]);correct++;}else{printf("%d    |    %d     不符\r\n",(int)(aiOutData[0]+0.5f),test_data[i]);}printf("===========\r\n");}printf("测试完成: 准确率 %d %%\r\n",correct*100/16);/* USER CODE END 2 */

更改CMakeLists和CMakeLists_template,主要是把文件中的那个.a的静态库文件文件引入,在“add_executable…“语句后加入

target_link_libraries(${PROJECT_NAME}.elf  ${PROJECT_SOURCE_DIR}/Middlewares/ST/AI/Lib/NetworkRuntime700_CM4_GCC.a)

最后编译即可

在串口助手可以看到结果:

这篇文章的代码在Gitee上

https://gitee.com/shibwoen/stm32_tensorflow/tree/master/CLION

同时我也参考了文章

https://wiki.stmicroelectronics.cn/stm32mcu/wiki/AI:How_to_perform_motion_sensing_on_STM32L4_IoTnode#Real-time_scheduling_considerations

STM32运行深度学习指南基础篇(3)(STM32CubeMX.AI+Tensorflow)相关推荐

  1. 计算机视觉面试宝典--深度学习机器学习基础篇(四)

    计算机视觉面试宝典–深度学习机器学习基础篇(四) 本篇主要包含SVM支持向量机.K-Means均值以及机器学习相关常考内容等相关面试经验. SVM-支持向量机 支持向量机(support vector ...

  2. 深度学习之基础篇:凸学习问题

    简介 深度学习中,凸优化的重要性不言而喻.为了更好的理解凸优化,这里对凸学习问题.凸性及相关性质做一个简单总结: 这里我们依次来了解其中各个性质. 基本概念 1. 凸集 定义:设C是向量空间中的一个集 ...

  3. 深度学习指南:基于Ubuntu从头开始搭建环境

    这是一篇为机器搭建深度学习研究环境的详细指南,包括驱动程序.工具和各种深度学习框架的安装指导.在64位Ubuntu 14.04的机器上使用Nvidia Titan X进行测试. 还有一些有类似目的的指 ...

  4. Java工程师学习指南 中级篇

    Java工程师学习指南 中级篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我写的文章都是站 ...

  5. 极光小课堂 | 极光推送之 Android 客户端使用指南——基础篇

    " 本文中涉及到的所有代码现已在 Github 上开源,地址:https://github.com/xuexiangjys/JPushSample" 01 前言 - 极光推送是国内 ...

  6. 从零开始搭建深度学习服务器: 基础环境配置(Ubuntu + GTX 1080 TI + CUDA + cuDNN)

    从零开始搭建深度学习服务器: 基础环境配置(Ubuntu + GTX 1080 TI + CUDA + cuDNN) 首先先声明一下 这篇是转载来自  : 从零开始搭建深度学习服务器: 基础环境配置( ...

  7. 《繁凡的深度学习笔记》前言、目录大纲 一文让你完全弄懂深度学习所有基础(DL笔记整理系列)

    <繁凡的深度学习笔记>前言.目录大纲 (DL笔记整理系列) 一文弄懂深度学习所有基础 ! 3043331995@qq.com https://fanfansann.blog.csdn.ne ...

  8. 零基础学习深度学习_深度学习的基础!!!

    零基础学习深度学习 The ability to learn from experience and perform better when confronted with similar chall ...

  9. Java工程师学习指南 入门篇

    Java工程师学习指南 入门篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都 ...

最新文章

  1. 地图与定位之大头针视图
  2. VTK:参数化超环形用法实战
  3. mongodb创建用户和密码
  4. php冒泡和选择排序,选择排序vs冒泡排序
  5. 深度推荐系统2019年度阅读收藏清单
  6. 算术的c语言程序设计,C 程序设计:变量与算术表达式
  7. 智能公交市场的竞争与合作
  8. OpenLTE 基站相关头文件:PHY、MAC、RLC、RRC、PDCP、RB、MME、HSS、GW
  9. sumif单列求和_sumif函数使用方法:单条件求和
  10. 详解程序员如何备战金三银四跳槽季
  11. 基于FPGA驱动TLC5615模块
  12. 【他来了】云顶之奕 手游账号注册!国服可玩!
  13. linux-nginx部署
  14. MacOS 10.15 Catalina 更新系统后无法访问根目录下的/dashu/log
  15. 移动端界面设计之尺寸篇
  16. 行走C江湖多年,你修炼过五大秘笈吗?
  17. 加州大学伯克利分校与NTT合作以加速采用智能技术
  18. 中国联通今年5G投资350亿元!附2019业绩PPT全文
  19. 哪个系统目录包含linux使用的外部设备,下面那个系统目录中包含Linux使用的外部设备( )...
  20. 学python的电脑 战66_买笔记本电脑,价格在6000-7000的,作为办公学习,Python,ps的,不玩游戏,有什么推荐的?...

热门文章

  1. 友链导航源码php,网址导航源码 自助链源码(PHP+MYSQL完整版)
  2. python下医学图像处理库的安装问题
  3. Pytorch 构建简单Neural Networks
  4. 李孟:构建强健的DNS解析系统
  5. 明日之星家校共育项目“一知一做”正式启动
  6. TS流PAT/PMT详解
  7. 图书管理器项目(参考答案)
  8. 为什么学了模数电还是看不懂较复杂的电路图
  9. 计算机如何识别指纹和掌纹?
  10. uniapp开发仿哔哩哔哩/短视频系统