基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的血细胞检测与计数系统(Python+PySide6界面+训练代码)
摘要:本文介绍了一种基于深度学习的血细胞检测系统系统的代码,采用最先进的YOLOv8算法并对比YOLOv7、YOLOv6、YOLOv5等算法的结果,能够准确识别图像、视频、实时视频流以及批量文件中的血细胞。文章详细解释了YOLOv8算法的原理,并提供了相应的Python实现代码、训练数据集,以及基于PySide6的用户界面(UI)。该系统实现了对图像中血细胞的准确识别和分类,并包含了基于SQLite的登录注册管理、一键更换YOLOv5/v6/v7/v8模型以及界面自定义修改等功能。本文旨在为相关领域的研究人员和新入门的朋友提供一个参考,完整代码资源文件以及数据集可以在文末的下载链接中获取。本文结构如下:
演示与介绍视频:https://www.bilibili.com/video/BV1Fu4m1A7x2/
YOLOv8/v7/v6/v5项目合集下载:https://mbd.pub/o/bread/mbd-ZZuXmZts
YOLOv8/v5项目完整资源下载:https://mbd.pub/o/bread/ZZuXmJ9p
YOLOv7项目完整资源下载:https://mbd.pub/o/bread/ZZuXmZpp
YOLOv6项目完整资源下载:https://mbd.pub/o/bread/ZZuXmJdu
前言
在当今医疗健康领域,血细胞检测扮演着至关重要的角色。它不仅是血液病诊断的基石,如贫血、白血病等,也是评估病人健康状态、监测治疗效果的重要手段。随着医疗技术的发展,传统的血细胞检测方法—依赖显微镜下的人工观察和计数—正逐渐显现出其局限性,包括耗时长、效率低下以及结果受操作人员技能水平影响大等问题。这些挑战催生了一系列基于计算机视觉和深度学习技术的研究,旨在提高检测的自动化程度、准确性和效率。尤其是YOLO[1](You Only Look Once)系列算法在实时对象检测领域的成功应用,为血细胞检测带来了革命性的进展。从YOLOv5到最新的YOLOv8[2],每一代算法的更新都在不断推动检测精度的提升和速度的优化,使得血细胞自动检测成为可能。
近年来,随着深度学习技术的快速发展,基于YOLO等算法的血细胞检测研究取得了显著成就。研究者们不断在算法结构、优化方法、数据增强技术上进行创新,以适应血细胞图像的特殊性和复杂性。例如,通过引入注意力机制、改进的损失函数和更精细的特征提取网络,新一代的YOLO算法能够更有效地从血细胞图像中识别和分类不同类型的血细胞,显著提高了检测的准确率和速度。此外,随着公开可用的血细胞图像数据集的增多,模型训练和验证的质量也得到了显著提升。最新的研究成果表明,基于深度学习的血细胞检测方法在准确率、检测速度以及稳定性方面均优于传统方法,为临床诊断提供了有力的技术支持。
最新的研究成果显示,通过对YOLO算法的不断改进和优化,如增加注意力机制、改进的锚点机制和损失函数,能够有效提升血细胞图像的检测精度和速度。例如,一项研究中采用了YOLOv5[3]算法,并对其进行了定制化改进,以适应血细胞图像的特殊性,结果表明该改进算法在血细胞检测中的表现优于传统方法和其他深度学习模型。此外,随着YOLOv6[4]和YOLOv7[5]的发布,研究者进一步通过算法结构的调整和训练策略的优化,实现了更快的检测速度和更高的准确率,这对于实时血细胞检测具有重要意义。
与此同时,其他深度学习算法也在血细胞检测领域得到了应用。例如,基于卷积神经网络(CNN)和图卷积网络(GCN)的混合模型,在处理血细胞图像时能够更好地捕捉到细胞之间的空间关系,从而提高了分类和检测的准确性。此外,一些研究采用了自适应的图像预处理方法和数据增强技术,以克服血细胞图像质量不一和数据不平衡的问题,这些方法显著提高了模型的泛化能力和鲁棒性。
值得注意的是,随着深度学习技术的普及和发展,数据集的规模和质量成为影响模型性能的关键因素。近期有研究专注于构建更大规模、更高质量的血细胞图像数据集,并利用这些数据集对深度学习模型进行训练和验证,取得了良好的效果。这些高质量的数据集不仅为模型训练提供了宝贵资源,也为算法评估和比较提供了标准化的平台。
然而,尽管取得了巨大进步,血细胞检测领域仍面临着一系列技术挑战,包括如何进一步提高检测的准确性和稳定性、如何处理图像质量差异大的问题、以及如何将这些高级算法有效地部署到实际的医疗环境中。此外,随着技术的发展,新的算法和模型不断涌现,如何在保证实时性的同时进一步提高性能,也是当前研究的热点。
本博客所展示的工作基于最新的YOLOv8算法构建了一个高效的血细胞检测系统,不仅在理论研究上进行了深入探讨,而且在实际应用开发上取得了显著成果。本文的主要贡献归纳如下:
- 采用最先进的YOLOv8算法进行血细胞检测:本研究充分利用了YOLOv8算法的强大能力,在血细胞检测领域中实现了前所未有的效率和准确度。通过与YOLOv7、YOLOv6、YOLOv5等早期版本的对比分析,本文详细展示了YOLOv8在处理速度、检测精度等方面的显著优势,为血细胞检测技术的进一步发展提供了新的研究思路和实践手段。
- 利用PySide6实现血细胞检测系统:本文探索了如何使用Python的PySide6库开发一个用户友好的血细胞检测系统界面。该系统不仅提高了血细胞检测的直观性和便捷性,而且促进了YOLOv8算法在实际应用中的广泛应用。
- 包含登录管理功能:系统设计了登录管理功能,提高了使用的安全性和个性化体验。这一设计不仅保护了用户的数据安全,也为将来引入更多个性化和高级功能奠定了基础。
- 对YOLOv8模型进行深入研究:本文不仅应用了YOLOv8算法,而且对其性能进行了全面的评估和分析,包括精确度、召回率等关键指标的评价,以及在不同条件下的表现分析。这些研究成果不仅加深了对YOLOv8算法的理解,也为其进一步的优化和改进提供了坚实的基础。
- 提供完整的数据集和代码资源包:为了让读者能够更深入地理解YOLOv8及其前版本在血细胞检测应用中的操作和性能,本文提供了包含详细数据集和完整代码的资源包。这一贡献使得读者能够直接复现研究结果,并在此基础上进行自己的研究和开发工作。
1.数据集介绍
在本研究中,我们专注于使用一个高度精确的血细胞图像数据集,它包含了多样化的血细胞类型,为深度学习模型提供了丰富的学习资源。数据集总计包括8900张经过预处理的图像,这些图像被分为6587张训练集、1869张验证集以及444张测试集图像,确保了模型在各个阶段的性能评估都基于足够的数据进行。这种划分有利于模型在广阔的样本空间中学习并验证其泛化能力,同时也允许在独立的测试集上进行公正和准确的性能评估。
我们对数据集进行了精细的预处理,所有图像均自动校正了方向,并剥离了EXIF中的方向信息,以确保数据输入的一致性。此外,图像被统一调整至448x448像素大小,尽管这一处理可能导致原始图像的宽高比失真,但这样做确保了所有图像均能被深度学习模型有效地处理。
在分析数据集的标注分布时,我们发现了显著的类别不平衡。'Platelet' 类别的实例数量在数据集中占比最高,而如 'Eosinophil', 'Monocyte', 'Neutrophil' 等类别的实例相对较少。这种类别不平衡现象在机器学习尤其是深度学习中是一个常见的问题,它可能导致模型对多数类别过于敏感而忽视了少数类别。针对这一问题,我们可能需要采取特定的数据平衡策略,如过采样少数类别或调整类别权重,以提高模型对所有类别的检测能力。
进一步的数据分析揭示了细胞尺寸和位置的分布特点。从尺寸分布图中可以观察到,大多数细胞具有较小的边界框尺寸,并且主要集中在图像的中心区域。这一发现指出,我们的模型需要对小尺寸目标具有较高的识别能力,并且可能需要对图像中心区域给予更多的关注。此外,通过边界框的聚类分析,我们可以进一步优化模型中锚框的尺寸和比例参数,以便更准确地预测血细胞的位置和形状。
我们的数据集不仅具有多样的图像,还提供了详细的类别标签。每张图片都经过了仔细的标注,确保了模型能够在准确性和分类能力上达到较高标准。这些标签对于训练阶段的损失函数计算以及模型评估阶段的性能指标计算都至关重要。博主使用的类别代码如下:
Chinese_name = {"Basophil": "嗜碱细胞", "Echinocytes": "刺状红细胞", "Elliptocyte": "椭圆形红细胞",
"Eosinophil": "嗜酸细胞",
"Erythroblast": "红细胞前体", "Hypochromia": "低色素症", "Lymphocyte": "淋巴细胞",
"Macrocyte": "大细胞",
"Microcyte": "小细胞", "Monocyte": "单核细胞", "Neutrophil": "中性粒细胞", "Ovalocyte": "椭圆细胞",
"Platelet": "血小板", "RBC": "红细胞", "Schistocyte": "裂片细胞", "Spherocyte": "球形细胞",
"Stomatocyte": "口形细胞", "TargetCell": "靶细胞", "Teardrop": "泪滴细胞", "WBC": "白细胞"}
综上所述,我们的数据集提供了一个全面、多样化且精确标注的图像集合,为血细胞检测系统的开发提供了坚实的基础。通过深入分析数据分布,我们为模型设计和训练提供了指导,以期在实现高准确度的同时,也保证了模型的鲁棒性和泛化能力。这些精心的准备和分析工作,为解决实际医疗诊断中的血细胞检测问题提供了有力的技术支持。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行血细胞检测的图片或视频,或者启动摄像头进行实时检测。在进行血细胞检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8作为目标检测领域的一项重要进展,其算法原理体现了最新的技术革新和性能优化。这一模型不仅在传统的YOLO架构上做出了改进,还引入了多项新技术以提高检测的准确性和速度。
首先,YOLOv8通过引入更加精细的网络架构设计,增强了模型对小目标的识别能力,同时也提高了对背景噪声的抑制能力。特别是,它采用了多尺度特征提取技术,能够捕获不同大小目标的特征。这一特征对于血细胞等细小目标的检测尤其重要,因为它们在图像中的表现可能非常微小,易于被忽视。而YOLOv8通过在不同层次上进行特征融合,能够提升对这些细小目标的检测效率。
在损失函数的设计上,YOLOv8采用了创新的 'Distribution Focal Loss',这是一种针对分类误差的改进。传统的Focal Loss主要是为了解决分类任务中的类别不平衡问题,而'Distribution Focal Loss'则进一步,通过调整分类概率分布来优化。这种新型的损失函数不仅能够更加精确地反映类别之间的差异,还可以有效减少模型在面临不平衡数据时的过拟合现象。
YOLOv8还采用了Task Aligned Assigner,这是一种新颖的任务对齐分配机制。它通过对标注框与预测框之间的对齐程度进行评分,来决定哪些标注框应当被分配给特定的锚点。Task Aligned Assigner的引入有效减少了标注与预测之间的误差,提升了模型的准确性。
在模型的训练过程中,YOLOv8的设计者还特别考虑了训练数据的质量和效率问题。这一方面体现在如何更有效地利用训练数据来提升模型性能。YOLOv8采用了一系列数据增强技术来模拟各种可能的检测场景,增强模型在复杂环境下的泛化能力。数据增强技术的应用,使得YOLOv8能够在多样化的数据上获得更稳定和鲁棒的学习效果。
综上所述,YOLOv8在网络架构、损失函数设计、标注框分配机制以及数据增强技术等多个方面都进行了创新和优化,这些改进让它在目标检测领域的表现超越了以往的版本。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模型训练中使用的一些重要超参数及其设置:
超参数 | 设置 | 说明 |
---|---|---|
学习率(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。
results2 = model.train(
data=data_path,
device='0',
workers=workers,
imgsz=640,
epochs=120,
batch=batch,
name='train_v8_' + data_name
)
在训练和验证损失的图像中,我们观察到模型在训练初期迅速进步,随后稳步提升。对于box损失,即目标框的回归损失,它衡量的是预测框与真实框之间的差异。训练和验证损失的快速下降表明模型很好地学习到了如何定位目标。在cls损失,即分类损失方面,这代表了模型预测的类别与真实类别之间的不一致性。损失的下降表明模型在区分不同类别的细胞方面变得更加精确。而df1损失,可能是指YOLOv8特有的'Distribution Focal Loss',其下降趋势表示模型在处理不平衡数据集方面变得更加有效,提高了对少数类的检测性能。
从性能指标图像中,我们可以看到模型在精度和召回率方面的表现。精度指的是模型预测正确的正样本占所有预测为正的样本的比例,而召回率是指模型正确预测的正样本占所有实际为正的样本的比例。图像显示随着训练的进行,模型的精度和召回率都逐渐提高,这表明模型在识别目标方面变得越来越可靠。特别是召回率的快速提升,意味着模型错过的目标数量显著减少。
接下来,关于模型的精确度和召回率,我们看到metrics/precision(B)和metrics/recall(B)在训练过程中稳步提升,尤其是召回率,它快速提升至接近0.8的水平,并在后期保持稳定。这表明模型能够检测出数据集中的大部分正样本,同时保持较少的误检。精确度在训练后期也达到了高水平,这意味着模型的预测在很大程度上是准确的,只有少数正样本被错误标记。
最后,我们评估了模型在不同IoU阈值下的平均精度(mAP)。mAP是目标检测领域中常用的评价指标,用来衡量模型整体的性能。从图像中可以看到,随着训练的进行,mAP50(IoU=0.5时的mAP)和mAP50-95(IoU从0.5到0.95的mAP的平均值)都呈现上升趋势。这表明模型在各种不同程度的重叠情况下,都能保持较高的性能,这对于实际应用来说非常重要。
PR曲线展示了模型在每个类别上的表现,通过精度和召回率两个维度的变化关系来评估。精度是指模型正确预测正样本的能力,而召回率衡量的是模型识别出的正样本占所有正样本的比例。理想的模型在这两个指标上都应该表现出高值。在图中,我们看到大多数血细胞类型的曲线趋于右上角,这表明对于这些类型,模型既保持了高精度也实现了高召回率。特别是对于Basophil、Eosinophil和Erythroblast等类型,曲线紧贴右上角,说明模型在这些类别上的检测性能非常出色。
然而,也有一些类别,如Macrocyte和Microcyte,其PR曲线相对较低,特别是Microcyte的表现,显示出较低的精度和召回率,这可能是由于模型对这些细胞类型的特征学习不足,或者是数据集中这些类别样本较少导致的。对于这些类别,可能需要进一步的数据收集或是模型训练策略调整,比如专门针对这些类型增加样本数量或采用针对性的数据增强。
整体而言,模型在所有类别上的平均精度mAP@0.5为0.815,这是一个相当高的性能指标,意味着模型在IoU阈值为0.5时,能够达到81.5%的平均精度。这个结果表明模型对于大多数类别都有着可靠的检测能力,是在血细胞检测应用中非常有前景的性能表现。然而,我们也应该注意到mAP仅是一个综合性能指标,它可能掩盖了个别类别上的性能不足。因此,对于那些表现不佳的类别,我们应该进行更细致的分析和优化,以确保模型在所有类型的血细胞检测上都能表现出色。
总结来说,YOLOv8模型在血细胞检测任务上的性能评估结果较好,尤其是在多数类别上展现的高精度和高召回率。这些分析结果不仅证明了模型的强大能力,也为我们提供了未来改进工作的明确方向,特别是在处理那些模型表现不足的细胞类型时。通过持续的优化和调整,我们期待将模型的性能提升到新的高度。
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.808 | 0.722 | 0.798 | 0.815 |
F1-Score | 0.72 | 0.68 | 0.75 | 0.72 |
(3)实验结果分析:
在比较不同版本的YOLO模型时,我们需要细致分析每个模型的性能指标,特别是在同一数据集上的表现。这里我们使用了两个核心的度量指标:mAP(mean Average Precision)和F1-Score。mAP衡量了模型在不同置信度阈值下的平均精确度,而F1-Score则是精确度和召回率的调和平均,能够综合反映模型的性能。
YOLOv8n以0.815的mAP领先于其他版本,显示出在检测精度上的优势。这可能归因于YOLOv8n在网络架构、损失函数和训练策略上的改进。YOLOv5nu紧随其后,以0.808的mAP表现出了相似的高水平性能,这可能是因为YOLOv5nu在稳定性和成熟性上有较好的表现,尽管它的架构可能没有YOLOv8n那么先进。YOLOv7-tiny的mAP略低于YOLOv5nu,为0.798,考虑到“tiny”版本通常是为了速度优化而设计的,这个结果依然可以看作是相当不错的。YOLOv6n的表现最低,mAP为0.722,这表明在所选择的数据集上,YOLOv6n的性能可能受到某些因素的限制,或者它在处理某些类型的目标上不如其他版本的YOLO模型。
F1-Score的对比中,YOLOv7-tiny以0.75的分数领先,这意味着尽管其整体检测精度略低,但在精确度和召回率的平衡上表现得最佳。YOLOv5nu和YOLOv8n在F1-Score上并列,都是0.72,说明这两个模型在精确度和召回率的权衡上相似,并且与mAP高分相一致,表现出较高的检测性能。YOLOv6n在F1-Score上的分数为0.68,与其在mAP上的表现一致,是四个模型中最低的。
从这些结果可以看出,YOLOv8n和YOLOv5nu在检测性能上相较于YOLOv6n和YOLOv7-tiny有显著的优势。这可能与它们在网络结构的复杂度、特征提取的能力以及损失函数的优化方面有关。YOLOv7-tiny尽管在mAP上略低,但其F1-Score的表现最好,这可能是由于其对精确度和召回率之间的平衡做了优化。YOLOv6n可能需要在算法结构或训练策略上做进一步的调整以提升性能。
总之,不同版本的YOLO模型在实验数据上的表现揭示了各自的优点和局限。这些洞察可以帮助我们选择适合特定任务的模型,或者在未来的研究中指导我们对模型进行改进。考虑到YOLO系列模型持续的发展,我们期待在未来的工作中,通过进一步的优化和调整,能够实现更高的检测性能。
4.4 代码实现
在这篇博客中,我们探索了如何构建一个血细胞检测系统,该系统结合了深度学习的强大功能和图形用户界面(GUI)的直观性。我们的目标是利用YOLOv8的强大检测能力,开发一个能够识别和分类不同类型血细胞的应用程序。这不仅是机器视觉领域的一个实际案例,也展示了现代编程语言如Python在集成各种技术方面的灵活性。
(1)导入必要的模块和配置
为了实现这一目标,我们首先导入了一系列必要的Python模块。random模块用于生成各种血细胞类型的随机颜色代码,这为后续在图像上标注检测结果提供了视觉上的区分;sys模块提供了与Python解释器交互的接口,允许我们访问系统级命令;time模块用于添加时间相关的功能,例如在界面上显示处理时间;而cv2即OpenCV库,是处理图像的核心工具。PySide6是我们构建GUI的框架,它使得创建窗口和响应用户操作变得简单直观。
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
QF_Config.set_verbose(False)
在代码中,我们使用QtFusion库,这是一个封装了Qt功能的库,它提供了创建现代化窗口和控件的方法。我们定义了类名和为每个类别生成的颜色列表,它们将用于在图像上标注检测到的血细胞,每个细胞类型都有一个唯一的颜色,以方便用户区分。
(2)定义类别和模型
我们接着创建了YOLOv8Detector的实例,并加载了预先训练好的模型权重。这个步骤是实现检测功能的关键,它确保我们的系统具备了直接进行血细胞检测的能力。
cls_name = ["嗜碱细胞", "刺状红细胞", "椭圆形红细胞", "嗜酸细胞", "红细胞前体", "低色素症",
"淋巴细胞", "大细胞", "小细胞", "单核细胞", "中性粒细胞", "椭圆细胞", "血小板",
"红细胞", "裂片细胞", "球形细胞", "口形细胞", "靶细胞", "泪滴细胞", "白细胞"] # 定义类名列表
colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(cls_name))] # 为每个目标类别生成一个随机颜色
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/blood-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
(3)创建主窗口
MainWindow类继承自QMainWindow,它构成了我们应用的主窗口。在这个类中,我们设置窗口的基本属性,如大小和标签,这些标签将用于显示图像和检测结果。此外,我们还定义了键盘事件的处理函数,以便用户可以通过按键来控制应用程序。
class MainWindow(QMainWindow): # 自定义主窗口类
def __init__(self): # 构造函数
super().__init__() # 调用父类构造函数
self.resize(850, 500) # 设置窗口大小
self.label = QtWidgets.QLabel(self) # 创建标签用于显示图像
self.label.setGeometry(0, 0, 850, 500) # 设置标签位置和大小
def keyPressEvent(self, event): # 键盘事件处理
if event.key() == QtCore.Qt.Key.Key_Q: # 按下Q键时
self.close() # 关闭窗口
在我们的系统中,MainWindow类继承自QMainWindow,它是主窗口的基础。在这个类中,我们设置了窗口的大小,并且初始化了一个标签来显示处理过的图像。我们还定义了keyPressEvent函数来处理用户的键盘输入,当用户按下'Q'键时,程序会安全退出。
(4)主程序流程
我们的代码示例从实例化一个Qt应用程序开始。这是创建任何基于PySide6的GUI应用的第一步。在这个框架中,QApplication对象管理GUI应用的控制流程和主要设置,而MainWindow对象则负责初始化我们的主窗口界面。我们紧接着定义了一个图像的路径,并使用cv_imread函数读取图像。这个函数是对OpenCV读取图像功能的封装,能够确保中文路径也能被正确处理。读取后的图像随即被调整到适合显示的尺寸。
if __name__ == '__main__': # 如果当前模块是主模块
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
img_path = abs_path("test_media/BloodCells_SIXU_A_00385.jpg") # 定义图像文件的路径
image = cv_imread(img_path) # 使用cv_imread函数读取图像
image = cv2.resize(image, (850, 500)) # 将图像大小调整为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: # 遍历检测信息
# 获取类别名称、边界框、置信度和类别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]) # 在图像上绘制边界框和标签
window.dispImage(window.label, image) # 在窗口的label上显示图像
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
一旦得到模型的预测结果,我们使用postprocess方法进行后处理,这包括将模型的输出转换为可理解和可视化的格式。最终,处理后的图像展示在主窗口的标签上。这不仅为用户提供了即时的反馈,而且还展示了YOLOv8模型在实际应用中的强大能力。
上面的代码展示了从图像读取到深度学习预测再到图像展示的完整流程。它不仅体现了编程的严谨性,还彰显了跨学科技术的综合应用。通过这样的项目,我们不仅能够提升医学图像分析的质量,还能推动深度学习技术在各行各业的广泛应用。
5. 血细胞检测系统实现
在设计交互式血细胞检测与识别系统的过程中,我们采取了一个模块化和层次化的方法,以确保系统既高效又易于维护。我们的系统设计思路是围绕用户体验来构建的,旨在提供一个直观、响应迅速的用户界面,同时在后台执行复杂的图像处理和目标检测任务。
5.1 系统设计思路
在我们的系统设计中,我们致力于打造一个直观且功能强大的交互式血细胞检测与识别系统,旨在提高用户的操作便利性,并充分利用YOLOv8模型的强大功能。
(1)架构设计
我们的设计理念是通过高度模块化的方法,将复杂的技术细节抽象化,从而让用户可以不必关注背后的复杂算法就能够进行血细胞检测与识别。具体来说,我们将系统划分为三个主要层次:处理层、界面层和控制层,每层均担负着独特的职责,相互协作以达到整体功能。
- 处理层(Processing Layer):在处理层,我们利用YOLOv8Detector类的预训练模型来处理复杂的图像数据。这个类封装了所有必要的方法,用于加载模型、执行预测、处理图像数据以及后处理分析结果。这样的设计使得图像处理和目标检测流程高度自动化,同时保持了足够的灵活性,以便根据不同的应用需求调整处理策略。
- 界面层(UI Layer):由Ui_MainWindow类生成的用户界面构成,它设计有清晰、易于理解的交互元素,如按钮和标签,允许用户无缝地上传图像、启动检测过程,并查看结果。这些界面元素不仅提供了必要的功能性,还通过直观的布局和视觉提示增强了用户体验。
- 控制层(Control Layer):由Ui_MainWindow类生成的用户界面构成,它设计有清晰、易于理解的交互元素,如按钮和标签,允许用户无缝地上传图像、启动检测过程,并查看结果。这些界面元素不仅提供了必要的功能性,还通过直观的布局和视觉提示增强了用户体验。
整个系统的设计遵循了模块化的原则。每个层次都有明确的职责分工,这不仅有助于系统的维护和升级,也使得扩展新功能变得简单快捷。通过这样的设计思路,我们确保了系统能够高效地处理血细胞检测任务,同时为用户提供了一流的使用体验。在未来,我们希望这个系统能够支持更多的功能和模型,进一步拓展其在图像识别领域的应用范围。
(2)系统流程
在本次博客的探讨中,我们将深入了解交互式血细胞检测与识别系统的工作流程,这一系统基于Python开发,融合了YOLOv8模型的强大功能与PySide6的图形界面开发能力。以下是我们系统的运行流程详细介绍。
-
当用户启动应用程序时,系统首先创建了MainWindow类的实例,这是整个应用的核心。MainWindow类不仅初始化用户界面,设置窗口大小、布局和其他相关参数,而且还预设了一系列的用户交互机制,例如按钮点击和下拉选择等,从而构成了用户操作的起点。
-
界面上,用户可以灵活选择他们的输入源。无论是希望通过摄像头实时捕捉图像、读取存储在硬盘上的视频文件,还是加载静态图片,应用程序都提供了直观的操作方式来满足这些需求。这种设计使得系统能够适应多种不同的使用场景,从实验室的研究到实际的临床应用都游刃有余。
-
一旦输入源被用户确定,系统就会调用媒体处理器和方法,这包括配置摄像头、读取视频文件或加载图像文件。这一阶段,系统展现了其对不同媒体类型处理的灵活性和强大的功能。
-
随后,系统进入了连续帧处理的循环。首先是预处理阶段,系统对每一帧图像进行适配模型输入要求的预处理,这确保了后续模型的检测准确性。接着,在检测与识别阶段,经过预处理的图像被送入YOLOv8模型,模型以惊人的速度识别图像中的目标并进行分类。
-
界面更新阶段,是用户体验的重要环节。随着检测结果的产生,界面会实时展示检测框和标注的类别。此外,用户还可以在界面上看到检测统计数据,这些数据可能以表格或条形图的形式展现,让用户能够直观地感受到模型检测性能的强大。
-
用户与系统的交互不仅限于开始检测。应用程序提供了一系列的按钮和菜单,使用户能够保存检测结果、查询作者和版本信息,甚至根据需求筛选和分析特定的检测结果。此外,媒体控制功能使用户能够控制媒体的播放状态,无论是启动或停止摄像头捕捉、视频播放还是图像分析,都可以简单地通过界面操作来实现。
总之,这一血细胞检测与识别系统是对现代机器学习技术与用户界面设计融合的一个典范。通过这样的系统设计思路,我们不仅提供了一个强大的工具来协助专业人员进行图像分析,还确保了普通用户也能轻松地接触和利用这些高端技术。未来,我们期望此系统能够进一步扩展,涵盖更多的功能和模型,为用户提供更全面的服务。
5.2 登录与账户管理
在我们的血细胞检测系统中,为了增强用户体验和提供更加定制化的服务,我们引入了一个全面的登录与账户管理功能。该功能基于PySide6进行界面设计,并使用SQLite数据库来安全地管理用户数据。此系统不仅为机器学习和图像处理的高度技术性任务提供了支持,同时也在用户管理方面做了深入的考虑。
登录与账户管理的界面提供了一系列直观的用户操作,包括账户注册、密码修改、头像设置、账户注销以及重新登录等。每位用户在注册后便拥有了独立的空间,在这个空间内,他们能够保存个人的检测历史和偏好设置,这样的设计不仅保护了用户的隐私,也增加了数据管理的便捷性。用户可以轻松地在登录界面完成账户的注册和登录操作,随后便可进入到主界面进行血细胞的检测与分析。
这个个性化的空间对于每个用户来说至关重要,它不仅可以存储他们的检测结果,还可以根据个人偏好对系统进行设置,比如更改头像或更新密码,从而让用户在使用血细胞检测系统时拥有更加个人化的体验。
这些账户管理功能的实现,体现了我们对用户隐私和安全的重视。通过细致的设计,用户在使用系统进行血细胞检测时,能够感受到一种安全和信任感。此外,系统还为每个用户提供了重新登录的快捷方式,确保了即使在暂时退出系统后,用户也能迅速回到他们的个人界面中。
主界面则是用户与深度学习模型互动的场所。它实时展示了检测框、类别标签和置信度等关键信息,无论用户是通过图片、视频文件、实时摄像头输入还是批量文件处理,系统都能实时识别目标并进行记录。这不仅提高了工作效率,也增强了系统在实际应用场景中的实用性。
通过结合用户管理和目标检测功能,我们的系统不仅在技术层面上实现了高效的血细胞检测,而且在用户体验上也提供了极大的便利。用户管理界面的引入,确保了每个用户都能在一个安全、可控的环境中使用这一强大的工具,这样的设计体现了我们对于用户需求的深刻理解和对技术细节的严谨把控。未来,我们计划继续优化这一系统,为用户提供更多的定制化功能,以满足不断增长的市场需求。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1Fu4m1A7x2/
YOLOv8/v7/v6/v5项目合集下载:https://mbd.pub/o/bread/mbd-ZZuXmZts
YOLOv8/v5项目完整资源下载:https://mbd.pub/o/bread/ZZuXmJ9p
YOLOv7项目完整资源下载:https://mbd.pub/o/bread/ZZuXmZpp
YOLOv6项目完整资源下载:https://mbd.pub/o/bread/ZZuXmJdu
在文件夹下的资源显示如下,下面的链接中也给出了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等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的血细胞检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎
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. ↩︎
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. ↩︎