基于深度学习的智能手势识别系统

基于深度学习的石头剪刀布手势识别(UI界面+YOLOv8/v7/v6/v5代码+训练数据集)

引言

石头剪刀布是一种简单而有趣的游戏。通过基于深度学习的手势识别系统,我们可以自动检测和识别玩家的手势。本文将详细介绍如何构建一个石头剪刀布手势识别系统,包括环境搭建、数据收集与处理、模型训练、系统实现以及用户界面设计,并提供实际的代码示例。

系统概述

本系统的实现步骤包括:

  1. 环境搭建
  2. 数据收集与处理
  3. 模型训练
  4. 系统实现
  5. 用户界面设计

环境搭建

首先,需要搭建一个适合深度学习开发的环境。本文使用Python 3.8或以上版本,并依赖于多个深度学习和图像处理库。

安装必要的库

使用以下命令安装所需库:

pip install numpy pandas matplotlib opencv-python torch torchvision ultralytics pyqt5

数据收集与处理

数据收集

收集包含石头、剪刀和布手势的图像和视频数据集。可以通过互联网下载公开的数据集,或者自己拍摄。确保数据集包含各种不同的手势类型和不同的背景。

数据处理

将图像数据整理到指定的文件夹结构,并标注手势的位置。以下是示例的文件夹结构:

datasets/├── images/│   ├── train/│   │   ├── image1.jpg│   │   ├── image2.jpg│   ├── val/│   │   ├── image1.jpg│   │   ├── image2.jpg├── labels/├── train/│   ├── image1.txt│   ├── image2.txt├── val/├── image1.txt├── image2.txt

每个标签文件的内容如下:

class x_center y_center width height

其中,class表示类别编号(如石头、剪刀、布),x_centery_center为归一化后的中心坐标,widthheight为归一化后的宽度和高度。

数据增强

为了提高模型的泛化能力,可以对数据进行增强处理。常见的数据增强方法包括旋转、缩放、平移、镜像等。

import albumentations as A
from albumentations.pytorch import ToTensorV2
import cv2
import os# 定义数据增强变换
transform = A.Compose([A.RandomRotate90(),A.Flip(),A.Transpose(),A.OneOf([A.IAAAdditiveGaussianNoise(),A.GaussNoise(),], p=0.2),A.OneOf([A.MotionBlur(p=0.2),A.MedianBlur(blur_limit=3, p=0.1),A.Blur(blur_limit=3, p=0.1),], p=0.2),A.ShiftScaleRotate(shift_limit=0.0625, scale_limit=0.2, rotate_limit=45, p=0.2),A.OneOf([A.OpticalDistortion(p=0.3),A.GridDistortion(p=0.1),A.IAAPiecewiseAffine(p=0.3),], p=0.2),A.OneOf([A.CLAHE(clip_limit=2),A.IAASharpen(),A.IAAEmboss(),A.RandomBrightnessContrast(),], p=0.3),A.HueSaturationValue(p=0.3),ToTensorV2()
])# 处理图像
def augment_images(image_folder, output_folder):os.makedirs(output_folder, exist_ok=True)for filename in os.listdir(image_folder):image_path = os.path.join(image_folder, filename)image = cv2.imread(image_path)augmented = transform(image=image)augmented_image = augmented["image"].numpy().transpose(1, 2, 0)output_path = os.path.join(output_folder, filename)cv2.imwrite(output_path, augmented_image)# 应用数据增强
augment_images('datasets/images/train', 'datasets/images/train_augmented')

模型训练

使用YOLO模型进行训练。

配置文件

创建一个配置文件config.yaml

path: datasets
train: images/train
val: images/val
test: images/testnc: 3  # 类别数:石头、剪刀、布
names: ['rock', 'paper', 'scissors']  # 类别名称

训练代码

使用以下代码训练模型:

from ultralytics import YOLO# 加载模型
model = YOLO('yolov8n.pt')# 训练模型
model.train(data='config.yaml', epochs=50, imgsz=640, batch=16, lr0=0.01)

训练过程会生成模型权重文件best.pt,该文件包含了训练好的模型参数。

系统实现

训练好的模型可以用于实时手势检测。使用OpenCV读取视频流,并调用YOLO模型进行检测。

检测代码

import cv2
from ultralytics import YOLO# 加载训练好的模型
model = YOLO('best.pt')# 打开视频流
cap = cv2.VideoCapture(0)while cap.isOpened():ret, frame = cap.read()if not ret:break# 检测手势results = model(frame)for result in results:bbox = result['bbox']label = result['label']confidence = result['confidence']# 画框和标签cv2.rectangle(frame, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (0, 255, 0), 2)cv2.putText(frame, f'{label} {confidence:.2f}', (bbox[0], bbox[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)# 显示结果cv2.imshow('Rock Paper Scissors Detection', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()

用户界面设计

为了提高系统的易用性,我们设计了一个用户友好的界面。使用PyQt5实现用户界面,提供图像或视频播放和检测结果显示。

界面代码

以下是一个简单的PyQt5界面代码示例:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButton, QFileDialog
from PyQt5.QtGui import QPixmap, QImage
import cv2
from ultralytics import YOLOclass GestureDetectionUI(QWidget):def __init__(self):super().__init__()self.initUI()self.model = YOLO('best.pt')def initUI(self):self.setWindowTitle('Gesture Detection System')self.layout = QVBoxLayout()self.label = QLabel(self)self.layout.addWidget(self.label)self.button = QPushButton('Open Image or Video', self)self.button.clicked.connect(self.open_file)self.layout.addWidget(self.button)self.setLayout(self.layout)def open_file(self):options = QFileDialog.Options()file_path, _ = QFileDialog.getOpenFileName(self, "Open File", "", "All Files (*);;MP4 Files (*.mp4);;JPEG Files (*.jpg);;PNG Files (*.png)", options=options)if file_path:if file_path.endswith('.mp4'):self.detect_gesture_video(file_path)else:self.detect_gesture_image(file_path)def detect_gesture_image(self, file_path):frame = cv2.imread(file_path)results = self.model(frame)for result in results:bbox = result['bbox']label = result['label']confidence = result['confidence']cv2.rectangle(frame, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (0, 255, 0), 2)cv2.putText(frame, f'{label} {confidence:.2f}', (bbox[0], bbox[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)height, width, channel = frame.shapebytesPerLine = 3 * widthqImg = QImage(frame.data, width, height, bytesPerLine, QImage.Format_RGB888).rgbSwapped()self.label.setPixmap(QPixmap.fromImage(qImg))def detect_gesture_video(self, file_path):cap = cv2.VideoCapture(file_path)while cap.isOpened():ret, frame = cap.read()if not ret:breakresults = self.model(frame)for result in results:bbox = result['bbox']label = result['label']confidence = result['confidence']cv2.rectangle(frame, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (0, 255, 0), 2)cv2.putText(frame, f'{label} {confidence:.2f}', (bbox[0], bbox[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)height, width, channel = frame.shapebytesPerLine = 3 * widthqImg = QImage(frame.data, width, height, bytesPerLine, QImage.Format_RGB888).rgbSwapped()self.label.setPixmap(QPixmap.fromImage(qImg))QApplication.processEvents()cap.release()if __name__ == '__main__':app = QApplication(sys.argv)ex = GestureDetectionUI()ex.show()sys.exit(app.exec_())

总结

本文详细介绍了如何构建一个基于深度学习的石头剪刀布手势识别系统,从环境搭建、数据收集与处理、模型训练、系统实现到用户界面设计。这不仅提高了游戏的趣味性,还展示了深度学习在图像识别领域的强大能力。
声明:本文只是简单的项目思路,如有部署的想法,想要(UI界面+YOLOv8/v7/v6/v5代码+训练数据集)的可以联系作者.

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

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

相关文章

C++类与对象-总结实践篇

为了总结熟悉类与对象相关的语法,本文通过实现经典的日期计算来练习巩固这一块的知识 目录 一、要实现的功能 二、难点分析 2.1 判断日期大小 2.2 日期加/减对应天数 2.3 两个日期相减 三、源代码 牛客网日期类相关练习题: 日期累加_牛客题霸_牛…

Oracle 19c打Datapatch数据补丁报错处理

Oracle 19c打Datapatch数据补丁报错处理 错误分析重新编译补丁验证安装完数据库补丁后,在数据补丁的步骤收到以下报错: Connecting to database...OK Gathering database info...done Bootstrapping registry and package to current versions...done Determining current s…

【Java】韩顺平Java学习笔记 第19章 IO流

文章目录 文件概述常用的文件操作创建文件获取文件信息目录的操作和文件删除流的分类各抽象类常用子类对象FileInputStreamFileOutputStreamFileReaderFileWriter 节点流和处理流概念BufferedReaderBufferedWriterBufferedInputStream & BufferedOutputStream 对象流&#…

LeetCode 算法:搜索插入位置 c++

原题链接🔗:搜索插入位置 难度:简单⭐️ 题目 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(l…

Python | TypeError: ‘module’ object is not callable

Python | TypeError: ‘module’ object is not callable 在Python编程中,遇到“TypeError: ‘module’ object is not callable”这类错误通常表明你尝试像函数一样调用了一个模块。这种错误通常是由于导入模块时的疏忽或误解导致的。本文将深入探讨此错误的根源&…

2024年7月23日~2024年7月29日周报

目录 一、前言 二、完成情况 2.1 一种具有边缘增强特点的医学图像分割网络 2.2 融合边缘增强注意力机制和 U-Net 网络的医学图像分割 2.3 遇到的困难 三、下周计划 一、前言 上周参加了一些师兄师姐的论文讨论会议,并完成了初稿。 本周继续修改论文&#xff0…

vivado LOC

LOC LOC指定逻辑单元对目标SITE资源的放置分配 Xilinx部分。 LOC属性或约束有时与BEL属性一起使用,以定义精确的 将细胞放置在设备内。在这些情况下,必须定义BEL约束 否则将发生放置错误。 提示:要将I/O端口分配给设备包上的物理引脚&#xf…

大语言模型系列——Transformer 介绍与使用

引言 自从 Google 在 2017 年发表了一篇题为《Attention Is All You Need》的论文以来,Transformer 已经成为了自然语言处理领域的一个重要里程碑。与传统的 RNN 和 LSTM 不同,Transformer 通过自注意力机制(Self-Attention Mechanism&#…

使用eclipse在新建的java项目中编辑xml文件时Unhandled event loop exception No more handles

处理方法:更换xml编辑器 Window ——》Preferences ——》General ——》Editors ——》File Associations 如果File types里面没有*.xml,则点击Add进行新增 选中*.xml,然后在Associated editors 选中想用的编辑器,设置为defaul…

Selenium---Xpath选择器

XPath (XML Path Language) 是由国际标准化组织W3C指定的,用来在 XML 和 HTML 文档中选择节点的语言。 xpath 语法中,整个HTML文档根节点用/表示,如果我们想选择的是根节点下面的html节点,则可以在搜索框输入 /html如果输入下面…

vpp中的不同节点的数据传输,使用vpp中的回调函数,相同的原理也可以实现,不同节点的函数的调用

vpp中的不同节点的数据传输,使用vpp中的回调函数,相同的原理也可以实现,不同节点的函数的调用 1.实现数据传输所需要用到的函数2.具体实现 1.实现数据传输所需要用到的函数 需要用到的一个宏__clib_export 作用:就是将这后边的…

小白也能读懂的ConvLSTM!(开源pytorch代码)

ConvLSTM 1. 算法简介与应用场景2. 算法原理2.1 LSTM基础2.2 ConvLSTM原理2.2.1 ConvLSTM的结构2.2.2 卷积操作的优点 2.3 LSTM与ConvLSTM的对比分析2.4 ConvLSTM的应用 3. PyTorch代码参考文献 仅需要网络源码的可以直接跳到末尾即可 1. 算法简介与应用场景 ConvLSTM&#x…

app-routing.module.ts 简单介绍

Angular的路由是一种功能,它允许应用程序响应不同的URL路径或参数并根据这些路径加载不同的组件。app-routing.module.ts是Angular项目中负责设置应用程序路由的文件。 以下是一个简单的app-routing.module.ts文件示例,它配置了三个路由: i…

SAPUI5基础知识22 - 图标(Icons)

1. 背景 SAPUI5 提供了一套丰富的图标库,可以用于增强应用程序的视觉吸引力和用户体验。这些图标是矢量图形,可以在任何分辨率下保持清晰,并且可以自定义颜色和大小。 2. 示例 在 SAPUI5 中,图标可以通过 sap.ui.core.Icon 控件…

Redis快速入门基础

Redis入门 Redis是一个基于内存的 key-value 结构数据库。mysql是二维表的接口数据库 优点: 基于内存存储,读写性能高 适合存储热点数据(热点商品、资讯、新闻) 企业应用广泛 官网:https://redis.io 中文网:https://www.redis.net.cn/ Redis下载与…

Spring缓存注解

Spring缓存注解 EnableCaching | 来启动缓存注解Cached | 用来表示某一个方法的结果可以被缓存 Cached(name “testCache:id1:”, key “#testId”, cacheType CacheType.REMOTE, localLimit CustomerConstants.DEFAULT_LIMIT, expire 1800)方法方法上。 #相关参数&#…

The Llama 3 Herd of Models 第6部分推理部分全文

第1,2,3部分 介绍,概览和预训练 第4部分 后训练 第5部分 结果 6 Inference 推理 我们研究了两种主要技术来提高Llama 3405b模型的推理效率:(1)管道并行化和(2)FP8量化。我们已经公开发布了FP8量化的实现。 6.1 Pipeline Parallelism 管道并行 当使用BF16数字表示模型参数时…

家具购物小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,家具分类管理,家具新品管理,订单管理,系统管理 微信端账号功能包括:系统首页,家具新品,家具公告&#xff0…

【开发学习笔记】git的工作区与分支

Git是一款分布式版本控制系统,被广泛应用于软件开发中,用于跟踪和管理项目的源代码。在Git中,工作区与分支是两个核心概念,它们在Git的工作流程中扮演着不同的角色。 工作区的概念 工作区(Working Directory&#xf…

Linux网络——深入理解传入层协议TCP

目录 一、前导知识 1.1 TCP协议段格式 1.2 TCP全双工本质 二、三次握手 2.1 标记位 2.2 三次握手 2.3 捎带应答 2.4 标记位 RST 三、四次挥手 3.1 标记位 FIN 四、确认应答(ACK)机制 五、超时重传机制 六 TCP 流量控制 6.1 16位窗口大小 6.2 标记位 PSH 6.3 标记…