基基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的水果识别系统(Python+PySide6界面+训练代码)
摘要:本篇博客详尽介绍了一套基于深度学习的水果识别系统及其实现代码。系统采用了尖端的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等前代算法进行了详细的性能对比分析,提供在识别图像、视频、实时视频流和批量文件中水果方面的高效准确性。文章不仅详细阐述了YOLOv8算法背后的原理,还提供了完整的Python实现代码、必要的训练数据集,以及一个基于PySide6的交互式用户界面(UI)。此系统包含了完善的用户管理系统、模型快捷切换和UI自定义功能。本文意在为水果识别和相关领域的研究者,以及对深度学习有兴趣的初学者提供一个宝贵的学习资源。完整的代码和数据集已在博客末尾提供链接下载。本文结构如下:
演示与介绍视频:https://www.bilibili.com/video/BV16H4y1L7ag/
YOLOv8/v7/v6/v5项目合集:[https://mbd.pub/o/bread/mbd-ZZuZmZtv](https://mbd.pub/o/bread/mbd-ZZuZmZtv)
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuZk51y
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuZmZtp
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuZmZpv
前言
水果识别系统的研究背景不仅仅局限于提升农业生产的自动化水平,还包括了改善零售管理的效率和顾客的购物体验。在全球化的今天,水果的种类和来源地日趋多样化,如何快速准确地识别和分类成为了一个重要的问题。此外,随着消费者对食品安全和质量的要求越来越高,如何有效地追踪和管理水果的质量也成为了行业面临的重要挑战。
基于YOLO的水果识别系统能够帮助农业生产者和零售商通过自动化的方式,提高工作效率,降低人力成本,并且通过精确识别,减少浪费,提高整体供应链的管理效率。此外,这项技术的发展还可以促进智能农业的进步,为实现精准农业、智能化管理提供技术支持。
在近年来,基于深度学习的图像识别技术,尤其是目标检测算法在水果识别领域取得了显著进展。YOLO[1]系列算法因其高效的检测速度和良好的识别准确度,在实时水果识别系统中被广泛应用。自YOLOv5[2]以来,每个版本的迭代都在性能、准确度和速度上带来了显著改进,而最新的YOLOv8[3]版本更是在网络结构、训练机制和优化算法上做出了重大创新,以适应更复杂的识别场景和提升系统的泛化能力。
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240226194512222-1636293124.jpg)
除了YOLO系列,其他如Mask R-CNN、SSD和EfficientDet等算法也在水果识别领域有所应用。这些算法通过引入不同的网络架构和训练策略,进一步提高了识别的准确性和速度。例如,Mask R-CNN通过引入区域建议网络(RPN)和全卷积网络(FCN),能够实现对水果的精确分割和识别。EfficientDet则通过优化模型的尺度不变性和网络深度,实现了在保持高精度的同时降低计算复杂度。
近期的研究还展示了深度学习模型结合新型数据增强技术和迁移学习策略在提升水果识别性能方面的潜力。数据增强技术,如随机裁剪、旋转和色彩调整,可以显著扩充训练数据集,增强模型的泛化能力。迁移学习则通过利用预训练模型在大规模数据集上学习到的特征,加速了模型在特定水果识别任务上的训练过程,并提高了识别准确率。
ViT(Vision Transformer)和注意力机制的引入,为处理图像识别任务提供了新的视角。不同于传统的卷积神经网络(CNN),ViT通过将图像分割成序列化的块并利用自注意力机制来捕捉块间的关系,展示了在图像分类和目标检测任务上的卓越性能。在水果识别系统中,注意力机制的应用使得模型能够更加聚焦于图像中的关键特征,如颜色、形状和纹理,从而提高识别的准确性。
值得注意的是,尽管当前的水果识别技术已经取得了显著进步,但仍面临一些挑战,如在复杂背景下的识别准确性、多种水果同时识别的能力,以及对新品种水果的快速适应等。未来的研究可能会聚焦于通过算法优化、深度学习模型的结构创新以及更高效的数据处理方法来解决这些问题。
本博客通过详细介绍一个基于YOLOv8算法的水果识别系统的开发和实现,旨在为深度学习和目标检测领域的研究者和从业者提供一个全面的研究和应用示例。本文的贡献可以概括如下:
- 采用最先进的YOLOv8算法进行水果识别:本文不仅引入了当前最先进的目标检测算法YOLOv8进行水果识别,而且还与YOLOv7[4]、YOLOv6[5]、YOLOv5等早期版本进行了详细的对比分析。这一部分工作不仅展示了YOLOv8在效率和准确度上的显著优势,也为水果识别领域的研究者和从业者提供了新的研究思路和实践手段。
- 利用PySide6实现用户友好的水果识别系统界面:通过使用Python的PySide6库,本文成功开发出了一个既美观又易于操作的水果识别系统界面。该界面的设计大大降低了用户操作的复杂度,使得非专业用户也能轻松进行水果识别,从而推动了YOLOv8算法在实际应用中的普及。
- 集成登录管理功能以提升系统安全性:系统中的登录管理功能增强了水果识别系统的安全性,确保了数据的安全和用户隐私的保护。此外,这一功能的设计为将来添加更多个性化服务和功能提供了扩展性和灵活性。
- 对YOLOv8模型进行深入研究与评估:本文不仅应用了YOLOv8算法进行水果识别,还对其性能进行了全面的评估,包括精确度、召回率等关键性能指标的详细分析。通过这些深入的研究,本文为YOLOv8算法在不同环境下的应用效果提供了有力的证据,并为未来的优化和改进奠定了基础。
- 提供完整的数据集和代码资源包:为了帮助读者更好地理解和掌握YOLOv8等算法在水果识别领域的应用,本文提供了一套完整的数据集和代码资源包。这些资源不仅包括了丰富的训练和测试数据集,还有实现水果识别系统的完整代码,使得读者能够直接复现实验结果,并在此基础上进行进一步的研究和开发。
1.数据集介绍
在本篇博客中,我们将深入介绍用于水果识别系统的数据集。这个数据集是系统性能和准确性的基石,它不仅支撑了模型的训练和验证,也确保了最终部署时的实用性和鲁棒性。在构建和准备数据集的过程中,我们采取了一系列精细的步骤,旨在使数据集能够充分代表现实世界中的多样性和复杂性。
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240226194520841-1468047260.jpg)
我们的数据集由3030张高质量的图像组成,这些图像涵盖了广泛的水果类别,并在各种背景、光照条件和角度下捕捉。为了优化模型的训练和评估,我们将数据集细分为2424张训练图像、303张验证图像和303张测试图像。这样的划分确保了模型在学习过程中不会过拟合,并能在未见过的数据上进行准确的预测。
数据集的预处理和增强处理步骤为模型的成功训练奠定了基础。所有的图像都经过自动方向调整,以消除由于设备拍摄方向不一致而引入的变异。图像尺寸被统一调整至640x640像素,虽然这一处理可能改变了原始图像的纵横比,但实验表明,这对模型的性能影响不大。此外,通过自适应均衡化增强了图像的对比度,使得模型能够更清晰地辨识在不同光照条件下的水果细节。
分析数据集的类别分布,我们发现苹果、香蕉和火龙果的样本数量较多,而糖苹果等其他类别的样本较少。这种不均衡的现象可能会导致模型对常见类别过于敏感,而忽视那些较少见的类别。为了缓解这一问题,我们可能会在模型训练时采取重采样或加权损失函数等技术,以确保模型对所有类别都有良好的识别能力。
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240226194526742-1993367296.jpg)
通过目标的空间分布分析,我们注意到大部分水果目标的中心点集中在图像的中心区域。这种分布表明,在训练模型时,我们需要特别关注图像的中心区域,同时也要保证模型能够准确识别位于边缘的目标。边界框宽高比的分布进一步显示了数据集中水果的形状多样性。模型需要适应这些形状的多样性,以准确识别各种水果。
Chinese_name = {'apple': "苹果", 'banana': "香蕉", 'dragon fruit': "火龙果", 'guava': "番石榴", 'oren': "橙子", 'pear': "梨",
'pineapple': "菠萝", 'sugar apple': "释迦果"}
总结来说,我们的数据集通过其丰富的样本、精心的预处理步骤、以及对类别不平衡和目标分布的深入分析,为水果识别系统提供了坚实的基础。这些努力确保了模型不仅在理论上的高性能,而且在实际应用中的实用性和准确性。我们期待这个数据集不仅能够支持我们当前的研究,也能激发未来在水果识别技术领域的进一步探索和创新。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240226194623714-1253829309.gif)
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行水果识别的图片或视频,或者启动摄像头进行实时检测。在进行水果识别时,系统会实时显示检测结果,并将检测记录存储在数据库中。
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240226194629394-885206790.gif)
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240226194633835-951258161.gif)
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240226194647556-953338260.png)
3. YOLOv8算法原理
YOLOv8 是最新的最先进的 YOLO 模型,它在以前成功的 YOLO版本基础上,引入了新的功能和改进,进一步提升了其性能和灵活性,能够更好得适应各种目标检测任务。
首先,YOLOv8在输入处理上采用了Mosaic数据增强方法,该方法通过将四张训练图像拼接成一张大图像,并在这个大图像上执行随机裁剪,有效地增加了模型训练时的背景复杂性和目标尺度变化。这种数据增强技术不仅提高了模型对不同尺寸目标的识别能力,而且增强了模型对多样化背景的适应性。此外,与YOLOv4时代相比,现在的YOLOv8能够处理更大的图像输入,这意味着更多的细节可以被捕捉,从而提高了模型在复杂场景下的精确度。
YOLOv8的网络结构是它的核心创新之一。它构建在YOLOv7的基础上,继承并改进了ELAN(Enhanced Layer Aggregation Network)的设计理念,同时引入了新的特征聚合机制来增强特征的表达能力。YOLOv8的网络结构优化了特征传递路径,减少了信息损失,并增强了不同尺度特征的融合能力,这对于提升模型对小目标的检测性能尤为重要。
在主干网络设计方面,YOLOv8采用了CBS(Cross-Stage-Partial connections)技术,这是一种改进的特征传递方式,通过跨阶段连接提高信息流的效率。此外,YOLOv8的C2F(Coarse-to-Fine)结构进一步优化了细粒度特征的利用。与YOLOv5的C3模块相比,YOLOv8的C2F模块通过精细化的特征处理策略,能够更有效地捕捉到细小目标的特征,这对于识别水果这类小型或远距离目标尤为重要。SPPF(Spatial Pyramid Pooling-Fast)模块是对YOLOv5中的SPP模块的改进,它能够通过池化操作快速提取不同尺度的上下文信息,而BottleneckCSP则是一种高效的特征聚合模块,用于增强网络的学习能力和特征表达。
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240226194653268-511369547.jpg)
在Neck部分,YOLOv8延续并优化了YOLOv5采用的特征金字塔网络(Feature Pyramid Network, FPN)和路径聚合网络(Path Aggregation Network, PAN)的设计。FPN和PAN的结合增强了模型在不同尺度上的特征提取能力,使得网络不仅能够检测大尺寸目标,还能敏锐捕捉到小尺寸目标。FPN通过从低到高的层级结构融合不同分辨率的特征信息,增强了模型在多尺度检测能力,而PAN则反向进行特征聚合,确保了从高分辨率层传递的细节信息不会丢失。这种结构设计充分利用了YOLOv8在深层网络和浅层网络中学到的信息,使得模型在处理复杂背景和不同大小目标时更为精确。
Head部分是YOLOv8进行目标分类和定位的核心,这一部分对检测的准确性起着决定性作用。YOLOv8采用了解耦头部(Decoupled Head)的设计,这意味着分类和定位任务被分开处理,以提高网络在处理这两个不同任务时的专注度和效率。在实际应用中,这种设计允许模型更灵活地调整分类和定位的特征提取策略,提高了检测的准确度。YOLOv8也继续使用Anchor-Based的方法,即预定义的锚点框帮助模型预测物体的位置,但是在YOLOv8中,这一机制被进一步优化,以适应更多样化的目标形状和尺寸。
总的来说,YOLOv8算法的Neck和Head部分的设计体现了在现有算法基础上的深度优化和创新。这些优化不仅增强了模型的特征提取能力,也提升了模型在不同任务中的专注度和精确度,从而确保了在各种复杂环境下对目标进行有效检测的能力。这样的技术进步为我们在水果识别等具体应用中提供了强大的技术支持,使得YOLOv8能够在众多目标检测算法中脱颖而出。
4. 代码简介
在本节中,我们将详细介绍如何使用YOLOv8进行水果识别的代码实现。代码主要分为两部分:模型预测和模型训练。
4.1 模型预测
在模型预测部分,首先导入了OpenCV库和YOLO模型。OpenCV库是一个开源的计算机视觉和机器学习软件库,包含了众多的视觉处理函数,使用它来读取和处理图像。YOLO模型则是要用到的目标检测模型。
import cv2
from ultralytics import YOLO
接着,加载自行训练好的YOLO模型。这个模型是在大量的图像上预训练得到的,可以直接用于目标检测任务。
model.load_model(abs_path("weights/best-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)
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240226194704583-945618113.png)
4.2 模型训练
这里我们开始训练和测试自己的数据集,在cmd终端或pycharm中运行run_train_model.py进行训练,以下是训练过程中的结果截图。YOLOv8的损失函数是其性能的关键部分,它指导模型学习如何准确地检测和分类对象。
以下表格详细介绍了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。
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)和目标损失(obj_loss)随着训练次数的增加而稳定下降。这表明模型在识别目标的位置、预测正确的类别以及准确判断物体是否存在方面逐渐变得更加准确。边界框损失的快速下降表示模型很快学会了定位物体的边界框,而类别损失和目标损失的下降则表明模型在分类水果以及检测水果的存在上也在不断进步。验证集的损失趋势与训练集相似,这是一个积极的信号,表明模型没有过拟合,具有良好的泛化能力。
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240226194723683-728067405.png)
在我们的水果识别系统中,通过精密的模型评估,Precision-Recall (PR) 曲线为我们提供了模型性能的直观视图。PR曲线是衡量目标检测模型性能的关键工具,因为它揭示了模型识别正类别(水果)的准确性和完整性。在这张PR曲线图中,我们可以看到模型在各个水果类别上的表现,以及它们的平均准确度(mAP@0.5)。
首先,我们观察到所有水果类别的PR曲线都非常接近图表的右上角,这意味着高召回率和高精确度。在这种情况下,高精确度表明模型预测的正样本中有很高比例是真实正样本,而高召回率表明模型能够检测到大多数真实正样本。我们的模型在大部分水果类别上都实现了超过0.98的mAP@0.5,这展现了模型极佳的性能。特别是,sugar apple类别的识别准确度达到了0.995,这是一个异常高的分数,显示了模型在识别该类别上的卓越能力。
此外,整体上所有类别的mAP@0.5为0.989,这一值的高度说明了模型具备良好的泛化能力,在所有测试的水果类别上都能保持一致的高性能。这样的性能表明了我们的模型在处理不同水果的变化和特征上具有优秀的适应性和准确性。
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240226194728051-262060299.png)
总之,PR曲线和mAP数值为我们的水果识别系统提供了信心,它表明我们的系统能够在现实世界的应用中提供高准确度的识别结果。这样的评估结果对于在商业环境中部署此类系统至关重要,因为它们直接影响到用户体验和系统的可信度。高精确度和召回率的结合保证了我们的模型可以在各种条件下可靠地识别水果,这对于实现自动化水果分类和库存管理系统等应用场景具有重大意义。随着技术的不断进步,我们相信可以进一步提升这些指标,为用户提供更加无缝和精确的水果识别服务。
4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比
(1)实验设计:
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240226194739158-1207217556.png)
本实验旨在评估和比较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.989 | 0.988 | 0.987 | 0.989 |
F1-Score | 0.98 | 0.98 | 0.98 | 0.99 |
(3)实验结果分析:
在目标检测领域,YOLO(You Only Look Once)系列算法以其速度和准确性广受欢迎。我们进行了一项系统的比较研究,目的是在相同的水果识别数据集上,评估YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n这四种算法的性能。通过这些实验,我们旨在揭示各版本的YOLO算法在处理相似任务时的相对优势和局限性。
根据实验数据,我们可以看到在mAP值方面,四种算法都表现出了极高的性能,mAP值均在0.987以上,这表明每种算法都具有较高的平均准确度,能够在不同的物体尺寸和难度上保持良好的识别能力。YOLOv5nu和YOLOv8n在这一指标上有着略高的0.989的分数,而YOLOv6n和YOLOv7-tiny略低一些,分别是0.988和0.987。尽管差异不大,这还是指示了YOLOv5nu和YOLOv8n可能在处理我们数据集上的多样化水果图像时具有更好的泛化能力。
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240226201826318-1316816466.png)
在F1-Score这一指标上,所有模型的表现也都非常接近,均为0.98,除了YOLOv8n略为领先,达到了0.99。F1-Score是精确度和召回率的调和平均数,因此0.99的得分意味着YOLOv8n在维持高召回率的同时,也减少了假正样本的数量,即在识别为正样本的物体中,有更高的比例是正确的。
这些实验数据显示,尽管这四种算法的性能相差不大,但YOLOv8n在F1-Score上的细微优势表明它在精确度和召回率上达到了更好的平衡。这在实际应用中可能意味着YOLOv8n在减少误识别的同时,仍能保持高识别率,这对于需要高精度识别系统的场景尤为重要。
综合以上分析,我们可以得出结论,YOLOv8n在我们的水果识别任务中略微领先于其他版本的YOLO模型,特别是在F1-Score上的表现。这种细微的差别可能源自算法结构的微调和优化,也可能是由于YOLOv8n对于我们数据集特定特征的更好适应。然而,考虑到所有模型的性能都非常接近,选择哪一个算法可能还需要考虑其他因素,如实时性能、计算资源和使用场景的特定要求。在选择目标检测模型时,这些实验结果提供了宝贵的参考信息。
4.4 代码实现
在这篇博客中,我们探讨了使用Python语言和各种库创建一个基于YOLOv8算法的水果识别系统的过程。这段代码是我们项目的核心部分,它整合了图像处理、模型推理和用户界面(UI)管理,以提供一个实时的物体检测应用。
在实时水果识别系统中,需要结合YOLOv8模型和一系列开源库,如OpenCV、QtFusion和PySide6等,来实现主窗口的展示、摄像头帧的处理以及水果的检测和标注等功能。
(1)导入必要的模块和配置
我们的代码首先导入了必要的模块。sys模块允许我们与Python解释器交互,而time模块则用于记录预测所需的时间,这对于性能分析至关重要。图像处理是通过cv2模块,也就是OpenCV库来实现的。为了构建UI,我们使用了PySide6库和QtFusion库的组件。
import sys # 导入sys模块,用于访问与Python解释器相关的变量和函数
import time # 导入time模块,用于获取当前时间
import cv2 # 导入OpenCV库,用于图像处理
from QtFusion.widgets import QMainWindow # 从QtFusion库导入FBaseWindow类,用于创建主窗口
from QtFusion.handlers import MediaHandler # 从QtFusion库导入MediaHandler类,用于处理媒体流
from QtFusion.utils import drawRectBox, get_cls_color # 从QtFusion库导入drawRectBox函数,用于在图像上绘制矩形框
from PySide6 import QtWidgets, QtCore # 导入PySide6库的QtWidgets和QtCore模块,用于创建GUI
from QtFusion.path import abs_path
from QtFusion.config import QF_Config
from YOLOv8Model import YOLOv8Detector # 从YOLOv8Model模块导入YOLOv8Detector类,用于物体检测
from datasets.FruitData.label_name import Label_list
QF_Config.set_verbose(False)
这一部分主要负责导入各种模块。random用于随机颜色生成,sys和time分别用于系统操作和时间处理。cv2是图像处理的核心,而QtFusion和PySide6则用于构建用户界面。YOLOv8Detector是进行目标检测的关键类。
(2)定义类别和模型
在这里,cls_name定义了要识别的水果类型。colors为每种类型生成随机颜色,用于检测结果的可视化。model是我们的YOLOv8检测器,用于加载并运行目标检测模型。
cls_name = Label_list # 定义类名列表
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names) # 获取类别颜色
(3)创建主窗口
接下来,定义了一个MainWindow类,它是UI的主窗口。我们通过PySide6的QLabel构建了一个图像展示区域,并设置了合适的大小。这个主窗口也能够响应键盘事件,比如按下'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)主程序流程
在frame_process函数中,我们处理摄像头捕获的每一帧图像。图像首先被调整大小,然后送入YOLOv8模型进行预测。我们测量并打印了推理时间,并根据检测结果在图像上绘制了边界框和标签。
def frame_process(image): # 定义frame_process函数,用于处理每一帧图像
image = cv2.resize(image, (850, 500)) # 调整图像的大小
pre_img = model.preprocess(image) # 对图像进行预处理
t1 = time.time() # 获取当前时间
pred, superimposed_img = model.predict(pre_img) # 使用模型进行预测
t2 = time.time() # 获取当前时间
use_time = t2 - t1 # 计算预测所用的时间
print("推理时间: %.2f" % use_time) # 打印预测所用的时间
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'] # 获取类名、边界框、置信度和类别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) # 在窗口的label控件上显示图像
随后初始化了应用程序和主窗口,并设置了视频处理相关的参数。我们通过MediaHandler管理视频流,连接了新帧准备好时应调用的函数,并启动了媒体处理。
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
videoHandler = MediaHandler(fps=30) # 创建MediaHandler对象,设置帧率为30
videoHandler.frameReady.connect(frame_process) # 当有新的帧准备好时,调用frame_process函数
videoHandler.setDevice(device=0) # 设置设备为0,即默认的摄像头
videoHandler.startMedia() # 开始处理媒体流
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
整个代码是一个实时视频处理和物体检测应用的完整框架。它不仅展示了如何集成深度学习模型到一个实际的应用中,还演示了如何利用现代图像处理库和用户界面工具来创建直观的用户体验。
5. 水果识别系统实现
在实现一款实时水果识别与识别系统时,采用面向对象的设计思路,依赖Python语言和多种开源库如Pyside6、QtFusion、Pytorch等。其中,重要的MainWindow类是系统的主体,负责提供用户界面来控制输入源、进行水果识别与识别,并展示检测结果。以下将详细介绍其设计思路、架构设计以及整个流程。
5.1 系统设计思路
在我们的系统设计中,我们的主要目标是创建一个交互式的水果识别与识别系统,它不仅能够实时处理图像并进行目标检测,而且还能提供直观的用户交互界面。我们的系统是围绕MainWindow类构建的,它集成了用户界面、媒体处理和深度学习模型,使得用户可以轻松地加载图像、执行目标检测,并查看结果。
(1)架构设计
在架构设计方面,我们的系统采用了层次化的方法。为了实现这个目标,采取了将界面、媒体处理和模型集成在一起的设计思路。通过对象组合的方式,将不同的处理器和模型组织在一起,让每个功能模块都能独立进行,同时,还利用信号和槽机制来进行模块间的交互和数据传递。
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240226201841835-2042020359.png)
- 处理层(Processing Layer):这一层是系统的智能核心,包含我们精心训练的YOLOv8模型。YOLOv8Detector类不仅封装了模型的加载和执行,还处理了图像的预处理和后处理。它是我们水果识别能力的基石,通过它,系统能够识别不同的水果,并准确地给出检测结果。
- 界面层(UI Layer):为了让用户轻松地与系统交互,我们设计了一个清晰且功能丰富的UI。这个层次通过PySide6库中的控件来实现,包括显示检测结果的图像视图、状态指示器和操作按钮。这些元素不仅为用户提供了操作的手段,也实时展示了系统的输出结果,增强了用户的交互体验。
- 控制层(Control Layer):控制层是处理层和界面层之间的桥梁。MainWindow类中的方法和槽函数响应用户的输入,如键盘和鼠标事件,并控制模型和媒体处理器的行为。这样,用户的每个动作都能得到及时的反馈,无论是启动和停止识别过程,还是调整模型参数。
在这三个层次的协作下,我们的水果识别系统能够实现流畅的用户交互、高效的媒体处理和精确的水果识别。通过精心的设计和实现,每一层都在其职责范围内执行任务,而且通过信号和槽机制的高效通信,整个系统能够协同工作,以实现最终的目标——提供一个高效、准确且用户友好的水果识别系统。这种架构设计不仅使得系统易于维护和扩展,也为用户提供了稳定和可靠的使用体验。
(2)系统流程
在本博客的实际任务中,我们详细探讨了构建交互式水果识别系统的整个流程。此系统的基础是MainWindow类,它不仅初始化用户界面,而且集成了媒体处理和物体检测模型的各个组件,从而提供了一个综合的解决方案,用于实时识别摄像头捕捉的图像中的水果。
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240226201856203-1585018236.png)
-
当用户启动应用程序时,系统首先实例化MainWindow类。这个主窗口是用户与系统交互的核心,它初始化了界面布局、设置了必要的参数,并准备接受用户的输入。界面设计直观,易于操作,用户可以方便地选择输入源,无论是实时视频流、视频文件还是图像文件。
-
选一旦输入源被选定,系统便启动媒体处理器,开始对输入数据进行读取和配置。在此基础上,系统进入一个连续的处理循环,对每一帧图像进行如下步骤的处理:
- 预处理阶段:为了使图像满足YOLOv8模型的要求,系统对每帧图像进行一系列预处理操作。这些操作可能包括调整图像大小、变换色彩空间,以及对图像进行归一化处理。这一阶段是确保模型能够有效解读图像的关键。
- 检测与识别阶段:经过预处理的图像被输入到YOLOv8模型中。模型运用其深度学习算法,准确地在图像中定位水果,并识别出它们的类别。我们的模型特别优化用于检测不同种类、大小和成熟度的水果。
- 界面更新阶段:随着检测结果的出现,UI会实时反映输出。检测到的水果以边框标记在图像上,类别标签清晰显示。此外,界面上的图表和统计数据也会更新,以展示检测的详细信息和历史结果。
- 交互操作:用户可以通过界面的控制元素与系统互动。这包括保存检测结果的功能,查看关于页面,以及使用筛选器来分析特定的检测结果。
- 媒体控制:此外,用户还有能力控制媒体播放的状态。通过简单的按钮操作,用户可以开始或暂停视频捕捉,从而允许在需要时对场景进行详细的分析。
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240226201902189-436764475.png)
通过这种设计,我们的水果识别系统提供了一个完整的端到端解决方案,它将前沿的计算机视觉技术与用户友好的界面结合起来,既服务于技术人员进行深入分析,也满足非技术用户的日常需求。整个系统的设计体现了用户中心的理念,并以其高效的检测性能和优化的用户体验,展现了技术创新在实际应用中的价值。
5.2 登录与账户管理
在我们的水果识别系统中,对用户体验的细致打磨和对个性化功能的深入探索,使得系统不仅在技术层面上先进,也在用户交互方面显得十分友好和直观。整个系统的设计考虑到了用户管理的重要性,因此我们构建了一个完善的登录与账户管理系统。
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240226201911971-1350536821.png)
这个系统是基于强大的PySide6框架来构建的,结合了SQLite数据库,以确保用户信息的安全性和方便性。用户首次使用时,可以通过注册功能来创建自己的账户。注册过程设计得简单易用,只需填写基本信息并设置密码即可。这一步骤通过存储到SQLite数据库,为每个用户建立了独立的身份标识。
一旦注册完成,用户可以使用自己的凭据进行登录,并随时通过用户界面更改密码或更新个人资料,如上传新头像,这增强了系统的个性化和安全性。此外,我们的系统还提供了账户注销功能,让用户能够在使用完毕后安全地退出系统。如果用户需要,可以使用忘记密码的功能来重设密码,这些都是通过与后端数据库的交互来实现的。
用户在系统中的每次识别操作和设置更改都与其账户绑定,这样就可以在用户之间提供独立的使用体验,并保护他们的隐私。这意味着用户的识别历史和设置可以被私人化地存储和管理,用户可以回顾过去的识别记录,或者继续之前未完成的任务。
进入主界面后,用户将被引导至水果识别功能,这是系统的核心。主界面实时显示包括检测框、类别及置信度等信息,支持多种输入源,包括图片、视频、实时摄像头捕获和批量文件处理。无论是进行单张图片的快速检测,还是对视频流进行实时分析,系统都能给出精确的识别结果,并将这些结果记录下来。
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240226201917086-1425910746.png)
通过以上的设计和实现,水果识别系统为用户提供了一个全面、高效、私人化的使用体验。不仅仅是技术层面的创新,用户界面和管理系统的设计同样显示了我们对用户需求的深刻理解和对细节的精心打磨。这样的系统不仅能够满足实时目标检测的技术需求,还能提供符合用户期待的个性化服务,为用户的日常生活和专业工作带来便利。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240223172556334-254454142.png)
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV16H4y1L7ag/
YOLOv8/v7/v6/v5项目合集:[https://mbd.pub/o/bread/mbd-ZZuZmZtv](https://mbd.pub/o/bread/mbd-ZZuZmZtv)
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuZk51y
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuZmZtp
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuZmZpv
在文件夹下的资源显示如下,下面的链接中也给出了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等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的水果识别和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎
Wu W, Liu H, Li L, et al. Application of local fully Convolutional Neural Network combined with YOLOv5 algorithm in small target detection of remote sensing image[J]. PloS one, 2021, 16(10): e0259283. ↩︎
Talaat F M, ZainEldin H. An improved fire detection approach based on YOLO-v8 for smart cities[J]. Neural Computing and Applications, 2023, 35(28): 20939-20954. ↩︎
Wang C Y, Bochkovskiy A, Liao H Y M. YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2023: 7464-7475. ↩︎
Li C, Li L, Jiang H, et al. YOLOv6: A single-stage object detection framework for industrial applications[J]. arXiv preprint arXiv:2209.02976, 2022. ↩︎