基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的田间杂草检测系统(深度学习模型+UI界面+Python代码+训练数据集)

news2024/11/24 9:25:34

摘要:开发用于田间杂草识别的系统对提高农业运营效率和提升作物产出至关重要。本篇文章详尽阐述了如何应用深度学习技术开发一个用于田间杂草识别的系统,并附上了完备的代码实现。该系统基于先进的YOLOv8算法,并对比了YOLOv7YOLOv6YOLOv5等版本在性能上的差异,通过mAPF1 Score等关键性能指标进行了深入分析。文章详细讲解了YOLOv8算法的核心机制,提供了相关的Python代码训练用的数据集,并设计了基于PySide6的图形用户界面。

该系统能够高精度地识别和区分田间图像中的杂草,并支持多种输入方式,如单张图片图片集视频文件或实时摄像头捕捉。它还包括热力图分析识别框标记类别统计、可调节的置信度IOU参数、以及结果的图形化展示等特点。此外,还开发了一个基于SQLite的用户管理系统,包括注册登录界面,以及切换模型的按钮和易于修改的用户界面设计。本文目的是为深度学习初学者提供一份详实的指导和资源,文末已提供完整代码数据集的下载链接,以便读者获取和应用。本文结构如下:

文章目录

  • 前言
  • 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模型+PySide6界面+训练数据集)


前言

        在当今农业生产中,杂草管理是保障作物健康成长和提高产量的关键环节。不当的杂草控制不仅会导致作物产量降低,还会增加农药的使用,从而影响环境和人体健康。随着精准农业的发展,利用先进的信息技术来实现高效、环保的杂草管理成为研究的热点。基于机器视觉的田间杂草检测系统,能够快速准确地识别和分类田间杂草,为后续的精确施药和杂草控制提供数据支持。这种技术的应用不仅可以显著提高杂草管理的效率和准确性,还有助于减少化学农药的使用,对环境友好。

        近年来,深度学习技术在图像处理领域取得了显著进展,尤其是YOLO1(You Only Look Once)系列算法在实时物体检测方面展示出了卓越的性能。从YOLOv1到最新的YOLOv82345,每一次迭代都在检测速度、准确性以及模型复杂度方面取得了平衡,使其成为田间杂草检测的理想选择。此外,其他算法如Mask R-CNN、SSD等也在不断进化,提供了多样化的选择。同时,随着公开数据集的不断丰富和更新,如Weed-COCO和Agricultural Weed Dataset,为算法的训练和验证提供了宝贵的资源,进一步推动了田间杂草检测技术的发展。

在这里插入图片描述

        尽管深度学习算法在田间杂草检测中取得了显著进展,但仍面临着一系列挑战。例如,如何提高算法在复杂环境下的鲁棒性,包括光照变化、遮挡和背景噪声等因素;如何处理作物与杂草之间的相似性,尤其是在初生阶段;以及如何提高大规模数据处理的效率和减少算法的计算成本。此外,如何集成多模态数据,如结合光谱信息和深度信息,以提高杂草检测的准确性和可靠性,也是当前研究的热点。

        我们可以预见到几个方向的发展。一是算法优化和模型轻量化,目的是提高算法的实时处理能力和在资源受限的设备上的应用可能性。二是多模态数据和多任务学习策略的应用,通过融合图像数据、光谱数据和环境数据,提高检测的准确性和适应性。三是人工智能与机器人技术的结合,实现自动化的田间杂草管理系统,减轻人工劳动强度,提高农业生产的效率和可持续性。

        通过上述讨论,我们可以看到,田间杂草检测技术正处于快速发展之中,不仅涵盖了算法的创新和数据集的扩展,还面临着技术挑战和未来发展的广阔前景。这些进展和挑战共同推动着精准农业技术的前进,为实现高效、环保的农业生产提供了强大的技术支持。

        本博客的核心工作是基于最先进的YOLOv8算法,构建了一个高效且用户友好的田间杂草检测系统。我们不仅深入探讨了YOLOv8算法的原理和实现,还通过对比YOLOv7、YOLOv6、YOLOv5等早期版本,展现了YOLOv8在田间杂草检测方面的显著优势。本文的主要贡献总结如下:

  1. 采用最先进的YOLOv8算法进行田间杂草检测:本文详细介绍了YOLOv8算法在田间杂草检测中的应用,包括算法的选择理由、实现方法以及与早期版本(YOLOv7、YOLOv6、YOLOv5)的性能比较。这一部分不仅为田间杂草检测提供了一种新的、更有效的解决方案,也为相关领域的研究者和技术从业者提供了宝贵的参考和启发。
  2. 利用PySide6实现田间杂草检测系统:通过使用Python的PySide6库,本文成功开发了一个具有良好用户界面的田间杂草检测系统。该系统的设计旨在提供一个直观、便捷的操作体验,极大地促进了YOLOv8算法在田间杂草检测领域的应用和推广。
  3. 包含登录管理功能:为了提高系统的安全性并为将来可能添加的个性化功能打下基础,本文在系统中设计了一个登录管理功能。这一创新不仅保护了用户的个人信息安全,也为系统的后续升级和功能拓展提供了支持。
  4. 对YOLOv8模型的深入研究:本文对YOLOv8算法在田间杂草检测中的性能进行了全面的评估,包括精确度、召回率等关键性能指标的详细分析,以及模型在不同环境和条件下的表现。这些研究成果不仅加深了我们对YOLOv8算法性能的理解,也为算法的进一步优化和应用提供了坚实的基础。
  5. 提供完整的数据集和代码资源包:为了帮助读者更好地理解并实践YOLOv8算法在田间杂草检测中的应用,本文提供了一套完整的数据集和代码资源包。这些资源旨在降低读者复现实验结果的难度,促进算法的学习和研究,为田间杂草检测技术的发展做出了实质性的贡献。

1.数据集介绍

        在本研究中,我们致力于开发一个精确识别田间杂草的智能检测系统。为了实现这一目标,我们构建了一个综合性的图像数据集,该数据集是训练和验证我们基于YOLOv8算法的杂草检测模型的基础。数据集共包含2486幅图像,其中1661幅用于模型的训练,580幅用于验证模型的泛化能力,而余下的245幅则作为测试集,用以评估模型在未见数据上的性能。

在这里插入图片描述
        这些图像不仅覆盖了多种田间环境和不同的光照条件,而且还细致地标注了杂草的种类和位置。通过这样的精确标注,我们能够确保模型可以从数据中学习到如何区分不同类型的杂草,并在各种背景下准确识别它们。在预处理阶段,我们对图像进行了标准化处理,包括尺寸调整和颜色空间转换,以满足深度学习模型的输入要求,并加速了模型训练的收敛过程。此外,为了增强模型对于实际田间环境中可能出现的变异性的适应性,我们还应用了一系列数据增强技术,例如旋转、缩放、剪切和颜色抖动等。

        通过对数据集的深入分析,我们观察到杂草实例在图像中呈现出相对均匀的分布,这有助于模型学习在不同位置和条件下检测杂草。边界框尺寸的集中趋势揭示了数据集中杂草的典型尺寸范围,这对于调整模型的锚框尺寸至关重要。此外,通过分析边界框的密度分布,我们可以进一步优化模型,使其对于杂草尺寸的变化更加敏感。

在这里插入图片描述

        每幅图像都附有相应的标签信息,这些标签明确指明了图像中杂草的类别和位置。这些标签在训练深度学习模型时扮演着关键角色,因为它们提供了监督信号,指导模型学习如何识别和分类不同的杂草。根据您的描述,我们可以推断数据集可能包含了多个不同的杂草类别,每个类别的实例都被精确地标注以供模型学习。博主使用的标签及其对应的中文名称如下所示:

Chinese_name = {'weeds': "杂草"}

        综上所述,我们精心准备的数据集是一个强大的工具,它不仅支持了我们当前的研究工作,还为未来在田间杂草检测领域的探索和发展提供了宝贵的资源。通过这些努力,我们期望该数据集能够帮助我们的检测系统实现高效、准确的杂草管理,从而推动精准农业技术的进步。我们的数据集介绍不仅展示了研究的深度和广度,而且为感兴趣的研究人员提供了一个丰富的实验基础,以促进这一领域的技术创新和应用实践。


2. 系统界面效果

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

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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


3. YOLOv8算法原理

        YOLOv8作为YOLO系列中的新一代算法,继承并优化了前代模型的众多特性,具备了更加卓越的性能和效率。它的核心原理在于直接在输出层进行预测,大大简化了目标检测流程,提高了速度和准确度,使其在实时应用中表现出色。

在这里插入图片描述

        首先,YOLOv8沿用了YOLO系列一贯的端到端单一网络架构,这意味着它可以在单个前向传播过程中预测出图像中的目标位置和类别。这种设计减少了作为中间步骤的区域提议阶段,从而减少了计算量并提高了处理速度。相较于YOLOv5和YOLOv8的早期版本,YOLOv8在网络架构上做了进一步的优化,如结合了特征金字塔和路径聚合网络,这使得模型能够更有效地利用多尺度信息,增强了对小目标的检测能力。

        在检测头的设计上,YOLOv8采用了一个更加高效的Baseline,它能够更精确地定位目标,并在计算资源有限的情况下仍然保持高性能。YOLOv8在目标定位的精确度上也做了重大的改进,引入了Anchor-Based和Anchor-Free的机制,结合了这两种目标检测方法的优点。它通过对Anchor点的位置进行优化,提高了对各种尺寸和形状目标的适应性,同时,通过引入Task-Aligned Assigner,它可以更智能地匹配预测框和真实框,减少了不必要的计算和复杂度。

        进一步地,YOLOv8在损失函数的设计上也进行了改进。例如,它采用了CIoU损失来精确地衡量预测框和真实框之间的重叠度,这一改进使得模型在训练过程中能够更加关注于目标的几何属性。同时,它还利用了DFLloss,这是一种新的损失函数,能够更加准确地预测目标的类别和位置,尤其是在目标尺寸和形状多样性较大的情况下。

        最后,YOLOv8在训练策略上也做出了创新。采用了Mosaic数据增强,它可以在一个图像中合成多个训练样本,提高了模型对复杂场景的适应性。这种方法可以极大地提升模型对不同尺寸、形状和背景的目标的泛化能力。同时,Mosaic增强也有助于模型在训练早期快速收敛,实现更高的准确度。

        总而言之,YOLOv8通过一系列的技术革新,如CSP结构的引入、多尺度预测、改进的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模型训练中使用的一些重要超参数及其设置:

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

        在构建田间杂草检测系统的过程中,训练一个精准的深度学习模型是最核心的步骤。这一过程涉及到从零开始或利用已有的预训练模型来进行进一步的学习,以适应我们特定的任务。为此,我们将使用YOLOv8,这是目前最先进的目标检测算法之一,它以其快速和准确性而闻名。在本段博客内容中,我们将深入探讨如何设置和启动YOLOv8模型的训练过程。

        首先,导入必要的模块和库是任何Python程序的起点。这里我们导入os模块来处理文件路径问题,torch库是PyTorch深度学习框架的核心,yaml用于读取数据配置文件。ultralytics提供的YOLO是一个功能强大的对象检测模型,而QtFusion.path中的abs_path函数则用于获取数据集配置文件的绝对路径。

import os

import torch
import yaml
from ultralytics import YOLO  # 导入YOLO模型
from QtFusion.path import abs_path

        接下来,我们设置设备,优先使用CUDA加速(如果可用),否则使用CPU。这是为了确保模型可以在GPU上运行,从而大幅提高训练速度。

device = "cuda:0" if torch.cuda.is_available() else "cpu"

         我们确保了以下代码只有在该模块作为主程序运行时才会执行,并定义了工作进程数和批次大小,这些是控制数据加载和批处理的重要参数。为了定位数据集的yaml配置文件,我们使用abs_path函数,并替换路径分隔符以适应不同操作系统的路径规则。这个yaml文件包含了关于数据集的重要信息,如类别、路径和数据划分等。

if __name__ == '__main__':  # 确保该模块被直接运行时才执行以下代码
    workers = 1
    batch = 8

    data_name = "PlantLeaf"
    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  # 指定训练任务的名称
    )

        读取yaml文件并在需要时更新路径项是处理配置文件的常规操作。这一步骤确保了模型能够正确地定位到数据集的位置。在加载模型并准备进行训练之前,首先需要加载预训练权重。这里我们加载了yolov5nu.pt作为YOLOv5模型的权重,这是从UltraLytics提供的预训练模型开始的一个好起点。最后,我们使用train方法开始训练模型。这里指定了数据配置文件、设备、工作进程数、图像大小、训练周期和批次大小。name参数用于命名训练任务,便于后续的识别和参考。

        在深度学习模型的训练过程中,监控损失函数和性能指标的变化对于了解模型的学习进度至关重要。通过对YOLOv8模型训练过程中的损失函数图像进行分析,我们可以对模型性能做出专业且详细的解读。

        首先,观察训练过程中的损失函数图像,我们看到模型的三个主要损失分量——边界框损失(box_loss)、分类损失(cls_loss)和置信度损失(dfI_loss)——均随着训练的进行呈现出稳定的下降趋势。具体来说,边界框损失反映了模型预测的边界框与实际标注框之间的偏差,从图中我们可以看到,在训练阶段这一损失从接近2的数值稳定减小到1.3左右,这表明模型在定位杂草的能力逐渐增强。分类损失则表明了模型在识别不同杂草类别上的表现,从最初的约2.2减少到不到1.0,说明分类准确性有了显著提高。置信度损失的下降则表示模型对其预测结果越来越有信心。验证集上的损失变化与训练集相似,显示了模型在未见数据上的泛化能力。

        进一步分析评估指标,精确度(precision)和召回率(recall)是衡量模型性能的两个重要指标。在训练过程中,我们注意到精确度在起初波动后稳定在75%左右,这意味着当模型预测图像中存在杂草时,其预测结果有75%的概率是正确的。召回率在训练后期稳定在接近75%,说明模型能够检测到大约75%的所有实际杂草。

在这里插入图片描述

        在更为细致的评估指标中,平均精度均值(mAP)是一个综合考虑精确度和召回率的指标。我们看到,mAP@0.5(IOU=50%时的mAP)在训练过程中呈上升趋势,并在训练结束时趋于稳定,而mAP@0.5-0.95(IOU从50%至95%时的mAP均值)也显示了相似的趋势。这些指标的提升表明模型对杂草检测任务的整体性能有了全面的提升。

        在机器学习和深度学习模型的性能评估中,F1分数是一个非常重要的指标,它结合了精确度(Precision)和召回率(Recall)两个指标的信息。具体来说,F1分数是精确度和召回率的调和平均数,能够平衡二者的影响,为模型性能提供一个综合的衡量。在目标检测任务中,F1分数尤其重要,因为它直接反映了模型检测正确目标的能力。

在这里插入图片描述

         从F1分数曲线图中,我们可以观察到F1分数随置信度阈值的变化而变化。曲线在置信度阈值约为0.293时达到了峰值,此时的F1分数为0.75。这表明在该置信度阈值下,模型对于检测杂草的平均性能最佳。一般来说,置信度阈值越低,模型将更多的预测结果视为有效,从而可能提高召回率但降低精确度;而置信度阈值越高,则可能会提高精确度但降低召回率。在该模型中,选择0.293的置信度阈值似乎提供了一个很好的平衡,使得模型在忽略较少正确预测的同时,尽量减少了错误预测的数量。

         然而,当置信度阈值继续增加时,F1分数开始急剧下降,这意味着模型开始漏检许多正样本,即实际存在的杂草没有被模型检测出来。这对于田间杂草检测来说是不利的,因为漏检可能导致杂草无法得到及时和有效的管理。另一方面,当置信度阈值过低时,F1分数也呈现出下降趋势,这表明模型产生了过多的假阳性预测,即将非杂草的区域错误地标记为杂草。

        综合以上分析,YOLOv8在我们的田间杂草检测任务中表现出了良好的学习效果和性能提升。损失函数的下降以及评估指标的稳定表明,模型在训练过程中成功地学习到了如何从图像中识别和定位杂草。F1分数曲线为我们优化模型性能提供了直观的指导。通过分析这一曲线,我们可以选择适当的置信度阈值,以确保我们的模型在保持高召回率的同时,也能尽可能地减少错误预测。这些结果为我们的研究提供了坚实的证据,说明采用YOLOv8算法进行田间杂草检测是有效的,并且有潜力进一步提高精度和召回率,实现更精确的杂草管理。

4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比

(1)实验设计

在这里插入图片描述

        本实验旨在评估和比较YOLOv5、YOLOv6、YOLOv7和YOLOv8几种模型在田间杂草目标检测任务上的性能。为了实现这一目标,博主分别使用使用相同的数据集训练和测试了这四个模型,从而可以进行直接的性能比较。该数据集包含田间杂草的图像。本文将比较分析四种模型,旨在揭示每种模型的优缺点,探讨它们在工业环境中实际应用的场景选择。

模型图像大小 (像素)mAPval 50-95CPU ONNX 速度 (毫秒)A100 TensorRT 速度 (毫秒)参数数量 (百万)FLOPs (十亿)
YOLOv5nu64034.373.61.062.67.7
YOLOv8n64037.380.40.993.28.7
YOLOv6N64037.5--4.711.4
YOLOv7-tiny64037.4--6.0113.1

(2)度量指标

  • F1-Score:F1-Score是精确率(Precision)和召回率(Recall)的调和平均值。精确率是指模型正确识别的正例与所有识别为正例的案例之比,而召回率是指模型正确识别的正例与所有实际正例之比。F1-Score对于不平衡的数据集或者需要同时考虑精确率和召回率的任务特别重要。
  • mAP(Mean Average Precision):mAP是衡量模型在多个类别上平均检测准确度的指标。它计算了模型在所有类别上的平均精度,是目标检测领域中常用的性能度量。
名称YOLOv5nuYOLOv6nYOLOv7-tinyYOLOv8n
mAP0.7900.7870.7710.785
F1-Score0.760.760.760.75

(3)实验结果分析

       在我们的田间杂草检测研究中,对比了四个版本的YOLO模型——YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n——以评估它们的性能。我们的对比侧重于两个核心指标:mAP(mean Average Precision)和F1-Score,这些都是衡量目标检测算法性能的关键标准。

        从mAP的角度来看,YOLOv5nu以0.790的分数略微领先于其他模型,紧随其后的是YOLOv6n,其mAP为0.787。YOLOv7-tiny的mAP稍低,为0.771,而YOLOv8n的mAP为0.785,表明尽管这些模型在性能上有所差异,但它们都能提供相当高的平均精度。这一结果对于实际应用来说非常重要,因为它意味着在田间杂草的检测中,这些模型都能以较高的准确度识别出杂草的存在。

在这里插入图片描述

        关于F1-Score,这是精确度和召回率的调和平均值,能够平衡这两个指标的重要性,因此是一个全面反映模型性能的指标。在我们的实验中,YOLOv5nu、YOLOv6n和YOLOv7-tiny在F1-Score上均表现出了0.76的均衡性能,而YOLOv8n略低于这一标准,为0.75。这表明尽管YOLOv8n在mAP上与其他模型相当,但在平衡精确度和召回率方面可能需要进一步的优化。

        通过这些实验数据,我们可以得出结论,尽管YOLOv8是最新的模型,但在我们的田间杂草检测任务中,YOLOv5nu显示出略优的性能,特别是在mAP指标上。YOLOv6n和YOLOv7-tiny也表现出了竞争力,尤其是在F1-Score上。这些发现表明,在选择合适的模型时,应当考虑特定任务的需求和评估指标的重要性,以确保最终的检测系统能够满足实际应用中对准确性和鲁棒性的要求。此外,这些实验结果也为未来的研究提供了一个重要的参考,表明即使是较新的模型版本,也可能不会在所有情况下都是最佳选择。因此,我们鼓励研究人员继续探索不同模型的性能,并根据具体的应用场景进行选择。

4.4 代码实现

        在当今人工智能的研究和应用中,目标检测技术尤其是在田间杂草检测领域,扮演着至关重要的角色。为了实现这一点,我们利用YOLOv8模型,这是目标检测领域的一种前沿技术,它以高准确率和快速处理能力而著称。本博客将向您详细介绍如何使用YOLOv8模型和Python进行实时视频流的目标检测,这不仅能为专业人士提供洞见,也为技术爱好者提供了实践的可能。

(1)导入必要的模块和配置
        我们的代码首先导入了一系列必要的库。sys模块让我们能够与Python解释器交互,而time模块允许我们计算操作的执行时间。cv2是OpenCV库的Python接口,它提供了各种图像处理功能。QtWidgets和QtCore是PySide6库中的两个模块,分别用于创建图形用户界面(GUI)的组件和管理应用程序的核心功能。此外,QtFusion库中的MediaHandler类被用来处理视频流。

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.Weeds.label_name import Label_list

QF_Config.set_verbose(False)

(2)定义类别和模型
        接下来,我们创建了一个YOLOv8Detector对象,这是我们检测模型的核心。通过加载预先训练好的模型权重,我们为即将到来的图像检测准备好了模型。

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的定义,这是我们用户界面的核心。通过继承QMainWindow,我们能够快速搭建一个有标签和窗口的GUI。在这个类中,我们定义了一个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()  # 关闭窗口

(4)主程序流程

        接下来是frame_process函数,这是我们系统的工作核心。每当从摄像头捕获到新的视频帧,都会调用这个函数。首先,使用OpenCV的resize函数调整帧的大小以适配我们的模型输入。然后,模型通过preprocess方法对图像进行预处理,并通过predict方法执行检测。检测后,我们计算预测时间并打印出来。如果检测到杂草,我们就使用drawRectBox函数在图像上绘制边界框和类别标签。

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的实例,以30fps的速度从默认摄像头捕获视频。每处理完一帧,都会触发frame_process函数。QApplication对象管理GUI应用程序的控制流和主设置,而MainWindow实例则是我们的应用程序窗口。

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. 田间杂草检测系统实现

        在设计交互式田间杂草检与识别系统的过程中,系统的设计思路往往决定了其功能的强大与否以及用户体验的好坏。对于交互式田间杂草检测系统的设计,我们采纳了模块化和分层的架构原则,旨在打造一个既高效又易于使用的应用。

5.1 系统设计思路

        在我们的系统设计中,我们将详细探讨设计一个交互式田间杂草检测系统的思路。我们的目标是创建一个易于使用的GUI应用程序,该应用程序能够利用深度学习模型识别和定位图像中的田间杂草。为了实现这一目标,我们采用了一个整合界面、媒体处理和模型预测的全面设计方案。

(1)架构设计
        在构建我们的交互式田间杂草检测系统时,我们采用了一种模块化的系统设计思路,将界面层、处理层和控制层紧密结合,以提供高效、直观的用户体验。这种设计方法不仅确保了每个功能模块的独立性和可维护性,而且通过信号和槽机制的使用,实现了模块间的高效通信和数据传递,为用户带来了流畅的交互体验。
在这里插入图片描述
        界面层(UI Layer)是用户与系统交互的前端,它通过PySide6库构建,以实现直观的图形用户界面。这一层包括了用于展示结果的标签、用于开始和停止检测过程的按钮以及用于显示系统状态的指示器。用户界面的直观设计使得用户即使没有技术背景,也能轻松地操作系统,执行杂草的检测任务。

        处理层(Processing Layer)是系统的核心,由一个高效的YOLOv8模型驱动,负责执行图像的实时处理和杂草的识别任务。该模型通过精确的深度学习算法,能够快速识别和定位图像中的杂草,其高度优化的性能确保了系统可以在实时环境中运行,不会对用户操作产生延迟。

        控制层(Control Layer)则作为系统的中枢神经,协调用户界面和处理层的交互。通过定义一系列槽函数和事件处理机制,控制层响应用户的指令,控制视频流的处理,并将检测结果反馈给用户界面。这样的设计使得系统既灵活又稳健,能够应对各种操作和条件变化,同时保持响应迅速和结果准确。

        整个系统的设计体现了现代软件工程的最佳实践,即关注点分离(Separation of Concerns)。通过将关注点分离,每个部分可以专注于其功能,从而提高了代码的清晰度、可测试性和可扩展性。此外,我们还在系统中集成了详尽的日志和错误处理机制,确保在实际部署中,任何问题都能被迅速识别和解决,从而提高了系统的稳定性和可靠性。

        综上所述,我们的系统不仅提供了高效的田间杂草检测功能,而且还通过友好的用户界面,为用户提供了一种轻松的操作方式。这种结合了先进技术和用户友好设计的系统,是未来农业技术创新的一个典范,能够帮助农业工作者更高效地管理农田,提高农作物的产量和质量。

(2)系统流程

        在本篇博客中,我们将探讨如何使用先进的深度学习技术构建一个交互式田间杂草检测系统,流畅的用户体验和高效的处理流程是设计的核心。系统的旅程从创建MainWindow类的实例开始,这个实例不仅作为用户与应用程序交云的界面,而且也是处理管道的启动核心。用户被迎接以一个直观的界面,它提供了选择图像输入源的选项,无论是实时的摄像头图像流,还是本地的视频文件和静态图片。这种灵活性允许用户根据需要来选择最合适的输入方式。

在这里插入图片描述

  1. 当用户启动应用程序时,系统首先创建了一个MainWindow类的实例。这是整个应用程序的心脏,负责初始化用户界面和设置必要的参数。这个主窗口不仅为用户提供了一个操作的起点,而且通过其精心设计的布局和控件,为用户提供了一个清晰的导航路径。

  2. 应用程序的界面设计非常直观,用户可以轻松选择他们的输入源。输入源的灵活性是系统设计的亮点之一,支持从摄像头实时捕捉图像、从视频文件播放到加载静态图片。这种多输入源的支持使系统在多种场景下都能发挥作用,无论是在田间直接进行实时监控,还是在办公室中分析已有的图像资料。

  3. 用户选择输入源后,系统会调用媒体处理器和相关方法来处理这些输入数据。这个过程可能涉及对摄像头的配置、视频文件的解码读取或是对静态图像文件的加载处理。这一阶段的工作确保了后续步骤能够在优化的数据上运行,为模型提供了标准化的输入。

  4. 一旦输入源准备就绪,系统便进入了一个连续的帧处理循环。在预处理阶段,每一帧图像都会被缩放和归一化,以满足YOLOv8模型的输入要求。紧接着,预处理后的图像被送入YOLOv8模型进行检测和识别。这个过程中,系统不仅能检测杂草的存在,还能对不同的杂草类别进行分类。

  5. 随着检测结果的产生,用户界面将实时更新。检测到的杂草被边界框圈出,并显示相应的类别。此外,界面还提供了展示检测统计数据的表格和图表,使用户能够快速理解当前的检测情况。

  6. 为了提高系统的互动性,用户还可以通过界面中的按钮进行多种操作。这包括保存当前的检测结果、查询系统的作者和版本信息,甚至筛选和分析特定类别的检测结果。用户还可以通过简单的媒体控制,如播放、暂停或停止摄像头捕捉和视频播放,从而更好地管理和分析图像数据。
    在这里插入图片描述

        总体来说,这个田间杂草检测系统不仅提供了一个强大的技术解决方案,同时也兼顾了用户操作的便利性。它体现了高技术和用户体验的完美结合,不仅使得杂草检测变得更加高效,也使得操作过程更加简便。这种设计思路预示着未来农业技术的发展方向,强调了技术的可访问性和实用性。

5.2 登录与账户管理

        在这个数字化和个性化需求日益增长的时代,为用户提供一个安全且可定制的使用环境已经成为软件设计的重要组成部分。我们的交互式田间杂草检测系统在这一点上尤为突出,它不仅提供了强大的病害识别功能,还配备了完善的用户登录与账户管理系统,确保了每个用户都能拥有一个安全且私人的操作空间。

在这里插入图片描述

        在本系统中,当用户启动应用程序时,系统立即初始化并展示一个基于PySide6构建的登陆界面,这是用户与系统交互的第一步。这个界面不仅简洁美观,而且功能全面,提供账号注册、密码修改、个性化头像设置等选项。每个用户都可以通过注册创建一个独立的账户,系统将在SQLite数据库中为每个用户保留一个私人空间,用户可以在这个空间内保存自己的设置和检测历史记录。

        一旦登录成功,用户便进入主界面。在这里,用户可以选择输入源,包括实时摄像头捕捉的图像、视频文件或静态图片。系统后端会根据用户选择的输入源,配置摄像头或加载文件,为检测任务做好准备。实时视频或图像经过预处理后,送入先进的YOLOv8模型进行精确的杂草检测和识别,模型将以矩形框标出杂草的位置,并在界面上实时显示检测结果。
        主界面设计精心,不仅显示实时检测框和类别,还包括置信度信息。用户可以通过按钮来控制媒体播放,如启动或停止视频流,或分析批量文件。此外,界面还提供了查询作者和版本信息、保存检测结果和筛选特定检测结果的功能,让用户能够更方便地管理和分析检测数据。

在这里插入图片描述

        为了进一步增强用户体验,我们在登录界面加入了密码修改、头像设置和账户注销等功能。这些个性化的服务使得用户能够根据自己的喜好和需求调整系统设置,提供了更高层次的用户定制性和便捷性。用户的所有个人信息和设置都受到系统的保护,确保了数据的安全和隐私。

        总的来说,我们的系统不仅实现了基于最新深度学习模型的田间杂草检测,而且通过一个完善的用户管理界面,提供了注册、登录、个性设置和结果管理等一系列高级功能。这不仅提升了用户的操作体验,也为研究人员和农业工作者提供了一个强大的工具,以支持他们在田间杂草管理中的决策。


下载链接

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

在这里插入图片描述

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

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

在这里插入图片描述

    在文件夹下的资源显示如下,下面的链接中也给出了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, Divvala S, Girshick R, et al. You only look once: Unified, real-time object detection[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 779-788. ↩︎

  2. Bochkovskiy A, Wang C Y, Liao H Y M. Yolov4: Optimal speed and accuracy of object detection[J]. arXiv preprint arXiv:2004.10934, 2020. ↩︎

  3. 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. ↩︎

  4. 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. ↩︎

  5. Terven J, Cordova-Esparza D. A comprehensive review of YOLO: From YOLOv1 to YOLOv8 and beyond[J]. arXiv preprint arXiv:2304.00501, 2023. ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1512330.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提前爆料:绝地求生七周年预告片餐厅改版,七周年主题战术手套

七周年预告片刚刚在官博上线,让我们一起逐帧分析一下都有哪些皮肤吧。 开局就是一个七周年喷漆 然后出生岛手里会拿着七周年的蛋糕,互相丢。 艾伦格的餐厅们进行改版,成为七周年主题 餐厅内有一个七周年的饮料机,不知道是不是和米…

浅淡 C++ 与 C++ 入门

我们知道,C语言是结构化和模块化的语言,适用于较小规模的程序。而当解决复杂问题,需要高度抽象和建模时,C语言则不合适,而C正是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库…

C++的类和对象(六):友元、内部类

目录 友元 友元函数 友元类 内部类 匿名对象 拷贝对象时的一些编译器优化 再次理解类和对象 友元 基本概念:友元提供了一种突破封装的方式,有时提供了便利,但是友元会增加耦合度,破坏了封装,所以友元不宜多用&…

数据结构 第1章:绪论

文章目录 1. 绪论1.1. 数据结构 1.2. 算法1.2.1. 算法的基本概念1.2.2. 算法的时间复杂度1.2.3. 算法的空间复杂度 1. 绪论 程序 数据结构 算法 1.1. 数据结构 数据:是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理…

【YOLOv9】训练模型权重 YOLOv9.pt 重新参数化轻量转为 YOLOv9-converted.pt

【YOLOv9】训练模型权重 YOLOv9.pt 重新参数化轻量转为 YOLOv9-converted.pt 1. 模型权重准备2. 模型重新参数化2.1 文件准备2.2 参数修改2.3 重新参数化过程 3. 重新参数化后模型推理3.1 推理超参数配置3.2 模型推理及对比 4. onnx 模型导出(补充内容)4…

MathType7最新软件产品秘钥2024中文版

MathType 7是一款功能强大的数学公式编辑器,专为教育工作者、学生、科研人员以及任何需要处理数学公式的人群设计。以下是对MathType 7的详细介绍: 一、功能特点: 广泛的符号和模板支持:MathType 7支持各种数学符号、公式、方程…

OpenAI:ChatGPT API 文档之 Embedding

在自然语言处理和机器学习领域,"embeddings" 是指将单词、短语或文本转换成连续向量空间的过程。这个向量空间通常被称为嵌入空间(embedding space),而生成的向量则称为嵌入向量(embedding vector&#xff0…

基于支持向量机SVM的沉降预测,SVM详细原理,Libsvm详解

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 完整代码和数据下载链接:基于支持向量机SVM的沉降预测资源-CSDN文库 https://download.csdn.net/download/abc991835105/88947544 SVM应用实例,基于支持向量机SVM的沉降预测…

LED基础知识分享(一)

大家好,我是砖一。 今天给大家分享一下,LED的基础知识,有照明行业,或者对LED感兴趣的朋友,可以学习一下,希望对你有用~ 一,什么是LED (Light Emitting Diode)? 1,LED是一种发出某…

力扣面试经典150 —— 16-20题

力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题,安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题,文中 “数组” 通常指 python 列表;文中 “指针” 通常指 python 列表索引 文章目录 16. [困难] 接…

深度学习——第10章 优化神经网络:如何防止过拟合(DNN)

第10章 优化神经网络:如何防止过拟合(DNN) 目录 10.1 什么是过拟合 10.2 L1、L2正则化 10.3 L2正则化的物理解释 10.4 Dropout正则化 10.5 其它正则化技巧 10.6 总结 上一课,我们一步步搭建了一个深层神经网络来实现图片的分类。结果显示,随着网络层数加深,隐藏层数…

【力扣 - 合并区间】

题目描述 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [start_i, end_i] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入:int…

剑指offer C ++双栈实现队列

1. 基础 队列:先进先出,即插入数据在队尾进行,删除数据在队头进行; 栈:后进先出,即插入与删除数据均在栈顶进行。 2. 思路 两个栈实现一个队列的思想:用pushStack栈作为push数据的栈&#xff…

Linux 多进程开发(下)

第二章 Linux 多进程开发 2.6 进程间通信2.6.1 匿名管道2.6.2 有名管道2.6.3 内存映射2.6.4 信号2.6.5 共享内存 2.7 守护进程 网络编程系列文章: 第1章 Linux系统编程入门(上) 第1章 Linux系统编程入门(下) 第2章 L…

word中图片位置问题(后续遇到问题再更新)

问题1:图片插入后显示不全 具体表现为:复制黏贴、或者插入图片后,出现插入的图片显示不全,或者不显示。 例如: 这是因为:图片被设定了固定行距 解决方案:ctrl1 效果: 问题2&am…

南昌云宸网络发展有限公司-小分类客户可自选

南昌云辰网络发展有限公司是华东地区最大的互联网公司。 公司业务涉及互联网营销策划、移动互联网、物联网、广告传媒、微电影、***等,依托以互联网技术为核心的B2B企业贸易平台和O2O电子商务平台,提供为用户提供一站式网络营销策划和解决方案。 &#…

String类(C++)详解与应用

1. 标准库中的string类 1.1 string类 http://www.cplusplus.com/reference/string/string/?kwstringhttp://www.cplusplus.com/reference/string/string/?kwstring1. 字符串是表示字符序列的类2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的…

【数据库】Oracle内存结构与参数调优

Oracle内存结构与参数调优 Oracle 内存结构概览oracle参数配置概览重要参数(系统运行前配置):次要参数(可在系统运行后再优化调整): Oracle数据库服务器参数如何调整OLTP内存分配操作系统核心参数配置Disabling ASMM(禁…

力扣--课程表--bfs+dfs

整体思路: 这是一道拓扑序列的题目,我们将边的方向定义成从先修课指向后修课的方向,借一下官方的题解图片,我们需要判断的是形成的这个图结构是否存在环,如果存在环,那么代表不能完成所有课程的学习。 bfs思…

【leetcode】相同的树➕对称二叉树➕另一棵树的子树

大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一. 相同的树二. 对称二叉树三. 另一棵树的子树 一. 相同的树 点击查看题目 思路: bool isSameTree(…