基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的多种类动物识别(Python+PySide6界面+训练代码)
摘要:本篇博客详细讲述了如何利用深度学习构建一个多类动物识别系统,并且提供了完整的实现代码。该系统基于强大的YOLOv8算法,并进行了与前代算法YOLOv7、YOLOv6、YOLOv5的细致对比,展示了其在图像、视频、实时视频流和批量文件处理中识别多种类动物的准确性。文章深入讲解了YOLOv8算法的底层原理,提供了相应的Python代码、用于训练的数据集,以及一个基于PySide6的用户界面。此系统不仅能够精准地检测和分类图像中的动物,还具备了用户注册登录管理、模型一键切换、UI自定义等丰富功能,非常适合生物多样性研究、自然保护区监测等应用。文章的目标是为生态研究者和深度学习领域的新手提供一份实用指导和参考。完整的代码和数据集已在文章结尾提供链接,便于读者下载和使用。本文结构如下:
演示与介绍视频:https://www.bilibili.com/video/BV1y1421Z7ed/
YOLOv8/v7/v6/v5项目合集下载::https://mbd.pub/o/bread/mbd-ZZuXmZtw
YOLOv8/v5项目完整资源下载:https://mbd.pub/o/bread/ZZuXmJ1w
YOLOv7项目完整资源下载:https://mbd.pub/o/bread/ZZuXmZls
YOLOv6项目完整资源下载:https://mbd.pub/o/bread/ZZuXl5xr
前言
在当前的自然保护和生物多样性研究中,多种类动物识别技术扮演着至关重要的角色。随着人类活动对生态系统的影响日益加剧,准确监测和识别野生动物种群成为了野生动物保护、生态平衡维护和生物多样性研究的关键。利用先进的计算机视觉技术,尤其是基于深度学习的方法,如YOLO(You Only Look Once)系列模型,进行动物识别,不仅能够提高识别的准确性和速度,还可以在无人监控的环境中自动进行长时间的动物监测。
在近年来,基于深度学习的动物识别技术取得了显著的进展。其中,YOLO系列模型因其出色的实时性能和高准确率而在动物识别领域尤为突出。最近的研究表明,YOLOv8[1]作为该系列的最新版本,在处理速度和识别准确性方面都有显著的提升。研究人员对YOLOv8进行了各种优化,使其能够更好地适应复杂的自然环境中的动物识别任务。例如,通过改进卷积神经网络(CNN)结构,提升了模型对小型或遮挡动物的识别能力。
Mask R-CNN[2]已被用于识别野生动物并在精确性方面取得了良好的表现。这种模型不仅可以识别动物种类,还能精确地定位动物在图像中的位置。同时,利用迁移学习,研究者们能够将在大型数据集上预训练的模型应用到特定的动物识别任务中,从而无需从头开始训练模型,节省了大量的时间和资源。
此外,ViT(Vision Transformer)引入了自然语言处理中的Transformer结构到图像识别领域。它通过将图像分割成序列的方式来处理,显示出与传统卷积神经网络(CNN)不同的优势,尤其在处理大规模图像数据集时表现出色。ViT的成功促使研究人员开始探索注意力机制在图像处理领域的潜力。注意力机制能够帮助模型聚焦于图像中的重要部分,从而提高识别的准确性,这在复杂的自然环境中识别不同动物时尤为重要。
此外,数据集的发展也对动物识别技术的进步起到了关键作用。随着高质量、多样化的数据集的建立和发布,如iNaturalist和Animal10+等,深度学习模型能够更好地学习和泛化不同环境下的动物特征。这些数据集不仅包含了丰富的动物种类,还提供了各种背景和光照条件下的图像,为模型的训练提供了丰富的数据支持。
尽管这些技术在动物识别领域已取得显著成果,但它们也面临着一些挑战,如在极端天气条件下的识别准确性、对于罕见动物种类的识别能力等。未来的研究可能会集中在进一步提升这些模型在更多样化环境中的鲁棒性和准确性。
本博客的主要贡献在于综合运用最先进的计算机视觉技术和深度学习模型,构建了一个高效且用户友好的多种类动物识别系统。以下是本文的主要贡献:
- 采用最先进的YOLOv8算法进行多种类动物识别:本文不仅介绍了YOLOv8算法的原理和实现,而且通过与YOLOv7[3]、YOLOv6[4]、YOLOv5[5]等早期版本的对比分析,展示了YOLOv8在效率和精准度方面的优势。这为多种类动物识别领域的研究者和从业者提供了新的研究思路和实践手段。
- 利用PySide6开发动物识别系统:文章中还探讨了如何使用Python的PySide6库来开发一个直观且易于操作的动物识别系统界面。这一系统的开发使得多种类动物的识别过程更加用户友好,便于非专业用户理解和使用,进而推动了YOLOv8算法在实际应用领域的普及。
- 整合登录管理功能:本系统集成了登录管理功能,增强了系统的安全性,并为未来添加个性化功能创造了条件。这一创新不仅提高了使用者的使用体验,也为动物识别系统的商业化应用奠定了基础。
- 深入研究YOLOv8模型的性能:文章对YOLOv8模型的性能进行了全面的研究,包括对模型的精确度、召回率等关键性能指标的评估,以及在不同环境条件下的表现分析。这些分析为深入理解YOLOv8算法提供了宝贵的视角,并为未来的算法优化和改进奠定了坚实的基础。
- 提供完整的数据集和代码资源包:为了帮助读者更好地理解和应用YOLOv8/v7/v6/v5算法,本文提供了完整的数据集和代码资源包。这些资源不仅包括用于训练和测试的详细数据集,还包括构建动物识别系统所需的全部代码。通过这些资源,读者可以直接复现实验结果,并在此基础上进行进一步的研究和开发。
1.数据集介绍
在构建高效的多种类动物识别系统中,拥有一个质量上乘的数据集对于训练强大的机器学习模型至关重要。本文介绍的数据集是一个专门为动物识别任务设计的图像库,它不仅涵盖了从热带雨林中的老虎到农田里的牛等广泛的动物种类,而且还包括了这些动物在多样化的环境条件下所拍摄的图像。这个数据集总共包含了13,879张图像,其中11,259张用于训练,1,879张用于验证,以及741张用于测试。这种划分策略旨在确保模型在广泛的数据上进行学习,同时保留出足够的图像进行验证和测试,以评估模型对于未知数据的识别能力。
在预处理过程中,所有图像都经过了自动定向校正,确保每张图像的方向一致,并移除了EXIF方向信息,以免干扰模型学习。此外,图像被统一调整至640x640像素的分辨率,采用拉伸的方式适应目标检测模型的输入需求。为了提升模型的鲁棒性,我们引入了数据增强策略,包括以50%的概率对图像进行垂直翻转。这样的处理不仅提高了数据的多样性,还增强了模型对图像变换的适应能力。
数据集的类别分布图揭示了不同动物类别的实例数量差异。有些类别的实例数目远多于其他类别,这种不均衡可能会导致模型对频繁出现的类别过拟合,而忽略了那些较少见的类别。因此,在模型训练时可能需要采取一定的策略,如对少数类进行过采样或在损失函数中引入类别权重,以实现类别间的平衡。
数据集中边框中心点的分布趋势表明,动物目标通常位于图像的中央区域。这种特性有助于模型学习在图像中心搜索目标,但也暗示了训练过程中需要增强模型对图像边缘区域目标的识别能力。同时,边框尺寸的分布图显示出数据集中的动物目标大小相对一致,这有利于模型学习和预测目标的尺度,但对于体型变化较大的动物,模型可能需要额外的调整以提高识别准确率。
最后,边框宽高比的分布展示了动物形态的多样性,这对于训练模型适应不同动物的体型和姿态变化非常重要。通过分析这些分布特性,我们可以更好地理解数据集的结构,为目标检测模型的设计和优化提供指导,确保模型在实际应用中能够准确、高效地识别各种动物。博主使用的类别代码如下:
Chinese_name = { '0': '0','Bear': '熊','Buffalo': '水牛','Deer': '鹿','Elephant': '大象','Human': '人类','Leopard': '豹',
'Monkey': '猴子', 'Raccoon': '浣熊','Tiger': '老虎','WildBoar': '野猪','bear': '熊','buffalo': '水牛','bicycle': '自行车',
'car': '汽车','cat': '猫','cow': '牛', 'deer': '鹿','dog': '狗','dogs-cats': '狗和猫', 'donkey': '驴', 'gaur': '野牛',
'guard dog': '看门狗', 'goat': '山羊', 'hen': '母鸡', 'otherentities': '其他实体', 'person': '人','rat': '鼠','wolf': '狼'}
总的来说,这个数据集的设计和预处理工作为动物识别任务提供了坚实的基础,它的多样化和精细的标注为深度学习模型的训练和验证提供了丰富的资源。通过对数据集特性的深入分析,我们可以确保所开发的多种类动物识别系统在处理真实世界图像时具备较好的性能。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行多种类动物检测的图片或视频,或者启动摄像头进行实时检测。在进行多种类动物检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
在深入探讨基于YOLOv8的多种类动物识别系统中,理解该算法的核心原理是至关重要的。YOLOv8作为目标检测领域的最新进展,其设计哲学是在保持高效性的同时提升模型的准确性。这个版本在网络结构、损失函数以及训练策略上均有显著的创新和优化。YOLOv8继承了UltraLytics公司在2023年发布的YOLOv5的结构,并在此基础上进行了优化和改进。
首先,YOLOv8继续采用了YOLO系列特有的端到端(end-to-end)设计,通过单一的神经网络直接从原始像素数据到边界框预测和类别概率的输出。这种设计简化了传统目标检测流程,减少了复杂的预处理和后处理步骤,大幅提升了运行速度。然而,速度的提升并未牺牲准确性,这得益于YOLOv8在网络架构上的改进,包括对特征提取器(Backbone)和特征金字塔网络(FPN)的优化。
YOLOv8特别强化了对边界框预测的准确性。在先前版本中,预测边界框的方法通常是基于预设的锚点(anchor),YOLOv8则采用了一种无锚点(anchor-free)的方法,直接从特征图上预测边界框的中心点和尺寸,这减少了对锚点尺寸和比例选择的依赖,提高了模型对各种尺寸动物的适应性。在预测头(Head)方面,YOLOv8采用了解耦头(Decoupled Head)的设计,与之前版本的耦合头(Coupled Head)相比,这种设计使得分类和边界框回归更加独立,提高了模型在复杂场景中的精确度。
训练过程中,YOLOv8对损失函数进行了改进,以更精确地反映预测框与真实框之间的差异。引入了一种新的损失函数,称为CIOU Loss,它不仅考虑了预测框和真实框之间的重叠区域,还考虑了它们的中心点距离和长宽比的一致性。另外,YOLOv8在模型训练中采用了新的标签分配策略,这一策略通过Task Aligned Assigner来动态地分配正负样本,优化了样本不均衡的问题。这种策略使得模型能够在训练过程中更有效地学习到不同的特征。
4. 代码简介
在本节中,我们将详细介绍如何使用YOLOv8进行多种类动物检测的代码实现。代码主要分为两部分:模型预测和模型训练。
4.1 模型预测
在模型预测部分,首先导入了OpenCV库和YOLO模型。OpenCV库是一个开源的计算机视觉和机器学习软件库,包含了众多的视觉处理函数,使用它来读取和处理图像。YOLO模型则是要用到的目标检测模型。
import cv2
from ultralytics import YOLO
接着,加载自行训练好的YOLO模型。这个模型是在大量的图像上预训练得到的,可以直接用于目标检测任务。
model.load_model(abs_path("weights/multi-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 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
在模型训练部分,首先导入YOLO模型,并加载了预训练的YOLOv8模型。
from ultralytics import YOLO
model = YOLO('./weights/yolov8s.pt', task='detect')
接着开始训练模型。其中指定了训练数据的配置文件路径,使用GPU进行训练,使用2个工作进程加载数据,输入图像的大小为640x640,训练100个epoch,每个批次的大小为8,训练任务的名称为'train_v8_' + data_name。
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)衡量了模型对不同动物类别预测的准确性。训练和验证损失的下降趋势表明模型在区分不同动物种类上的性能也在不断提升。尤其值得注意的是,验证集上的分类损失下降得非常平稳,这意味着模型在训练过程中没有出现过拟合现象,具有良好的泛化能力。对于方向损失(dfI_loss),其代表模型对目标方向的预测准确性。这个指标在训练和验证过程中也显示出了稳步下降的趋势,说明模型对于动物目标的方向信息捕捉得越来越准确。
在评估模型性能时,精确度(precision)和召回率(recall)是两个关键指标。精确度指的是模型预测为正的样本中实际为正的比例,召回率则是模型正确预测的正样本占所有实际正样本的比例。从图中我们可以看到,随着训练的进行,模型的精确度和召回率均有所提高,这表明模型在辨识目标上的性能逐渐增强。尤其是召回率的提高,说明模型在不遗漏真实目标这一方面取得了显著的进步。
最后,平均精确度(mAP)是目标检测中综合评价模型性能的标准指标。mAP的提高意味着模型在各个类别和不同的IOU阈值下都表现出了更高的识别准确性。在这里,mAP的两个变体:mAP@0.5和mAP@0.5-0.95,分别代表在IOU为0.5和在IOU从0.5到0.95的范围内计算的mAP,都显示出随训练次数增加而逐渐增高的趋势。这一结果进一步证实了模型在整体上达到了良好的检测性能,能够在多种复杂情况下准确识别目标。
F1分数是精确度和召回率的调和平均值,它是评估分类模型性能的重要指标。在目标检测模型的评估中,F1分数对于理解模型如何平衡精确度与召回率尤为关键。
下图为博主训练多种类动物检测的F1曲线图。在深度学习模型的性能评估中,F1得分是一个关键的评估指标,它综合考虑了模型的精确度和召回率。该曲线图描述了模型预测的置信度阈值与F1得分之间的关系,对于不同的类别展示了不同的曲线,同时还突出了所有类别的平均F1得分。从图中可以看到,各个类别的F1得分曲线分布表现出了明显的差异,这表明模型对不同类别的识别性能存在差异。某些类别的F1得分在较低置信度阈值时就能达到较高的水平,这意味着模型对这些类别的识别具有较高的置信度和较好的识别准确性。然而,也有一些类别的F1得分较低,甚至在高置信度阈值时也无法达到较高的F1得分,这可能是由于样本不足、类别不平衡或模型对这些特定类别的特征学习不足。
观察到的所有类别的平均F1得分曲线显示出一个典型的先增后减的趋势,其在某一置信度阈值附近达到峰值。在图中,我们可以看到这个峰值大约在置信度为0.575时,F1得分约为0.51。这个峰值表示了模型在综合所有类别后得到的最佳性能。F1得分的峰值所对应的置信度阈值可以视为模型识别动物类别时的最佳操作点,表明在这个阈值下,模型能够在保持合理精确度的同时实现较高的召回率。
需要注意的是,这个平均F1得分可能掩盖了某些类别上的性能问题,因此在实际应用中,我们可能需要对具有较低F1得分的类别进行进一步的分析和优化,比如增加训练样本、调整类别权重或改进模型结构,以提升整体模型的性能。综合考虑,F1-Confidence曲线为我们提供了一个直观的工具,以评估和调整模型的置信度阈值。通过分析这些曲线,我们可以更精确地理解模型在各个置信度水平上的性能,并据此进行调整以获得最佳的识别效果。此外,这些曲线还揭示了模型对于不同类别的识别能力,为未来的模型改进提供了宝贵的信息。
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.558 | 0.559 | 0.489 | 0.565 |
F1-Score | 0.53 | 0.53 | 0.46 | 0.51 |
(3)实验结果分析:
在深度学习领域,持续的算法迭代和更新是提升模型性能的关键途径。我们通过在相同的数据集上实施一系列实验,旨在比较和评估不同版本的YOLO模型——包括YOLOv5nu、YOLOv6n、YOLOv7-tiny以及YOLOv8n——在多种类动物识别任务上的性能。实验的设计和目的是为了明确各版本模型在准确性和检测效率上的差异,以便为实际应用提供更具指导性的见解。
实验设置保持一致性,以确保比较的公正性。每个模型都在相同的硬件配置、相同数量的训练周期以及相同的数据处理流程下进行训练和评估。我们使用了标准的深度学习框架和库来实现这些模型,确保除了模型架构之外,其他可能影响结果的因素如优化器、学习率以及数据增强策略等均保持不变。
根据实验结果,我们可以看出各个版本的YOLO模型在mAP上表现接近,但仍有细微的差别。YOLOv8n以0.565的mAP领先,其次是YOLOv6n和YOLOv5nu,而YOLOv7-tiny则相对落后。这表明在动物识别任务上,YOLOv8n的整体检测性能略优于其他版本,能够更准确地识别出更多的真正目标。而在F1-Score指标上,YOLOv5nu和YOLOv6n都达到了0.53的分数,展现了较好的精确度和召回率平衡,而YOLOv8n稍低于这两者,但仍然高于YOLOv7-tiny的0.46。
综合以上结果,YOLOv8n在多种类动物识别任务中表现出了较好的性能,具有更高的检测准确性和召回率。然而,选择最合适的算法还需要考虑实际应用场景和硬件资源等因素。通过这次对比实验,读者可以更好地理解这四个算法的性能特点,为选择合适的目标检测算法提供参考。
4.4 代码实现
在这篇博客中,我们将探讨一个实现实时多类动物检测系统的 Python 代码片段。该系统利用 YOLOv8 算法的强大功能来检测视频流中的动物。我们将剖析代码,详细解释每个组件,以便读者全面了解其工作原理以及 YOLOv8 如何在准确的动物检测中发挥关键作用。此外,我们还将测量模型推理的时间,以评估其在实时应用中的效率。
在实时多种类动物识别系统中,结合YOLOv8模型和一系列开源库,如OpenCV、QtFusion和PySide6等,来实现主窗口的展示、摄像头帧的处理以及多种类动物的检测和标注等功能。
(1)导入必要的模块和配置
首先,我们导入必要的模块,包括sys模块用于访问与Python解释器相关的变量和函数,time模块用于记录时间戳,cv2即OpenCV库用于处理图像,以及QtFusion和PySide6库用于构建图形用户界面。我们还从自定义的YOLOv8Model模块中导入YOLOv8Detector类,它封装了YOLOv8模型的加载和推理功能。在这里,Label_list定义了要识别的多种类动物类型。
import random # 用于生成随机颜色
import sys # 用于访问Python解释器相关的功能
import time # 用于记录操作所需的时间
from QtFusion.config import QF_Config
import cv2 # OpenCV库,用于图像处理
from QtFusion.widgets import QMainWindow # 用于创建GUI窗口
from QtFusion.utils import cv_imread, drawRectBox # 辅助函数,用于图像读取和绘制
from PySide6 import QtWidgets, QtCore # 构建图形用户界面
from QtFusion.path import abs_path
from YOLOv8Model import YOLOv8Detector # YOLOv8模型,用于目标检测
from datasets.AnimalsDet.label_name import Label_list
QF_Config.set_verbose(False)
这一部分主要负责导入各种模块。random用于随机颜色生成,sys和time分别用于系统操作和时间处理。cv2是图像处理的核心,而QtFusion和PySide6则用于构建用户界面。YOLOv8Detector是进行目标检测的关键类。
(2)创建主窗口
GUI是我们动物检测系统的关键元素。它为用户提供了一个可视化界面,用于与应用程序进行交互。在代码中,我们使用以下 MainWindow 类创建主应用程序窗口:
class MainWindow(QMainWindow): # 自定义主窗口类
def __init__(self): # 构造函数
super().__init__() # 调用父类构造函数
self.resize(640, 640) # 设置窗口大小
self.label = QtWidgets.QLabel(self) # 创建标签用于显示图像
self.label.setGeometry(0, 0, 640, 640) # 设置标签位置和大小
def keyPressEvent(self, event): # 键盘事件处理
if event.key() == QtCore.Qt.Key.Key_Q: # 按下Q键时
self.close() # 关闭窗口
在这里,我们定义类 MainWindow ,它用作主应用程序窗口。它继承自 QMainWindow 640x640 像素并将其大小设置为 640x640 像素。在窗口内,我们创建一个 QLabel 小部件 ( self.label ) 来显示处理后的图像。
(3)主程序流程
在主程序中,我们首先初始化Qt应用和主窗口。接着,读取并处理视频,使用YOLOv8模型进行目标检测,并在检测到的目标周围绘制边界框和标签。最后,图像被显示在GUI窗口中。
def frame_process(image): # 定义帧处理函数,用于处理每一帧图像
image = cv2.resize(image, (640, 640)) # 将图像的大小调整为850x500
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上显示图像
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对象
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())
在此,"best-yolov8n.pt"是经过大量多种类动物图像训练得到的模型权重文件。这就是实现多种类动物识别系统的完整代码,整个过程包括了数据预处理、YOLOv8模型预测、结果后处理和可视化等步骤,结构清晰,逻辑简洁。通过这样的方式,可以实现对视频进行实时的多种类动物识别和标注。
5. 多种类动物识别系统实现
在构建实时多种类动物检测与识别系统时,我们的设计理念旨在提供一个用户友好、交互式的界面,使用户能够轻松使用该系统进行动物检测与识别。在本节中,我们将结合实际任务进一步完善系统设计思路。
5.1 系统设计思路
为了让用户能够轻松地与系统互动,我们设计了一个直观的MainWindow类。它不仅负责呈现用户界面,还作为用户操作和系统响应之间的桥梁。我们确保该界面简洁易用,即便是对技术不太熟悉的用户也能够快速上手。
(1)架构设计
在MainWindow类的架构设计中,采用了处理层、界面层、控制层的设计模式。这个系统的设计充分考虑了用户体验和系统性能,通过合理的架构设计和技术选型,实现了一个高效且易于使用的多种类动物检测与识别系统。我们的架构采用了模块化设计,每个模块都有特定的职责。这种设计使得系统更加灵活,便于维护和升级。例如,处理层由YOLOv8Detector类构成,这是我们的机器学习引擎,负责处理图像数据并执行目标检测任务。它独立于用户界面,这意味着在未来我们可以轻松地替换或升级模型,而不会影响到系统的其他部分。
处理层包含了YOLOv8Detector类,其中包括了预训练模型和相关方法。处理层的主要任务是执行动物检测和识别。我们使用YOLOv8算法,它经过训练,能够高效地检测图像中的多个目标。
界面层由Ui_MainWindow类生成的用户界面组成。这些界面元素包括按钮、标签、表格等,它们构成了用户与系统互动的窗口。用户可以通过界面层与系统进行交互,例如打开视频文件、启动检测,以及查看检测结果。
控制层由MainWindow类实现的槽函数和其他方法组成。这一层负责响应用户的操作,控制媒体处理器和模型的行为。例如,当用户点击“开始检测”按钮时,控制层将触发图像处理、模型预测,并在界面上显示检测结果。
我们的系统旨在应对实际任务需求,如野生动物监测、动物行为分析等。用户友好的界面使非专业用户能够轻松使用该系统,而底层的处理层则提供了高效的检测和识别能力。通过信号和槽机制,不同模块之间能够实现无缝的协同工作,确保系统在运行时表现出良好的稳定性和响应性。
(2)系统流程
在本博客的实际任务中,我们旨在构建一个基于YOLOv8模型的实时多种类动物检测系统。该系统通过直观的图形用户界面(GUI),允许用户从不同的输入源中选择数据,进行实时的图像处理和目标检测。整个系统的设计旨在提供一条流畅的工作流程,从选择输入源到展示检测结果,每一步都精心设计以提升用户体验。
-
在多种类动物检测与识别系统的设计中,用户启动应用程序后,系统会创建MainWindow类的实例,作为用户与系统互动的起点。这个实例负责初始化整个应用的界面和相关参数,以便用户能够轻松操作系统。
-
应用程序提供了一个直观的用户界面,用户可以通过该界面选择不同的输入源,根据实际需求,可以选择摄像头实时捕捉的图像、视频文件或静态图片作为输入。这个灵活的输入源选择使系统更具通用性,适用于不同场景的动物检测与识别任务
-
一旦用户确定了输入源,系统将根据选择调用相应的媒体处理器和方法来处理输入数据。这可能涉及到摄像头的初始化与配置、视频文件的读取或图像文件的加载,以确保系统能够准备好开始处理媒体数据。
-
每当模型产生新的检测结果时,用户界面都会实时更新。检测框和类别标签会在图像上展示,同时,检测统计数据会以表格或条形图的形式呈现给用户,使得用户可以直观地理解检测结果。
此外,用户界面提供了多种交互操作,如保存结果、查询信息和筛选特定结果等。这些功能通过按钮和下拉菜单实现,进一步增强了系统的易用性和灵活性。媒体控制也是系统的一部分,用户可以控制输入源的播放状态,例如启动或停止视频捕捉。这为用户提供了进一步的操作自由度,使得他们可以按需暂停和继续媒体流,以更好地分析和理解检测结果。
综上所述,我们的多种类动物检测与识别系统经过精心设计,将界面、媒体处理和模型集成在一起,实现了用户友好的交互式体验。该系统不仅适用于科研领域的动物检测与识别任务,还具备实际应用的潜力,为用户提供了一种高效、便捷的解决方案。
5.2 登录与账户管理
在我们的动物识别系统中,用户登录和账户管理是功能实现的关键一环。这个系统通过一个精心设计的用户登录界面,基于PySide6框架与SQLite数据库,提供了全面的账户管理功能。这些功能不仅增强了用户体验,还为用户提供了个性化的服务和更好的数据管理能力。
首先,系统的用户登录界面允许新用户进行账户注册,这是他们开始使用系统的第一步。注册过程旨在为用户创建一个安全的个人空间,在这个空间内,用户可以自由地保存和管理自己的检测结果以及个性化的系统设置。这种设计允许用户在不同的会话中保持工作的连贯性,并且方便他们随时回顾和分析过去的检测数据。
一旦注册成功,用户就可以通过简单的登录过程进入系统的主界面。在主界面中,用户可以进行动物识别任务,实时显示包括检测框、类别及置信度等信息。这些信息不仅直观展示了识别结果,也为用户提供了对检测过程的直接控制。
此外,我们的系统支持多种输入源,包括图片、视频、实时摄像头捕获以及批量文件输入,满足不同用户在多样化应用场景下的需求。系统的设计考虑到了用户操作的便利性和多样性,确保了在不同输入源切换过程中的流畅性和稳定性。
综上所述,我们的多种类动物检测系统不仅具备强大的动物识别和检测功能,还通过用户账户管理提供了个性化服务。这些账户功能的加入,使得用户能够在安全的环境下使用系统,并根据个人喜好调整设置,提高了用户体验和系统的实用性。这样的设计充分展现了现代软件系统的发展趋势,即在提供高级技术服务的同时,也不忘关注用户的个性化需求和使用便捷性。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1y1421Z7ed/
YOLOv8/v7/v6/v5项目合集下载::https://mbd.pub/o/bread/mbd-ZZuXmZtw
YOLOv8/v5项目完整资源下载:https://mbd.pub/o/bread/ZZuXmJ1w
YOLOv7项目完整资源下载:https://mbd.pub/o/bread/ZZuXmZls
YOLOv6项目完整资源下载:https://mbd.pub/o/bread/ZZuXl5xr
在文件夹下的资源显示如下,下面的链接中也给出了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等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的多种类动物检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
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. ↩︎
He K, Gkioxari G, Dollár P, et al. Mask r-cnn[C]//Proceedings of the IEEE international conference on computer vision. 2017: 2961-2969. ↩︎
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. ↩︎
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. ↩︎