基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的生活垃圾检测与分类系统(Python PySide6界面及训练代码)

摘要:本篇博客详细讲述了如何利用深度学习构建一个生活垃圾检测与分类系统,并且提供了完整的实现代码。该系统基于强大的YOLOv8算法,并进行了与前代算法YOLOv7、YOLOv6、YOLOv5的细致对比,展示了其在图像、视频、实时视频流和批量文件处理中识别生活垃圾的准确性。文章深入讲解了YOLOv8算法的底层原理,提供了相应的Python代码、用于训练的数据集,以及一个基于PySide6的用户界面。此系统不仅能够精准地检测和分类图像中的生活垃圾,还具备了用户注册登录管理、模型一键切换、UI自定义等丰富功能,非常适合城市垃圾管理和回收的应用。文章的目标是为垃圾分类研究者和深度学习领域的新手提供一份实用指导和参考。完整的代码和数据集已在文章结尾提供链接,便于读者下载和使用。本文结构如下:

文章目录

  • 前言
  • 1.数据集介绍
  • 2. 系统界面效果
  • 3. YOLOv8算法原理
  • 4. 代码简介
  • 4.1 模型预测
  • 4.2 模型训练
  • 4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比
  • 4.4 代码实现
  • 5. 生活垃圾识别系统实现
  • 5.1 系统设计思路
  • 5.2 登录与账户管理
  • 下载链接
  • 6. 总结与展望
  • 结束语
  • ➷点击跳转至文末所有涉及的完整代码文件下载页☇

    基于YOLOv8/v7/v6/v5的生活垃圾检测与分类系统演示与介绍(Python+PySide6界面+训练代码)


    前言

            在当今社会,随着人口增长和消费模式的不断变化,生活垃圾的产量急剧增加,成为全球面临的重大环境问题之一。不当处理生活垃圾不仅会造成土地、水源和空气的污染,还会对生态系统和人类健康产生长远的负面影响。因此,有效的垃圾分类和处理变得尤为关键,它不仅有助于减少对环境的污染,也是推进资源循环利用、实现可持续发展的重要手段。传统的垃圾分类方法依赖于人工分拣,效率低下且存在健康风险。随着人工智能技术的快速发展,特别是深度学习和计算机视觉领域的进步,利用智能化技术进行生活垃圾的检测与分类成为了一种有效的解决方案。

            近年来,基于深度学习的目标检测模型,尤其是YOLO(You Only Look Once)系列,在生活垃圾检测与分类领域显示出了巨大的潜力。YOLO系列模型因其高效的检测速度和不错的准确率,成为了研究者和工程师们广泛采用的工具。从YOLOv5到最新的YOLOv8,每个版本的更新都在不断优化模型的性能,提高其在复杂环境下的准确性和鲁棒性。这些改进包括网络架构的创新、训练策略的优化以及更精细的特征提取机制等12。同时,与YOLO模型并行的其他算法,如SSD、Faster R-CNN等也在不断进化,通过引入新的机制和技术,如注意力机制、神经网络搜索等,来进一步提高检测的准确率和速度3

            此外,大量的研究工作致力于构建和更新针对生活垃圾检测的数据集,这些数据集的质量和多样性直接影响到模型训练的效果。最新的研究表明,通过使用更加丰富和多元化的数据集,结合数据增强技术,可以有效提升模型对于生活垃圾不同类别的识别能力4。同时,研究者也在探索如何通过改进算法和优化模型结构,来降低模型对计算资源的需求,以便于在资源受限的设备上部署,实现实时的垃圾检测与分类5

            近期的研究还包括了对模型轻量化的探索,旨在使这些高效的算法能够在计算资源有限的设备上运行,实现生活垃圾检测与分类的实时处理。例如,通过网络剪枝、量化和知识蒸馏等技术,可以有效减少模型的参数量和计算需求,而不显著降低模型的性能。

            综上所述,生活垃圾检测与分类系统的研究正处于快速发展阶段,通过不断地技术创新和算法优化,未来的系统将更加智能化、高效。这些进展不仅为环境保护贡献力量,也为深度学习和计算机视觉领域的研究提供了丰富的实践场景和挑战。

            本博客的主要贡献在于综合运用最先进的计算机视觉技术和深度学习模型,构建了一个高效且用户友好的生活垃圾识别系统。以下是本文的主要贡献:

    1. 采用最先进的YOLOv8算法:本研究采用了目前最先进的目标检测算法——YOLOv8,用于构建生活垃圾检测与分类系统。这标志着与传统模型如CNN和ResNet相比,在速度、准确性和效率方面的显著提升。通过与YOLOv7、YOLOv6和YOLOv5等早期版本的对比分析,本文展现了YOLOv8在处理复杂垃圾分类场景中的优越性能,从而为该领域的研究者和实践者提供了新的研究方向和实践方法。
    2. 利用PySide6实现友好的用户界面:通过使用Python的PySide6库,本文开发了一个用户友好的生活垃圾检测与分类系统界面。该界面不仅直观便捷,还为YOLOv8算法的实际应用营造了便利条件,推动了技术的实际落地和广泛应用。
    3. 集成登录管理功能:本系统设计了登录管理功能,增强了系统的安全性,并为将来引入更多个性化功能铺平了道路。这一设计体现了对用户体验和系统安全的双重考虑。
    4. 对YOLOv8模型进行深入研究:本文不仅应用了YOLOv8算法,还对其性能进行了全面的分析,包括精准度、召回率等关键指标的评估,以及模型在不同条件下的表现分析。这种深入研究有助于更加全面地理解YOLOv8的能力和局限,为算法的进一步优化提供了坚实的基础。
    5. 提供完整的数据集和代码资源包:为了促进读者的理解和应用,本文提供了一套完整的数据集和代码资源包。这包括了用于模型训练和测试的详尽数据集,以及实现检测与分类系统的完整代码。通过这些资源,读者可以轻松复现实验结果,并在此基础上进行更深入的研究或开发自己的应用。

    1.数据集介绍

            数据集的质量直接决定了机器学习模型的性能。在这篇博客中,我们将深入探讨一个特别的目标检测数据集,该数据集专注于垃圾分类,包含了多种不同的垃圾类型。它由10,464张图像组成,其中包含了7,324张训练图像、2,098张验证图像和1,042张测试图像。这个分布确保了模型能在足够大的数据集上进行训练,同时也留有充足的数据进行验证和测试,确保模型的泛化能力。

            在数据预处理阶段,每张图像都经过了自动方向校正,且剔除了EXIF中的方向信息,以确保模型训练时的一致性。随后,所有图像都被调整大小至640×640像素,无论原始尺寸如何,这样的统一处理可以简化模型架构的输入要求。为了提升图像质量,自动对比度调整通过自适应均衡化完成,这样可以增强图像中的特征,使得模型能更容易地识别垃圾物品。

           数据集的另一个关键特征是它的类别分布。类别包括生物可降解物品、纸板、玻璃、金属、纸张和塑料。生物可降解物品在数据集中占主导地位,其实例数量是其他类别的数倍。这种不平衡性可能导致模型对于数量较少的类别过拟合或识别性能不佳。

            对于目标检测数据集而言,不仅仅是类别分布至关重要,边界框的分布也同样关键。在我们分析的数据集中,边界框的集中趋势表明,大部分垃圾物品都被放置在图像的中心区域。虽然这可能简化了物品定位的任务,但也暗示了数据集可能缺乏足够的位置变化,这可能会影响模型在现实世界应用时的鲁棒性。解决这一问题的一个方法是引入数据增强技术,例如随机裁剪、平移和旋转,以模拟物品位置的多样性。

            边界框的宽高比分布进一步揭示了物品的几何特性。多数边界框的宽度集中在图像中部,而高度则较低,这可能表明数据集中的物品倾向于横向放置,且不是特别高。这种分布对于设计模型架构时选择合适的锚框尺寸和比例至关重要。博主使用的类别代码如下:

    Chinese_name = {'BIODEGRADABLE': "可降解", "CARDBOARD": '纸板', 'GLASS': "玻璃", 'METAL': "金属", 'PAPER': "纸质", 'PLASTIC': "塑料"}
    

            数据预处理和增强为模型的训练打下了良好基础,而不平衡的类别分布、边界框的集中趋势以及宽高比分布则向我们提出了一系列的问题。这些问题需要我们在模型设计和训练过程中予以重视,以确保最终的模型能在各种条件下都表现出色。

    2. 系统界面效果

            系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。

    (1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。

    (2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行生活垃圾检测的图片或视频,或者启动摄像头进行实时检测。在进行生活垃圾检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。

    (3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。

    (4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。


    3. YOLOv8算法原理

            YOLO是一种流行的实时目标检测算法,它的设计理念是在单次的图像浏览过程中完成物体检测任务,实现了速度与准确性的平衡。YOLOv8作为这一系列中的最新成员,继承了YOLO算法高效的特点,并在其基础上进行了一系列的创新和优化。

            YOLOv8的输入部分采用了Mosaic数据增强方法。这一方法通过将四张训练图像以一定的比例随机组合到同一张图片中,增加了模型的泛化能力和对于多尺度目标的识别能力。Mosaic数据增强通过模拟多种目标尺度和场景布局,提高了模型在处理复杂场景时的鲁棒性。此外,YOLOv8在输入数据的处理上还引入了自适应图像缩放,这有助于模型更好地适应不同大小的目标。

            YOLOv8的架构还特别关注了计算效率的问题。通过优化网络中的计算路径和模块设计,YOLOv8在保持高精度的同时显著提升了速度。例如,它可能采用了更深但更高效的骨干网络,以及更先进的特征融合技术,这些都有助于模型在处理实时视频流时保持高性能。

            YOLOv5中使用特征金字塔网络(Feature Pyramid Network, FPN)和路径聚合网络(Path Aggregation Network, PAN)。这两个网络的结合提高了特征融合的效果。FPN通过自顶向下的结构,将高层的语义丰富的特征与低层的高分辨率特征相结合,而PAN则通过自底向上的路径增强了特征的上采样效果。这样的结构不仅增强了不同尺度特征的融合,而且保证了特征在不同尺度上的一致性,提高了检测精度。在YOLOv8中,Neck部分进一步优化了FPN和PAN的结构,采用了C3模块和C2F模块来增强特征融合的能力,强化了模型对于不同尺度目标的识别。

            Head是模型的最后一部分,负责生成检测框、分类和置信度分数等。YOLOv5采用了一个单一的Head结构,而YOLOv8则采用了Decoupled-Head结构,也就是将分类和框的预测分开处理,这种解耦的方法可以提高预测的精确性,同时降低计算成本。YOLOv8还引入了Anchor-Free的方法,与传统的Anchor-Based方法相比,不再依赖预定义的锚点框,而是直接在特征图上预测目标的中心点和其他属性。这种方法简化了模型的设计,并可能提高模型对于各种尺度和形状目标的适应性。

            总的来说,YOLOv8相比于之前的版本,如YOLOv5、YOLOv8s、YOLOv8m,YOLOv8的主要优化在于特征融合的效率和精度,以及预测头(Head)的设计改进。通过引入C2F模块、C3模块、Decoupled-Head结构和Anchor-Free方法,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损失函数通常由以下几部分组成:
    以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:

    超参数 设置 说明
    学习率(lr0 0.01 决定了模型权重调整的步长大小,在训练初期有助于快速收敛。
    学习率衰减(lrf 0.01 控制训练过程中学习率的降低速度,有助于模型在训练后期细致调整。
    动量(momentum 0.937 加速模型在正确方向上的学习,并减少震荡,加快收敛速度。
    权重衰减(weight_decay 0.0005 防止过拟合,通过在损失函数中添加正则项减少模型复杂度。
    热身训练周期(warmup_epochs 3.0 初始几个周期内以较低的学习率开始训练,逐渐增加到预定学习率。
    批量大小(batch 16 每次迭代训练中输入模型的样本数,影响GPU内存使用和模型性能。
    输入图像大小(imgsz 640 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。

            在模型训练部分,需要导入必要的模块,os用于操作系统交互,torch用于利用PyTorch的深度学习功能,yaml用于解析YAML文件,以及ultralytics包中的YOLO,这是实现YOLO算法的热门选择。

    import os
    
    import torch
    import yaml
    from ultralytics import YOLO  # 导入YOLO模型
    from QtFusion.path import abs_path
    device = "cuda:0" if torch.cuda.is_available() else "cpu"
    

            在这里,可以智能地选择了GPU(如果可用),这对加速训练过程至关重要,如果GPU不可用,则回退到CPU。

            接着开始训练模型。其中指定了训练数据的配置文件路径,使用GPU进行训练,使用1个工作进程加载数据,输入图像的大小为640×640,训练120个epoch,每个批次的大小为8,训练任务的名称为’train_v8_’ + data_name。

    if __name__ == '__main__':  # 确保该模块被直接运行时才执行以下代码
        workers = 1
        batch = 8
    
        data_name = "VehicleTypeDet"
        data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current')  # 数据集的yaml的绝对路径
        unix_style_path = data_path.replace(os.sep, '/')
    
        # 获取目录路径
        directory_path = os.path.dirname(unix_style_path)
        # 读取YAML文件,保持原有顺序
        with open(data_path, 'r') as file:
            data = yaml.load(file, Loader=yaml.FullLoader)
        # 修改path项
        if 'path' in data:
            data['path'] = directory_path
            # 将修改后的数据写回YAML文件
            with open(data_path, 'w') as file:
                yaml.safe_dump(data, file, sort_keys=False)
    
        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  # 指定训练任务的名称
        )
    

            在深度学习模型的训练过程中,监控损失函数和评估指标的变化对于理解模型性能和收敛行为至关重要。从YOLOv8训练损失和评估指标图像中,我们可以对模型的学习过程进行细致的分析。

            box_loss代表预测物体周围边界框的误差。cls_loss是分类损失,指示模型在将物体正确分类到各个类别的能力。df1_loss可能代表一个“可微特征”损失,这在物体检测中经常用来确保学习到的特征能够很好地区分物体类别。所有三个图表都显示了下降趋势,表明模型在经过多次迭代后正在学习并提高其预测能力。图表中的平滑线条表明模型在学习过程中没有经历高变异性,这通常是稳定学习过程的良好迹象。

            验证损失也在减少,并呈现与训练损失类似的模式。这表明模型没有过拟合,对未见过的数据具有良好的泛化能力。精确度测量的是正确识别为正的比例,而召回率测量的是正确识别的实际正样本的比例。两个指标都随着时间的增长而提高,这表明模型变得更加准确,并且随着训练的进行,遗漏的真正正样本越来越少。

            metrics/mAP50(B)图显示了在交并比(IoU)阈值为0.5时的平均平均精确度(mAP),这是一个考虑精确度和召回率的常用物体检测指标。metrics/mAP50-95(B)图显示了在从0.5到0.95的多个IoU阈值上计算的平均平均精确度。这些图表也显示出上升趋势,意味着模型在正确检测与真实边界框重叠度更高的物体方面越来越好。

            总体而言,这些指标表明YOLOv8模型的性能良好,并且在训练过程中持续改进。损失在减少,精确度、召回率和mAP指标都在增加。但重要的是要注意,模型性能的最终评估不应仅基于这些训练图表,还应基于模型在从未见过的单独测试集上的表现。这将给出模型泛化到新数据的真实度量。

            F1分数是精确度和召回率的调和平均值,它是评估分类模型性能的重要指标。在目标检测模型的评估中,F1分数对于理解模型如何平衡精确度与召回率尤为关键。

            下图为博主训练生活垃圾检测的F1曲线图。在深度学习模型的性能评估中,F1得分是一个关键的评估指标,它综合考虑了模型的精确度和召回率。该曲线图描述了模型预测的置信度阈值与F1得分之间的关系,对于不同的类别展示了不同的曲线,同时还突出了所有类别的平均F1得分。从图中可以看到,该模型在各个类别中表现不同。当置信度阈值设置为 0.339 时,所有类别的聚合 F1 分数在 0.51 处达到峰值。这表明,将阈值设置为大约 0.339 将产生该模型所有类别中最平衡的性能,但这也意味着在精确度和召回率之间进行权衡。值得注意的是,对于关键应用,可能需要调整此阈值,具体取决于最小化误报(精确度)还是漏报(召回率)更重要。

             从实际意义上讲,对于回收分拣系统,这些结果可以指导系统的校准方式。对于可生物降解的废物和纸板等材料,该系统可以对其分类充满信心地运行,并可能更快地移动。对于塑料等材料,可能需要额外的验证。

             为了提高性能,特别是对于性能较低的类别,可以考虑收集更多样化的训练数据,应用技术来平衡数据集,试验不同的模型架构,或者使用集成方法,这些方法可能会捕获与表现不佳的类别相关的更广泛的特征。总之,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.520 0.533 0.521 0.527
    F1-Score 0.51 0.52 0.52 0.51

    (3)实验结果分析

            在深度学习领域,持续的算法迭代和更新是提升模型性能的关键途径。我们通过在相同的数据集上实施一系列实验,旨在比较和评估不同版本的YOLO模型——包括YOLOv5nu、YOLOv6n、YOLOv7-tiny以及YOLOv8n——在生活垃圾识别任务上的性能。实验的设计和目的是为了明确各版本模型在准确性和检测效率上的差异,以便为实际应用提供更具指导性的见解。

            首先,我们注意到YOLOv6n在mAP指标上表现最佳,达到了0.533,这表明在整体检测精度上,YOLOv6n的表现略优于其他版本。mAP是衡量检测模型在多个类别和多个召回率下的平均精确度,因此一个高的mAP值意味着模型在不同情况下都能维持较高的准确度。

            紧随其后的是YOLOv7-tiny和YOLOv8n,它们的mAP分别是0.521和0.527。这两个版本的表现相当接近,但YOLOv8n略占优势。这可能表明YOLOv8n在处理该数据集时,在不牺牲太多速度的前提下,能够提供较好的准确性,这对于需要在准确度和速度之间找到平衡的实际应用来说是有利的。YOLOv5nu的mAP是0.520,位于四个模型的最低点。虽然差距不大,但这表明在进行算法选择时,如果整体准确度是首要考虑的因素,可能会优先考虑其他版本。

            在F1-Score方面,所有模型的表现都相当接近,其中YOLOv6n和YOLOv7-tiny均为0.52,而YOLOv5nu和YOLOv8n则为0.51。F1-Score作为精确度和召回率的调和平均值,是一个反映模型准确性和完整性的指标。这些接近的值说明在实际应用中,四个版本的模型在综合精确度和覆盖率方面都有相近的性能。

            总的来说,尽管在F1-Score上的差异不大,YOLOv6n在mAP上的领先表明其在整体检测性能上可能是最优的。然而,实际选择哪个模型还需要考虑其他因素,如模型的速度、大小、实际应用中的资源限制以及是否需要对特定类别具有更高的检测能力。例如,YOLOv7-tiny可能因为其较小的模型尺寸而更适用于资源受限的环境,即便它在mAP上略逊一筹。同样,虽然YOLOv5nu在这项比较中的表现最弱,但它可能在易用性或者在某些特定场景下的性能上有特定的优势。

    4.4 代码实现

            在这篇博客中,我们将深入探讨一个使用YOLOv8进行实时目标检测的Python应用。这个应用结合了机器学习与计算机视觉技术,用于识别和分类图像中的对象。我们将逐步走过代码的每个关键部分,从概念理解到实际实现,以确保您能够把握其核心原理和技术细节。

            在实时生活垃圾识别系统中,结合YOLOv8模型和一系列开源库,如OpenCV、QtFusion和PySide6等,来实现主窗口的展示、摄像头帧的处理以及生活垃圾的检测和标注等功能。

    (1)导入必要的模块和配置
            首先,我们从基本的模块导入开始。在代码的开头,我们导入了random, sys, 和 time 模块,这些都是Python的标准库,用于生成随机数、与Python解释器交互以及处理时间。接着,我们引入了cv2库,即广泛用于图像处理的OpenCV库。这些都为我们的图像检测应用程序打下了基础。

    import random  # 导入random模块,用于生成随机数
    import sys  # 导入sys模块,用于访问与Python解释器相关的变量和函数
    import time  # 导入time模块,用于处理时间
    from QtFusion.config import QF_Config
    import cv2  # 导入OpenCV库,用于处理图像
    from QtFusion.widgets import QMainWindow  # 从QtFusion库中导入FBaseWindow类,用于创建窗口
    from QtFusion.utils import cv_imread, drawRectBox  # 从QtFusion库中导入cv_imread和drawRectBox函数,用于读取图像和绘制矩形框
    from PySide6 import QtWidgets, QtCore  # 导入PySide6库中的QtWidgets和QtCore模块,用于创建GUI
    from QtFusion.path import abs_path
    from YOLOv8Model import YOLOv8Detector  # 从YOLOv8Model模块中导入YOLOv8Detector类,用于加载YOLOv8模型并进行目标检测
    from datasets.Garbage.label_name import Label_list
    
    QF_Config.set_verbose(False)
    

            我们引入了QtFusion和PySide6模块,这些库用于创建用户界面。QtFusion提供了一系列的窗口和小工具类,而PySide6则是Qt库的Python绑定,这使得我们可以方便地构建跨平台的图形用户界面。在这段代码中,我们还设定了日志输出的详细级别。

    cls_name = Label_list  # 定义类名列表
    colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(cls_name))]  # 为每个目标类别生成一个随机颜色
    
    model = YOLOv8Detector()  # 创建YOLOv8Detector对象
    model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current"))  # 加载预训练的YOLOv8模型
    

            接下来,代码中初始化了一个用于分类的名字列表cls_name,以及为每个类别生成一个随机颜色的列表colors。这些颜色将用于在检测到的对象周围绘制边界框,帮助我们区分不同的对象。然后,我们创建了YOLOv8Detector对象,并加载了预训练的模型。这一步是实现目标检测的关键,YOLOv8Detector类封装了YOLOv8模型的加载和预测功能,而加载的模型文件是训练好的权重,这使得我们可以在新的图像上进行快速准确的目标检测。

    (2)创建主窗口
            在定义了MainWindow类后,我们的应用程序创建了一个窗口实例,并设置了适当的大小和布局。此外,keyPressEvent方法的定义允许我们通过按下’Q’键来关闭程序,增加了用户交互的便利性。

    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)主程序流程

            最后,我们在程序的主体部分加载和处理了图像。首先,使用cv_imread函数读取了图像,然后调整大小以适应窗口。之后,图像被预处理并传递给我们的模型进行预测。预测结果经过后处理,最终在界面上显示。在这个过程中,我们还计算并打印了模型推理的时间。

    if __name__ == '__main__':  # 如果当前模块是主模块
        app = QtWidgets.QApplication(sys.argv)  # 创建QApplication对象
        window = MainWindow()  # 创建MainWindow对象
    
        img_path = abs_path("test_media/biodegradable14_jpg.rf.3f972a64ad38a8618ea91d97ce25b6d3.jpg")  # 定义图像文件的路径
        image = cv_imread(img_path)  # 使用cv_imread函数读取图像
    
        image = cv2.resize(image, (850, 500))  # 将图像大小调整为850x500
        pre_img = model.preprocess(image)  # 对图像进行预处理
    
        t1 = time.time()  # 获取当前时间(开始时间)
        pred = model.predict(pre_img)  # 使用模型进行预测
        t2 = time.time()  # 获取当前时间(结束时间)
        use_time = t2 - t1  # 计算预测所用的时间
    
        det = pred[0]  # 获取预测结果的第一个元素(检测结果)
    
        # 如果有检测信息则进入
        if det is not None and len(det):
            det_info = model.postprocess(pred)  # 对预测结果进行后处理
            for info in det_info:  # 遍历检测信息
                # 获取类别名称、边界框、置信度和类别ID
                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])  # 在图像上绘制边界框和标签
    
        print("推理时间: %.2f" % use_time)  # 打印预测所用的时间
        window.dispImage(window.label, image)  # 在窗口的label上显示图像
        # 显示窗口
        window.show()
        # 进入 Qt 应用程序的主循环
        sys.exit(app.exec())
    

            整个应用程序是一个结合了前沿的目标检测技术和用户友好界面的例证。它不仅展示了如何将复杂的机器学习模型集成到应用程序中,还提供了关于如何使用Python进行高效图像处理的实用知识。


    5. 生活垃圾识别系统实现

            在构建实时生活垃圾检测与识别系统时,我们的核心目标是创建一个既能准确检测垃圾,又具有高度用户互动性的系统。我们的系统设计思路是集成和协调三个主要组件:界面层、处理层和控制层。这种分层架构不仅确保了代码的可维护性和模块化,还有助于未来的功能扩展和优化。

    5.1 系统设计思路

            为了让用户能够轻松地与系统互动,我们设计了一个直观的MainWindow类。它不仅负责呈现用户界面,还作为用户操作和系统响应之间的桥梁。我们确保该界面简洁易用,即便是对技术不太熟悉的用户也能够快速上手。
    (1)架构设计
            在MainWindow类的架构设计中,采用了处理层、界面层、控制层的设计模式。这个系统的设计充分考虑了用户体验和系统性能,通过合理的架构设计和技术选型,实现了一个高效且易于使用的生活垃圾检测与识别系统。

            处理层致力于核心的图像处理和机器学习任务。我们采用了YOLOv8Detector类,这个类封装了YOLOv8模型的所有功能,包括图像的预处理、实时目标检测和后处理。模型的预训练使得它能够即插即用,无需用户进行复杂配置。这一层的设计注重于计算效率和检测准确性,确保系统可以在各种环境下稳定运行。

            界面层关注于用户体验。我们利用Qt框架来构建一个直观的用户界面。这个界面不仅要展示检测结果,还要提供简洁的操作路径。为此,我们设计了清晰的视觉元素和直观的导航结构,确保用户能够轻松上手,无需深入理解底层的机器学习原理。同时,通过高度的定制化UI,我们也让用户能够根据个人喜好调整界面设置。

            控制层则是整个系统的指挥中心。它通过MainWindow类将用户界面和检测模型连接起来。在这一层,我们使用了信号和槽机制,这是Qt框架的一个特色,允许不同的界面组件和处理逻辑之间进行松散耦合的通信。控制层处理来自用户界面的输入,比如按钮点击和选项更改,并相应地调整处理层的行为。此外,当处理层完成垃圾的检测和分类后,控制层将结果反馈给界面层,以便用户可以实时查看。

            通过上述三层的紧密配合,我们的系统不仅能够高效地完成生活垃圾的检测和分类,还能提供一种互动和直观的用户体验。这种设计不仅强调了功能实现,还兼顾了用户的操作习惯和理解能力,旨在使技术服务于人,而不是相反。这样的系统设计思路,能够有效地桥接高科技与日常使用的鸿沟,让普通用户也能享受到人工智能带来的便捷。

    (2)系统流程

            在本博客的实际任务中,我们旨在构建一个基于YOLOv8模型的实时生活垃圾检测系统。该系统通过直观的图形用户界面(GUI),允许用户从不同的输入源中选择数据,进行实时的图像处理和目标检测。整个系统的设计旨在提供一条流畅的工作流程,从选择输入源到展示检测结果,每一步都精心设计以提升用户体验。

    1. 当用户启动应用程序时,系统首先会实例化MainWindow类,这一过程是整个应用的核心,因为它负责布置用户交互的舞台。该实例的初始化包括设置界面布局、初始化参数以及准备好等待用户输入的状态。这是一个关键的步骤,因为它为用户提供了一个清晰直观的起点,从而确保了用户体验的流畅性和直观性。

    2. 应用程序的界面设计旨在简化用户与系统的交互。用户可以轻松选择他们希望分析的媒体输入源,无论是实时的摄像头捕捉、一个视频文件还是一个静态的图像文件。这种灵活性是考虑到不同用户可能有不同的使用场景和需求。

    3. 一旦输入源被用户选定,应用程序立即响应,调用相应的媒体处理器开始数据的获取和处理。这个过程可能涉及复杂的步骤,比如配置摄像头、处理视频文件的编解码问题,或者对静态图像文件进行格式转换和加载。这些步骤虽然在用户界面下是不可见的,但却是确保系统准确响应用户需求的重要环节。

    4. 接下来,系统进入到一个连续帧处理的循环中,这是动态输入源(如摄像头或视频)的关键处理阶段。在预处理阶段,系统对输入的每一帧图像进行标准化和调整,以符合YOLO模型的预期输入格式。这包括调整图像的尺寸、转换色彩空间、以及进行图像归一化等操作。

    5. 在检测与识别阶段,这些经过预处理的图像被送入训练有素的YOLOv8模型进行分析。模型会输出目标的检测框,以及对应的分类信息。由于我们的系统专注于生活垃圾检测与分类,这里的输出将是垃圾的类型和位置信息。

    6. 随着检测结果的产生,用户界面会实时更新来反映这些结果。检测框和分类标签将在图像上展示,而统计数据则以表格或图表的形式呈现给用户。这样的实时反馈对于用户理解系统的工作方式至关重要,也增加了系统的互动性和实用性。

            此外,用户界面还设计了一系列的交互操作。用户可以通过按钮来保存检测结果,查询系统信息,或者通过下拉菜单来筛选特定的检测结果进行进一步的分析。这些交互元素不仅提升了用户体验,也使得系统的使用更加灵活。

            最后,媒体控制的功能允许用户根据需要启动或停止媒体的捕捉和播放。无论用户希望暂停检测来更详细地观察某个结果,还是想要重新开始捕捉新的图像,系统都能迅速响应。总的来说,我们设计的交互式生活垃圾检测与分类系统的流程,旨在提供一个无缝、直观且高度可控的用户体验。通过精心设计的界面和后台逻辑,我们的系统不仅能够提供高效准确的检测结果,还能够允许用户以他们喜欢的方式与系统进行互动。

    5.2 登录与账户管理

            在我们的生活垃圾检测与分类系统中,用户体验始于一个简洁而直观的登录界面。该界面是基于现代的PySide6框架构建的,它不仅提供了美观的用户界面,还保证了应用的跨平台性能。为了保护用户信息并提供快速的数据访问,我们采用了SQLite数据库来管理用户账户数据。这样的设计选择兼顾了轻量级操作和数据安全性。

            新用户可以通过填写必要的信息来创建新的账户。已注册用户可以在必要时更改密码。用户可以上传和修改个人头像,这为用户的个人化体验增添了一份亲切感。当用户不再需要使用系统时,可以选择注销账户。对于已注册的用户,系统提供了快速重登入功能,确保用户能够迅速返回到他们的个人空间继续工作。

            一旦登录成功,用户便进入到主界面,开始他们的生活垃圾检测与分类任务。用户的个人空间内,可以保存和管理检测结果和个人设置。这意味着用户的工作进度、偏好设置和历史记录都被妥善保存,以便在未来的会话中继续使用。

            主界面为用户提供了一个功能强大的操作中心,可以导入深度学习模型,实现精准的多物体识别和检测。它实时显示关键信息,如检测框、类别和置信度。用户可以选择图片、视频、实时摄像头捕获或批量文件输入作为检测源,系统将实时识别目标并记录结果。这些功能不仅提高了工作效率,也确保了用户能够在实时目标检测的各种场景下都能得到满足。

            综上所述,我们的生活垃圾检测与分类系统不仅在技术层面上实现了高效、准确的目标检测与识别,而且在用户体验层面上也提供了全面、个性化的服务。从用户账户的安全管理到个性化设置,再到实时的检测与分析功能,我们致力于为用户提供一个无缝、便捷且高度定制化的使用体验。

    下载链接

        若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:

    完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷

    演示与介绍视频:https://www.bilibili.com/video/BV1ZJ4m1Y7fd/

        在文件夹下的资源显示如下,下面的链接中也给出了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等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的生活垃圾检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。

            该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。


    结束语

            由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。


    1. Redmon, J., & Farhadi, A. (2018). YOLOv3: An Incremental Improvement. arXiv preprint arXiv:1804.02767. ↩︎

    2. Bochkovskiy, A., Wang, C. Y., & Liao, H. Y. M. (2020). YOLOv4: Optimal Speed and Accuracy of Object Detection. arXiv preprint arXiv:2004.10934. ↩︎

    3. Ren, S., He, K., Girshick, R., & Sun, J. (2015). Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks. In Advances in neural information processing systems (pp. 91-99). ↩︎

    4. Garcia-Garcia, A., Orts-Escolano, S., Oprea, S., Villena-Martinez, V., & Garcia-Rodriguez, J. (2017). A Review on Deep Learning Techniques Applied to Semantic Segmentation. arXiv preprint arXiv:1704.06857. ↩︎

    5. Howard, A., Sandler, M., Chen, B., Wang, W., Chen, L., Tan, M., Chu, G., Vasudevan, V., Zhu, Y., Pang, R., & Adam, H. (2019). Searching for MobileNetV3. In Proceedings of the IEEE International Conference on Computer Vision (pp. 1314-1324). ↩︎

    作者:思绪无限

    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的生活垃圾检测与分类系统(Python PySide6界面及训练代码)

    发表回复