摘要:本文深入探讨了基于YOLOv8/v7/v6/v5的血细胞智能检测与计数系统,该系统的核心是采用最先进的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等先前版本进行性能指标对比。文章全面回顾了国内外研究现状,并详细介绍了数据集处理的步骤,探讨了不同YOLO算法版本的原理和特点,并展示了如何构建和训练这些模型。此外,本文还着重介绍了基于Streamlit框架开发的交互式Web应用界面设计,该界面支持从图像、视频到实时摄像头的各种血细胞智能检测与计数任务。用户能够便捷地上传不同训练模型(YOLOv8/v7/v6/v5)进行推理预测,并且可以方便地对界面进行定制修改。作为研究成果的补充,本文提供了包括完整的网页设计、深度学习模型代码,以及训练数据集的下载链接,旨在促进该领域的进一步研究和应用开发。这些资源将对希望在医学图像分析领域应用深度学习技术的研究人员和开发者大有裨益。
文章目录
网页版-基于深度学习的血细胞智能检测与计数系统(YOLOv8/v7/v6/v5+实现代码+训练数据集)
1. 网页功能与效果
(1)开启摄像头实时检测:本系统允许用户通过网页直接开启摄像头,实现对实时视频流中血细胞的检测。系统将自动识别并分析画面中的血细胞,并将检测结果实时显示在用户界面上,为用户提供即时的反馈。
(2)选择图片检测:用户可以上传本地的图片文件到系统中进行血细胞智能检测与计数。系统会分析上传的图片,识别出图片中的血细胞,并在界面上展示带有血细胞标签和置信度的检测结果,让用户能够清晰地了解到每个血细胞状态。
(3)选择视频文件检测:系统支持用户上传视频文件进行血细胞智能检测与计数。上传的视频将被系统逐帧分析,以识别和标记视频中每一帧的血细胞。用户可以观看带有血细胞智能检测与计数标记的视频,了解视频中血细胞的变化。
(4)选择不同训练好的模型文件:系统集成了多个版本的YOLO模型(如YOLOv8/v7/v6/v5),用户可以根据自己的需求选择不同的模型进行血细胞智能检测与计数。这一功能使得用户能够灵活地比较不同模型的表现,以选择最适合当前任务的模型。
在我们开发的基于Streamlit的交互式Web应用中,我们致力于提供一个直观、易用的操作界面,以便用户能够高效准确地进行血细胞智能检测与计数。应用集成了一系列功能,旨在满足不同用户的需求。
首先,实时摄像头检测功能允许用户开启连接的摄像头,直接进行实时血细胞检测,适用于没有预先准备样本图片的即时检测需求。此外,我们还提供了图片检测和视频文件检测功能,用户可以上传本地的血细胞图像或视频文件,系统将自动进行检测并展示结果。为了适应不同的检测需求,我们设计了模型文件选择功能,用户可以根据个人需求,从不同训练好的模型文件(YOLOv8/v7/v6/v5)中选择最合适的模型进行检测。
我们深知用户可能需要对比检测前后的差异,因此提供了检测与原始画面同时或单独显示的功能,用户可根据需要选择查看模式。为了便于用户对特定目标进行分析,我们还加入了特定目标标记与结果展示的功能,通过点击下拉框选择标记特定目标,并单独显示检测结果。
为了让用户能够更灵活地调整检测结果,我们实现了可以动态调整的置信度阈值和IOU阈值设置,以及将检测结果动态显示在页面表格上的设计。用户还可以通过点击按钮,将表格结果输出到CSV文件,或将标记过的图片、视频及摄像头画面的检测结果导出为AVI图像文件,便于保存和进一步分析。通过这些精心设计的功能,我们的Web应用不仅提高了血细胞检测的效率和准确性,也极大地优化了用户体验。我们期待未来能够进一步优化该应用,引入更多创新功能,以更好地服务于医疗健康领域的需求。
2. 绪论
2.1 研究背景及意义
在过去的几年里,血细胞的智能检测与计数领域经历了飞速的发展,特别是深度学习技术在医学图像处理中的应用,极大地推动了该领域的进步。目标检测算法,尤其是YOLO系列,因其高效的检测速度和准确率,在血细胞检测中展现了巨大的潜力。最新的研究表明,通过对YOLO算法的不断优化和改进,可以显著提高血细胞检测的准确性和效率。
YOLOv51作为一种轻量级的目标检测算法,已被广泛应用于医学图像的处理中。近期的研究表明,YOLOv5不仅在检测速度上具有优势,而且在处理复杂医学图像时,准确率也得到了显著提升。随后,YOLOv6和YOLOv7]2的发布,进一步优化了模型的结构和算法,使得检测的准确性和速度得到了平衡,特别是在处理高分辨率的医学图像时,这一优势更为明显。
YOLOv8的出现,标志着目标检测算法在医学图像分析领域的又一次飞跃。研究表明,YOLOv8不仅进一步减少了模型的复杂度,提高了运行效率,而且在多类别的血细胞检测任务中,展现了比前几代更高的准确率和更好的泛化能力。这对于需要快速而准确检测和计数多种血细胞的临床应用来说,是一个重要的进步。
然而,尽管取得了这些进展,血细胞智能检测与计数仍然面临着一些挑战,如算法的泛化能力、对不同类型血细胞的识别精度、以及在实际应用中的效率等问题。因此,未来的研究需要继续探索更有效的算法改进策略,优化模型结构,提高检测的准确性和效率,以满足临床应用的需求。
2.2 国内外研究现状
在过去的几年里,深度学习技术在医学图像分析,尤其是在血细胞的智能检测与计数领域,取得了显著的进步。其中,目标检测算法的发展尤为突出,YOLO系列自YOLOv5以来的迭代更新不仅体现了在速度和准确性上的优化,更重要的是,它们提供了处理复杂医学图像挑战的有效解决方案。YOLOv8、YOLOv7、YOLOv6与YOLOv5的连续改进,展现了算法在精度、速度以及模型大小上的平衡,使其成为血细胞检测任务中的首选技术。
除了YOLO系列,其他算法如ViT(Vision Transformer)3、注意力机制的引入、RetinaNet、Faster R-CNN4以及DETR(End-to-End Object Detection with Transformers)等,也在目标检测领域内展现了其独特的优势。ViT通过引入自注意力机制来捕获图像中的长距离依赖,改善了模型对图像特征的理解,而DETR利用Transformer的结构,简化了检测流程,去除了对先验框的依赖,展现了在处理复杂场景时的优势。
在数据集的发展上,随着深度学习技术的普及,公开可用的医学图像数据集数量和质量都有了显著提升。这不仅促进了算法的训练和验证,也为算法性能的比较提供了公平的基准。与此同时,新的数据增强技术和预处理方法的发展,进一步提高了模型训练的效率和泛化能力,特别是在处理血细胞这类小目标检测任务时的表现更为突出。
尽管如此,血细胞的智能检测与计数领域仍然面临着一系列技术挑战。例如,如何有效处理血细胞图像中的遮挡和聚集问题、如何提高模型对不同类型血细胞的分类精度、以及如何在保证检测速度的同时,减少模型的计算资源消耗等。这些问题的解决,需要在算法创新、数据处理、模型优化等方面进行综合考虑。
未来的研究趋势可能会聚焦于算法的综合优化,比如结合YOLO系列的高效检测能力和Transformer系列的强大表达能力,以及进一步探索轻量化模型和实时检测技术的可能性。同时,随着计算资源的发展和算法优化技术的进步,更复杂的模型和算法有望在实际应用中得到更广泛的应用。
2.3 要解决的问题及其方案
2.3.1 要解决的问题
在开发血细胞智能检测与计数系统的过程中,我们面临着一系列复杂而独特的挑战。这些挑战的解决方案对于提升系统的性能和用户体验至关重要。以下是我们需要解决的关键问题:
-
血细胞识别的准确性和速度:血细胞的种类繁多,且每种血细胞在形状、大小和颜色上可能都有细微的差异。这就要求我们的系统不仅要能够准确地识别出这些细微的特征差异,还需要能够快速处理图像数据,以满足临床和研究中对实时性的高要求。
-
环境适应性和模型泛化能力:血细胞图像的采集环境复杂多变,如不同的显微镜设置、光照条件和背景噪声等,都可能影响识别的准确性。因此,我们的系统需要具备出色的环境适应性和模型泛化能力,确保在各种条件下都能保持高识别准确率。
-
用户交互界面的直观性和功能性:为了让用户能够有效地使用我们的系统,我们需要设计一个直观易懂的用户交互界面。该界面应该能够让用户轻松地进行图像上传、实时监控、历史数据查询和模型切换等操作。
-
数据处理能力和存储效率:鉴于血细胞检测与计数将涉及大量的图像和视频数据处理,我们的系统必须具备强大的数据处理能力和高效的存储机制,以保证识别过程的实时性和长期数据的有效管理。
-
系统的可扩展性和维护性:考虑到医学研究和临床应用的快速发展,我们的系统设计需要具有良好的可扩展性,以便未来可以轻松集成新的检测模型或功能。此外,系统的维护性也非常重要,确保能够持续稳定运行,并及时进行更新和升级。
2.3.2 解决方案
在面对血细胞智能检测与计数的挑战时,我们提出了一系列创新解决方案,以确保我们的系统不仅能准确快速地识别和计数血细胞,还能适应各种环境,提供直观的用户体验,并具备高效的数据处理和存储能力。以下是我们采取的关键策略:
- 深度学习模型的选择和优化
我们采用了基于YOLOv8/v7/v6/v5系列的深度学习模型,结合PyTorch技术框架,以实现血细胞智能检测与计数。YOLO系列的模型以其高速和准确性著称,非常适合实时图像处理任务。特别地,我们通过精细调整模型架构,优化了模型以适应血细胞图像的特点,包括其独特的形状、大小和颜色差异。此外,我们运用了多种数据增强技术,如随机裁剪、旋转、缩放和色彩调整等,以提升模型在不同环境条件下的泛化能力和准确性。
- 技术框架和开发工具
选择PyTorch作为我们的主要深度学习框架,不仅因为它的灵活性和强大的GPU加速功能,而且还因为它广泛的社区支持和丰富的库资源。基于Streamlit构建的Web应用界面,使得用户可以轻松上传图像、视频文件进行血细胞检测,并实时从摄像头获取图像数据。我们使用CSS进行界面美化,确保了应用的美观性和用户友好性。此外,PyCharm作为我们的开发IDE,提供了强大的代码管理和调试工具,帮助我们高效地开发和维护代码。
- 功能实现和系统设计
我们的系统设计支持多种输入源,包括图像文件、视频流和实时摄像头捕获,以适应不同用户的需求。实现了动态模型切换功能,用户可以根据自己的具体需求,选择不同版本的YOLO模型进行检测。此外,我们设计了直观的用户界面,支持用户登录注册,保障了用户信息的安全性,并提供了易于管理和权限控制的功能。
- 数据处理和存储策略
我们利用PyTorch的高效数据加载和预处理机制,确保了数据处理的实时性和准确性。同时,设计了智能数据存储方案,通过有效的数据组织和索引技术,提高了长期数据管理和查询的效率。为保障数据的安全性,我们实施了加密存储和访问控制机制。
- 性能优化和系统测试
我们对模型和系统进行了全面的性能分析,识别并针对性地优化了瓶颈,包括模型压缩和硬件加速等措施,以确保系统的高效运行。通过全面的测试,包括单元测试、功能测试和压力测试,我们确保了系统的稳定性和可靠性。
通过实施上述方法,我们开发的血细胞智能检测与计数系统能够在不同环境下准确、快速地进行血细胞的检测与计数,同时提供友好的用户体验和强大的数据处理能力,满足了科研和临床应用
2.4 博文贡献与组织结构
本文详细介绍了基于YOLOv8/v7/v6/v5的血细胞智能检测与计数系统的设计与实现,涵盖了从理论研究到实际应用的全面内容。我们的工作不仅聚焦于算法的选择和优化,还包括了系统设计、用户界面的开发以及对模型性能的深入分析。以下是本文的主要贡献:
-
任务相关文献综述:我们系统性地回顾了当前在血细胞检测与计数领域的研究进展,包括深度学习在内的多种算法应用,特别是YOLO系列算法在这一领域的最新进展。这为我们的研究提供了坚实的理论基础。
-
数据集的处理:本文详细介绍了血细胞图像数据集的预处理方法,包括数据增强、标注和分割等关键步骤,旨在提高模型训练的效率和准确性。
-
YOLOv8/v7/v6/v5等算法选择:我们对比了不同版本的YOLO算法在血细胞智能检测与计数任务上的性能,通过实验验证选择了最适合本项目的模型版本,并对模型进行了优化和调整以满足特定需求。
-
采用Streamlit设计了美观友好的网页:利用Streamlit框架,我们开发了一个直观易用的Web应用,使得用户可以方便地上传图像、视频进行血细胞检测,同时支持实时摄像头捕获功能。
-
对比了YOLOv7/v6/v5等算法的效果:本文提供了一个详尽的算法性能比较,包括检测速度、准确率以及在不同条件下的表现,为读者提供了选择合适模型的参考依据。
-
完整的数据集和代码资源包:为了促进血细胞智能检测与计数领域的研究,我们提供了完整的数据集和代码资源包,包括预处理脚本、模型训练和预测的代码,以及用户界面的设计代码。
后续章节的组织结构如下: 绪论:介绍研究背景、目的和本文的主要贡献;算法原理:详细介绍YOLOv8/v7/v6/v5等算法的工作原理及其在血细胞智能检测与计数中的应用;数据集处理:讨论使用的数据集及其预处理、增强方法。代码介绍:提供模型训练和预测的详细代码说明,包括环境搭建、参数配置和执行步骤。实验结果与分析:展示不同模型在血细胞智能检测与计数任务上的实验结果,并进行比较分析。系统设计与实现:介绍基于Streamlit的血细胞智能检测与计数系统的设计与实现细节。结论与未来工作:总结本文的研究成果,并讨论未来的研究方向和潜在的改进空间。
3. 数据集处理
在探索血细胞智能检测与计数的研究旅程中,构建一个全面、均衡且丰富的数据集是成功的关键。本文介绍的数据集担负着这一使命,它通过精心设计,支持了从深度学习模型训练到性能验证的全过程。包含3153张图像的这个数据集被划分为2853张训练图像、219张验证图像和81张测试图像,以支持模型在不同阶段的适应性和泛化能力测试。博主使用的类别如下:
Chinese_name = {'Platelets': "血小板", 'RBC': "红细胞", 'WBC': "白细胞", 'sickle cell': "镰状细胞"}
数据集中的图像经过专业的预处理和增强,以确保在不同设备和环境下的一致性,提高算法的鲁棒性。每张图像都被自动调整至640x640像素的统一尺寸,并去除了EXIF信息中可能导致方向混淆的标签,这一步骤对于训练卷积神经网络是至关重要的。此外,针对血细胞图像的特点,进行的数据增强措施有助于模型抵御现实世界中的各种挑战,如不同的光照、显微镜设置及背景噪声。
数据集的类别分布呈现了显著的不平衡,其中红细胞(RBC)实例的数量大大超过其他类型的血细胞,如血小板、白细胞(WBC)和镰状细胞。这一不平衡性可能导致模型对红细胞的过度拟合,而忽视了其他较少见的类别。因此,在模型训练过程中,需要采用特定策略如重采样或类别权重调整,以确保所有类型的血细胞都能被公平地识别。
标注边界框的分布情况表明,大多数血细胞位于图像的中心位置。这可能是由于在制备血液涂片时的采样习惯所致,但这也意味着需要在数据增强阶段模拟边缘情况,以提高模型对边缘血细胞的识别能力。同时,边界框的尺寸分布揭示了血细胞的多种形态,其中血小板通常具有较小的尺寸,而红细胞和白细胞则呈现更大的边界框。模型需要能够区分和处理不同大小的血细胞,以实现准确计数和分类。
综上所述,本数据集的构建旨在解决血细胞检测与计数中的实际问题,它不仅注重图像数量和质量的平衡,还专注于实现数据的多样性和可操作性。通过对数据集的这些特点进行深入分析,我们可以开发出更加鲁棒和精确的血细胞检测模型,这对于提高生物医学图像分析的效率和准确性具有重要意义。在未来的研究中,这个数据集也为探索新的算法和技术提供了一个坚实的基础。
4. 原理与代码介绍
4.1 YOLOv8算法原理
YOLOv8模型作为目前最新一代的目标检测模型,继承了YOLO系列的核心设计理念,同时引入了创新的架构和技术以提高性能和效率。YOLO(You Only Look Once)系列自从推出以来,就以其高速的检测速度和良好的实时性能赢得了广泛的认可。
YOLOv8作为当今最先进的目标检测算法之一,在设计和实现上都显示出了显著的创新。其核心在于如何快速且准确地对输入图像中的物体进行检测,其架构可分为三个主要组成部分:Backbone、Neck和Head。
在Backbone部分,YOLOv8继承并改进了前代YOLO系列算法中的Darknet架构。它使用了CSPDarknet53作为基础网络架构,通过引入CSPNet(Cross Stage Partial Networks)的设计,即在传统的Darknet53结构中,将每个卷积层的特征分为两部分,一部分直接穿过网络,另一部分则进入后续的层进行处理。这种设计可以有效地减少计算量,同时保持或提高网络的性能。而YOLOv8在此基础上做出了进一步的优化,提高了特征提取的效率和精度。
Neck部分负责提取不同尺度的特征,并进行特征融合。YOLOv8沿用并改进了YOLOv5引入的PAN(Path Aggregation Network)结构,该结构与FPN(Feature Pyramid Networks)相结合,旨在聚合不同层级的特征,以提高检测的精度。YOLOv8通过SPPF(Spatial Pyramid Pooling Fusion)增强了对不同尺度特征的聚合能力,通过多尺度特征的融合,大大提高了模型对于不同尺寸物体的检测能力。
在Head部分,YOLOv8进行了显著的改进,尤其是在Anchor设计方面。不同于YOLOv5的Anchor-based设计,YOLOv8采用了Anchor-free的设计理念,摒弃了传统的固定大小的Anchor,减少了模型在训练过程中对于Anchor大小调整的依赖。这一设计的优点在于简化了模型,并减少了预设的复杂性。此外,YOLOv8引入了新的损失函数,即DFL(Distribution Focal Loss),这种损失函数专注于处理不同类别间的分布失衡,从而提高模型在多分类任务中的表现。
总体而言,YOLOv8的创新不仅在于其结构的改进,还体现在其对于目标检测中的类别不平衡、尺寸多样性、检测精度和速度等方面的全面考量。通过上述的技术创新,YOLOv8实现了在实时性与检测精度之间的良好平衡,为实际应用中的血细胞智能检测与计数系统提供了强有力的技术支持。
4.2 模型构建
在我们的血细胞智能检测与计数研究中,构建一个准确且高效的深度学习模型是关键。本部分介绍了模型的构建过程,涵盖了从数据预处理到模型加载,再到预测和后处理的每一步。
首先,我们导入了处理图像所需的OpenCV库以及PyTorch,这些工具为我们提供了在图像数据上应用深度学习算法的能力。QtFusion.models中的Detector是我们自定义的类,用于目标检测,而datasets.label_name提供了我们数据集中类别名称的中文翻译。选择正确的设备来运行我们的模型是非常重要的,我们使用torch.cuda.is_available()检查是否有GPU可用,如果有,则使用GPU加速计算,否则退回到CPU。这是通过设置device变量来完成的。
import cv2
import torch
from QtFusion.models import Detector
from datasets.label_name import Chinese_name
from ultralytics import YOLO
from ultralytics.utils.torch_utils import select_device
在代码中,device变量用于定义模型训练和推理将使用的计算设备。如果GPU可用(torch.cuda.is_available()),则使用GPU加速计算;如果不可用,回退到CPU。接着定义了一系列的初始参数ini_params,它们为模型预测设置了诸如设备类型、置信度阈值、IOU阈值和类别过滤器等重要参数。这些参数是我们模型预测步骤中不可或缺的部分,它们将影响模型如何识别和处理图像中的血细胞。
device = "cuda:0" if torch.cuda.is_available() else "cpu"
ini_params = {
'device': device,
'conf': 0.25,
'iou': 0.5,
'classes': None,
'verbose': False
}
为了数出每个类别的实例数量,我们定义了一个函数count_classes。它利用了一个字典来存储每个类别的计数,并通过遍历检测信息来更新这个计数。这为我们提供了一个清晰的视图,了解哪些血细胞类别最常见,哪些比较罕见。
def count_classes(det_info, class_names):
count_dict = {name: 0 for name in class_names}
for info in det_info:
class_name = info['class_name']
if class_name in count_dict:
count_dict[class_name] += 1
count_list = [count_dict[name] for name in class_names]
return count_list
在YOLOv8v5Detector类中,我们继承并扩展了Detector类。这个类的构造函数初始化了模型和一些关键的变量。在load_model方法中,我们加载了预训练的YOLO模型,并将设备设置为之前确定的CPU或GPU。此外,我们还转换了模型中的类别名称,将其本地化为中文,以便于在实际应用中更易于理解。preprocess方法定义了如何处理输入图像,这里我们将其简单地保留原样。而predict方法则是模型的核心,它调用YOLO模型进行预测,利用初始化参数进行置信度和IOU的筛选。
class YOLOv8v5Detector(Detector):
def __init__(self, params=None):
super().__init__(params)
self.model = None
self.img = None
self.names = list(Chinese_name.values())
self.params = params if params else ini_params
def load_model(self, model_path):
self.device = select_device(self.params['device'])
self.model = YOLO(model_path)
names_dict = self.model.names
self.names = [Chinese_name[v] if v in Chinese_name else v for v in names_dict.values()]
self.model(torch.zeros(1, 3, *[self.imgsz] * 2).to(self.device).type_as(next(self.model.model.parameters())))
def preprocess(self, img):
self.img = img
return img
def predict(self, img):
results = self.model(img, **ini_params)
return results
def postprocess(self, pred):
results = []
for res in pred[0].boxes:
for box in res:
class_id = int(box.cls.cpu())
bbox = box.xyxy.cpu().squeeze().tolist()
bbox = [int(coord) for coord in bbox]
result = {
"class_name": self.names[class_id],
"bbox": bbox,
"score": box.conf.cpu().squeeze().item(),
"class_id": class_id,
}
results.append(result)
return results
def set_param(self, params):
self.params.update(params)
在预测完成后,postprocess方法处理模型的输出,将边界框、类别、置信度等信息转换为我们需要的格式。我们对每个预测边界框进行迭代,提取了类别ID、边界框坐标和置信度分数,并将它们包装成一个结果字典。最后,set_param方法允许我们动态地更新模型的参数,这对于根据不同的应用场景调整模型行为非常有用。
通过这些代码,我们定义了一个端到端的流程,可以从图像中检测和识别不同的血细胞类型。这一流程不仅在技术上先进,而且还考虑到了实用性和用户体验,使其在未来的血液分析和医学研究中有着极大的应用潜力。
4.3 训练代码
在我们的血细胞智能检测与计数项目中,训练一个高性能的深度学习模型是至关重要的。这部分博客将深入介绍如何使用PyTorch框架和YOLOv8算法来训练我们的模型。以下是训练模型的详细代码介绍。以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:
超参数 | 设置 | 说明 |
---|---|---|
学习率(lr0 ) | 0.01 | 决定了模型权重调整的步长大小,在训练初期有助于快速收敛。 |
学习率衰减(lrf ) | 0.01 | 控制训练过程中学习率的降低速度,有助于模型在训练后期细致调整。 |
动量(momentum ) | 0.937 | 加速模型在正确方向上的学习,并减少震荡,加快收敛速度。 |
权重衰减(weight_decay ) | 0.0005 | 防止过拟合,通过在损失函数中添加正则项减少模型复杂度。 |
热身训练周期(warmup_epochs ) | 3.0 | 初始几个周期内以较低的学习率开始训练,逐渐增加到预定学习率。 |
批量大小(batch ) | 16 | 每次迭代训练中输入模型的样本数,影响GPU内存使用和模型性能。 |
输入图像大小(imgsz ) | 640 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
环境设置与模型加载:首先,我们需要导入必要的库。torch是PyTorch深度学习框架的核心库,提供了GPU加速以及自动梯度计算等功能,而ultralytics中的YOLO是一种基于PyTorch的实现,用于加载和训练YOLO模型。QtFusion.path中的abs_path函数用于获取文件的绝对路径,确保路径的准确性和跨平台兼容性。
import os
import torch
import yaml
from ultralytics import YOLO # 用于加载YOLO模型
from QtFusion.path import abs_path # 用于获取文件的绝对路径
接下来,我们定义device变量来指定训练时使用的设备,如果检测到可用的GPU,就使用第一块GPU(“0”),否则使用CPU。
device = "0" if torch.cuda.is_available() else "cpu"
数据集准备:workers参数指定了数据加载时使用的子进程数量,而batch定义了每个批次的图像数量。批量大小和工作进程数量在训练效率和内存利用率之间提供了平衡。为了准确地指向我们的数据集,我们构造了数据集配置文件的路径,并进行了路径规范化处理。然后,我们读取YAML配置文件,这个文件包含了数据集的详细信息,如类别标签和图像路径等。
workers = 1 # 工作进程数
batch = 8 # 每批处理的图像数量
data_name = "Haemocytes"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current')
unix_style_path = data_path.replace(os.sep, '/')
在读取YAML文件后,我们可能需要修改其中的某些项,如path,以确保它反映了数据的实际存储位置。然后,我们将修改后的内容写回到文件中。
directory_path = os.path.dirname(unix_style_path)
with open(data_path, 'r') as file:
data = yaml.load(file, Loader=yaml.FullLoader)
if 'path' in data:
data['path'] = directory_path
with open(data_path, 'w') as file:
yaml.safe_dump(data, file, sort_keys=False)
训练模型:最关键的部分是加载预训练的YOLOv8模型并开始训练。这里我们使用了YOLO类的train方法,其中指定了各种训练参数,包括数据集路径、设备、工作进程数、输入图像大小、训练周期数和批量大小。通过设置name参数,我们为训练任务提供了一个标识符,有助于后续的追踪和分析。
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模型,专门用于我们的血细胞检测任务。随着模型在多轮迭代中学习数据集的细节,它的性能预期将逐步提升,最终达到一个准确识别各种血细胞类别的状态。
5. 实验结果与分析
5.1 训练曲线
在深度学习模型的训练过程中,损失函数的变化及其评价指标的变化是模型性能进步的重要指示。图中展示了YOLOv8模型在训练期间各种损失和性能指标的变化情况,对这些指标的分析对于理解模型的学习效果至关重要。
首先,观察训练和验证阶段的边界框损失(box_loss)和分类损失(cls_loss)。这两项损失的逐步降低表明,随着训练的进行,模型在定位对象的边界框和分类任务上越来越精确。特别是在边界框损失方面,我们可以看到一个明显的下降趋势,这说明模型在区分目标对象的位置方面有显著提升。相比之下,分类损失的下降趋势则表明模型在辨识不同类型的血细胞上也在不断进步。
接下来分析目标检测中两个重要的性能指标:精确度(precision)和召回率(recall)。精确度表达了模型识别出的目标中,有多少是正确的。召回率则衡量了在所有应被识别的目标中,模型成功识别了多少。从图中我们可以看出,精确度和召回率在训练过程中经历了波动,但总体上都呈现出提升的趋势。在训练初期,模型可能还在学习如何处理数据,因此性能指标可能会出现较大波动。随着模型对数据集的特征学习越来越深入,性能逐渐稳定并提高。
再来看均值平均精确度(mAP)的两个指标,即mAP@0.5和mAP@0.5-0.95。mAP@0.5指的是在IoU(交并比)为0.5的阈值下的平均精确度,而mAP@0.5-0.95则考虑了IoU从0.5到0.95的不同阈值,是一个更为严格和全面的性能度量。两者都是目标检测领域中公认的评估标准。在本模型的训练中,这两个指标随着训练周期的增加而稳步上升,显示出模型在捕获目标的准确性方面取得了实质性的进展。
总之,这些训练时的损失和性能图表展示了YOLOv8模型在血细胞智能检测与计数任务上的有效学习。损失函数的下降趋势和性能指标的提升表明模型在识别准确性、定位能力和分类准确性方面都有所提高。这些进步预示着模型在实际应用中,尤其是在高速度和高准确度都至关重要的医学图像分析任务上,有着良好的潜力和适用性。
5.2 F1曲线图
在深度学习模型的性能评估中,F1分数是衡量模型精确性和召回率平衡的关键指标,它的高值指示着模型在保持高识别率的同时避免了过多的误判。图中展示的是血细胞检测模型在各个置信度阈值下的F1分数曲线,这为我们提供了模型性能的详尽视图。
通过分析F1分数曲线,我们可以观察到几个重要的特点。首先,曲线的形状告诉我们模型在不同置信度阈值下的性能变化。理想情况下,我们希望在置信度较低时就能获得较高的F1分数,这意味着模型能在较为宽松的条件下就实现准确检测。对于图中的血细胞检测模型,我们看到在置信度阈值较低的情况下F1分数迅速上升,说明模型即使在低置信度下也能保持较高的性能。
特别地,针对不同类别的血细胞——血小板、红细胞(RBC)、白细胞(WBC)和镰状细胞——模型的F1分数表现出显著差异。这可能与训练数据中各类样本的数量和多样性有关。从曲线我们可以看出,对于红细胞,模型的F1分数在置信度较低时即达到高峰,这反映了模型在红细胞检测上的强大性能。而对于镰状细胞,由于其独特的形态,F1分数曲线在较高的置信度阈值下才达到高值,这表明模型在高置信度下对这类血细胞的检测更为准确。
整体上所有类别的F1分数在置信度阈值约为0.463时达到了一个高峰,此时的整体F1分数为0.78。这意味着该置信度阈值可能是对于此模型进行血细胞检测的最优阈值。在实际应用中,我们可以根据这个结果来调整我们模型的置信度阈值,以期达到最佳的检测效果。
当置信度阈值进一步提高时,模型的F1分数开始下降,这提示我们模型可能会错过一些正确的预测,或者是在某些类别上出现了过多的误判。因此,在实际应用中,我们可能需要在保持高F1分数的同时,调整阈值以获得最佳的精确度和召回率平衡。
通过这些详细的分析,我们能够深入理解模型在不同类别的血细胞检测任务上的表现,并对模型的预测置信度进行优化。这些见解不仅有助于我们对现有模型进行改进,还为未来开发更精确、更鲁棒的血细胞检测模型提供了宝贵的数据支持。
5.3 YOLOv8/v7/v6/v5对比实验
(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 作为衡量模型性能的重要指标,尤其在处理类别分布不均的数据集时显得尤为关键。它通过结合精确率与召回率,提供了一个单一的度量标准,能够全面评价模型的效能。精确率衡量的是模型在所有被标记为正例中真正属于正例的比例,而召回率则关注于模型能够识别出的真正正例占所有实际正例的比例。F1-Score通过两者的调和平均,确保了只有当精确率和召回率同时高时,模型的性能评估才会高,从而确保了模型对于正例的预测既准确又完整。
- mAP(Mean Average Precision):在目标检测任务中,Mean Average Precision(mAP)是评估模型性能的重要标准。它不仅反映了模型对单个类别的识别精度,而且还考虑了所有类别的平均表现,因此提供了一个全局的性能度量。在计算mAP时,模型对于每个类别的预测被单独考虑,然后计算每个类别的平均精度(AP),最后这些AP值的平均数形成了mAP。
名称 | YOLOv5nu | YOLOv6n | YOLOv7-tiny | YOLOv8n |
---|---|---|---|---|
mAP | 0.820 | 0.794 | 0.781 | 0.834 |
F1-Score | 0.78 | 0.74 | 0.76 | 0.78 |
(3)实验结果分析:
在血细胞智能检测与计数的任务中,模型选择是至关重要的。我们的实验对YOLO系列的几个版本进行了深入的性能比较,以明确哪一个模型更适合这一特定的应用场景。在这一过程中,我们使用了F1-Score和mAP这两个核心指标,它们分别衡量了模型的准确性和预测的稳定性。
从实验结果来看,YOLOv8n在mAP指标上得分最高,达到了0.834,显示出在这个数据集上的优越性能。mAP指标衡量的是模型在各个置信度阈值下的平均精度,高分意味着模型在绝大多数情况下都能给出准确的预测。YOLOv5nu虽然紧随其后,但mAP为0.820,说明它在精度上略微逊色于YOLOv8n。YOLOv6n和YOLOv7-tiny的mAP得分分别为0.794和0.781,相对较低,这可能是由于它们的网络架构较为简单,或者是在训练数据的利用上不如其他两个版本。
在F1-Score的表现上,YOLOv5nu和YOLOv8n并列第一,均为0.78,这个结果反映了这两个模型在精确度和召回率之间达到了良好的平衡。YOLOv7-tiny的F1-Score为0.76,略低于前两者,但考虑到“tiny”版本通常是为了在准确性和速度之间取得平衡而设计的,这个结果仍然十分可观。YOLOv6n的F1-Score为0.74,表现最差,可能是因为在模型训练时未能很好地平衡偏差和方差,或者模型本身对于数据集的特征学习不够充分。
这些指标的差异可能与多个因素有关,包括模型的深度、宽度、以及复杂性。新版本的YOLO模型通常包含了更多的改进和优化,例如更先进的损失函数、更细粒度的特征提取和更有效的非极大值抑制(NMS)机制。此外,YOLOv8n可能利用了最新的研究成果,如更深的网络结构和更大的模型容量,以更好地从数据中学习复杂的特征。而YOLOv5nu则可能得益于其稳定的架构和有效的训练策略,在这次评估中依然保持了高水平的性能。
综上所述,选择合适的模型需要根据实际的应用场景和需求进行。对于需要高准确性的场景,YOLOv8n将是一个不错的选择。对于需要在速度和准确性之间取得平衡的场景,YOLOv5nu或YOLOv7-tiny可能更加合适。而对于需要快速部署且计算资源受限的环境,YOLOv6n和YOLOv7-tiny的“n”和“tiny”版本仍然是值得考虑的候选者。通过深入分析每个模型的表现,我们可以对它们在实际医疗图像处理任务中的潜在效用有一个更全面的认识。
6. 系统设计与实现
6.1 系统架构概览
在介绍基于YOLOv8/v7/v6/v5模型的血细胞智能检测与计数系统的架构设计时,我们将着重探讨几个核心组件的设计和实现。这些组件在系统中扮演着至关重要的角色,包括模型加载、图像处理、检测执行、结果展示等多个方面。下面是对这些关键组件设计的具体说明:
- 模型加载与初始化
在系统中,模型的加载与初始化是首要步骤,确保了检测模型能够被正确地加载和初始化以供后续使用。本系统中采用的YOLOv8v5Detector
类负责加载预训练的YOLO模型。这一步骤在__init__
方法中实现,通过调用model.load_model
方法,传入模型路径(如YOLOv8/v7/v6/v5的权重文件),完成模型的加载工作。此外,该类还会初始化模型参数,如置信度阈值(conf_threshold
)和IOU阈值(iou_threshold
),以适应不同的检测需求。
- 图像处理
图像处理是系统中的一个关键步骤,它直接影响到检测结果的准确性和效率。在frame_process
方法中,系统首先对输入的图像进行尺寸调整,确保图像尺寸符合模型的输入要求。接着,利用model.preprocess
方法对图像进行预处理,如归一化等,为模型推理做好准备。
- 检测执行
检测执行是系统的核心部分,负责执行血细胞的识别和定位。在frame_process
方法中,经过图像预处理后,使用model.predict
方法对预处理后的图像执行推理,获得检测结果。此过程中,会根据设定的置信度阈值和IOU阈值过滤掉一部分检测框,以提高检测的准确性。
- 结果展示与记录
系统设计了多种方式来展示和记录检测结果,便于用户理解和进一步分析。通过logTable
实例(由LogTable
类创建),系统能够将检测结果保存至CSV文件中,便于后续的分析和报告生成。同时,在toggle_comboBox
和frame_process
方法中,系统提供了图形界面上的结果展示,包括将检测框和置信度直接绘制在图像上,并通过image_placeholder
等属性在Web界面上展示处理后的图像和检测结果。
- 用户交互界面
系统通过streamlit
库构建了友好的用户交互界面,允许用户通过Web界面轻松地上传图像或视频文件,选择模型类型,设置检测参数等。在setup_sidebar
方法中,系统初始化了侧边栏的各项配置,包括模型选择、文件上传、参数设置等。此外,process_camera_or_file
方法则根据用户的选择,执行摄像头实时检测或文件检测。
通过上述关键组件的设计和实现,本系统实现了血细胞的智能检测与计数功能,不仅提高了检测的效率和准确性,还提供了易于使用的用户界面,极大地方便了用户的使用和结果的分析。
6.2 系统流程
在我们的血细胞智能检测与计数系统中,整个流程从用户界面的交互到最终的检测结果展示,形成了一个闭环的工作流程。以下是该系统工作流程的步骤性描述,旨在清晰展示从启动到获取结果的全过程:
-
初始化系统:启动系统时,首先执行
__init__
方法,进行必要的初始化设置,包括模型加载、参数设置、界面布局等。在这一步骤中,YOLOv8v5Detector
类实例被创建,用于后续的图像检测任务。 -
设置用户界面:通过
setup_page
和setup_sidebar
方法,系统设置主页面和侧边栏的布局与选项。侧边栏提供模型选择、文件上传、参数配置等选项,用户可以通过这些选项来自定义检测过程。 -
文件上传和摄像头选择:用户可以选择上传图像或视频文件,或者选择使用实时摄像头进行检测。这一步骤通过侧边栏中的选项来实现,系统根据用户的选择准备相应的输入源。
-
参数配置:用户可以通过侧边栏设置检测相关的参数,如置信度阈值和IOU阈值等。这些参数直接影响检测的精度和结果。
-
启动检测:用户完成输入源和参数设置后,点击“开始运行”按钮启动检测过程。系统将根据用户的选择执行相应的检测任务,包括处理摄像头输入、图片文件或视频文件。
-
图像预处理:无论是来自摄像头、图片文件还是视频文件的输入,系统首先对每一帧图像执行预处理,包括尺寸调整和归一化等,以适应模型的输入要求。
-
执行检测:预处理后的图像数据被送入YOLO模型进行推理,系统通过
frame_process
方法调用model.predict
执行检测,得到包含血细胞位置和类别的检测结果。 -
结果处理与展示:检测完成后,系统通过
toggle_comboBox
和frame_process
方法处理检测结果,包括绘制检测框、计数和分类等,并在用户界面上展示这些结果。 -
结果记录:检测结果除了在界面上直接展示外,还通过
logTable
实例记录到CSV文件中,方便用户后续进行分析和报告生成。 -
用户交互与反馈:在检测过程中,用户可以随时调整参数设置或重新选择输入源,系统将根据新的设置重新执行检测。此外,用户还可以导出检测结果和记录文件。
通过上述流程,我们的系统为用户提供了一个高效、准确且易于操作的血细胞智能检测与计数工具,大大提升了血细胞分析的效率和准确性。
代码下载链接
如果您希望获取博客中提及的完整资源包,包含测试图片、视频、Python文件(*.py)、网页配置文件、训练数据集、代码及界面设计等,可访问博主在面包多平台的上传内容。相关的博客和视频资料提供了所有必要文件的下载链接,以便一键运行。完整资源的预览如下图所示:
资源包中涵盖了你需要的训练测试数据集、训练测试代码、UI界面代码等完整资源,完整项目文件的下载链接可在下面的视频简介中找到➷➷➷
演示及项目介绍视频:https://www.bilibili.com/video/BV1wx4y1Y7mE/
完整安装运行教程:
这个项目的运行需要用到Anaconda和Pycharm两个软件,下载到资源代码后,您可以按照以下链接提供的详细安装教程操作即可运行成功,如仍有运行问题可私信博主解决:
- Pycharm和Anaconda的安装教程:https://deepcode.blog.csdn.net/article/details/136639378;
软件安装好后需要为本项目新建Python环境、安装依赖库,并在Pycharm中设置环境,这几步采用下面的教程可选在线安装(pip install直接在线下载包)或离线依赖包(博主提供的离线包直接装)安装两种方式之一:
- Python环境配置教程:https://deepcode.blog.csdn.net/article/details/136639396(2,3方法可选一种);
- 离线依赖包的安装指南:https://deepcode.blog.csdn.net/article/details/136650641(2,3方法可选一种);
如使用离线包方式安装,请下载离线依赖库,下载地址:https://pan.baidu.com/s/1uHbU9YzSqN0YP_dTHBgpFw?pwd=mt8u (提取码:mt8u)。
7. 结论与未来工作
通过深入研究并实践了基于YOLOv8/v7/v6/v5的深度学习模型在血细胞智能检测与计数领域的应用,我们成功开发了一个高效准确的系统。通过细致比较和优化多个版本的YOLO模型,不仅显著提升了血细胞智能检测与计数的准确率和实时性,而且还借助Streamlit技术,打造了一个直观、美观且用户友好的Web应用界面,极大地简化了用户操作流程,使得血细胞检测变得更加便捷和高效。
经过严格的实验验证,我们的方法在血细胞智能检测与计数的准确性和处理速度方面均达到了高水平。此外,本研究还提供了完整的数据处理、模型训练与预测代码,以及基于Streamlit的应用开发细节,为后续研究者和开发人员提供了极大的便利。尽管我们在这一领域已取得显著成就,但血细胞智能检测与计数作为一个高度复杂和动态变化的任务,仍然存在诸多挑战和提升空间。针对未来的研究和开发,我们计划从以下方面进行深入探索:
- 模型优化:我们将继续研究深层网络结构和优化策略,如神经网络架构搜索(NAS),以进一步提高模型的检测性能和效率。
- 多模态学习:考虑引入图像以外的其他模态信息,如文本和语音数据,通过多模态学习方法来增强血细胞检测的准确度和鲁棒性。
- 跨域适应性:研究在不同人群和环境条件下的血细胞检测问题,通过领域适应技术提升模型的泛化能力和适应性。
- 用户交互体验:我们计划进一步改进和优化用户界面和交互设计,使系统更加人性化和智能化,以更好地满足广大用户的需求。
- 实际应用场景的拓展:探索血细胞智能检测与计数技术在更多实际应用中的潜力,如医疗健康、远程诊断等领域,以实现其更广泛的应用和社会价值。
总体而言,基于YOLOv8/v7/v6/v5模型的血细胞智能检测与计数技术正在迅速发展,并有望在医疗健康、生物科学研究等多个领域发挥更大的作用。随着技术的不断进步和应用范围的持续拓展,我们有理由相信,这一领域的未来充满了无限可能和广阔前景。
Yusof, Najiha‘Izzaty Mohd, et al. “Assessing the performance of YOLOv5, YOLOv6, and YOLOv7 in road defect detection and classification: a comparative study.” Bulletin of Electrical Engineering and Informatics 13.1 (2024): 350-360. ↩︎
Zhao, Dewei, et al. “A Small Object Detection Method for Drone-Captured Images Based on Improved YOLOv7.” Remote Sensing 16.6 (2024): 1002. ↩︎
Bietti, Alberto, et al. “Birth of a transformer: A memory viewpoint.” Advances in Neural Information Processing Systems 36 (2024). ↩︎
Qin, Han, et al. “An Improved Faster R-CNN Method for Landslide Detection in Remote Sensing Images.” Journal of Geovisualization and Spatial Analysis 8.1 (2024): 2. ↩︎