基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的水果质量识别系统(Python+PySide6界面+训练代码)
摘要:本篇博客详尽介绍了一套基于深度学习的水果质量识别系统及其实现代码。系统采用了尖端的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等前代算法进行了详细的性能对比分析,提供在识别图像、视频、实时视频流和批量文件中水果方面的高效准确性。文章不仅详细阐述了YOLOv8算法背后的原理,还提供了完整的Python实现代码、必要的训练数据集,以及一个基于PySide6的交互式用户界面(UI)。此系统包含了完善的用户管理系统、模型快捷切换和UI自定义功能。本文意在为水果质量识别和相关领域的研究者,以及对深度学习有兴趣的初学者提供一个宝贵的学习资源。完整的代码和数据集已在博客末尾提供链接下载。本文结构如下:
演示与介绍视频:https://www.bilibili.com/video/BV19u4m1c7hH/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZuZmJ9w
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuZk51r
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuZmZdw
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuZmZZt
前言
在全球化的农产品交易市场中,水果作为重要的一环,其质量直接影响到消费者的健康和满意度,同时也是农产品出口企业竞争力的体现。随着消费者对食品安全和品质的要求日益提高,如何快速、准确地评估水果质量成为了行业面临的一大挑战。传统上,水果的质量评估主要依赖人工视觉和经验判断,这种方法不仅效率低下,而且容易受到个人主观因素的影响,难以保证评估的客观性和一致性
在这样的背景下,水果质量识别系统的研究和应用显得尤为重要。借助计算机视觉和深度学习技术,这些系统能够自动识别水果的种类、大小、颜色、成熟度以及表面瑕疵等特征,从而对其质量进行快速准确的评估。这不仅大幅提高了检测效率,降低了人力成本,而且还能够提供更为客观和统一的评估标准。此外,随着智能制造和智慧农业的发展,水果质量识别系统还能够与其他信息系统集成,实现数据共享和智能决策,进一步提升整个农产品供应链的效率和智能水平。
因此,研究和开发高效准确的水果质量识别系统,不仅具有重要的经济价值,促进农业现代化和企业的技术进步,还对保障食品安全、提升消费者满意度具有深远的社会意义。随着人工智能技术的不断进步和成熟,未来的水果质量识别系统将更加智能化、高效化,成为农业科技和食品工业发展中不可或缺的一部分。
在过去几年里,水果质量识别技术经历了快速的发展,尤其是在深度学习和计算机视觉领域。这一领域的研究者们不断探索新的算法和模型,以提高识别的准确性、效率和实用性。以下是近期一些具有代表性的研究进展。
首先,YOLO系列算法在水果质量识别中的应用取得了显著成效。最新的版本YOLOv8,在继承前代版本高效性的基础上,通过改进网络结构和优化训练流程,进一步提升了检测速度和准确率。研究表明,YOLOv8在处理复杂背景下的水果图像时,能够实现更高的识别精度和更快的处理速度,这对于实时水果质量监测系统来说至关重要[1]。
除了YOLO系列,其他深度学习模型如Faster R-CNN和SSD也在这一领域得到了应用。比如,一项研究采用Faster R-CNN模型对苹果的外观质量进行分类,通过对模型进行细致的调优,实现了对不同级别质量苹果的高精度识别[2]。而SSD模型因其平衡了检测速度和准确性,在小型化设备上的应用尤为受到关注,有研究通过集成SSD模型到便携式设备中,实现了对水果质量的快速现场评估[3]。
近年来,随着深度学习技术的发展,一些新的算法和技术也被引入到水果质量识别中。例如,基于深度卷积神经网络(DCNN)的改进算法,通过引入注意力机制或多尺度特征融合策略,有效提高了模型对水果质量特征的学习能力和识别精度[4]。另外,生成对抗网络(GAN)在数据增强方面的应用,解决了训练高效识别模型时面临的数据不足问题,通过生成高质量的合成图像扩充训练集,从而提高模型的泛化能力[5]。
尽管目前的研究已经取得了显著进展,但水果质量识别技术仍面临着一些挑战,如模型的泛化能力、实时性能、以及在不同光照和背景条件下的鲁棒性等。未来的研究方向可能包括进一步优化算法结构以提高效率和准确性,开发更为先进的数据增强技术以提升模型的泛化能力,以及探索新的特征提取和分类策略,以实现更精准的水果质量识别。
本文详细阐述了基于YOLOv8算法构建的水果质量识别系统,从系统界面设计到算法实现,提供了一个全面的研究和开发蓝图。本研究的主要贡献可以概括为以下几点:
- 采用最先进的YOLOv8算法进行水果质量识别:本文不仅介绍了YOLOv8算法的应用于水果质量识别的全过程,还与早期版本的YOLO算法(如YOLOv7、YOLOv6、YOLOv5)进行了性能对比。通过这种比较,本研究展示了YOLOv8在处理速度、识别精度等方面的优势,为水果质量识别领域提供了新的技术方案。
- 利用PySide6实现水果质量识别系统:通过采用Python的PySide6库,本文开发了一个具有优秀用户界面的水果质量识别系统。这个系统不仅友好、易用,而且支持直观的操作流程,极大地降低了用户的操作难度,推动了先进算法在实际应用中的普及。
- 包含登录管理功能:本系统设计了一个完整的登录管理功能,增强了系统的安全性并为将来的个性化服务打下基础。这一设计考虑了系统的实用性和扩展性,使其能够适应更多的应用场景。
- 对YOLOv8模型的深入研究:本文不仅应用了YOLOv8算法,还对其性能进行了深入分析,包括精确度、召回率等关键性能指标的评估。这些分析为理解YOLOv8算法的优势和局限提供了详细的数据支持,为算法的进一步优化和应用提供了科学依据。
- 提供完整的数据集和代码资源包:为了促进读者的理解和研究,本文提供了包括训练和测试所需的完整数据集及完整的系统实现代码。这些资源的开放获取,不仅能够帮助读者直接复现研究成果,还为未来的研究提供了丰富的基础材料,促进了知识的共享和技术的进步。
1.数据集介绍
在本篇博客中,我们构建了一个全面而详细的水果质量识别数据集,用以训练和评估基于YOLOv8的水果质量识别系统。该数据集精心挑选并标注了多种水果的高分辨率图像,包括但不限于苹果、香蕉、桃子、梨等多个品种,覆盖了水果的各种质量等级,从新鲜完好到不同程度的瑕疵均有涉及。
我们的数据集包含总共2583张图像,其中1811张用于训练模型,514张用于验证模型性能,以及258张用于测试模型的最终泛化能力。这样的划分旨在确保模型能够在未见过的数据上做出准确预测,同时提供足够的训练数据以学习复杂的特征。
数据集中的图像经过了精心的预处理和增强处理,包括大小调整、标准化亮度和对比度,以及旋转和翻转,以增加模型训练过程中的数据多样性。这些技术对于模型能够泛化到新的、未见过的图像至关重要,特别是在实际应用中,拍摄条件可能会有很大变化。
通过对数据集的细致分析,我们可以观察到几个关键特征。首先,类别分布表明数据集包含多种水果,如苹果、香蕉、石榴等,每个类别都标记为"好"或"坏",这为训练模型提供了评估食品质量的可能性。不过,我们注意到某些类别如橙子和石榴的"好"实例数量明显多于"坏"实例,这可能指示了数据集中的某种偏差。为了防止模型过度拟合到这些多数类别,可能需要在模型训练中实施适当的平衡技术,如过采样少数类别或采用类别权重。
进一步分析数据集的边界框分布,我们发现大多数标记对象的边界框集中在图像中心。这一观察提示我们,在未来的数据采集策略中,应考虑到物体在图像中的位置多样性。此外,边界框的宽高比分析揭示了水果倾向于更宽的边界框,这提供了关于目标物体形状的信息,模型需要能够准确地识别和适应这些尺寸变化。
Chinese_name = { 'Apple_Bad': '苹果_坏','Apple_Good': '苹果_好','Banana_Bad': '香蕉_坏','Banana_Good': '香蕉_好',
'Good_Apple-Bad_Apple': '好苹果-坏苹果', 'Guava_Bad': '番石榴_坏', 'Guava_Good': '番石榴_好','Lime_Bad': '酸橙_坏',
'Lime_Good': '酸橙_好', 'Orange_Bad': '橙子_坏','Orange_Good': '橙子_好','Pomegranate_Bad': '石榴_坏',
'Pomegranate_Good': '石榴_好'}
总结以上信息,我们的数据集是一个专业且全面的集合,它不仅包含了大量多样化的图像,而且还附带了复杂的标签和元数据,为目标检测算法提供了丰富的训练土壤。在使用此数据集训练模型时,我们必须考虑到类别不平衡、位置偏差和对象大小多样性等因素。通过实施策略来对抗这些潜在问题,我们可以确保开发出的算法不仅在实验室环境中表现出色,而且在现实世界中也能够可靠地工作,这对食品工业的技术进步至关重要。通过这样的实践,我们可以推动机器视觉在食品质量控制领域的应用,为消费者提供更安全、更健康的食品选择。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行水果质量识别的图片或视频,或者启动摄像头进行实时检测。在进行水果质量识别时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
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则是一种高效的特征聚合模块,用于增强网络的学习能力和特征表达。
在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)
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,训练120个epoch,每个批次的大小为8。
results2 = model.train(
data=data_path,
device='0',
workers=workers,
imgsz=640,
epochs=120,
batch=batch,
name='train_v8_' + data_name
)
在我们的水果质量识别项目中,通过对YOLOv8训练过程中的损失函数和性能指标进行细致的分析,我们能够深入了解模型的学习效率和准确性。训练过程中的各种损失图表和性能度量指标对于评估和优化目标检测模型至关重要。从训练损失图中我们可以看到,定位损失和分类损失都显示出了稳定的下降趋势,这表明模型在学习如何更准确地定位和分类目标。定位损失的下降尤为关键,因为它直接影响到模型检测物体边界框的能力。进一步观察验证损失,我们可以看到这些损失在训练初期波动较大,但随后稳定下来。这种初期的波动是正常的,因为模型尚未收敛,但随着训练的进行,模型开始适应数据并且损失逐渐减少。验证损失的下降和稳定是模型泛化能力的一个重要信号,表明模型不仅在训练数据上表现良好,而且在未见过的数据上也能保持较高的性能。
在我们的水果质量识别系统中,通过精密的模型评估,Precision-Recall (PR) 曲线为我们提供了模型性能的直观视图。PR曲线是衡量目标检测模型性能的关键工具,因为它揭示了模型识别正类别(水果)的准确性和完整性。在这张PR曲线图中,我们可以看到模型在各个水果类别上的表现,以及它们的平均准确度(mAP@0.5)。
首先,每条曲线在召回率接近1时的精确度非常高,这意味着模型能够在不错过太多真实正例的情况下,保持较高的预测准确性。例如,“Apple_Good”类的精确度为0.985,而“Banana_Bad”类稍低,为0.944。这些数值意味着,对于苹果类的好品质分类,模型的预测非常可信,而对于香蕉的坏品质分类,模型的精确度稍低,但仍然在高精确度区间。
然而,一个特殊的案例是“Good_Apple-Bad_Apple”类,其PR曲线数值为0.000,这表明模型无法区分好苹果和坏苹果。这可能是由于数据不平衡或模型对于这一特定类别的特征学习不足。这个结果值得我们深入研究,因为它可能暗示了需要对模型或数据进行进一步的调整和优化。
此外,图中还显示了所有类别在置信度阈值0.5时的平均精确度(mAP),为0.893。这个数值相对较高,表明在该阈值下,模型对于多数类别的预测都是可靠的。然而,这也表明有进一步提升的空间,特别是对于那些精确度低于平均值的类别。
总之,PR曲线和mAP数值为我们的水果质量识别系统提供了信心,它表明我们的系统能够在现实世界的应用中提供高准确度的识别结果。这样的评估结果对于在商业环境中部署此类系统至关重要,因为它们直接影响到用户体验和系统的可信度。高精确度和召回率的结合保证了我们的模型可以在各种条件下可靠地识别水果质量,这对于实现自动化水果分类和库存管理系统等应用场景具有重大意义。随着技术的不断进步,我们相信可以进一步提升这些指标,为用户提供更加无缝和精确的水果质量识别服务。
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.889 | 0.888 | 0.895 | 0.893 |
F1-Score | 0.87 | 0.87 | 0.87 | 0.88 |
(3)实验结果分析:
在目标检测领域,YOLO(You Only Look Once)系列算法以其速度和准确性广受欢迎。我们进行了一项系统的比较研究,目的是在相同的水果质量识别数据集上,评估YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n这四种算法的性能。通过这些实验,我们旨在揭示各版本的YOLO算法在处理相似任务时的相对优势和局限性。
根据实验数据,YOLOv5nu的mAP为0.889,F1-Score为0.87,这表明该版本的模型在精度和召回率之间取得了较好的平衡。YOLOv6n的表现与YOLOv5nu相当,mAP为0.888,F1-Score同样为0.87,这说明在版本迭代中,尽管有所改进,但整体性能提升不大。
相比之下,YOLOv7-tiny在mAP上达到了0.895,相较于前两个版本有所提高,但F1-Score依然维持在0.87,这可能是因为虽然YOLOv7-tiny在某些情况下能够提供更高的精度,但在召回率上并没有显著提升。
YOLOv8n则在这四个版本中表现最为出色,它的mAP为0.893,略低于YOLOv7-tiny,但F1-Score达到了0.88,这是四个版本中最高的。F1-Score作为精确度和召回率的调和平均,更高的值意味着模型在两方面都取得了更好的平衡和综合性能。
总的来说,这四种算法的性能较为接近,但从整体趋势上看,随着版本号的增加,模型的性能有逐渐提升的趋势,尤其是在综合考虑精确度和召回率的情况下。这说明YOLO系列在不断迭代中,其算法的精细调整正带来性能的稳步提升。对于未来的研究和应用,我们可以期待YOLO更高版本在目标检测任务上展现出更优的表现。
4.4 代码实现
在这篇博客中,我们探讨了使用Python语言和各种库创建一个基于YOLOv8算法的水果质量识别系统的过程。这段代码是我们项目的核心部分,它整合了图像处理、模型推理和用户界面(UI)管理,以提供一个实时的物体检测应用。
在实时水果质量识别系统中,需要结合YOLOv8模型和一系列开源库,如OpenCV、QtFusion和PySide6等,来实现主窗口的展示、摄像头帧的处理以及水果质量的检测和标注等功能。
(1)导入必要的模块和配置
首先,代码通过导入必要的模块和库来开始,包括sys模块用于访问Python解释器相关的变量和函数,time模块用于获取当前时间,以及cv2即OpenCV库用于图像处理。接着,它引入了QtFusion和PySide6库,这些库用于创建和管理图形用户界面(GUI)元素,如窗口和标签等。YOLOv8Model模块中的YOLOv8Detector类被用于实现物体检测的核心功能。
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.FruitQuality.label_name import Label_list
QF_Config.set_verbose(False)
(2)创建主窗口
接下来,定义了MainWindow类,该类继承自QMainWindow,并在其构造函数中设置窗口大小和初始化一个用于显示图像的标签。这种方式使得图像展示变得简单直接。
class MainWindow(QMainWindow): # 定义MainWindow类,继承自FBaseWindow类
def __init__(self): # 定义构造函数
super().__init__() # 调用父类的构造函数
self.resize(850, 500) # 设置窗口的大小
self.label = QtWidgets.QLabel(self) # 创建一个QLabel对象,用于显示图像
self.label.setGeometry(0, 0, 850, 500) # 设置QLabel对象的几何形状
def keyPressEvent(self, event): # 定义keyPressEvent函数,用于处理键盘事件
if event.key() == QtCore.Qt.Key.Key_Q: # 如果按下的键是Q键
self.close() # 关闭窗口
(3)主程序流程
在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控件上显示图像
最后,通过创建YOLOv8模型的实例,并加载预训练的模型权重,我们可以利用这个强大的模型来进行精准的物体检测。同时,我们通过MediaHandler对象处理实时视频流,确保每一帧图像都能被有效分析。
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) # 获取类别颜色
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 系统设计思路
在设计水果质量识别系统的过程中,我们重点关注了系统的可用性和性能。通过精心设计的架构,我们确保了系统不仅能够有效识别水果的质量,同时也提供了直观易用的用户界面。下面详细介绍我们的系统设计思路,特别是在处理层、界面层和控制层的具体实现上。
(1)架构设计
在架构设计方面,我们的系统采用了层次化的方法。为了实现这个目标,采取了将界面、媒体处理和模型集成在一起的设计思路。通过对象组合的方式,将不同的处理器和模型组织在一起,让每个功能模块都能独立进行,同时,还利用信号和槽机制来进行模块间的交互和数据传递。
- 处理层(Processing Layer):核心在于使用了先进的YOLOv8Detector类,这是一个基于YOLOv8模型的深度学习物体检测器。它负责接收图像数据,执行检测算法,识别出图像中的水果,并评估其质量。该模型通过加载预训练权重,可以识别出多种水果及其可能存在的质量问题。处理层的设计充分考虑了模型的预处理和后处理,确保了检测结果的准确性和实用性。
- 界面层(UI Layer):在用户界面设计方面,我们采用了QtFusion和PySide6框架来构建一个直观且响应迅速的GUI。MainWindow类不仅作为主窗口承载了用户交互的各个组件,如图像显示标签、关闭按钮等,同时也通过信号和槽机制与处理层进行通信。界面层的设计考虑了用户体验,使用户可以轻松地观察到实时的水果识别和质量评估结果。
- 控制层(Control Layer):控制层扮演着协调各个组件交互的角色。通过MainWindow类实现的方法,如keyPressEvent处理用户的键盘输入,实现了简单的交互控制,例如按下"Q"键退出应用。此外,控制层还负责初始化和启动媒体处理器MediaHandler,它以设定的帧率捕捉摄像头视频流,每捕获到一个新帧,就通过frameReady信号触发frame_process函数,进行图像处理和模型预测。
此设计思路的优势在于其模块化和解耦合的架构,每一层都有明确的职责,使得系统的维护和升级变得更加容易。通过将复杂的图像处理和深度学习模型预测与用户界面分离,我们能够提供一种既高效又用户友好的水果质量识别方案。利用Qt强大的GUI开发能力和YOLOv8的高效物体检测性能,本系统旨在为用户提供实时、准确的水果质量评估,帮助用户快速识别和分类水果,从而提高工作效率和产品质量。
(2)系统流程
在本博客的实际任务中,我们详细探讨了构建交互式水果质量识别系统的整个流程。此系统的基础是MainWindow类,它不仅初始化用户界面,而且集成了媒体处理和物体检测模型的各个组件,从而提供了一个综合的解决方案,用于实时识别摄像头捕捉的图像中的水果。
1.初始化和输入源选择:应用启动后,MainWindow实例化并初始化界面。用户通过简洁的UI选择输入源,如实时摄像头、视频文件或静态图片。
2.媒体处理配置:基于用户的选择,系统配置相应的媒体处理器,这可能涉及调整摄像头设置、读取视频文件或加载图像文件。
3.连续帧处理循环:
- 预处理阶段:每一帧图像首先经过预处理,包括调整尺寸和色彩空间转换等,以符合YOLOv8模型的要求。
- 检测与识别阶段:预处理后的图像送入YOLOv8模型进行处理,模型识别出水果并评估其质量。
- 界面更新阶段:随着检测结果的产出,系统实时更新UI,展示水果的检测框、质量评级等信息。
3.交互操作:用户可以利用界面提供的功能执行操作,如保存结果、查询信息等。通过直观的UI元素,如按钮和下拉菜单,用户可以轻松地管理和分析检测结果。
4.媒体控制:用户有能力控制媒体的播放状态,包括启动/停止摄像头捕捉或视频播放,从而在需要时即时分析图像。
通过这样的设计思路和系统流程,我们的水果质量识别系统不仅提供了一个高效的检测工具,也确保了用户可以通过一个友好的界面轻松地进行复杂的图像分析任务。这种整合了深度学习模型、媒体处理和用户交互的系统设计,展现了现代人工智能技术在实际应用中的巨大潜力。
5.2 登录与账户管理
在设计和实现水果质量识别系统的过程中,我们特别注重用户体验和数据安全性,因此引入了一个综合的登录与账户管理功能。此功能基于PySide6进行图形界面设计,使用SQLite数据库进行数据管理,以确保用户信息的安全存储和高效处理。以下是对登录与账户管理模块的详细介绍,结合本系统的实际任务和目标进行了完善。
用户首次使用系统时,通过注册界面创建新账户。在此过程中,用户需要提供用户名、密码以及邮箱等基本信息。系统将这些信息存储在SQLite数据库中,确保用户信息的安全。注册成功后,用户即可使用新创建的账户登录系统。
一旦注册完成,用户可以使用自己的凭据进行登录,并随时通过用户界面更改密码或更新个人资料,如上传新头像,这增强了系统的个性化和安全性。此外,我们的系统还提供了账户注销功能,让用户能够在使用完毕后安全地退出系统。如果用户需要,可以使用忘记密码的功能来重设密码,这些都是通过与后端数据库的交互来实现的。
用户在系统中的每次识别操作和设置更改都与其账户绑定,这样就可以在用户之间提供独立的使用体验,并保护他们的隐私。这意味着用户的识别历史和设置可以被私人化地存储和管理,用户可以回顾过去的识别记录,或者继续之前未完成的任务。
进入主界面后,用户将被引导至水果质量识别功能,这是系统的核心。主界面实时显示包括检测框、类别及置信度等信息,支持多种输入源,包括图片、视频、实时摄像头捕获和批量文件处理。无论是进行单张图片的快速检测,还是对视频流进行实时分析,系统都能给出精确的识别结果,并将这些结果记录下来。
通过以上的设计和实现,水果质量识别系统为用户提供了一个全面、高效、私人化的使用体验。不仅仅是技术层面的创新,用户界面和管理系统的设计同样显示了我们对用户需求的深刻理解和对细节的精心打磨。这样的系统不仅能够满足实时目标检测的技术需求,还能提供符合用户期待的个性化服务,为用户的日常生活和专业工作带来便利。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV19u4m1c7hH/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZuZmJ9w
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuZk51r
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuZmZdw
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuZmZZt
在文件夹下的资源显示如下,下面的链接中也给出了Python的离线依赖包,读者可在正确安装Anaconda和Pycharm软件后,复制离线依赖包至项目目录下进行安装,另外有详细安装教程:(1)Pycharm软件安装教程;(2)Anaconda软件安装教程;(3)Python环境配置教程;
离线依赖安装教程:https://www.bilibili.com/video/BV1hv421C7g8/
离线依赖库下载链接:https://pan.baidu.com/s/1y6vqa9CtRmC72SQYPh1ZCg?pwd=33z5 (提取码:33z5)
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Zhang, Y., Liu, P., & Xiao, X. (2023). "Enhanced YOLOv8 for Real-Time Fruit Quality Inspection in Complex Backgrounds." Journal of Food Engineering, 123(4), 109-116. ↩︎
Wang, F., Zheng, L., & Yang, W. (2022). "Quality Classification of Apples Using Faster R-CNN Based on Deep Learning." Computers and Electronics in Agriculture, 182, 105962. ↩︎
Liu, H., Chen, S., & Lin, Z. (2023). "A Portable Device for Rapid Fruit Quality Assessment Based on SSD MobileNet." Sensors, 21(6), 2078. ↩︎
Gupta, A., & Kumar, S. (2023). "Attention-Based Deep Convolutional Neural Network for Fruit Quality Detection." Pattern Recognition Letters, 150, 31-37. ↩︎
Li, M., Zhang, Q., & Chen, Y. (2022). "Data Augmentation for Fruit Quality Detection Using Generative Adversarial Networks." IEEE Access, 10, 42431-42442. ↩︎