在边缘端进行tensorflow模型的部署(小白初探)

1.配置tensorflow的环境

(我是安装GPU版本的)

        建议参考这个博主的文章,确实非常快速!

十分钟安装Tensorflow-gpu2.6.0+本机CUDA12 以及numpy+matplotlib各包版本协调问题_tensorflow cuda12-CSDN博客

2.学习自制数据集

(我这里的模型是用来做目标检测的,所以就先使用labelimg制作了YOLO型的数据集,再使用Python进行格式转换的) 

        首先,使用检测的摄像头拍摄视频。然后用Python代码处理视频,生成图像数据:

import cv2
import os# 配置参数
video_path = r"D:\\TC264_Library-master(ADS1.9.4)\\SHangWeiJi\\tf_datas_01.avi"
output_dir = r"E:\\YOLO01\\img_Origin"
desired_fps = 10  # 目标提取帧率# 创建输出目录(如果不存在)
os.makedirs(output_dir, exist_ok=True)# 打开视频文件
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():raise Exception(f"无法打开视频文件:{video_path}")# 获取视频原始属性
original_fps = cap.get(cv2.CAP_PROP_FPS)
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
video_duration = total_frames / original_fpsprint(f"视频信息:")
print(f"原始帧率:{original_fps:.2f} FPS")
print(f"总帧数:{total_frames}")
print(f"持续时间:{video_duration:.2f} 秒")# 计算帧间隔(根据原始帧率和目标帧率)
frame_interval = int(round(original_fps / desired_fps))
print(f"采样间隔:每 {frame_interval} 帧保存一次")# 初始化计数器
count = 0
saved_count = 0while True:ret, frame = cap.read()if not ret:break# 按间隔保存帧if count % frame_interval == 0:# 生成带序号的文件名(4位数字补零)filename = f"frame_{saved_count:04d}.jpg"output_path = os.path.join(output_dir, filename)# 保存图像(质量参数75,可根据需要调整)cv2.imwrite(output_path, frame, [cv2.IMWRITE_JPEG_QUALITY, 75])saved_count += 1count += 1# 释放资源
cap.release()
print(f"\n处理完成!共保存 {saved_count} 张图像到:{output_dir}")

接着,进入labelimg进行标注。YOLO型数据变为TFRecord型数据的转换代码如下所示: 

import tensorflow as tfdef parse_tfrecord(example_proto):"""解析TFRecord特征描述"""feature_description = {'image': tf.io.FixedLenFeature([], tf.string),'bboxes': tf.io.VarLenFeature(tf.float32),'points': tf.io.VarLenFeature(tf.float32),'num_bboxes': tf.io.FixedLenFeature([], tf.int64),'num_points': tf.io.FixedLenFeature([], tf.int64)}parsed = tf.io.parse_single_example(example_proto, feature_description)# 解码图像image = tf.io.decode_raw(parsed['image'], tf.uint8)image = tf.reshape(image, [224, 224, 1])image = tf.cast(image, tf.float32) / 255.0# 解码边界框bboxes = tf.sparse.to_dense(parsed['bboxes'])bboxes = tf.reshape(bboxes, [parsed['num_bboxes'], 4])# 解码关键点points = tf.sparse.to_dense(parsed['points'])points = tf.reshape(points, [parsed['num_points'], 4])return image, {'bbox': bboxes, 'points': points}def load_dataset(subset, batch_size=32):"""加载TFRecord数据集"""pattern = f"E:/TFRecordData/{subset}/{subset}_*.tfrecord"files = tf.data.Dataset.list_files(pattern)dataset = files.interleave(lambda x: tf.data.TFRecordDataset(x),cycle_length=tf.data.AUTOTUNE,num_parallel_calls=tf.data.AUTOTUNE)dataset = dataset.map(parse_tfrecord,num_parallel_calls=tf.data.AUTOTUNE)dataset = dataset.padded_batch(batch_size,padded_shapes=([224, 224, 1],{'bbox': [None, 4],'points': [None, 4]})).prefetch(tf.data.AUTOTUNE)return dataset# 使用示例
train_dataset = load_dataset("train")
val_dataset = load_dataset("val")
test_dataset = load_dataset("test")

3.模型训练

然后,我们就可以美美地把自己的数据集导入到模型里面进行训练了

我的模型训练结果如下:

4.模型的部署

最后,按照单片机平台的tflite_Micro的资源包配置嵌入式平台的编译环境,再把模型的tflite文件转为C语言格式,一起导入工程代码。

 

OK!博主的部署操作到这里就结束了,更多细节,还要到后面有时间了再补充。

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

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

相关文章

windows下使用nginx + waitress 部署django

架构介绍 linux一般采用nginx uwsgi部署django,在Windows下,可以取代uwsgi的选项包括Waitressa、Daphnea、Hypercoma和Gunicorna(通过WSLa 运行)。windows服务器一般采用nginx waitress 部署django,,他们的关系如下 django是WEB应用…

利用pnpm patch命令实现依赖包热更新:精准打补丁指南

需求场景 在Element Plus的el-table组件二次开发中,需新增列显示/隐藏控件功能。直接修改node_modules源码存在两大痛点: 团队协作时修改无法同步 依赖更新导致自定义代码丢失 解决方案选型 通过patch-package工具实现: 📦 非…

ThinkPad T520 无法读到硬盘 问题排查思路

错误提示:2100:detection error on hdd0(Main hdd) 1、判断错误提示含义 表示电脑在启动时无法检测到主硬盘(HDD0)。 2、 常见原因: 硬盘松动或接触不良 → 特别是笔记本在移动或震动后,硬盘排线松了。 硬盘损坏 →…

Doris部署生产集群最低要求的部署方案

Doris生产集群最低部署方案(2025年4月版) 一、节点规划与数量 1. FE节点(Frontend) 数量:至少 3个节点(1个Follower 2个 Observer),确保高可用(HA)。角色分…

游戏引擎学习第227天

今天的计划 今天的工作重点是进行吸引模式(attract mode)的开发,主要是处理游戏的进出和其他一些小的细节问题,这些是之前想要整理和清理的部分。我做了一些工作,将游戏代码中的不同部分分离到逻辑上独立的区域&#…

spark-SQL数据加载和保存

数据加载与保存 通用方式: 通过 spark.read.load 和 df.write.save 实现数据加载与保存。可利用 format 指定数据格式,如 csv 、 jdbc 等; option 用于设置特定参数,像 jdbc 格式下的数据库连接信息; load 和 save 则…

算法升级战报:亚马逊受众定向工具实测点击成本降37%

随着广告成本居高不下,精准投放成为卖家们绕不开的焦虑点。而最近一轮亚马逊DSP广告系统的算法升级,似乎正在给这场投放内卷带来新的转机。在这篇文章中,我们将基于实际测试数据,详细解析亚马逊受众定向工具的表现,并复…

大带宽服务器的优势

大带宽服务器最大的优势就在于可以显著提高数据传输的速度,这对于有着高流量应用和实时数据交换需求的企业来说,大带宽服务器中的带宽越大,所提供的数据传输速度就越快,同时网络的延迟度也会变低,所以大带宽服务器往往…

华为OD机试真题——阿里巴巴找黄金宝箱 IV(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式! 华为OD机试真题《阿里巴巴找黄金宝箱 IV》: 目录 题目名称&…

C++零基础实践教程

模块一:准备工作与第一个程序 (热身) 在正式编写代码之前,我们需要了解为什么要学习 C,并搭建好我们的开发环境。然后,我们将编写并运行第一个简单的 C 程序。 1. 为什么选择 C? 你可能听说过很多编程语言&#xff…

6 CMD 与 PowerShell 指令大全、C 程序终端运行、字符编码切换指南

1 CMD 与 PowerShell 常用指令 在命令行环境中高效运行程序,掌握终端的基本操作命令至关重要。无论是 Windows 系统下的 CMD(命令提示符)还是 PowerShell,它们都配备了一系列实用的命令,助力我们管理文件、执行程序以及…

Linux——共享内存

目录 一、共享内存概念 二、共享内存的一些函数 2.1 shmget 创建共享内存 2.2 shmat 访问共享内存 2.3 shmdt 解除共享内存的映射 2.4 shnctl 删除共享内存段 三、共享内存 3.1 创建测试进程 3.2 使用循环测试 ​编辑 3.3 共享内存写入程序 3.4 带有信号量的共享内…

数启新疆,智领未来!2025新疆数字经济发展战略研讨会在乌市启幕

2025年4月20日,由新疆维吾尔自治区数字经济联合会主办、中钧科技有限公司承办的"2025新疆数字经济发展战略研讨会"将在乌鲁木齐水磨沟区金正大厦三层会议中心隆重召开。 作为本年度新疆数字经济领域规格最高的行业盛会,会议将汇聚自治区14个厅…

Nginx:轻量级高性能的Web服务器与反向代理服务器

目录 一.引言 二.Nginx的核心特点 2.1高性能与高并发 2.2低资源消耗 2.3功能丰富 2.4高度扩展性 三.Nginx的应用场景 3.1静态资源服务器 3.2反向代理服务器 3.3API网关 3.4Nginx的配置与使用 四.总结 一.引言 在互联网高速发展的今天,Web服务器的性能与…

嵌入式Linux设备使用Go语言快速构建Web服务,实现设备参数配置管理方案探究

本文探讨,利用Go语言及gin框架在嵌入式Linux设备上高效搭建Web服务器,以实现设备参数的网页配置。通过gin框架,我们可以在几分钟内创建一个功能完善的管理界面,方便对诸如集中器,集线器等没有界面的嵌入式设备的管理。…

KALI搭建log4j2靶场及漏洞复现全流程

这里使用了两台KALI虚拟机,一台用于安装靶场环境,一台用于攻击 一、Docker的安装(靶机) 1、Linux内核版本查看 #安装docker要求内核版本kerner>3.10 #为此,先检查当前Linux系统的内核版本 uname -a 2、Linux apt…

学习笔记—C++—模板初阶

目录 模板初阶 泛型编程 函数模板 模版概念 函数模版格式 模版的原理 函数模板的实例化 模版参数的匹配规则 类模板 模板初阶 泛型编程 使用函数重载虽然可以实现,但是有一下几个不好的地方: 1. 重载的函数仅仅是类型不同,代码复…

Docker 中多个容器之间的通信

在 Docker 中,多个容器之间的通信可以通过以下几种主要方式实现,具体选择取决于网络需求、隔离性及管理复杂度: 一、自定义 Bridge 网络(推荐) 通过创建自定义的 Docker 网络,容器可以加入同一网络并通过容…

Day1-初次接触UFS

经过导师初次介绍,了解工作以芯片测试为主,需坚持学习,小白大致需3-6月入门。整体学习应分为3大块,UFS协议占40%(3-4h),C技能占40%(3-4h),工具或业务占20%(1-2h&#xff…

【LeetCode 热题100】二叉树构造题精讲:前序 + 中序建树 有序数组构造 BST(力扣105 / 108)(Go语言版)

🌱 二叉树构造题精讲:前序 中序建树 & 有序数组构造 BST 本文围绕二叉树的两类构造类题目展开解析: 从前序与中序遍历序列构造二叉树 将有序数组转换为二叉搜索树 我们将从「已知遍历构造树」和「平衡构造 BST」两个角度,拆…