STM32运行深度学习指南基础篇(3)(STM32CubeMX.AI+Tensorflow)
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, ¶ms)) {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)相关推荐
- 计算机视觉面试宝典--深度学习机器学习基础篇(四)
计算机视觉面试宝典–深度学习机器学习基础篇(四) 本篇主要包含SVM支持向量机.K-Means均值以及机器学习相关常考内容等相关面试经验. SVM-支持向量机 支持向量机(support vector ...
- 深度学习之基础篇:凸学习问题
简介 深度学习中,凸优化的重要性不言而喻.为了更好的理解凸优化,这里对凸学习问题.凸性及相关性质做一个简单总结: 这里我们依次来了解其中各个性质. 基本概念 1. 凸集 定义:设C是向量空间中的一个集 ...
- 深度学习指南:基于Ubuntu从头开始搭建环境
这是一篇为机器搭建深度学习研究环境的详细指南,包括驱动程序.工具和各种深度学习框架的安装指导.在64位Ubuntu 14.04的机器上使用Nvidia Titan X进行测试. 还有一些有类似目的的指 ...
- Java工程师学习指南 中级篇
Java工程师学习指南 中级篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我写的文章都是站 ...
- 极光小课堂 | 极光推送之 Android 客户端使用指南——基础篇
" 本文中涉及到的所有代码现已在 Github 上开源,地址:https://github.com/xuexiangjys/JPushSample" 01 前言 - 极光推送是国内 ...
- 从零开始搭建深度学习服务器: 基础环境配置(Ubuntu + GTX 1080 TI + CUDA + cuDNN)
从零开始搭建深度学习服务器: 基础环境配置(Ubuntu + GTX 1080 TI + CUDA + cuDNN) 首先先声明一下 这篇是转载来自 : 从零开始搭建深度学习服务器: 基础环境配置( ...
- 《繁凡的深度学习笔记》前言、目录大纲 一文让你完全弄懂深度学习所有基础(DL笔记整理系列)
<繁凡的深度学习笔记>前言.目录大纲 (DL笔记整理系列) 一文弄懂深度学习所有基础 ! 3043331995@qq.com https://fanfansann.blog.csdn.ne ...
- 零基础学习深度学习_深度学习的基础!!!
零基础学习深度学习 The ability to learn from experience and perform better when confronted with similar chall ...
- Java工程师学习指南 入门篇
Java工程师学习指南 入门篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都 ...
最新文章
- 地图与定位之大头针视图
- VTK:参数化超环形用法实战
- mongodb创建用户和密码
- php冒泡和选择排序,选择排序vs冒泡排序
- 深度推荐系统2019年度阅读收藏清单
- 算术的c语言程序设计,C 程序设计:变量与算术表达式
- 智能公交市场的竞争与合作
- OpenLTE 基站相关头文件:PHY、MAC、RLC、RRC、PDCP、RB、MME、HSS、GW
- sumif单列求和_sumif函数使用方法:单条件求和
- 详解程序员如何备战金三银四跳槽季
- 基于FPGA驱动TLC5615模块
- 【他来了】云顶之奕 手游账号注册!国服可玩!
- linux-nginx部署
- MacOS 10.15 Catalina 更新系统后无法访问根目录下的/dashu/log
- 移动端界面设计之尺寸篇
- 行走C江湖多年,你修炼过五大秘笈吗?
- 加州大学伯克利分校与NTT合作以加速采用智能技术
- 中国联通今年5G投资350亿元!附2019业绩PPT全文
- 哪个系统目录包含linux使用的外部设备,下面那个系统目录中包含Linux使用的外部设备( )...
- 学python的电脑 战66_买笔记本电脑,价格在6000-7000的,作为办公学习,Python,ps的,不玩游戏,有什么推荐的?...