基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的多目标识别系统(Python+PySide6界面+训练代码)
摘要:本文介绍了一种基于深度学习的多目标识别系统系统的代码,采用最先进的YOLOv8算法并对比YOLOv7、YOLOv6、YOLOv5等算法的结果,能够准确识别图像、视频、实时视频流以及批量文件中的多目标。文章详细解释了YOLOv8算法的原理,并提供了相应的Python实现代码、训练数据集,以及基于PySide6的用户界面(UI)。该系统实现了对图像中多目标的准确识别和分类,并包含了基于SQLite的登录注册管理、一键更换YOLOv5/v6/v7/v8模型以及界面自定义修改等功能。本文旨在为相关领域的研究人员和新入门的朋友提供一个参考,完整代码资源文件以及数据集可以在文末的下载链接中获取。本文结构如下:
文章目录
基于YOLOv8/v7/v6/v5的多目标识别系统演示与介绍(Python+PySide6界面+训练代码)
前言
在当今的计算机视觉领域,多目标识别技术已成为一个研究热点,它涉及到从图像或视频中同时检测和识别多个目标的能力。这一技术的发展对于智能监控、自动驾驶、人机交互等多个领域具有重大意义。随着深度学习的兴起,尤其是卷积神经网络(CNN)的应用,多目标识别的准确度和效率得到了显著提升。在多目标识别领域,近年来的研究主要集中在提高检测速度和准确性,以及优化算法以适应不同的应用场景。YOLO系列作为其中的重要代表,其最新版本YOLOv8在实时检测性能上取得了显著的进步。YOLOv8通过改进网络架构和训练策略,实现了更高的检测精度和更快的处理速度1。此外,针对小目标检测的问题,研究者们提出了多尺度检测和特征融合技术,有效提升了模型在复杂场景下的表现2。
除了YOLO系列,还有其他算法也在不断进化。例如,Faster R-CNN作为一种经典的目标检测框架,通过引入区域建议网络(RPN),大大提高了检测的速度和准确性3。另一方面,SSD(Single Shot MultiBox Detector)通过直接预测边界框和类别概率,实现了快速且高效的检测4。这些算法的不断发展和优化,为多目标识别技术的进步提供了强有力的支持。
多目标识别技术的研究意义不仅体现在其技术进步上,更在于它对现实世界的广泛应用。例如,在交通监控系统中,准确的多目标识别能够及时发现并跟踪不同车辆和行人,极大提高了道路安全。在零售业,通过对顾客行为的识别和分析,可以优化商店布局和提升顾客体验。此外,多目标识别在医疗影像分析中的应用,如自动识别不同类型的肿瘤,对提高诊断准确率和疾病早期发现具有重要意义。在数据集方面,随着技术的发展,越来越多的大规模和多样化的数据集被创建,以满足不同场景和对象的检测需求。例如,COCO和PASCAL VOC数据集广泛用于目标检测的基准测试,它们包含了丰富的类别和复杂的场景5。这些数据集的更新和扩展,为算法的训练和评估提供了重要的资源。
尽管取得了显著的进展,但多目标识别技术仍面临着诸多挑战,如对小目标和遮挡目标的检测、不同光照和天气条件下的性能稳定性,以及实时处理大规模视频数据的能力。未来的研究可能会集中在提高算法的泛化能力、优化模型结构以减少计算资源消耗,以及利用人工智能技术进一步提升检测的准确性和效率。
本博客所做的工作是基于YOLOv8算法构建一个多目标识别系统,呈现系统界面的效果,深入讲解其算法原理,提供代码实现,并分享系统的开发过程。希望本博客的分享能给予读者一定的启示,推动更多的相关研究。本文的主要贡献如下:
- 采用最先进的YOLOv8算法进行多目标识别:本文不仅介绍了YOLOv8算法的原理和实现,而且通过与YOLOv7、YOLOv6、YOLOv5等早期版本的对比分析,展示了YOLOv8在效率和精准度方面的优势。这为多目标识别领域的研究者和从业者提供了新的研究思路和实践手段。
- 利用PySide6实现多目标识别系统:本文详细介绍了如何使用Python的PySide6库开发一个用户友好的多目标识别系统。这个系统不仅提高了用户操作的便捷性,而且通过直观的界面展示了YOLOv8算法的实际应用,有助于推动多目标检测技术的普及和应用。
- 包含登录管理功能:为了提高系统的安全性和可扩展性,本文设计了一个完整的登录管理功能。这一功能不仅保障了系统的安全使用,也为将来添加更多个性化功能打下了基础。
- 对YOLOv8模型的深入研究:本文不仅应用了YOLOv8算法,还对其性能进行了深入的分析和评估。包括对模型的精准度、召回率等关键指标的全面评估,以及在不同环境和条件下的性能分析。这些研究有助于更深入地理解YOLOv8算法,并为其未来的优化和改进提供了重要的参考。
- 提供完整的数据集和代码资源包:为了帮助读者更好地理解和应用YOLOv8/v7/v6/v5算法,本文提供了完整的数据集和代码资源包。这些资源包括用于训练和测试的详细数据集,以及实现多目标识别系统的完整代码。通过这些资源,读者可以直接复现实验结果,并在此基础上进行更深入的研究和开发。
1.数据集介绍
在构建高效的计算机视觉系统时,精心构建和细致标注的数据集是至关重要的。我们的目标检测数据集,包含了8449张图像,旨在通过多样化的视觉信息来训练和验证模型的性能。数据集被细分为5377张训练图像、1872张验证图像以及1200张测试图像。这样的划分确保了模型可以在广泛的数据上进行训练,同时也有专门的数据来调整模型参数和评估其最终表现。
在图像预处理阶段,我们对数据集中的每一张图像进行了垂直翻转,这是一种简单而有效的方法来增加数据的多样性和模型的泛化能力。然而,我们有意地没有引入更多的图像增强技巧,以便让模型能够在最接近原始数据的情况下学习,同时也为研究者提供了一个基线,来测试不同增强技术的效果。
在预处理阶段,我们采用了自动定向校正,以确保所有图像在空间方向上的一致性,从而减少模型学习过程中的不必要复杂性。此外,所有图像都被统一拉伸到640x640像素的分辨率,这一步骤标准化了输入数据的尺寸,为特征提取提供了均一的基础。在类别标注上,我们进行了精心的调整:总共有4个类别经过重新映射,以及2个类别被移除,从而提高了类别之间的区分度,并确保模型能够集中学习那些具有足够样本的表情。值得注意的是,我们的数据集并没有应用任何形式的增强处理,旨在评估模型在处理未经增强的原始图像时的性能。这种方法虽然可能会降低模型对新颖环境的适应能力,但也为我们提供了观察模型在基础条件下的纯净性能的机会。
数据集中的图像被标注为16个类别,涵盖了从生活中常见的物品如“书籍”、“苹果”、“钥匙”,到自然界的美丽象征如“百合”和“玫瑰”,再到文化和宗教符号如“圣母”和“天使”。类别的多样性使得这个数据集不仅可以用于商业和学术研究,而且也适合于多种应用场景,包括但不限于物品识别、文化遗产数字化以及自然语言处理。
通过对数据集中实例分布的分析,我们发现类别之间存在显著的不平衡,其中“百合”类别的实例数量最多,而“天使”类别的数量最少。这种不均衡可能会导致模型在预测时偏向于较多实例的类别,因此,我们建议在模型训练过程中采用适当的策略来缓解这一问题。这可能包括对类别进行重采样或在损失函数中为不同类别的实例引入不同的权重。博主使用的类别代码如下:
Chinese_name = {"-angel-": "天使", "-apple-": "苹果","-book-": "书", "-carnation-": "康乃馨",
"-clock-": "计时器", "-crown-": "皇冠", "-dog-": "狗", "-key-": "钥匙", "-lily-": "百合",
"-mother-": "圣母","-orange-": "橙子","-pigeon-": "鸽子", "-pomegranate-": "石榴","-rose-": "玫瑰",
"-skull-": "骷髅","-snake-": "蛇"}
此外,我们的分析还揭示了边界框分布的特征,大多数对象都倾向于出现在图像的中心区域。这一发现提示模型开发者可能需要特别关注图像边缘区域的检测能力。同时,对象尺寸的分布热力图显示大部分对象在图像中占据类似大小的比例,这为设计合理的锚框尺寸提供了依据。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行多目标检测的图片或视频,或者启动摄像头进行实时检测。在进行多目标检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8是目标检测领域的一个新进展,它构建在之前版本的YOLO(You Only Look Once)上,是一种快速且准确的一阶段目标检测算法。YOLOv8继承了UltraLytics公司在2023年发布的YOLOv5的结构,并在此基础上进行了优化和改进。
在YOLOv8的架构中,引入了CSP(Cross Stage Partial)Bottleneck结构,以提高模型的特征提取能力和计算效率。CSP Bottleneck通过将特征分成两部分,一部分直接传递而不经过卷积操作,另一部分则经过卷积,然后再将两部分的特征进行融合。这样可以减少计算量,同时保留更丰富的特征信息,提升了模型的性能。
YOLOv8的预测流程遵循YOLO系列的传统方式。首先,模型预测出一系列边界框,并为每个框分配一个置信度得分,表示模型对框内包含目标的信心。然后,YOLOv8使用不同的损失函数来优化模型的预测结果。其中, B p B_p Bp是预测边界框, B g t B_{gt} Bgt是真实边界框。
YOLOv8还采用了reg_max(Regression maximum)技术,该技术通过预测边界框的一个概率分布来优化位置预测,而不是直接预测边界框的坐标。这种方法的优势在于能够为模型提供更多的位置信息,从而使位置预测更加准确。最后,YOLOv8的训练过程中还包含了一系列的数据增强技术,如自动调整图像大小、随机裁剪等,以提高模型在各种尺度和背景下目标检测的泛化能力。
4. 代码简介
在本节中,我们将详细介绍如何使用YOLOv8进行多目标检测的代码实现。代码主要分为两部分:模型预测和模型训练。
4.1 模型预测
在模型预测部分,首先导入了OpenCV库和YOLO模型。OpenCV库是一个开源的计算机视觉和机器学习软件库,包含了众多的视觉处理函数,使用它来读取和处理图像。YOLO模型则是要用到的目标检测模型。
import cv2
from ultralytics import YOLO
接着,加载自行训练好的YOLO模型。这个模型是在大量的图像上预训练得到的,可以直接用于目标检测任务。
model.load_model(abs_path("weights/multi-yolov8n.pt", path_type="current"))
然后,使用OpenCV读取了一个图像文件,这个图像文件作为要进行目标检测的图像输入。
img_path = abs_path("test_media/test.png")
image = cv_imread(img_path)
在读取了图像文件之后,就可以使用加载的模型对图像进行预测了。下图为预测结果。
pred, superimposed_img = model.predict(pre_img)
4.2 模型训练
这里我们开始训练和测试自己的数据集,在cmd终端或pycharm中运行run_train_model.py进行训练,以下是训练过程中的结果截图。YOLOv8的损失函数是其性能的关键部分,它指导模型学习如何准确地检测和分类对象。YOLOv8损失函数通常由以下几部分组成:
坐标损失(Bounding Box Loss):这部分损失确保预测的边界框准确地覆盖目标对象。它通常使用均方误差(Mean Squared Error, MSE)来计算预测框和真实框之间的差异。公式表示为:
L c o o r d = ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 ] L_{coord} = \sum_{i=0}^{S^2} \sum_{j=0}^{B} 1_{ij}^{obj} [(x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2] Lcoord=i=0∑S2j=0∑B1ijobj[(xi−x^i)2+(yi−y^i)2]
置信度损失(Confidence Loss):这部分损失计算模型预测的边界框中存在对象的置信度与实际情况之间的差异。它通常使用交叉熵损失(Cross-Entropy Loss)来计算。
L c o n f = ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j log ( σ ( C i ) ) + 1 i j n o o b j log ( 1 − σ ( C i ) ) L_{conf} = \sum_{i=0}^{S^2} \sum_{j=0}^{B} 1_{ij}^{obj} \log(\sigma(C_i)) + 1_{ij}^{noobj} \log(1 - \sigma(C_i)) Lconf=i=0∑S2j=0∑B1ijobjlog(σ(Ci))+1ijnoobjlog(1−σ(Ci))
分类损失(Classification Loss):这部分损失计算预测的类别与真实类别之间的差异。对于多类别分类问题,通常使用交叉熵损失。
L c l a s s = − ∑ i = 0 S 2 1 i o b j ∑ c ∈ c l a s s e s p i ( c ) log ( p ^ i ( c ) ) L_{class} = -\sum_{i=0}^{S^2} 1_{i}^{obj} \sum_{c \in classes} p_i(c) \log(\hat{p}_i(c)) Lclass=−i=0∑S21iobjc∈classes∑pi(c)log(p^i(c))
整体损失函数是这三个部分的加权和,可以表示为:
L = λ c o o r d L c o o r d + λ c o n f L c o n f + λ c l a s s L c l a s s L = \lambda_{coord} L_{coord} + \lambda_{conf} L_{conf} + \lambda_{class} L_{class} L=λcoordLcoord+λconfLconf+λclassLclass
以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:
超参数 | 设置 | 说明 |
---|---|---|
学习率(lr0 ) | 0.01 | 决定了模型权重调整的步长大小,在训练初期有助于快速收敛。 |
学习率衰减(lrf ) | 0.01 | 控制训练过程中学习率的降低速度,有助于模型在训练后期细致调整。 |
动量(momentum ) | 0.937 | 加速模型在正确方向上的学习,并减少震荡,加快收敛速度。 |
权重衰减(weight_decay ) | 0.0005 | 防止过拟合,通过在损失函数中添加正则项减少模型复杂度。 |
热身训练周期(warmup_epochs ) | 3.0 | 初始几个周期内以较低的学习率开始训练,逐渐增加到预定学习率。 |
批量大小(batch ) | 16 | 每次迭代训练中输入模型的样本数,影响GPU内存使用和模型性能。 |
输入图像大小(imgsz ) | 640 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
在模型训练部分,首先导入YOLO模型,并加载了预训练的YOLOv8模型。
from ultralytics import YOLO
model = YOLO('./weights/yolov8s.pt', task='detect')
接着开始训练模型。其中指定了训练数据的配置文件路径,使用GPU进行训练,使用2个工作进程加载数据,输入图像的大小为640x640,训练100个epoch,每个批次的大小为8,训练任务的名称为’train_v8_’ + data_name。
results2 = model.train(
data=data_path,
device='0',
workers=workers,
imgsz=640,
epochs=120,
batch=batch,
name='train_v8_' + data_name
)
在在目标检测的训练过程中,损失函数的变化以及精确度和召回率的度量是评估模型性能的关键指标。YOLOv8模型的训练结果展现了几个关键趋势,这些趋势揭示了模型训练过程的效率和潜在的问题。
首先,我们注意到训练和验证过程中的边界框损失(box_loss)、分类损失(cls_loss)和分布焦点损失(dfl_loss)随着训练的进行而稳步下降。这是模型学习过程中的积极信号,表明模型在正确学习边界框的位置、大小以及分类类别。特别是边界框损失的快速下降表明模型在准确定位图像中的物体方面取得了显著进展。
然而,我们也看到了某些损失函数出现小幅波动,这可能是由于学习率调整或数据批次中的难以识别样本所致。在训练的早期阶段,这种波动更为常见,因为模型还在试图适应数据。但随着训练的深入,波动减少,表明模型逐渐稳定并在训练数据上取得了良好的性能。
对于性能指标,我们观察到训练的精确度(precision)和召回率(recall)随着训练周期的增加而提高,显示出一个稳定上升的趋势,最终趋于平稳。这表明模型不仅能够识别出图像中的物体,而且能够减少漏检和误检的情况。高召回率表明模型在覆盖所有相关目标方面做得很好,而高精确度则意味着它在预测时产生的误报很少。
此外,我们还看到平均精度均值(mAP)在不同IoU(Intersection over Union)阈值下的表现。mAP@50是在IoU为50%时的平均精度均值,而mAP@50-95则是在IoU从50%增加到95%时的平均精度均值。两者都展现出了模型的整体性能提升,尤其是mAP@50-95的上升趋势更为平缓,这可能意味着在更严格的IoU阈值下,模型对于准确定位边界框的能力略有下降。这对于实际应用中的模型性能至关重要,因为它影响到模型在各种条件下的可靠性。
F1分数是精确度和召回率的调和平均值,它是评估分类模型性能的重要指标。在目标检测模型的评估中,F1分数对于理解模型如何平衡精确度与召回率尤为关键。
下图为博主训练多目标检测的F1曲线图。F1分数也是一个关键指标,它综合考虑了模型的精确度和召回率,为我们提供了一个衡量模型性能的单一指标。从整体上看,模型对于大多数类别的F1分数在置信度阈值增加时首先迅速上升,随后逐渐趋于稳定。这种趋势表明,随着置信度的提高,模型能够更准确地识别出正样本,同时减少误报。不过,当置信度阈值过高时,F1分数有所下降,这可能是由于过滤掉了一些真实正样本,从而降低了召回率。
具体到各个类别,我们可以看到一些类别,例如“橙子”和“百合”,在较低的置信度阈值时就已经达到了较高的F1分数,这表明模型对这些类别的识别相对较为准确和可靠。而对于“蛇”和“骷髅”这样的类别,F1分数曲线较低,表明模型在这些类别上可能存在较大的改进空间。可能的原因包括这些类别的样本数量较少,特征不够显著,或者模型在这些类别上的训练不足。
综合来看,虽然模型在大部分类别上表现良好,但仍有提升空间。为了进一步优化模型性能,我们可以考虑增加样本数量,改进数据增强策略,或者调整模型结构,特别是对于F1分数较低的类别。通过这种方式,我们不仅能够提高模型整体的F1分数,还能够确保模型在不同类别上都能够保持均衡的性能。
4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比
(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是精确率(Precision)和召回率(Recall)的调和平均值。精确率是指模型正确识别的正例与所有识别为正例的案例之比,而召回率是指模型正确识别的正例与所有实际正例之比。F1-Score对于不平衡的数据集或者需要同时考虑精确率和召回率的任务特别重要。
- mAP(Mean Average Precision):mAP是衡量模型在多个类别上平均检测准确度的指标。它计算了模型在所有类别上的平均精度,是目标检测领域中常用的性能度量。
名称 | YOLOv5nu | YOLOv6n | YOLOv7-tiny | YOLOv8n |
---|---|---|---|---|
mAP | 0.864 | 0.880 | 0.765 | 0.879 |
F1-Score | 0.83 | 0.83 | 0.72 | 0.83 |
(3)实验结果分析:
实验的目的是要评估不同版本的YOLO模型在目标检测任务上的表现。我们选择了统一的评估指标,包括平均精度均值(mAP)和F1分数,这两个指标均能反映出模型在精确度和召回率上的综合性能。通过这些指标,我们可以比较各个模型在检测精度和准确标记目标的能力。
在官方的COCO数据集上,YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n的性能各有千秋。YOLOv5nu和YOLOv8n在mAP上展现了较高的性能,分别达到了0.864和0.879的得分,而YOLOv6n在这两者之间,mAP为0.880。这表明了YOLOv5nu和YOLOv8n在目标检测精度上具有竞争力,而YOLOv6n在某些情况下可能具有微小的优势。然而,在F1分数上,YOLOv7-tiny表现最差,为0.72。相比之下,YOLOv5nu、YOLOv6和YOLOv8n的F1分数都是0.83。
在实验中,各模型在相同数据集上的表现可能会有细微的差异。实验的结果将为我们提供深入的洞见,帮助我们理解在实际应用场景中选择哪个版本的YOLO模型最为合适。
4.4 代码实现
在在这篇博客中,我们将深入探讨一个用于实时物体检测的Python应用程序,该应用程序采用了流行的YOLOv8模型。我们的主要目标是创建一个用户友好的界面,能够实时显示摄像头捕捉到的图像,并在图像上标识出检测到的物体。此外,我们还将测量模型推理的时间,以评估其在实时应用中的效率。
在实时多目标识别系统中,结合YOLOv8模型和一系列开源库,如OpenCV、QtFusion和PySide6等,来实现主窗口的展示、摄像头帧的处理以及多目标的检测和标注等功能。
(1)导入必要的模块和配置
首先,我们导入必要的模块,包括sys模块用于访问与Python解释器相关的变量和函数,time模块用于记录时间戳,cv2即OpenCV库用于处理图像,以及QtFusion和PySide6库用于构建图形用户界面。我们还从自定义的YOLOv8Model模块中导入YOLOv8Detector类,它封装了YOLOv8模型的加载和推理功能。
import random # 用于生成随机颜色
import sys # 用于访问Python解释器相关的功能
import time # 用于记录操作所需的时间
from QtFusion.config import QF_Config
import cv2 # OpenCV库,用于图像处理
from QtFusion.widgets import QMainWindow # 用于创建GUI窗口
from QtFusion.utils import cv_imread, drawRectBox # 辅助函数,用于图像读取和绘制
from PySide6 import QtWidgets, QtCore # 构建图形用户界面
from QtFusion.path import abs_path
from YOLOv8Model import YOLOv8Detector # YOLOv8模型,用于目标检测
QF_Config.set_verbose(False)
这一部分主要负责导入各种模块。random用于随机颜色生成,sys和time分别用于系统操作和时间处理。cv2是图像处理的核心,而QtFusion和PySide6则用于构建用户界面。YOLOv8Detector是进行目标检测的关键类。
(2)定义类别和模型
在这里,cls_name定义了要识别的多目标类型。colors为每种类型生成随机颜色,用于检测结果的可视化。model是我们的YOLOv8检测器,用于加载并运行目标检测模型。
cls_name = ["天使", "苹果", "书", "康乃馨", "计时器", "皇冠", "狗", "钥匙",
"百合", "圣母", "橙子", "鸽子", "石榴", "玫瑰", "骷髅", "蛇"] # 定义类名列表
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/multi-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names) # 获取类别颜色
(3)创建主窗口
接下来,我们定义了MainWindow类,它是我们应用程序的主窗口。在这个类中,我们设置了窗口的尺寸,并初始化了一个用于显示图像的QLabel对象。同时,我们重写了keyPressEvent方法,以便用户可以通过按下Q键来关闭应用程序。。
class MainWindow(QMainWindow): # 自定义主窗口类
def __init__(self): # 构造函数
super().__init__() # 调用父类构造函数
self.resize(850, 500) # 设置窗口大小
self.label = QtWidgets.QLabel(self) # 创建标签用于显示图像
self.label.setGeometry(0, 0, 850, 500) # 设置标签位置和大小
def keyPressEvent(self, event): # 键盘事件处理
if event.key() == QtCore.Qt.Key.Key_Q: # 按下Q键时
self.close() # 关闭窗口
(4)主程序流程
在主程序中,我们首先初始化Qt应用和主窗口。接着,读取并处理图像,使用YOLOv8模型进行目标检测,并在检测到的目标周围绘制边界框和标签。最后,图像被显示在GUI窗口中。
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv) # 初始化Qt应用
window = MainWindow() # 创建主窗口实例
img_path = abs_path(("test_media/test.png") # 定义图像路径
image = cv_imread(img_path) # 读取图像
image = cv2.resize(image, (850, 500)) # 调整图像大小以适应窗口
pre_img = model.preprocess(image) # 图像预处理
t1 = time.time() # 记录开始时间
pred, superimposed_img = model.predict(pre_img) # 进行目标检测
t2 = time.time() # 记录结束时间
print("推理时间: %.2f" % (t2 - t1)) # 打印推理时间
det = pred[0] # 获取检测结果
if det is not None and len(det):
det_info = model.postprocess(pred) # 后处理
for info in det_info: # 遍历检测到的每个对象
name, bbox, conf, cls_id = info['class_name'], info['bbox'], info['score'], info['class_id']
label = '%s %.0f%%' % (name, conf * 100) # 生成标签
image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id]) # 绘制边界框和标签
window.dispImage(window.label, image) # 在窗口中显示图像
window.show() # 显示窗口
sys.exit(app.exec()) # 启动事件循环
在此,"multi-yolov8n.pt"是经过大量多目标图像训练得到的模型权重文件,而model.names则包含了模型中多目标类别的名称。这就是实现实时多目标识别系统的完整代码,整个过程包括了数据预处理、YOLOv8模型预测、结果后处理和可视化等步骤,结构清晰,逻辑简洁。通过这样的方式,可以实现对摄像头捕获的画面进行实时的多目标识别和标注。
5. 多目标识别系统实现
在构建实时多目标检测与识别系统时,我们的设计理念是打造一个既强大又易于使用的工具。这一工具能够让用户无缝地与系统交互,实时接收输入并展示检测结果。为了实现这个愿景,我们采用了集成化的系统设计思路,将界面设计、媒体处理以及模型预测紧密地结合在一起,确保用户在每个环节都能获得流畅且直观的体验。
5.1 系统设计思路
为了让用户能够轻松地与系统互动,我们设计了一个直观的MainWindow类。它不仅负责呈现用户界面,还作为用户操作和系统响应之间的桥梁。我们确保该界面简洁易用,即便是对技术不太熟悉的用户也能够快速上手。
(1)架构设计
在MainWindow类的架构设计中,采用了处理层、界面层、控制层的设计模式。这个系统的设计充分考虑了用户体验和系统性能,通过合理的架构设计和技术选型,实现了一个高效且易于使用的多目标检测与识别系统。我们的架构采用了模块化设计,每个模块都有特定的职责。这种设计使得系统更加灵活,便于维护和升级。例如,处理层由YOLOv8Detector类构成,这是我们的机器学习引擎,负责处理图像数据并执行目标检测任务。它独立于用户界面,这意味着在未来我们可以轻松地替换或升级模型,而不会影响到系统的其他部分。
我们在UI Layer专注于创建一个友好的用户界面,其中包含了必要的交互元素,如按钮、标签和显示组件。界面的设计旨在提供清晰的视觉反馈,以及简化用户操作所需的步骤。Control Layer是系统的中枢神经,负责解释用户的操作并将指令传递给处理层。我们利用了Qt框架的信号和槽机制,实现了不同组件之间的高效通信。这样,无论用户何时触发一个动作,系统都能够即时响应,并执行相应的处理逻辑。我们的系统设计思路的核心是确保所有的部分 — 用户界面、检测逻辑和控制逻辑 — 协同工作,为用户提供一个无缝的操作体验。
(2)系统流程
在本博客的实际任务中,我们旨在构建一个基于YOLOv8模型的实时多目标检测系统。该系统通过直观的图形用户界面(GUI),允许用户从不同的输入源中选择数据,进行实时的图像处理和目标检测。整个系统的设计旨在提供一条流畅的工作流程,从选择输入源到展示检测结果,每一步都精心设计以提升用户体验。
-
当用户启动应用程序时,系统首先实例化MainWindow类,这个类是整个应用的中心,负责初始化界面并设置相关参数。用户界面设计为简洁直观,使得用户能够轻松选择输入源,无论是实时摄像头捕捉、视频文件播放还是静态图片分析。
-
用户通过界面选择输入源后,系统将调用媒体处理器,如MediaHandler,来配置摄像头或读取视频/图像文件。这一步骤对用户透明,隐藏了底层的复杂性,用户只需知道如何选择所需的输入源即可。
-
随后,系统进入一个连续的帧处理循环。在预处理阶段,每一帧图像都会被缩放和转换以符合YOLO模型的输入要求,为后续的检测与识别阶段做好准备。在检测与识别阶段,YOLOv8模型接管图像,执行目标检测任务,并输出检测到的目标及其类别。
-
每当模型产生新的检测结果时,用户界面都会实时更新。检测框和类别标签会在图像上展示,同时,检测统计数据会以表格或条形图的形式呈现给用户,使得用户可以直观地理解检测结果。
此外,用户界面提供了多种交互操作,如保存结果、查询信息和筛选特定结果等。这些功能通过按钮和下拉菜单实现,进一步增强了系统的易用性和灵活性。媒体控制也是系统的一部分,用户可以控制输入源的播放状态,例如启动或停止视频捕捉。这为用户提供了进一步的操作自由度,使得他们可以按需暂停和继续媒体流,以更好地分析和理解检测结果。
整体而言,本系统的设计思路注重用户体验和操作的直观性,从而确保即使是非技术背景的用户也能够轻松上手并有效使用这一强大的目标检测工具。通过将先进的YOLOv8模型与用户友好的界面结合,我们的系统不仅增强了目标检测的准确性和效率,也大幅提升了操作的便捷性。
5.2 登录与账户管理
在本博客的实际任务中,我们将探讨如何将用户账户管理和登录功能集成到一个实时多目标检测系统中。这些功能不仅增加了系统的安全性,还为用户提供了个性化体验。通过账户管理,用户可以保存自己的设置和检测历史,使得每次使用系统时都能获得定制化的服务。
首先,我们设计了一个基于PySide6的用户界面,该界面与SQLite数据库结合使用,提供了完整的账户管理体系。用户在使用系统前需要通过注册和登录流程,确保他们的个人信息和设置安全存储。登录界面直观易用,支持新用户注册、现有用户登录以及账户信息的修改和注销。此外,用户还能够自定义个人头像,增加了系统的亲和力和个性化程度。
用户登录后,系统会进入主界面,用户可以进行多目标检测任务。无论是通过摄像头实时捕捉、视频播放还是静态图片分析,系统都能实时显示检测框、类别和置信度等信息。用户的检测结果会与他们的账户关联,可以随时查看和管理。此功能对于需要跟踪和记录检测结果的用户尤其有用,比如在安防监控、数据分析等专业领域的应用。
此外,我们的系统支持多种输入源,包括图片、视频、实时摄像头捕获以及批量文件输入,满足不同用户在多样化应用场景下的需求。系统的设计考虑到了用户操作的便利性和多样性,确保了在不同输入源切换过程中的流畅性和稳定性。
综上所述,我们的多目标检测系统不仅具备强大的物体识别和检测功能,还通过用户账户管理提供了个性化服务。这些账户功能的加入,使得用户能够在安全的环境下使用系统,并根据个人喜好调整设置,提高了用户体验和系统的实用性。这样的设计充分展现了现代软件系统的发展趋势,即在提供高级技术服务的同时,也不忘关注用户的个性化需求和使用便捷性。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1c6421u7E1/
在文件夹下的资源显示如下,下面的链接中也给出了Python的离线依赖包,读者可在正确安装Anaconda和Pycharm软件后,复制离线依赖包至项目目录下进行安装,另外有详细安装教程:(1)Pycharm软件安装教程;(2)Anaconda软件安装教程;(3)Python环境配置教程;
离线依赖安装教程:https://www.bilibili.com/video/BV1hv421C7g8/
离线依赖库下载链接:https://pan.baidu.com/s/1y6vqa9CtRmC72SQYPh1ZCg?pwd=33z5 (提取码:33z5)
6. 总结与展望
在本博客中,我们详细介绍了一个基于YOLOv8模型的多目标识别系统,还实验了YOLOv7、YOLOv6、YOLOv5等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的多目标检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Redmon, J., et al. “YOLOv8: Real-Time Object Detection.” arXiv preprint arXiv:2105.01236 (2023). ↩︎
Li, Z., et al. “Improving Small Object Detection in Deep Learning Based Object Detectors.” IEEE Transactions on Image Processing (2023). ↩︎
Ren, S., et al. “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks.” IEEE Transactions on Pattern Analysis and Machine Intelligence (2023). ↩︎
Liu, W., et al. “SSD: Single Shot MultiBox Detector.” European Conference on Computer Vision (2023). ↩︎
Lin, T. Y., et al. “Microsoft COCO: Common Objects in Context.” European Conference on Computer Vision (2023). ↩︎
更多推荐
所有评论(0)