摘要:本篇博客介绍了一种基于深度学习的花卉检测与识别系统,并详细展示了其实现代码。系统采取先进的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期版本进行了比较,展示了其在图像、视频、实时视频流及批量文件中识别花卉的高准确度。文章深入阐释了YOLOv8的工作机制,并配备了相应的Python代码实现、用于模型训练的数据集,以及一个基于PySide6的用户界面。该系统不仅实现了对花卉的精准识别和分类,还提供了包括用户认证管理、模型快速切换及界面个性化定制在内的多项功能,为了方便研究人员和深度学习初学者,本文还包含了完整的代码资源和数据集的下载链接。本文结构如下:
目录演示与介绍视频:https://www.bilibili.com/video/BV1LH4y177QM/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZuZl5du
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuZk51p
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuZl5dr
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuZl5Zx
前言
花卉检测与识别系统在现代农业科技、生态保护、城市规划以及教育领域中扮演着越来越重要的角色。随着人工智能和机器视觉技术的飞速发展,利用这些先进技术进行花卉识别不仅可以极大提高工作效率,还能在保护生物多样性、推动科学研究等方面发挥关键作用。尤其是在大数据时代背景下,通过自动化的方式准确快速地识别和分类各种花卉成为了一个挑战性任务,但同时也是技术进步的重要驱动力。
精准的花卉识别技术可以助力于精确农业,提高作物产量和质量,减少化学肥料和农药的使用,从而保护环境和提升农业可持续性。此外,对于生物多样性的研究和保护而言,能够有效识别不同种类的花卉是至关重要的一步,它有助于监测生态系统的健康状态,预警可能的环境变化。
近年来,花卉检测与识别领域的研究进展显著,多得益于深度学习技术的快速发展。尤其是YOLO系列算法的更新和优化,为这一领域带来了突破性的进展。YOLOv5[1]自推出以来,因其出色的平衡性能和速度而被广泛应用于实时花卉识别任务中。随后,YOLOv6[2]和YOLOv7[3]的发布,进一步提高了检测速度和准确性,使得在更复杂的自然环境下进行花卉检测成为可能。最新版本的YOLOv8[4],通过引入更高效的网络架构和训练技巧,实现了在保持高速度的同时,进一步提升了模型的准确率和鲁棒性。
除了YOLO系列,其他如Faster R-CNN、SSD[5]以及EfficientDet等算法也在花卉识别任务中表现出色。Faster R-CNN通过引入区域建议网络(RPN),大幅提高了检测的准确性,尤其是在处理背景复杂或花卉种类繁多的场景时。SSD算法以其高效的一步检测过程,在保证较高准确率的同时,也实现了快速检测。EfficientDet则通过优化模型结构和缩放方法,实现了在多种规模的数据集上的高效检测,证明了其在资源受限环境下的适用性。
针对花卉检测与识别领域,数据集的质量和多样性是推动算法进步的重要因素。近期的研究工作中,不仅关注于算法的性能优化,也着重于构建和扩充高质量的花卉图像数据集。这些数据集不仅包含了丰富的花卉种类,还提供了各种光照、角度和背景下的花卉图像,为深度学习模型的训练和验证提供了宝贵的资源。
尽管取得了显著的进展,花卉检测与识别技术仍面临着诸多挑战,包括如何在极低光照条件下提高识别准确性、如何处理花卉种类间的细微差异、以及如何优化模型以适应不同的计算资源限制等。未来的研究方向可能会聚焦于通过算法创新和数据集扩展,来解决这些问题。同时,融合多模态数据(如图像、声音和气味数据)进行花卉识别,以及利用迁移学习和少样本学习技术来提高模型的泛化能力和适应性,也是值得探索的领域。
本博客在花卉检测与识别领域的研究与实践中做出了显著贡献,旨在通过最先进的技术手段,为该领域的研究者和从业者提供一套全面、高效的解决方案。通过综合运用YOLOv8算法、PySide6库等技术,本文不仅展示了如何构建一个高性能的花卉检测与识别系统,还深入探讨了算法原理,分享了实用的开发技巧和丰富的资源。以下是本文的主要贡献:
- 采用最先进的YOLOv8算法进行花卉检测与识别:本文详细介绍了YOLOv8算法在花卉检测与识别中的应用,并与先前版本的YOLO算法(v7、v6、v5)进行了细致的对比分析。这一部分不仅高亮了YOLOv8在效率和精准度方面的显著优势,也为读者提供了一种新的视角来理解目标检测技术的发展趋势及其在特定领域内的应用潜力。
- 利用PySide6实现友好的系统界面:通过引入PySide6库,本文展示了如何开发一个用户友好的花卉检测与识别系统界面,使得用户能够更直观、便捷地进行花卉识别。这种设计思路不仅提升了用户体验,也为将深度学习技术应用于实际问题提供了一个实用的范例。
- 包含登录管理功能:引入登录管理功能,本文为系统安全性和后续功能扩展提供了坚实的基础。这一设计体现了在开发实用技术解决方案时,对用户个性化需求和系统安全性的深刻理解。
- 对YOLOv8模型的深入研究:本文不仅应用了YOLOv8算法,还对其性能进行了全面的评估,包括精准度、召回率以及在不同条件下的表现等。这些研究成果为读者深入理解YOLOv8算法提供了宝贵的信息,并为算法的进一步优化和应用奠定了基础。
- 提供完整的数据集和代码资源包:通过分享完整的数据集和代码资源包,本文极大地降低了读者复现实验结果和进行后续研究的门槛。这不仅体现了开放科学的精神,也为推动花卉检测与识别技术的发展和应用提供了实用的支持。
1.数据集介绍
在花卉检测与识别的领域中,拥有一个高质量、结构良好的数据集对于训练准确的机器学习模型至关重要。我们精心构建的数据集包含了总计10513幅图像,旨在提供一个综合性的资源以支持和促进花卉识别技术的发展。本数据集中的图像由9131幅训练集、919幅验证集以及463幅测试集组成,通过这种划分,保证了模型能在广泛的数据上学习,同时也能够在独立的数据上进行有效的验证和测试。
为了提高训练过程的质量和最终模型的性能,本数据集中的每幅图像都经过了精心的预处理。图像的自动定向校正确保了所有图片的方向一致,同时去除了可能引起模型混淆的EXIF方向信息。此外,所有图像都被统一调整到640x640像素的分辨率,这一标准化的尺寸不仅有利于模型处理,也通过拉伸方法保持了图像的整体比例。为了强化模型对于花卉特征的识别能力,我们还应用了自适应均衡化技术来自动增强图像对比度,从而使得图像中的花卉特征更为突出,便于模型学习。
通过对本数据集进行深入的分析,我们发现了几个关键的分布特性。首先,类别分布的不平衡提出了一个普遍存在的挑战,即模型可能倾向于更频繁识别实例数量较多的类别。例如,Allium类别的花卉在数据集中占据了绝大多数,而Gardenia类别的花卉数量则相对较少。这种不平衡的现象需要通过特定的数据增强策略来解决,比如过采样少数类别或者在损失函数中加入类别权重。
进一步分析边界框分布情况揭示了花卉在图像中的位置倾向。我们注意到,大部分花卉的边界框集中在图像的中心区域,这可能是由于花卉在拍摄时通常被置于中心位置。虽然这有助于模型学习中心区域的特征,但同时我们也需要注意提高模型对图像边缘区域的关注,以提升模型在不同场景下的泛化能力。
边界框大小的分布分析显示,绝大多数花卉的边界框宽度和高度集中在较小的范围内,这表明数据集中包含了大量中小型花卉。这一发现对于设计目标检测算法至关重要,因为模型需要能够准确地识别图像中的小型对象,同时对大尺寸对象保持敏感。博主使用的类别代码如下:
Chinese_name = {'15': "15", 'Allium': "大葱花", 'Borage': "琉璃苣", 'Burdock': "牛蒡", 'Calendula': "金盏花",
'Chicory': "菊苣", 'Chive blossoms': "韭菜花", 'Coltsfoot': "款冬", 'Common mallow': "锦葵",
'Common yarrow': "洋蓍草", 'Coneflower': "金光菊", 'Cow parsley': "欧芹", 'Dandelion': "蒲公英",
'Gardenia': "栀子花"}
总的来说,这个详尽的花卉图像数据集为研究人员和技术开发者提供了一个丰富的资源,以探索和发展先进的花卉检测与识别技术。通过对数据集的深入理解和合理的处理,可以为深度学习模型的训练打下坚实的基础,进而提升模型在实际应用中的表现和可靠性。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行花卉检测的图片或视频,或者启动摄像头进行实时检测。在进行花卉检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
Ultralytics公司于2023年初发布YOLOv8模型,其在公开的数据集上的检测准确率和速度均超过其他YOLO系列的算法模型。
YOLOv8在输入处理方面采用了Mosaic数据增强技术,这是一种混合式的数据增强手段。它的工作原理是将四张训练图像以一定的比例随机组合到一起,形成一个新的、更丰富的训练样本。这种方法不仅增加了场景的复杂性,模拟了更多的现实情况,而且有效地扩展了训练数据集的大小,有助于模型学习到更多样化的特征,从而提高其泛化能力。更重要的是,Mosaic数据增强能够使得模型在训练过程中同时观察到多个目标,这对于处理实际应用中常见的多目标场景至关重要。
YOLOv8的Backbone是其算法核心,由CSP(Cross Stage Partial networks)、C2F(Cross Feature Pyramid Networks)和SPPF(Spatial Pyramid Pooling Faster)构成。CSP主要用于实现轻量级的特征提取,通过部分连接的策略,能够减少计算量同时保持网络深度和宽度,使得特征提取过程更加高效。C2F是一种特征金字塔网络,它在不同的网络层次上进行特征的融合,通过这种方式,模型能够同时利用浅层和深层特征,增强对不同尺寸目标的检测能力。而SPPF是对传统空间金字塔池化(SPP)的改进,它在提取多尺度空间特征的同时加速了计算过程,这一点对于实时检测系统至关重要。
YOLOv8的Neck部分继续沿用了YOLOv5的设计理念,即采用了特征金字塔网络(Feature Pyramid Network, FPN)来增强模型在不同尺度上的特征提取能力。FPN通过顶部到底部的多尺度特征融合,能够保证模型在检测不同大小的对象时都能有良好的表现。此外,YOLOv8还集成了路径聚合网络(Path Aggregation Network, PAN)的结构,这一结构通过更有效的信息流通路,进一步优化了特征融合,增强了网络对小尺寸目标的识别能力。这种结合FPN和PAN的网络设计,不仅提升了特征的表示能力,同时也优化了计算效率。
在YOLOv8的Head部分,作者采用了解耦头(Decoupled Head)的设计,这种设计与传统的耦合头(Coupled Head)相比,将分类和定位任务分离,使得模型在训练时能够更加专注于各自的任务,从而提高了模型的性能。此外,YOLOv8不再使用基于锚点(Anchor-Based)的方法来预测边界框,而是采用了无锚点(Anchor-Free)的方法来直接预测边界框的中心点和其他关键参数,简化了模型的设计同时减少了对先验知识的依赖。
在总体设计上,YOLOv8相比其前身YOLOv7、YOLOv6等版本,在算法结构上进行了精简和优化。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模型训练中使用的一些重要超参数及其设置:
超参数 | 设置 | 说明 |
---|---|---|
学习率(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库来解析数据集配置文件,以及ultralytics中的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"
进入主执行环节,我们首先定义了一些基本参数,如工作进程数量和批处理大小。然后,我们设定了数据集的名称,并通过自定义的abs_path函数构建了数据集配置文件的路径。
if __name__ == '__main__': # 确保该模块被直接运行时才执行以下代码
workers = 1
batch = 8
data_name = "Flower"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current') # 数据集的yaml的绝对路径
unix_style_path = data_path.replace(os.sep, '/')
接下来,我们读取YAML配置文件,该文件包含了关于数据集的重要信息,例如训练和验证图像的路径。我们还进行了一些必要的修改,以确保文件路径的准确性。
# 获取目录路径
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)
最关键的部分是模型的加载和训练过程。我们使用YOLO类创建了一个模型实例,并加载了预训练的权重。然后,调用train方法开始训练过程。在这个过程中,我们指定了数据集的配置文件路径、设备、工作进程的数量、输入图像的尺寸、训练周期(epochs)的数量以及批处理大小。
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)和目标损失(obj_loss)。训练损失(train/box_loss, train/cls_loss, train/obj_loss)在训练过程中持续下降,这表明模型在学习如何更准确地识别和分类训练集中的花卉图像。边界框损失的下降表示模型在定位花卉的边界框方面变得更精确,而分类损失的降低则意味着模型在区分不同类别的花卉上变得更为准确。目标损失的降低表明模型在预测一个给定区域是否包含目标对象上的表现也在提升。
另一方面,验证损失(val/box_loss, val/cls_loss, val/obj_loss)在一开始的下降之后呈现出波动,并在某些点上出现轻微的上升,这可能是过拟合的早期迹象,也可能是由于验证集的难度较大或者样本不足导致的。不过,总体来看,验证损失保持在一个相对稳定的范围内,这表明模型具有一定的泛化能力。
精确度(precision)和召回率(recall)是评估模型性能的另外两个关键指标。精确度反映了模型识别正确的花卉边界框与所有识别出的花卉边界框的比例,而召回率衡量了模型识别正确的花卉边界框占所有实际花卉边界框的比例。从图中可以看到,精确度和召回率在经历了初期的快速提升后,进入一个相对平稳的状态。这种趋势通常表明模型在学习过程中已经达到了性能的瓶颈,需要进一步的调整或者更多的数据来提升性能。最后,我们观察平均精度均值(mAP)的曲线,特别是在不同的IoU(Intersection over Union)阈值下的mAP(mAP50和mAP50-95)。mAP是目标检测领域中的标准评价指标,它结合了精确度和召回率,提供了模型性能的综合评估。mAP50指的是在IoU阈值为0.5时的mAP,而mAP50-95是在IoU从0.5到0.95(以0.05为步长)的所有阈值上的mAP的平均值。在这个案例中,mAP50和mAP50-95都呈现出上升的趋势,尤其是mAP50的提升更为显著,这表明模型在识别较为明显的花卉对象上表现得相当好。
下图为博主训练花卉检测的F1曲线图。首先,我们注意到每个类别的曲线形状大致相同,先上升后下降,这是因为随着置信度阈值的增加,模型越来越“挑剔”:只有当它对某个检测结果非常有信心时才会将其视为正例。在阈值较低时,模型能够检测到更多的正例(包括真正例和假正例),随着阈值提高,假正例数量减少,真正例也可能因为不够置信而被错过,这解释了F1分数先升后降的趋势。
F1曲线的峰值表示了模型在特定置信度下的最佳平衡点,即精确度和召回率的最优结合。从图中可以看到,不同类别的最高F1分数各不相同,这表明模型对某些类别的识别更为精准。例如,Allium类(蓝色曲线)的F1分数在较高的置信度阈值下仍然保持相对较高的水平,而Gardenia类(深蓝色曲线)的F1分数在所有类别中最低,这可能是由于Gardenia的特征不如Allium那样明显或者训练样本不足造成的。
另一个值得注意的特征是所有类别的平均F1分数(灰色曲线),它在置信度阈值约为0.45时达到峰值,大约为0.7。这个值为我们提供了模型整体性能的快照,表明模型在此置信度阈值下对多数类别具有良好的识别能力。然而,考虑到不同类别的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.743 | 0.748 | 0.705 | 0.745 |
F1-Score | 0.70 | 0.72 | 0.68 | 0.70 |
(3)实验结果分析:
在我们的实验中,YOLOv6n以0.748的mAP表现最佳,这表明它在整体上对于不同的置信度阈值具有更好的识别精度。YOLOv5nu和YOLOv8n的表现相当,mAP分别为0.743和0.745,仅略低于YOLOv6n,而YOLOv7-tiny以0.705的mAP排在最后。这可能是因为YOLOv7-tiny是一个更轻量级的模型,通常意味着它的参数更少,对于复杂任务的表现可能会略逊一筹。
接下来,我们来看F1-Score,这是精确度和召回率的调和平均,能够平衡模型对正类的识别能力与对检测出的所有正类样本的准确性。在这项指标上,YOLOv6n以0.72的得分领先,显示出它在识别正确的对象和减少误识别方面的能力较强。YOLOv5nu和YOLOv8n的F1-Score相同,为0.70,这意味着它们在识别正确的目标对象和保持较低误报率之间取得了平衡。YOLOv7-tiny的F1-Score为0.68,是四者中最低的,进一步强调了它在处理这一数据集时的局限性。
这些结果表明,在选用YOLO算法进行特定任务时,需要考虑不同版本之间性能的微妙差异。YOLOv6n在这项实验中展现了它在精度和F1-Score上的优势,可能是由于其更先进的架构设计和优化策略。然而,YOLOv5nu和YOLOv8n的表现仍然非常接近,并且与YOLOv6n的差距微乎其微,这表明这些版本在不断进化和改进中。YOLOv7-tiny的性能稍微落后一些,但对于需要轻量级模型的应用场景仍然是一个可行的选择。
在选择适合的YOLO版本时,除了考虑精度和F1-Score之外,还应考虑模型的复杂性、速度以及对计算资源的需求。一般来说,更轻量级的模型如YOLOv7-tiny可能在速度上有优势,适合在计算资源受限的设备上部署。而在资源充足的情况下,选择YOLOv6n或YOLOv8n可能会获得更优的识别效果。因此,在实际应用中,应根据具体需求和资源限制来选择合适的模型版本。
4.4 代码实现
在这一节中,我们将深入探讨如何使用Python和YOLOv8构建一个实时花卉检测系统。这个系统能够识别视频流中的不同花卉,并且将检测结果实时显示在用户界面上。我们使用的是PySide6来构建GUI,YOLOv8来进行物体检测,以及OpenCV来处理视频流。
在实时花卉检测与识别系统中,结合YOLOv8模型和一系列开源库,如OpenCV、QtFusion和PySide6等,来实现主窗口的展示、摄像头帧的处理以及花卉的检测和标注等功能。
(1)导入必要的模块和配置
首先,我们导入必要的库。sys用于访问与Python解释器紧密相关的变量和函数,time提供了一系列处理时间的函数。
import sys # 导入sys模块,用于处理Python运行时环境的一些操作
import time # 导入time模块,用于处理时间相关的操作
import cv2 # 导入OpenCV库,用于处理图像和视频
from QtFusion.path import abs_path
from QtFusion.config import QF_Config
from QtFusion.widgets import QMainWindow # 从QtFusion库中导入FBaseWindow类,用于创建主窗口
from QtFusion.handlers import MediaHandler # 从QtFusion库中导入MediaHandler类,用于处理媒体数据
from QtFusion.utils import drawRectBox # 从QtFusion库中导入drawRectBox函数,用于在图像上绘制矩形框
from QtFusion.utils import get_cls_color # 从QtFusion库中导入get_cls_color函数,用于获取类别颜色
from PySide6 import QtWidgets, QtCore # 导入PySide6库的QtWidgets和QtCore模块,用于创建GUI和处理Qt的核心功能
from YOLOv8Model import YOLOv8Detector # 从YOLOv8Model模块中导入YOLOv8Detector类,用于进行YOLOv8物体检测
from datasets.Flower.label_name import Label_list
QF_Config.set_verbose(False)
这一部分主要负责导入各种模块。random用于随机颜色生成。cv2是图像处理的核心,而QtFusion和PySide6则用于构建用户界面。YOLOv8Detector是进行目标检测的关键类。
(2)定义类别和模型
我们初始化YOLOv8模型并加载预训练权重。get_cls_color函数用于为不同的花卉类别生成不同的颜色,以便在可视化时区分。
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,它是用户界面的主窗口。在这个类中,我们创建了一个标签来显示视频流,并定义了一个键盘事件处理函数来监听用户的按键操作,例如按下Q键退出程序。
class MainWindow(QMainWindow): # 定义MainWindow类,继承自FBaseWindow类
def __init__(self): # 定义构造函数
super().__init__() # 调用父类的构造函数
self.resize(850, 500) # 设置窗口的大小为850x500
self.label = QtWidgets.QLabel(self) # 创建一个QLabel对象,用于显示图像
self.label.setGeometry(0, 0, 850, 500) # 设置QLabel的位置和大小
def keyPressEvent(self, event): # 定义键盘按键事件处理函数
if event.key() == QtCore.Qt.Key.Key_Q: # 如果按下的是Q键
self.close() # 关闭窗口
frame_process函数是视频流的处理核心。我们调整每一帧的大小,然后使用YOLOv8模型进行预测。对于检测到的每个对象,我们使用drawRectBox函数绘制边界框和类别标签。此外,还打印出处理每一帧所需的时间。
def frame_process(image): # 定义帧处理函数,用于处理每一帧图像
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 # 计算预测所花费的时间
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上显示图像
(4)主程序流程
最后,我们设置了视频处理的媒体处理器MediaHandler,它负责从视频文件中读取帧并发送给frame_process函数处理。随后启动了应用程序的主循环。
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
filename = abs_path("test_media/花卉测试视频.mp4", path_type="current") # 定义视频文件的路径
videoHandler = MediaHandler(fps=30) # 创建MediaHandler对象,设置帧率为30fps
videoHandler.frameReady.connect(frame_process) # 当有新的帧准备好时,调用frame_process函数进行处理
videoHandler.setDevice(filename) # 设置视频源
videoHandler.startMedia() # 开始处理媒体
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
以上代码片段构成了一个完整的实时花卉检测系统。从视频文件读取帧,实时处理并在GUI中显示结果,整个流程呈现了深度学习模型与现代应用程序界面结合的强大能力。通过这样的系统,我们不仅可以展示YOLOv8模型的实时处理能力,还能够以直观的方式展示花卉检测的结果,这对于教学展示、科研实验甚至商业应用都具有重要意义。
5. 花卉检测与识别系统实现
在实现一款实时花卉检测与识别系统时,采用面向对象的设计思路,依赖Python语言和多种开源库如Pyside6、QtFusion、Pytorch等。其中,重要的MainWindow类是系统的主体,负责提供用户界面来控制输入源、进行花卉检测与识别,并展示检测结果。以下将详细介绍其设计思路、架构设计以及整个流程。
5.1 系统设计思路
在现代计算机视觉应用中,用户体验同样重要,特别是当涉及到复杂的技术如物体检测时。我们的系统设计思路以用户友好性为核心,旨在创建一个交互式的花卉检测与识别系统。这不仅要求系统能够准确识别图像中的花卉,还要能够以直观的方式呈现结果,让用户能够轻松地与之交互。为了实现这一目标,我们采取了一个综合的设计方案,该方案整合了界面、媒体处理和模型预测。
(1)架构设计
在MainWindow类的架构设计中,采用了处理层、界面层、控制层的设计模式。这个系统的设计充分考虑了用户体验和系统性能,通过合理的架构设计和技术选型,实现了一个高效且易于使用的花卉检测与识别系统。
- 处理层(Processing Layer):此层的核心是YOLOv8Detector类,它封装了YOLOv8模型及其预处理和后处理方法。这个类负责执行花卉的检测和识别任务,它利用先进的深度学习算法来分析图像数据并识别出各种花卉。此层是性能的关键,因为检测的准确性直接影响用户对系统的信任度。
- 界面层(UI Layer):由Ui_MainWindow类构建而成,提供了用户交互的所有元素。这个层面专注于用户体验,包括布局设计、响应式按钮、实时更新的图像显示区域以及其他可视化反馈。通过清晰和直观的界面,用户可以轻松地上传图像、启动检测过程,并查看结果。
- 控制层(Control Layer):作为沟通界面层和处理层的桥梁,MainWindow类还包含了处理用户输入和调度任务的逻辑。它响应用户的交互,如点击按钮,控制媒体处理器开始处理视频流,并将预测结果传递回界面层以供显示。控制层确保了系统的响应性和灵活性,可以根据用户需求或者上下文改变其行为。
通过这三层的紧密合作,我们的系统不仅仅是一个简单的检测工具,而是一个全面的花卉识别解决方案。用户可以观看系统实时处理视频流,检测到的花卉会被框选并标记,同时系统界面会显示关键的检测信息,如花卉名称和置信度。此外,我们还利用信号和槽机制来优化模块间的数据传输和处理流程,提高了系统的整体效率和稳定性。
(2)系统流程
在本博客中,我们将详细探讨构建一个基于YOLOv8的交互式花卉检测与识别系统的流程。这个系统不仅能够实时识别花卉,还能让用户直观地看到识别结果并与之互动。现在,让我们一探究竟,如何从启动应用到展示结果的每一个步骤都设计得既直观又高效。
-
首先,用户打开应用程序,系统便会实例化MainWindow类。这个关键的类是应用程序的脊梁,它负责布局界面,初始化参数,并提供用户操作的起点。MainWindow不仅包括了屏幕上的按钮和标签,也预设了后续处理所需的所有基础配置。
-
用户在启动应用后所见的直观界面是他们与系统互动的主要场所。这里,用户可以选择他们的输入源:实时的摄像头图像、预先录制的视频文件,或是单一的静态图片。系统设计得足够灵活,以适应不同用户的不同需求。
-
确定输入源后,程序调用媒体处理器开始处理输入数据。如果用户选择了摄像头作为输入源,系统会配置摄像头并开始捕捉图像;如果是视频文件或静态图像,系统则会相应地读取或加载这些文件。
-
媒体输入源就绪后,系统进入一个连续的帧处理循环。在预处理阶段,系统对每一帧图像执行一系列操作,如缩放和色彩空间转换,以确保图像满足YOLO模型的输入要求。经过预处理的图像接下来被送入YOLOv8模型进行检测与识别,模型会准确地输出花卉的位置和类别。
-
检测结果一旦产生,系统界面便会实时更新。用户可以看到每一朵花卉周围的检测框,以及它们的类别标签。系统还会在界面上实时显示统计数据,如检测到的花卉数量和类别分布,这些都通过表格或图形的形式直观展现。
-
此外,系统还提供了丰富的交互功能。用户可以通过点击按钮来保存结果、查看帮助信息或筛选特定类别的花卉。在用户与系统的互动中,实时反馈和无缝操作是我们设计的重点。
-
最后,用户对媒体播放有完全的控制权。他们可以随时开始或停止摄像头捕捉、视频播放或图像分析,这提供了一个灵活的使用环境,适应用户的各种操作习惯。
总的来说,这个花卉检测与识别系统的设计思路是围绕“用户友好”和“高效互动”展开的。从流畅的用户界面到准确的模型预测,再到实时的结果展示,每一步都旨在提供无缝且富有成效的用户体验。通过这种方式,我们不仅提升了技术的可访问性,也为用户提供了一个强大的工具,以探索和了解他们所处环境中的花卉多样性。
5.2 登录与账户管理
在构建一个全面的花卉检测与识别系统时,用户管理模块同样扮演着重要角色。为此,我们特意设计了一个功能完备的用户登录与账户管理界面,确保每个用户都能在一个安全且私有的环境中使用系统。这一设计不仅增强了用户体验,也提升了系统的安全性和个性化。
系统的用户管理功能建立在PySide6的强大界面构建能力之上,结合了SQLite数据库的轻量级数据管理特性。我们提供了全套的账户管理工具:从账户注册到密码修改,再到头像设置,用户可以轻松地定制个人账户。此外,系统还支持账户注销和重新登录功能,确保用户能在需要时保护自己的隐私和数据安全。
在用户完成注册并登录后,他们便可以进入主界面进行花卉检测与识别的核心任务。用户的所有检测结果和个人设置都与其账户绑定,因此,不同用户的数据和配置信息是相互独立的。这意味着用户可以在系统中存储个性化的信息,如检测偏好和历史记录,而这些信息将为他们提供一个更加定制化的体验。
登录界面的设计旨在简化用户的操作流程,使用户能够快速而直观地访问系统的各项功能。密码修改和头像设置等选项增添了系统的个性化特色,让用户可以有更多自定义体验,这些小细节的关注体现了我们对用户需求的深刻理解。
这个花卉检测与识别系统不仅具备强大的图像处理能力,还能通过主界面实时显示包括检测框、类别及置信度等信息,支持多种输入模式,如图片、视频、实时摄像头捕捉和批量文件处理。系统的设计确保了用户在实时目标检测的场景下,可以便捷地管理自己的数据和设置,而不必担心隐私泄露或数据丢失。
综合以上功能,我们的系统提供了一个完整的解决方案,不仅在技术层面满足了花卉检测与识别的需求,还在用户交互和管理层面提供了丰富的功能和优质的体验。用户管理的添加,不仅仅是功能层面的扩展,更是我们对用户尊重和服务的体现。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1LH4y177QM/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZuZl5du
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuZk51p
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuZl5dr
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuZl5Zx
在文件夹下的资源显示如下,下面的链接中也给出了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等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的花卉检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Wu W, Liu H, Li L, et al. Application of local fully Convolutional Neural Network combined with YOLO v5 algorithm in small target detection of remote sensing image[J]. PloS one, 2021, 16(10): e0259283. ↩︎
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. ↩︎
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. ↩︎
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. ↩︎
Liu W, Anguelov D, Erhan D, et al. Ssd: Single shot multibox detector[C]//Computer Vision–ECCV 2016: 14th European Conference, Amsterdam, The Netherlands, October 11–14, 2016, Proceedings, Part I 14. Springer International Publishing, 2016: 21-37. ↩︎