ESPFriends之ESP32模型部署训练历险记(一)

news2024/11/27 0:22:16

请添加图片描述

开发环境的部署搭建

超级小星星:时间过得可真快ESPFriends创客沙龙已经在武汉举办了两期,在这里有行业内的工程师、高校的学生以及极客,在这里我们交流分享自己的开发心得,提出遇到的“大坑”也可以得到小伙伴们的解决方案,希望活动可以越办越好,在这里我也记录一下自己的开发历程和学习心得与大家共勉。

内容源码地址:link

本期的主题是模型的训练与部署,AI这个东西确实很神奇,我们之所以感觉这东西很“虚”,是因为我们并没有将其落到实处,这里我们就开始本期的探索之旅吧!o( ̄▽ ̄)ブ

软件配置

我的的测试训练环境:
电脑系统:

  • Win11

软件:

  • VScode
  • ESP-IDF(V4.4.5)
  • Anaconda
  • PyCharm
  • Git

参考资料:

  • TensorFlow Lite Micro for Espressif Chipsets(乐鑫官方例程)
  • esp-who
  • esp-skainet
  • TensorFlow Lite

为了避免下载到有病毒的资源,所有的链接都是出自官方网站或者国内源

编译并运行官方的第一个例程

俗话说的好写程序从hello_world开始,当然我们检验自己的开发环境搭建是否正确当然先编译一下啦,这里解释一下为什么没有使用最新版本的IDF,因为在使用ESP-WHO框架的话,需要使用官方建议的软件分支,不然谁知道会出现什么问题,我使用过5.1分支的去set-target,不出所料第一步就出现问题/(ㄒoㄒ)/~~,当然官方之后会更新的啦!在这里插入图片描述
这里需要我们打开文件目录使用命令行的方式去编译项目工程,并烧录到ESP32-S3-EYE (感谢官方的开发板\^o^/)

当然对应的例程目录下面都有一个README文件,这里按照上面的说明操作即可:

# 设置芯片型号
idf.py set-target esp32s3
# 编译工程
idf.py build
# 烧录并打开串口监视
# 在这里使用命令行的话win平台下会自动找到设备串口并烧录
idf.py flash monitor

表示设置芯片信号成功,后面就会很顺利了
在这里插入图片描述
编译成功
在这里插入图片描述
烧录成功
在这里插入图片描述
查看测试程序
在这里插入图片描述
程序成功跑起来啦o(/ ̄▽ ̄)ブ
命令是不是很简单,当然这只是成功的一小步,后面还有更多的未知等待着我们去探索

跑一遍Tensorflow lite官方的示例程序

link

这里按照官方文件夹中的README文件操作,安装了bazel,在其根目录下运行指令

bazel build tensorflow/lite/micro/examples/hello_world:evaluate

第一步都过不了,找了半天都没找到解决办法/(ㄒoㄒ)/~~,好像是因为软件源的问题,但是在linux下可以使用清华源设置,在win下目前还没有找到解决方法
在这里插入图片描述
这里不影响我们用它的代码做参考,接下来我们就要自己敲代码了o(* ̄▽ ̄)ブ

啦啦啦

导入依赖项

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import math
# 生成从0到2派的数据,并将数据转换为np的float32的格式
x_values = np.random.uniform(low=0, high=2 * math.pi,
                             size=1000).astype(np.float32)
# 将数据随机排列
np.random.shuffle(x_values)

# 得到数据y
y_values = np.sin(x_values).astype(np.float32)
# 显示绘制数据图形
plt.plot(x_values, y_values,"b.")
plt.show()

在这里插入图片描述

# 添加随机噪声
y_values += 0.1 * np.random.randn(*y_values.shape)

# 绘制图形
plt.plot(x_values, y_values, "b.")
plt.show()

在这里插入图片描述

# 拆分数据集,将数据集分为训练集(60%)、测试集(20%)和验证集(20%)
TRAIN_SPLIT = int(0.6 * 1000)
TEST_SPLIT = int(0.2 * 1000 + TRAIN_SPLIT)
# 拆分数据集
x_train, x_validate, x_test = np.split(x_values, [TRAIN_SPLIT, TEST_SPLIT])
y_train, y_validate, y_test = np.split(y_values, [TRAIN_SPLIT, TEST_SPLIT])
# 绘制图形
plt.plot(x_train, y_train, "b.", label="Train")
plt.plot(x_validate, y_validate, "y.", label="Validate")
plt.plot(x_test, y_test, "r.", label="Test")
# 图像加图例
plt.legend()
plt.show()

在这里插入图片描述

模型转换

目前我还没有从官方的脚本项目配置中找到对应的脚本转换文件,目前我是用虚拟机中的命令转换的方式,这样也很简单,一起来操作一下吧

# 安装工具
sudo apt install xxd
# 执行转换命令
xxd -i Demo_model.tflite > Demo_model.h

然后将文件内容复制进例程中的模型文件中
对应目录在 examples/hello_world/main/model.cc link

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/844441.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP 请求合并

SAP 请求合并 由于公司请求管理要求比较高,经常需要将很多请求合并在一起传输,实际SAP是支持这个功能的,不仅可以将开发类的请求合并,还可以将开发和定制的合并在一起传输 1、合并请求 SE09 实用程序-重组-合并请求 看提示写的…

Qt--QPlugin插件

写在前面 Qt–动态链接库一文中提到,动态方式加载dll只能加载 extern "C“ 的导出函数,而无法加载类,因此可以使用Qt提供的插件来实现导出类的动态加载。 QPlugin是Qt插件框架的一部分,是一种轻量级的插件系统,…

K8S系列文章之 自动化运维利器 Ansible

Ansible-安装 第一步:安装我们的epel扩展源 yum -y install epel-release 我这里会报/var/run/yum.pid 已被锁定,如果没有直接进行下一步 [rootmaster home]# yum -y install epel-release 已加载插件:fastestmirror, langpacks /var/run/…

Bean的Aware接口

Aware 简介 Spring中提供了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化之后,可以获取相应资源。比如BeanNameAware之类的以Aware结尾的接口,这个接口获取的资源就是以BeanName相关的。 通过Aware接口,可以对Spring相…

以产品经理的角度去讲解原型图---会议OA项目

目录 一.前言 二.原型图 2.1 原型图是什么 3.1 原型图的作用 三.演示讲解 3.1 项目背景 3.2 项目介绍 3.2.1 会议管理(会议的发起,通知) 3.2.2 投票管理(会议的流程重大决策记录) 3.2.3 会议室管理 3.2.4 系统管…

SDXL-Stable Diffusion改进版

文章目录 1. 摘要2. 算法:2.1 结构:2.2 微小的条件机制2.3 多宽高比训练2.4 改进自编码器2.5 所有组合放到一起2.6 主流方案比较 3. 未来工作4. 限制 论文: 《SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis…

HCL MPLS L2VPN BGP lsp

目录 1 拓扑 2 配置步骤 2.1 配置接口IP 和路由协议 2.2 配置MPLS LDP 2.3 配置L2VPN PW(BGP) 2.4 验证L2VPN 使用EVE-NG 中 的H3C 镜像,配置bgp 后,OSPF 会失效,可能镜像有问题,使用HCL没有问题。 1 拓扑 2 配置步骤 2.1…

【Axure动态面板】利用动态面板实现树形菜单的制作

利用动态面板,简单制作高保真的树形菜单。 一、先看效果 https://1poppu.axshare.com 二、实现思路 1、菜单无非就是收缩和展开,动态面板有个非常好的属性:fit to content,这个属性的含义是:面板的大小可以根据内容多少…

vue3-ts-vite:vue 项目 配置 多页面应用

一、Vue项目,什么是多页面应用 Vue是一种单页面应用程序(SPA)框架,这意味着Vue应用程序通常只有一个HTML页面,而在该页面上进行动态的内容更改,而不是每次都加载新的HTML页面。 但是,有时候我…

C++动态内存管理 - new和delete

目录 开胃菜 - 浅析C/C的内存分段 内存分段 各段说明 new和delete的基础用法 深度剖析new 定位new 浅析delete malloc/free和new/delete的异同 开胃菜 - 浅析C/C的内存分段 这部分是计算机系统相关的知识,这里只是先浅谈一下,可能有些内容会有冲…

初学绘画就上手!7款AI绘图免费软件精选推荐!

本篇文章将分享7款个人非常喜爱的AI绘图免费软件,一起来看看吧。 即时灵感 即时灵感 " 是一款全新升级的 AI 绘画工具,为创作者们提供了丰富多样的创作体验和强大功能。这个创新工具旨在让创作过程更加简单、便捷,同时提供高质量的作品…

Jenkins+Nginx+vue

安装nodejs 在这里插入图片描述 echo off xcopy C:\ProgramData\Jenkins\.jenkins\workspace\super_manage_vue\dist F:\java\www\super_manage_vue\ /s /e /y echo 复制文件完成 exit安装niginx 配置文件如下 #user nobody; worker_processes 1;#error_log logs/error.lo…

反射调用private方法的坑

使用反射调用私有方法时,发现空指针异常,无法直接注入导致空指针异常 加入如下代码后,恢复正常 if (AopUtils.isCglibProxy(marketSmsTaskService)) {// 如果是cglib代理对象,则转为原始对象marketSmsTaskService (MarketSmsTas…

与身边的人有差距,我选择只跟自己比并发展自己的长处!

文章目录 方向一:简述自己的感受方向二:聊聊你想怎么做方向三:如何调整自己的心态 虽然清楚知识需要靠时间沉淀,但在看到自己做不出来的题别人会做,自己写不出的代码别人会写时还是会感到焦虑怎么办? 你是…

链表OJ题

题目一:206反转链表 题目要求: 思路分析: 代码实现: struct ListNode* reverseList(struct ListNode* head){ //n1,n2反转指针 n3链接下一个结点的指针struct ListNode* n1,*n2,*n3;n1 NULL;n2 head;if(n2)//有可能head本身…

CentOS7 启动谷歌浏览器 java+Selenium+chrome+chromedriver

前言:自己想使用该技术实现自动化抓取音乐,目前在window上运行成功,需要在Linux Centos服务上跑,配置上出现了许多问题,特此记录。 参考文档:CentOS7 安装Seleniumchromechromedriverjava_远方丿的博客-CSD…

PLC拉格朗日插值(SCL、ST计算源代码)

插值是对函数进行近似的基本方法,这篇博客主要介绍常用的拉格朗日插值法, Lagrange插值法不太清楚的同学,可以看看数值计算和分析类书籍,网上有很多C语言的拉格朗日插值算法,这里我们主要给出在PLC里利用ST,SCL语言完成拉格朗日插值计算。 1、拉格朗日插值FC 插值法可以…

TSINGSEE青犀视频安防监控视频平台加密机的详细使用与操作步骤

我们在此前的文章中介绍过不少TSINGSEE青犀视频安防监控视频平台关于加密机授权操作及相关疑问解答,感兴趣的用户可以翻阅往期的文章进行了解。由于新用户咨询该方面的问题较多,今天我们再来介绍一下操作步骤。 注意:加密机是依据IP授权&…

第三章-运输层

运输层服务 运输层协议为运行在不同主机上的进程之间提供逻辑通信,即从应用程序角度看两个主机好像直连一样,实际可能相隔万里运输层协议是在端系统上实现的,而不是路由器,为什么这么强调,因为运输层会将应用报文划分…

ctfshow web93-98

web93 打开环境是一个代码审计题目 简单分析就是输入一个变量num,其值不能等于4476与包含字母,但是他的值需要为4476 函数intval作用为获取变量的整数值,第二个参数的意思是进制,默认为10进制。题目参数为0,就根据变…