class YOLOv8v5Detector(Detector):
def __init__(self, params=None):
super().__init__(params)
self.model = None
self.img = None
self.names = list(Chinese_name.values())
self.params = params if params else ini_params
def load_model(self, model_path):
self.device = select_device(self.params['device'])
self.model = YOLO(model_path)
names_dict = self.model.names
self.names = [Chinese_name[v] if v in Chinese_name else v for v in names_dict.values()]
self.model(torch.zeros(1, 3, *[self.imgsz] * 2).to(self.device).type_as(next(self.model.model.parameters())))
def preprocess(self, img):
self.img = img
return img
def predict(self, img):
results = self.model(img, **ini_params)
return results
def postprocess(self, pred):
results = []
for res in pred[0].boxes:
for box in res:
class_id = int(box.cls.cpu())
bbox = box.xyxy.cpu().squeeze().tolist()
bbox = [int(coord) for coord in bbox]
result = {
"class_name": self.names[class_id],
"bbox": bbox,
"score": box.conf.cpu().squeeze().item(),
"class_id": class_id,
}
results.append(result)
return results
def set_param(self, params):
self.params.update(params)
postprocess方法将YOLO输出的检测结果转换为一个包含所有检测到的手势类别名称、边界框、置信度和类别ID的结构化列表。set_param方法允许在运行时更新模型的参数。
整个代码结构清晰地分为了模型的加载、图像的预处理、预测以及预测结果的后处理,体现了实际深度学习应用中的典型流程。该流程确保了从输入原始图像到最终的手势检测结果的转换,既高效又易于理解和修改。
4.3 训练代码
在本部分博客内容中,我们将深入探讨如何使用PyTorch框架及其扩展库ultralytics来训练一个YOLOv8模型。这一过程涉及设置训练参数、处理数据集路径配置以及启动训练过程。以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:
超参数
设置
说明
学习率(lr0)
0.01
决定了模型权重调整的步长大小,在训练初期有助于快速收敛。
学习率衰减(lrf)
0.01
控制训练过程中学习率的降低速度,有助于模型在训练后期细致调整。
动量(momentum)
0.937
加速模型在正确方向上的学习,并减少震荡,加快收敛速度。
权重衰减(weight_decay)
0.0005
防止过拟合,通过在损失函数中添加正则项减少模型复杂度。
热身训练周期(warmup_epochs)
3.0
初始几个周期内以较低的学习率开始训练,逐渐增加到预定学习率。
批量大小(batch)
16
每次迭代训练中输入模型的样本数,影响GPU内存使用和模型性能。
输入图像大小(imgsz)
640
模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。
环境设置与模型加载:首先,我们进行的是环境设置和模型准备工作。这包括引入必要的库,比如torch用于构建和训练深度学习模型,os用于处理文件和目录路径。
import os
import torch
import yaml
from ultralytics import YOLO # 用于加载YOLO模型
from QtFusion.path import abs_path # 用于获取文件的绝对路径
这一部分的代码是决定模型将在GPU还是CPU上运行,这一选择对训练效率有重大影响。
device = "0" if torch.cuda.is_available() else "cpu"
数据集准备:在实际运行代码之前,我们需要确定数据集配置文件的路径。通过abs_path函数获取数据集配置(.yaml文件)的绝对路径,并进行适当的路径转换以适配不同操作系统的路径风格。
workers = 1 # 工作进程数
batch = 8 # 每批处理的图像数量
data_name = "Gesture"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current')
unix_style_path = data_path.replace(os.sep, '/')
接着,代码中使用了Python的yaml库来读取配置文件,并对其中的path项进行更新,以确保所有路径都是相对于当前工作目录的正确路径。
directory_path = os.path.dirname(unix_style_path)
with open(data_path, 'r') as file:
data = yaml.load(file, Loader=yaml.FullLoader)
if 'path' in data:
data['path'] = directory_path
with open(data_path, 'w') as file:
yaml.safe_dump(data, file, sort_keys=False)
训练模型:最后,代码使用YOLO类来加载预先训练好的YOLOv8权重。随后,通过调用train方法启动训练过程,其中传入了多个训练参数如数据集配置文件路径、工作进程数量、图像尺寸、训练周期数、批次大小以及训练任务名称等。
model = YOLO(abs_path('./weights/yolov5nu.pt', path_type='current'), task='detect') # 加载预训练的YOLOv8模型
# model = YOLO('./weights/yolov5.yaml', task='detect').load('./weights/yolov5nu.pt') # 加载预训练的YOLOv8模型
# Training.
results = model.train( # 开始训练模型
data=data_path, # 指定训练数据的配置文件路径
device=device, # 自动选择进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=120, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v5_' + data_name # 指定训练任务的名称
)
model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect') # 加载预训练的YOLOv8模型
results2 = model.train( # 开始训练模型
data=data_path, # 指定训练数据的配置文件路径
device=device, # 自动选择进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=120, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v8_' + data_name # 指定训练任务的名称
)
这段代码展示了如何利用ultralytics YOLO库中的高级接口简化模型训练流程。用户只需要提供相关参数,便可以轻松开始模型的训练工作,而无需手动编写繁琐的训练循环和数据管理代码。
5. 实验结果与分析
5.1 训练曲线
在深度学习模型的训练过程中,对损失函数和性能指标的监控至关重要,因为它们提供了模型学习过程的直观反馈。分析训练损失和验证损失的趋势,以及精度和召回率等指标,可以帮助我们判断模型是否正在适当地学习,并揭示潜在的过拟合或欠拟合问题。本部分博客将对YOLOv8模型训练过程中的损失函数和性能指标进行分析。
我们可以看到损失函数的三个主要组成部分:box损失、类别损失和目标损失。在训练集上,这三个损失指标随着迭代次数的增加呈现出明显的下降趋势,这表明模型在逐渐学习如何更准确地预测边界框位置、类别以及目标存在的置信度。box损失的快速下降表明模型迅速学会了定位手势的边界框。类别损失和目标损失的下降则说明模型在识别手势的类别和存在性上也取得了进步。值得注意的是,在经过一定数量的训练周期后,这些损失值开始趋于稳定,这通常表示模型接近收敛。
在验证集上,损失曲线显示了类似的趋势,这是模型泛化性能良好的一个迹象。验证损失的轻微波动可能是由于验证数据的内在多样性,这种多样性对于评估模型的泛化能力是必要的。如果验证损失显著高于训练损失,或者随时间增加而增加,这可能是过拟合的标志。
性能指标,包括精度和召回率,以及mAP(平均精度均值)在不同的IOU(交并比)阈值下的值,为我们提供了模型性能的另一视角。精度是指模型正确预测的正例占所有预测正例的比例,而召回率是指模型正确预测的正例占所有实际正例的比例。从图中可见,精度和召回率都在迅速提高,并在经过一定次数的迭代后达到高水平。这意味着模型不仅能够正确识别手势,而且能够识别出绝大多数的手势实例。mAP值提供了一个整体性能的度量,而在高IOU阈值下的mAP值则更为严格。我们看到在这两个指标上,模型均表现出色,特别是在mAP50中,即使在较高的IOU阈值(例如mAP50-95)下,模型性能也相当不错。
综合来看,这些结果表明了YOLOv8模型在手势识别任务上的训练过程是成功的。模型能够从训练数据中学习到强大的特征表达,并在验证集上展现了良好的泛化能力。
5.2 PR曲线图
PR曲线是一个在多种阈值下,通过计算模型在特定召回率水平上的精确度而形成的曲线。精确度(Precision)是指模型正确识别的正例数占识别为正例数的比例,而召回率(Recall)是指模型正确识别的正例数占实际正例总数的比例。理想情况下,模型应该同时具有高精确度和高召回率,这样的模型可以可靠地识别大多数正例,同时避免误识别负例为正例。
从图中可见,PR曲线显示了对所有类别的整体评估,mAP@0.5(在IOU阈值为0.5时的平均精确度)达到了0.949,这是一个极其卓越的结果。mAP@0.5是目标检测任务中常用的评估指标之一,它表明当IOU阈值设定为0.5时,模型能够以接近95%的平均精确度正确识别手势。这表明模型在检测和定位手势方面表现非常出色。
曲线上的每个点代表不同的阈值设置,曲线越靠近图像的右上角,表明模型的精确度和召回率都很高。在您的模型中,曲线在靠近右上角的区域表现出了很高的稳定性,这意味着在不牺牲召回率的情况下,模型能保持很高的精确度。换句话说,它可以准确地识别出绝大多数手势,同时几乎不会将非手势误识别为手势。
此外,曲线下方的阴影区域表示了不同类别的精确度和召回率变化的范围。较宽的阴影区域表明某些类别可能比其他类别有更大的性能变化,这可能是由于数据集中某些类别手势的样本数量不足或者这些手势在视觉上更难以区分。
5.3 YOLOv8/v7/v6/v5对比实验
(1)实验设计:
本实验旨在评估和比较YOLOv5、YOLOv6、YOLOv7和YOLOv8几种模型在常见手势目标检测任务上的性能。为了实现这一目标,博主分别使用使用相同的数据集训练和测试了这四个模型,从而可以进行直接的性能比较。该数据集包含常见手势的图像。本文将比较分析四种模型,旨在揭示每种模型的优缺点,探讨它们在工业环境中实际应用的场景选择。
模型
图像大小 (像素)
mAPval 50-95
CPU ONNX 速度 (毫秒)
A100 TensorRT 速度 (毫秒)
参数数量 (百万)
FLOPs (十亿)
YOLOv5nu
640
34.3
73.6
1.06
2.6
7.7
YOLOv8n
640
37.3
80.4
0.99
3.2
8.7
YOLOv6N
640
37.5
-
-
4.7
11.4
YOLOv7-tiny
640
37.4
-
-
6.01
13.1
(2)度量指标:
F1-Score:F1-Score 作为衡量模型性能的重要指标,尤其在处理类别分布不均的数据集时显得尤为关键。它通过结合精确率与召回率,提供了一个单一的度量标准,能够全面评价模型的效能。精确率衡量的是模型在所有被标记为正例中真正属于正例的比例,而召回率则关注于模型能够识别出的真正正例占所有实际正例的比例。F1-Score通过两者的调和平均,确保了只有当精确率和召回率同时高时,模型的性能评估才会高,从而确保了模型对于正例的预测既准确又完整。
mAP(Mean Average Precision):在目标检测任务中,Mean Average Precision(mAP)是评估模型性能的重要标准。它不仅反映了模型对单个类别的识别精度,而且还考虑了所有类别的平均表现,因此提供了一个全局的性能度量。在计算mAP时,模型对于每个类别的预测被单独考虑,然后计算每个类别的平均精度(AP),最后这些AP值的平均数形成了mAP。
名称
YOLOv5nu
YOLOv6n
YOLOv7-tiny
YOLOv8n
mAP
0.956
0.953
0.931
0.949
F1-Score
0.92
0.92
0.89
0.91
(3)实验结果分析:
在我们的实验中,我们对四种不同的YOLO模型版本——YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n——在相同数据集上进行了细致的性能评估。通过对两个关键指标——mAP(mean Average Precision)和F1-Score——的深入分析,我们能够评价每个模型在精确度和召回率之间的平衡性能。
YOLOv5nu模型以0.956的mAP和0.92的F1-Score表现最优,显示出该版本在识别手势的平均精确度方面略胜一筹。mAP是衡量模型准确识别不同类别的能力的重要指标,YOLOv5nu在这方面的表现可能得益于其优化的网络结构和高效的特征提取能力。相比之下,YOLOv7-tiny的mAP和F1-Score均为最低,这可能是因为其“tiny”版本在设计上更偏向于速度而牺牲了一定的准确度,适用于对实时性要求极高的场景。
YOLOv6n与YOLOv8n的性能相当,它们的mAP分别为0.953和0.949,而F1-Score均为0.92。这表明在此次实验设定中,YOLOv6n和YOLOv8n在准确度和召回率方面实现了较好的平衡。其中YOLOv6n的mAP略高于YOLOv8n,这可能与模型内部特征融合的方式和锚点设置的优化有关。
综合来看,每个模型版本的性能都受到其架构设计的影响。例如,YOLOv5nu可能因为采用了更先进的特征融合技术或更合理的锚点策略,而在综合性能上稍微领先。而YOLOv7-tiny可能为了追求更快的推理速度,在模型复杂度上做了妥协,导致在准确度上的损失。
在实际应用中,依据具体场景的需求,可能会对准确率或召回率有更高的要求,因此选择模型时应考虑实际应用的特定需求。此外,实验结果也可能受到数据集特性的影响,如数据分布、类别不平衡等因素,这些都是决定最终模型选择的重要依据。
6. 系统设计与实现
6.1 系统架构概览
在构建基于YOLOv8/v7/v6/v5的常见手势识别系统时,我们采用了一种模块化、灵活的设计理念,以确保系统既能高效处理手势识别任务,又具备良好的可扩展性和维护性。以下是我们系统架构的主要组成部分:
模型加载与预处理:首先,通过YOLOv8v5Detector类加载预训练的YOLO模型,并对输入的图像进行必要的预处理,如尺寸调整和归一化。这一步骤是确保模型能够正确解读输入图像的关键。
配置管理:通过Detection_UI类管理整个系统的配置,包括模型类型、置信度阈值(conf_threshold)、IOU阈值(iou_threshold)等,以及处理的文件类型和上传的文件。这些配置项可以通过界面动态调整,以适应不同的应用场景和用户需求。
图像和视频处理:针对不同的输入源——摄像头、图片文件或视频文件,Detection_UI类中的process_camera_or_file方法负责处理这些输入。这包括从摄像头捕获实时图像、读取并解码上传的文件,以及调用模型进行手势识别。
结果展示与日志记录:系统将检测结果(包括识别的手势、置信度、位置等信息)以可视化的形式展现给用户,并通过ResultLogger和LogTable类进行结果的日志记录和保存。这使得用户不仅能实时看到识别结果,还能回溯和分析历史数据。
UI设计:为了提供友好的用户交互体验,我们通过setup_sidebar和setupMainWindow方法在Streamlit框架上设计了直观的图形界面,包括模型和摄像头的选择、阈值的调整、文件的上传以及结果的展示等功能。
实时更新和反馈:系统设计了进度条和动态更新机制,通过st.progress和st.image等Streamlit组件,实时反馈模型处理进度和结果,提高了用户的交互体验。
6.2 系统流程
基于YOLOv8/v7/v6/v5的常见手势识别系统的工作流程是一个从用户输入到最终结果展示的全过程,下面我们将详细介绍这一过程的各个步骤:
初始化系统配置:系统启动时,首先通过Detection_UI类的构造函数初始化系统配置。这包括设置模型参数、加载预训练的YOLO模型、初始化UI界面等。
设置UI界面:系统通过setup_page和setup_sidebar方法设置主页面和侧边栏的布局和内容,包括模型配置、文件上传、摄像头选择等选项。
模型加载:根据用户在UI界面选择的配置,系统通过YOLOv8v5Detector类加载相应的预训练YOLO模型。如果用户选择了自定义模型文件,系统将加载用户上传的模型。
输入处理:用户可以选择通过摄像头实时捕获图像、上传图片文件或视频文件作为输入。系统将根据用户的选择,通过process_camera_or_file方法处理相应的输入。
a. 摄像头输入:如果选择了摄像头,系统将持续从摄像头捕获图像,并实时进行手势识别。
b. 图片文件输入:如果上传了图片文件,系统将读取并处理该图片,进行一次性的手势识别。
c. 视频文件输入:如果上传了视频文件,系统将逐帧读取视频内容,对每一帧进行手势识别。
手势识别:无论是摄像头实时捕获的图像还是上传的文件,系统都会通过frame_process方法调用YOLO模型对输入图像进行手势识别。这一步骤涉及到图像预处理、模型推理、结果后处理等多个环节。
结果展示:系统将识别结果以可视化的方式展示给用户。对于摄像头输入,系统实现了实时更新的功能;对于文件输入,系统将展示处理后的图像和识别结果。
日志记录:系统通过ResultLogger和LogTable类记录识别过程中的详细信息,包括检测到的手势、置信度、位置等,并支持将结果保存为日志文件,方便用户进行回溯和分析。
用户交互:用户可以通过UI界面调整模型设置、重新选择输入源或导出识别结果等,系统将根据用户的操作动态更新配置和展示的内容。
整个系统流程是一个闭环的过程,用户在任何阶段都可以修改配置或选择不同的输入,系统将根据最新的配置重新处理输入并展示更新的结果,确保了系统的灵活性和用户友好性。通过精心设计的流程和友好的界面,我们的系统为用户提供了一个高效、准确的手势识别工具,展现了YOLO模型在实时目标检测领域的强大能力。
代码下载链接
如果您希望获取博客中提及的完整资源包,包含测试图片、视频、Python文件(*.py)、网页配置文件、训练数据集、代码及界面设计等,可访问博主在面包多平台的上传内容。相关的博客和视频资料提供了所有必要文件的下载链接,以便一键运行。完整资源的预览如下图所示:
资源包中涵盖了你需要的训练测试数据集、训练测试代码、UI界面代码等完整资源,完整项目文件的下载链接可在下面的视频简介中找到➷➷➷
演示与介绍视频 :https://www.bilibili.com/video/BV1j1421S7Xt/
YOLOv8/v7/v6/v5项目合集下载:https://mbd.pub/o/bread/mbd-ZZ2Xm5xx
YOLOv8和v5项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2XmZpr
YOLOv7项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2Xmpdp
YOLOv6项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2Xm5dv
完整安装运行教程:
这个项目的运行需要用到Anaconda和Pycharm两个软件,下载到资源代码后,您可以按照以下链接提供的详细安装教程操作即可运行成功,如仍有运行问题可私信博主解决:
Pycharm和Anaconda的安装教程:https://deepcode.blog.csdn.net/article/details/136639378;
软件安装好后需要为本项目新建Python环境、安装依赖库,并在Pycharm中设置环境,这几步采用下面的教程可选在线安装(pip install直接在线下载包)或离线依赖包(博主提供的离线包直接装)安装两种方式之一:
Python环境配置教程:https://deepcode.blog.csdn.net/article/details/136639396(2,3方法可选一种);
离线依赖包的安装指南:https://deepcode.blog.csdn.net/article/details/136650641(2,3方法可选一种);
如使用离线包方式安装,请下载离线依赖库,下载地址:https://pan.baidu.com/s/1uHbU9YzSqN0YP_dTHBgpFw?pwd=mt8u (提取码:mt8u)。
7. 结论与未来工作
本文深入研究并实践了基于YOLOv8/v7/v6/v5的深度学习模型在常见手势识别领域的应用,成功开发了一个集成了这些先进算法的手势识别系统。通过对YOLO系列模型的细致比较和优化,本研究不仅显著提升了手势识别的准确率和实时性,还利用Streamlit构建了一个直观、美观且用户友好的Web应用,使用户能够轻松地进行手势识别,从而在实际应用中展现出其重要价值。
经过一系列实验验证,我们的方法在手势识别的准确性和处理速度上都达到了令人满意的水平。同时,本文还提供了完整的数据集处理、模型训练与预测的流程,以及基于Streamlit的系统设计和实现细节,为未来的研究者和开发者提供了便利的复现和参考路径。尽管已取得了显著成果,手势识别作为一个多样化且充满挑战的任务,仍有许多改进空间。未来的工作将从以下几个方向进行深入探索:
模型优化:继续研究深层次的网络结构和优化策略,如神经网络架构搜索(NAS)技术,以进一步提升模型的性能和效率。
多模态融合:考虑结合语音、文本等其他模态的信息,采用多模态学习方法进行手势识别,以更全面地捕捉人类的情感和意图。
跨域适应性:研究跨文化、跨年龄组的手势识别,通过领域自适应技术提高模型在不同人群和环境中的泛化能力。
用户交互体验:进一步优化系统的用户界面和交互设计,使其更加人性化、智能化,以满足更广泛用户的需求。
实际应用拓展:探索手势识别在更多实际应用场景中的应用,如在线教育、远程会议、智能客服等,以发挥其最大的社会和经济价值。
总之,基于深度学习的常见手势识别技术正处于快速发展阶段,随着技术的进步和应用场景的拓展,我们相信在不久的将来,这一技术将在人机交互、社会安全、医疗健康等领域发挥更加重要的作用。
Liu C, Tao Y, Liang J, et al. Object detection based on YOLO network[C]//2018 IEEE 4th information technology and mechatronics engineering conference (ITOEC). IEEE, 2018: 799-803. ↩︎
Zhu X, Lyu S, Wang X, et al. TPH-YOLOv5: Improved YOLOv5 based on transformer prediction head for object detection on drone-captured scenarios[C]//Proceedings of the IEEE/CVF international conference on computer vision. 2021: 2778-2788. ↩︎
Sun Z, Chen B. Research on Pedestrian Detection and Recognition Based on Improved YOLOv6 Algorithm[C]//International Conference on Artificial Intelligence in China. Singapore: Springer Nature Singapore, 2022: 281-289. ↩︎
Zhao H, Zhang H, Zhao Y. Yolov7-sea: Object detection of maritime uav images based on improved yolov7[C]//Proceedings of the IEEE/CVF winter conference on applications of computer vision. 2023: 233-238. ↩︎
Wen, Guihao, et al. "The improved YOLOv8 algorithm based on EMSPConv and SPE-head modules." Multimedia Tools and Applications (2024): 1-17. ↩︎