基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的血细胞智能检测与计数(深度学习模型+UI界面代码+训练数据集)

摘要:开发血细胞智能检测与计数系统对于疾病的预防、诊断和治疗具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个血细胞智能检测与计数系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7YOLOv6YOLOv5,展示了不同模型间的性能指标,如mAPF1 Score等。文章深入解释了YOLOv8的原理,提供了相应的Python代码训练数据集,并集成了一个基于PySide6的界面。

系统能够精准检测和分类血细胞,支持通过图片图片文件夹视频文件摄像头进行检测和计数,包含柱状图分析标记框类别类别统计、可调ConfIOU参数结果可视化等功能。还设计了基于SQLite的用户管理界面,支持模型切换UI自定义。本文旨在为深度学习初学者提供实用指导,代码和数据集见文末。本文结构如下:

文章目录

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


前言

        在当今医学界,血液检测作为一项基础且关键的诊断手段,对于疾病的预防、诊断和治疗监控起着至关重要的作用。血细胞的数量和类型能够为医生提供重要的健康信息,帮助识别各种疾病,如贫血、感染和血液癌症等。传统的血细胞检测方法依赖于显微镜下的人工观察和计数,这不仅耗时而且容易受到操作者技能和主观判断的影响,限制了检测的效率和准确性。

        随着人工智能和机器学习技术的快速发展,尤其是深度学习在图像识别和处理领域的应用,为血细胞智能检测与计数提供了新的解决方案。YOLO(You Only Look Once)系列算法作为一种先进的实时目标检测系统,其在多个版本的迭代中展现出越来越强的性能,在医学图像处理尤其是血细胞检测领域的应用潜力备受关注。利用YOLO等深度学习算法能够大幅提高血细胞检测的速度和准确性,同时减少人为误差,这对于加快诊断流程、提高医疗服务质量具有重要意义。

在这里插入图片描述

        最新的研究工作不仅集中在算法的改进上,还致力于开发和扩充高质量的血细胞图像数据集。这些数据集通过提供多样化的血细胞图像和精确的标注,为模型的训练和验证提供了重要资源。例如,公开的血液细胞数据集如Blood Cell Count and Detection (BCCD) 和 LISC 数据集,已经被广泛用于评估各种算法的性能。然而,尽管有这些数据集的存在,数据多样性和质量仍是当前研究面临的重大挑战之一。为了应对这一挑战,研究人员正在通过增强现有数据集和创建更为复杂、包含罕见血细胞类型的新数据集来提高模型的泛化能力和准确性。

        除了YOLO1系列,其他深度学习算法如Mask R-CNN和U-Net也在血细胞的检测和分割中得到了应用,展现出了不俗的性能。特别是U-Net,其对小对象和细节的高度敏感性使其在细胞分割任务中表现出色。此外,Transformer模型,作为最新一代的深度学习算法,其在图像处理领域的应用也开始受到关注。研究表明,结合Transformer的模型能够更好地处理医学图像中的复杂模式,提供更准确的检测结果。

        此外,血细胞检测领域的技术挑战还包括提高模型的计算效率、减少对计算资源的需求以及提升模型在不同光照和背景条件下的鲁棒性。为了克服这些挑战,一些研究集中在开发更为高效的网络架构和训练策略,如轻量级网络、知识蒸馏技术和迁移学习方法。这些技术不仅有助于减少模型的参数数量和计算复杂度,还能够利用预训练模型加速学习过程,提高在具有限制性硬件环境下的应用潜力。

        然而,尽管取得了显著进展,血细胞智能检测与计数技术仍面临多个技术挑战。例如,如何在保持高准确度的同时提高模型的处理速度,以及如何提升模型对于不同类型血细胞的识别能力等。此外,大规模、高质量的医学图像数据集的缺乏也限制了深度学习模型的训练和验证。

        本博客所展示的工作基于最新的YOLOv82算法构建了一个高效的血细胞智能检测与计数系统,不仅在理论研究上进行了深入探讨,而且在实际应用开发上取得了显著成果。本文的主要贡献归纳如下:

  1. 采用最先进的YOLOv8算法进行血细胞智能检测与计数:本文详细介绍了如何利用YOLOv8算法进行血细胞智能检测与计数,并通过与YOLOv73、YOLOv64、YOLOv55等早期算法的对比分析,展现了YOLOv8在检测速度、准确性以及模型效率方面的显著优势。这为血细胞智能检测与计数领域的研究者和实践者提供了新的思路和工具。
  2. 利用PySide6实现的用户友好系统界面:通过采用Python的PySide6库,本文展示了如何开发一个既美观又易于操作的血细胞智能检测与计数系统界面。这一创新不仅提升了用户体验,也促进了YOLOv8算法在实际应用中的普及和应用。
  3. 包含登录管理功能的系统设计:引入登录管理功能,增强了系统的安全性,并为将来集成更多个性化功能打下了基础。这一设计思路为血细胞智能检测系统的开发提供了新的方向。
  4. 对YOLOv8模型的深入研究:本文不仅应用了YOLOv8算法,还对其性能进行了全面的评估,包括精准度、召回率以及在不同条件下的表现等。这些分析为进一步优化YOLOv8算法,提高血细胞智能检测与计数的准确性和效率提供了科学依据。
  5. 提供完整的数据集和代码资源包:为了促进学术共享和技术传播,本文提供了完整的数据集和代码资源包,使得读者能够直接复现实验结果,并在此基础上进行进一步的研究和开发。这一贡献不仅降低了技术门槛,也为血细胞智能检测与计数领域的研究提供了宝贵的资源。

1.数据集介绍

        在我们的血细胞智能检测与计数研究中,数据集的质量和结构是成功实现高效算法的关键。我们精心构建的数据集包含了3153张图像,其中2853张用于训练,219张用于验证,以及81张用于测试。这些图像覆盖了血液中的各种细胞类型,为深度学习模型提供了丰富的学习资源。

在这里插入图片描述

        从数据集的分布图可以看出,红细胞(RBC)的实例数量远超过其他类型的血细胞,如白细胞(WBC)、血小板和镰状细胞。这种分布反映了实际血液样本中细胞的比例,但同时也提示我们需要考虑在模型训练过程中采用适当的策略来处理类别不平衡的问题。为了让模型更好地学习并识别数量较少的细胞类型,如镰状细胞,可能需要采用过采样或数据增强的技术来平衡类别。

        我们的数据集还经过了一系列的预处理和增强处理,以提高模型的性能和泛化能力。所有的图像都被统一调整到了640x640像素的尺寸,确保了在不同设备和屏幕上都能保持一致的显示效果。此外,数据增强是提高模型鲁棒性的关键步骤。我们随机对图像进行了水平翻转,并在-15到+15度的范围内旋转图像,这些变换模拟了实际情况中可能遇到的变化,帮助模型学会从各种角度和方向识别细胞。

        数据集分布的分析还包括了细胞在图像中的相对位置。大多数细胞位于图像中心附近,这可能与显微镜拍摄时的聚焦习惯有关。然而,模型也需要能够识别那些位于图像边缘或角落的细胞,这就要求我们的训练数据能够包含这些情况。此外,我们还观察到了细胞的大小分布,这有助于进一步了解不同类型细胞的特征,并对模型进行相应的调整,以更精确地识别和计数。

在这里插入图片描述

        最后,我们的数据集还附带了详细的标注信息,这些信息不仅包括每个细胞的类别,也包括了它们的数量,为训练高效的检测模型提供了基础。标签数据的准确性对于模型的最终性能至关重要。我们提供的数据集和代码资源包将使读者能够复现我们的实验结果,并在此基础上进行进一步的研究和开发。博主使用的类别代码如下:

Chinese_name = {'Platelets': "血小板", 'RBC': "红细胞", 'WBC': "白细胞", 'sickle cell': "镰状细胞"}

        综上所述,我们的数据集提供了一个全面、多样化且精确标注的图像集合,为血细胞智能检测与计数系统的开发提供了坚实的基础。


2. 系统界面效果

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

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述


3. YOLOv8算法原理

        YOLOv8作为目标检测领域的一项重要进展,其算法原理体现了最新的技术革新和性能优化。这一模型不仅在传统的YOLO架构上做出了改进,还引入了多项新技术以提高检测的准确性和速度。

在这里插入图片描述

        YOLOv8引入了一种新颖的损失函数,称为’Distribution 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模型训练中使用的一些重要超参数及其设置:

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

        在本篇博客中,我们将一探究竟如何使用先进的深度学习模型YOLOv8来实现血细胞的智能检测与计数。这项任务是通过编写一段精心设计的Python代码来完成的,该代码集成了数据预处理、模型加载、训练以及评估等关键步骤。我们将分步骤详细介绍这个过程,展示如何从零开始构建一个高效的血细胞智能检测与计数系统。

        在模型训练部分,首先导入必要的库。torch是PyTorch的核心库,它为我们提供了实现深度学习模型的功能,而os库则在处理文件和目录路径时发挥作用。同时,yaml库的引入确保了我们能够有效地加载和处理数据集配置文件。通过检测是否有可用的GPU,我们可以确保模型训练在有GPU支持的情况下能够获得更快的执行速度。

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"

        然后,我们设置了工作进程的数量和批次大小。工作进程数决定了在数据加载时的并行程度,而批次大小则直接关联到模型训练过程中内存的使用和梯度更新的频率。在设定好训练的基础参数后,代码继续进行数据集配置文件的加载和预处理工作。这一步骤涉及到配置文件路径的获取和修改,保证训练过程能够顺利找到并利用数据集中的图像和标签信息。

workers = 1
batch = 8

data_name = "MarineDataset"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current')  # 数据集的yaml的绝对路径
unix_style_path = data_path.replace(os.sep, '/')

        紧接着,我们打开了YAML配置文件,这个文件描述了数据集的结构,包括训练和验证图像的路径、类别等信息。yaml.load函数负责解析这个文件。

# 获取目录路径
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)

        之后,我们进行了模型的实例化。利用ultralytics提供的YOLO模块,我们加载了预训练的YOLOv8模型。最终,我们开启了模型的训练流程。在训练函数中,我们详细指定了多个训练参数,包括数据集路径、执行设备、工作进程数、图像尺寸、训练周期以及批次大小等。所有这些参数共同决定了训练过程的行为和最终模型的性能。

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模型进行深度学习训练。

        在训练和验证损失的图像中,我们可以看到,随着训练周期的增加,训练集上的定位损失(train/box_loss)、分类损失(train/cls_loss)和目标置信度损失(train/obj_loss)均呈现下降趋势。这表明模型在识别血细胞的位置、分类以及确定其存在的置信度上逐渐变得更加准确。定位损失的降低直接关联到模型对血细胞边界框的预测精确性,而分类损失的减少则说明模型在区分不同种类血细胞方面的能力得到了增强。目标置信度损失的下降表明模型对检测到的对象是否真正为血细胞越来越有信心。

在这里插入图片描述

        同样,在验证集上的损失(val/box_loss、val/cls_loss、val/obj_loss)也呈下降趋势,尽管波动性略大于训练集,这是由于验证集上的数据模型在训练时未见过,因而模型在处理这些数据时会有更多的不确定性。然而,总体的下降趋势仍然显示了模型的泛化能力在逐步提升。

        在性能指标方面,我们关注的是精确度(metrics/precision)、召回率(metrics/recall)以及平均精确度(metrics/mAP50 和 metrics/mAP50-95)。从图中可以看出,精确度和召回率在训练过程中保持在较高水平,并随着训练逐渐稳定。这意味着模型能够以较高的准确率检测出血细胞,同时保持较低的遗漏率。mAP50和mAP50-95作为衡量模型整体性能的指标,随着训练的进行呈现出稳步提升的趋势。特别是mAP50-95,这个指标考虑了不同IoU(交并比)阈值的检测性能,它的上升表明模型对于不同大小和形状的血细胞都能保持较好的检测效果。

        F1得分作为精确度和召回率的调和平均数,能够全面反映模型的检测性能。在本博客中,我们将深入分析训练后模型的F1得分曲线图,以此来评估我们的YOLOv8模型在不同血细胞类别上的性能。

在这里插入图片描述

         从图中可以看出,F1得分随置信度阈值的变化呈现出不同的趋势,对于血小板(Platelets)、红细胞(RBC)、白细胞(WBC)和镰状细胞(sickle cell),各自的F1得分曲线有着明显的特征。整体上,所有类别在特定置信度阈值下的F1得分达到了0.78,这一数值在置信度阈值为0.463时出现,这表明模型在此阈值下达到平衡状态,即精确度与召回率之间取得了最佳的平衡。

         对于血小板,其F1得分曲线在置信度较低时迅速上升,并在高置信度区间保持相对平稳的高分数值,这表明模型对于血小板的检测具有较高的准确性和完整性。红细胞的曲线在置信度阈值增加的情况下,F1得分相对平缓地下降,说明模型在不牺牲过多召回率的情况下,依然能保持较高的精确度。白细胞的F1得分曲线则显示出较为波动的下降趋势,这可能是由于白细胞的形态多样性导致模型在高置信度时误判的增加。镰状细胞的F1得分曲线较低,表明模型在识别这一特定细胞类型时面临挑战,可能是因为镰状细胞的形态特征与其他细胞存在较大差异,模型需要更多的样本或者特定的特征学习来改进。

        总体而言,通过F1得分曲线图,我们能够具体了解到模型在不同置信度下对各类血细胞的检测性能。这种细致的分析方法为我们提供了丰富的信息来指导后续的模型优化。例如,我们可以通过调整损失函数或增加样本来提高模型在镰状细胞检测上的性能。此外,合理选择置信度阈值,既能保持较高的精确度,又能维持必要的召回率,对于实际应用中模型的准确性和可靠性至关重要。

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.8200.7940.7810.834
F1-Score0.780.740.760.78

(3)实验结果分析

        在比较不同版本的YOLO模型时,我们需要细致分析每个模型的性能指标,特别是在同一数据集上的表现。这里我们使用了两个核心的度量指标:mAP(mean Average Precision)和F1-Score。mAP衡量了模型在不同置信度阈值下的平均精确度,而F1-Score则是精确度和召回率的调和平均,能够综合反映模型的性能。

        从实验结果来看,YOLOv8n在mAP指标上以0.834的得分表现最优,超过了其他三个模型。这意味着整体而言,YOLOv8n在血细胞的检测任务上具有最高的平均检测精度,对于不同类型的血细胞能够提供更为准确的识别。其次是YOLOv5nu,mAP得分为0.820,同样展现出了很高的检测精度,表明尽管是更早的版本,但其性能仍然十分强劲。YOLOv6n和YOLOv7-tiny分别以0.794和0.781的mAP得分位列第三和第四,尽管它们的性能稍逊一筹,但在实际应用中仍然是可靠的选择。

        对于F1-Score,YOLOv8n和YOLOv5nu都达到了0.78,这显示了它们在精确度和召回率之间取得了较好的平衡。另一方面,YOLOv7-tiny的F1-Score为0.76,略高于YOLOv6n的0.74,表明尽管在mAP上略低于YOLOv6n,但在综合精确度和召回率方面,YOLOv7-tiny的表现稍好。

在这里插入图片描述

       综合考虑这两个指标,我们可以得出一些结论。首先,YOLOv8n作为最新的模型,它在检测准确性上的表现确实是最优的。它在mAP上的领先表明该模型更擅长在整体上识别和定位不同类型的血细胞。同时,其F1-Score的表现也证实了YOLOv8n能够在精确度和召回率之间取得良好的平衡。这一点对于医疗诊断尤为重要,因为我们不仅需要模型准确地识别出血细胞,还要尽可能减少漏检和误检。其次,YOLOv5nu虽然是一款较早的版本,但其在mAP和F1-Score上的表现仍然与YOLOv8n相媲美。这可能是因为YOLOv5nu在某些特定的特征学习和优化上做得较好。它的成功表明,即使在新版本发布后,旧版本在特定场景下仍然有其价值和适用性。YOLOv6n和YOLOv7-tiny的性能略低,可能是因为这些版本的模型在特征提取或者分类器设计上相对较弱,或者可能它们在训练数据集上没有得到充分的优化。特别是YOLOv7-tiny,作为一个轻量级的模型,它可能在模型容量和计算效率之间做出了妥协,这对于检测精度会有一定影响。

       在选择适合的模型时,我们不仅要考虑检测精度,还要综合考虑模型的实时性、计算成本和部署环境。YOLOv8n虽然在性能上占优,但可能在某些资源受限的场合不如轻量级的YOLOv7-tiny适用。因此,我们需要根据实际的应用场景和需求来选择最合适的模型。

4.4 代码实现

        在这篇博客中,我们构建了一个基于YOLOv8算法的血细胞智能检测系统。该系统的主要功能是实时从摄像头捕获图像,使用深度学习模型识别和定位图像中的血细胞,并在图像上绘制边界框以及显示检测到的细胞类型和置信度。下面,我们将详细介绍实现这一系统的核心代码。

(1)导入必要的模块和配置
        为了实现这一目标,我们首先导入了实现该系统所需的所有Python库。sys模块用于访问与Python解释器相关的功能,time模块帮助我们记录处理每帧图像所需的时间。OpenCV库被用于执行图像处理任务,而QtFusion中的类则用于构建图形用户界面(GUI)。PySide6为我们提供了创建GUI所需的工具和控件。

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

QF_Config.set_verbose(False)

(2)创建主窗口
        我们定义了MainWindow类来创建和管理GUI的主窗口。这个类中包括一个QLabel控件来展示视频流和检测结果。我们还定义了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()  # 关闭窗口

(3)视频流处理
        在处理视频流的每一帧时,我们定义了frame_process函数。该函数负责调整图像大小、调用模型进行预测,并计算处理所需的时间。预测结果将被后处理,并在图像上绘制边界框和标签。

def frame_process(image):  # 定义frame_process函数,用于处理每一帧图像
    image = cv2.resize(image, (850, 500))  # 调整图像的大小
    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)血细胞智能检测与计数

        我们实例化了YOLOv8的检测器,并加载了预训练的模型权重。每个类别的边界框将使用一个唯一的颜色来标识,这些颜色通过get_cls_color函数生成。最后,我们创建了QApplication和MainWindow实例,启动了视频流处理,并显示了GUI窗口。用户可以看到实时的视频流,以及模型在视频流中检测到的血细胞。

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对象

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())


# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())

        通过这段代码,我们构建了一个高效、交互性强的血细胞智能检测与计数系统。它不仅能实时处理图像,还能直观地展示YOLOv8模型的检测效果,为用户提供了一个友好的操作界面。这项技术的应用前景广泛,尤其在医疗领域,它可以大大提高血细胞智能检测与计数的速度和准确性,从而为医生提供重要的辅助诊断信息。


5. 血细胞智能检测与计数系统实现

        在设计交互式血细胞智能检测与计数与识别系统的过程中,我们的主要目标是创建一个集成了高效图像处理、准确血细胞识别和用户友好交互的桌面应用。为了达到这一目的,我们采取了一个多层次的系统设计思路,将复杂的图像处理任务、深度学习模型的预测以及用户界面相结合,实现了一种模块化和高度集成化的解决方案。

5.1 系统设计思路

        在我们的系统设计中,我们致力于打造一个直观且功能强大的交互式血细胞智能检测与计数与识别系统,旨在提高用户的操作便利性,并充分利用YOLOv8模型的强大功能。

(1)架构设计
        我们的设计理念是通过高度模块化的方法,将复杂的技术细节抽象化,从而让用户可以不必关注背后的复杂算法就能够进行血细胞智能检测与计数与识别。具体来说,我们将系统划分为三个主要层次:处理层、界面层和控制层,每层均担负着独特的职责,相互协作以达到整体功能。

在这里插入图片描述

  • 处理层(Processing Layer):在这个设计中,处理层是系统的核心,负责执行计算密集型的血细胞智能检测与计数任务。我们选用了YOLOv8Detector类,这是一个封装了YOLOv8算法的强大检测器,它加载了预训练的模型并优化了图像处理流程以适应实时检测。通过这个类,系统可以快速准确地识别图像中的血细胞,并提供必要的信息,如细胞位置、大小和类别。
  • 界面层(UI Layer):界面层则是与用户互动的前端,它由多种控件组成,如图像显示区域、状态栏和操作按钮。这些控件不仅为用户提供了清晰的视觉反馈,还允许用户通过简单直观的方式与系统进行交互。例如,用户可以通过按钮控制图像的加载、开始和停止检测过程,或者调整检测参数。
  • 控制层(Control Layer):控制层则作为处理层与界面层之间的桥梁,负责协调用户命令与后端处理的同步。在这一层中,MainWindow类通过槽函数响应用户的操作,控制视频流的处理和血细胞智能检测与计数的执行。此外,它还管理着信号和槽机制,确保各个组件之间能够高效地通信和数据传递,例如当检测到新的血细胞时,界面层能够即时更新显示结果。

在这里插入图片描述

        整个系统的设计不仅强调了性能和准确性,还注重用户体验。通过将复杂的技术细节隐藏在用户界面之后,我们为用户提供了一个简洁、易于使用的应用程序,使用户即使在没有深度学习或计算机视觉经验的情况下,也能轻松地进行高精度的血细胞智能检测与计数。

(2)系统流程

        在本次博客的探讨中,我们将详细探讨交互式血细胞智能检测与计数系统的设计流程,以及如何通过这个系统来执行复杂的图像识别任务。这个系统不仅能够处理来自不同输入源的图像数据,而且还能实时地展示检测结果,为用户提供丰富的交互功能。

  1. 当用户启动应用程序时,系统首先实例化了MainWindow类,这是整个应用的核心。MainWindow类初始化了应用的界面,设置了必要的参数,为用户提供了一个功能丰富且直观的操作界面。用户通过这个界面可以方便地选择想要分析的图像来源,无论是实时视频流、已有的视频文件,还是单张图片。

  2. 一旦输入源被确定,系统便激活媒体处理器来捕获和加载所需的图像数据。在这个阶段,系统可能会执行一系列配置,比如摄像头的分辨率设置或视频解码。随后,我们进入了一个连续的处理循环,每一帧图像都经过精心设计的处理流程。

  3. 在预处理阶段,系统会对图像执行一系列操作,比如缩放、色彩空间转换等,以保证图像格式和大小符合YOLOv8模型的输入需求。这一步骤对于后续的检测精度至关重要。接下来,在检测与识别阶段,经过预处理的图像会被送入训练有素的YOLOv8模型中。模型综合考虑了图像中的各种特征,准确地识别出血细胞的位置和类别,并将这些信息以边界框的形式输出。

  4. 随着检测结果的产出,系统的界面会实时更新,不仅显示了检测框和血细胞的类别,还通过界面中的统计数据展示区域,为用户提供了实时的检测和计数结果。用户可以通过界面上的控制按钮来保存这些结果,或者获取更多关于应用的信息。此外,用户还可以通过下拉菜单来筛选和分析特定类型的血细胞,进一步探索数据背后的丰富信息。

  5. 在媒体控制方面,系统为用户提供了完整的播放控制选项。用户可以随时开始或暂停视频流的捕获和分析,这为用户提供了极大的灵活性。无论用户希望实时监测还是后期分析,我们的系统都能够满足其需求。

    在这里插入图片描述

        总之,交互式血细胞智能检测与计数系统是一个集成了先进的图像处理技术、深度学习模型和用户友好界面的完整解决方案。通过这个系统,即便是没有深度学习背景的用户也能轻松地进行复杂的血细胞智能检测与计数任务,并获取实时、准确的分析结果。这一系统的设计充分考虑了易用性和功能性,旨在为医疗卫生领域的专业人士提供强有力的工具,帮助他们在血液疾病诊断和研究中作出更加精准的决策。

5.2 登录与账户管理

        在当今时代,软件系统的个性化和安全性愈发受到重视。我们的血细胞智能检测与计数系统正是在这样的背景下,融入了先进的账户管理功能,以确保用户能在一个安全和定制化的环境中使用我们的服务。这一功能的加入,不仅使得用户能够享受到更为私密和个性化的使用体验,同时也为系统的数据安全和管理提供了另一层保障。

在这里插入图片描述

        我们设计了一个用户登录界面,它基于PySide6——一个强大的Qt库的Python绑定,以及SQLite数据库——一个轻量级的数据库系统。这个登录界面不仅简洁美观,而且提供了易于操作的用户注册、登录、密码修改和头像设置等功能。用户可以在此界面创建一个属于自己的账户,并通过设置个性化头像来增强自己的个人识别度。账户一旦创建,用户的检测历史、偏好设置和其他重要数据便会存储在SQLite数据库中,这为用户提供了一个可靠和便捷的数据管理方案。

        账户管理系统的设计考虑到了用户的多样化需求。密码修改功能为用户提供了数据安全保障,用户可以定期更新自己的密码来避免未授权访问。同时,账户注销功能使得用户可以在不使用应用程序时保持账户的私密性,而重新登录功能则为用户提供了回到自己个人空间的便利途径。

        当用户通过登录界面进入主界面后,他们便可以开始进行血细胞的智能检测与计数。主界面不仅实时展示检测框、类别和置信度等重要信息,还支持多种输入源,包括图片、视频文件、实时摄像头捕获的图像以及批量文件。用户可以根据自己的需求选择不同的输入方式,系统会根据选定的输入源实时识别并记录血细胞信息。

在这里插入图片描述

        通过这些设计,我们的系统不仅提高了用户操作的便利性,也增强了使用过程的安全性和个性化体验。这将极大地促进用户在医学研究、临床实验等领域中对血细胞智能检测与计数的应用,为用户带来了更高效、更安全、更个性化的操作体验。随着技术的不断发展和用户需求的不断变化,我们将继续优化和升级账户管理系统,以满足用户更广泛的应用场景和更高层次的使用需求。


下载链接

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

在这里插入图片描述

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

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

在这里插入图片描述

    在文件夹下的资源显示如下,下面的链接中也给出了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. Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

弧形导轨的设计要求

制造业设备种类越来越多,非标自动化设备渐渐成了主力市场,其中弧形导轨线体作为非标自动化运输中的基石,承担了运输,定位,特殊工位组装,其设计要求也非常严格。 1、精度要求:弧形导轨需要具备高…

【C++】开源:iceoryx通信中间件配置与使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍iceoryx通信中间件配置与使用。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新…

Linux运维之管理工具篇

一、前言 因运维过程中,经常会借助于很多工具来实现我们的监控、备份、校验,安全测试,批量操作,可视化辅助,集中管理等,甚至AI相关,本文特对常用工具进行梳理记录,以备不时之需及后…

记OnlyOffice的两个大坑

开发版,容器部署,试用许可已安装。 word,ppt,excel均能正常浏览。 自带的下载菜单按钮能用。 但config里自定义的downloadAs方法却不一而足。 word能正常下载,excel和ppt都不行。 仔细比对调试了代码。发现app.js…

2024年3月份实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先,来看下效果图 在线体验地址:https://geojson.hxkj.vip,并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

Antd中s-table组件某字段进行排序

Antd中s-table组件某字段进行排序 提前说明&#xff0c;s-table组件包含分页等功能 <s-tableref"table":columns"columns":data"loadData"bordered:row-key"(record) > record.id"></s-table>而其中loadData为获取表数…

strcat函数

函数理解记忆&#xff1a;str表示是<string.g>中的函数&#xff0c;cat表示附加。意思是将一个字符串的内容附加到另一个字符串的末尾。 注意要点&#xff1a;既然要附加&#xff0c;附加的字符串和被附加的字符串都要有\0。否则不知道附加多少&#xff0c;不知附加在哪…

【Linux进程的知识点】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档文章目录 前言 操作系统的知识补充 我们来理解一个用户操作接口&#xff1a; 进程的理解 进程的基本概念 描述进程-PCB task_struct-PCB的一种 task_ struct内容分类 …

算法刷题Day8 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串

目录 0 引言1 反转字符串1.1 我的解题1.2 2 反转字符串II2.1 解题 3 替换数字3.1 双指针法 4 翻转字符串里的单词4.1 我的解题思路4.2 另一种思路 5 右旋转字符串5.15.2 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标题…

什么是序列化?为什么需要序列化?

1、典型回答 序列化(Serialization)序列化是将对象转换为可存储或传输的形式的过程(例如: 将对象转换为字节流) 反序列化(Deserialization) 是将序列化后的数据(例如: 二进制文件)转换回原始对象的过程。通过反序列化&#xff0c;可以从存储介质 (如磁盘、数据库) 或通过网络…

程序员们的“薪饭碗”鸿蒙迎来“薪”的就业岗位

随着科技行业的不断创新和发展&#xff0c;程序员们所面对的技术挑战和机遇也在不断增加。近年来&#xff0c;鸿蒙操作系统的崛起为程序员们提供了新的就业机会和发展前景。 鸿蒙系统作为一种全新的操作系统&#xff0c;在市场上占据一席之地。在当前就业市场中&#xff0c;鸿…

网络套接字-UDP服务器

一 预备知识 1 端口号和进程id 主机间的数据传输本质是两个进程在通信&#xff0c;就像是我们打开抖音刷视频&#xff0c;视频不是都保存在手机上的&#xff0c;而是服务器发送给你的&#xff0c;这里就是用到了网络。 那如何保证把数据给指定进程呢? 就是用端口号去标识主机中…

[实战]API防护破解之签名验签

前言&#xff1a; 传统的接口在传输的过程中&#xff0c;是非常容易被抓包进行篡改&#xff0c;从而进行中间人攻击。这时候我们可以通过对参数进行签名验证&#xff0c;如果参数与签名值不匹配&#xff0c;则请求不通过&#xff0c;直接返回错误信息&#xff0c;从而防止黑客…

Java错误:微服务报错Cannot execute request on any known serve

&#x1f414;问题内容 报Cannot execute request on any known server 这个错&#xff1a;连接Eureka服务端地址不对。 &#x1f414;解决方式 检查.yml文件或者.properties文件配置 下划线下划线后面的小写字母等同于去掉下划线大写下划线后面的字母&#xff08;驼峰原则&am…

网络安全从业人员何去何从

从2024年1月1日开始到今天&#xff0c;基本没有真正放下自己休息过一天。可能很多人会说是卷&#xff0c;其实真正的原因是压力。不仅仅是生活压力还有行业压力。 今年这个行业让很多人开始感到了迷茫&#xff0c;不仅是股市的低迷&#xff0c;更多的来自于各大公司不断的因为…

Linux学习:基础开发工具的使用(1)

目录 1. Linux软件包管理器&#xff1a;yum工具1.1 yum是什么&#xff08;软件商城&#xff09;1.2 yum的使用1.3 yum的背景生态 2. 项目开发与集成开发环境3. vim编辑器3.1 vim编辑器的常见模式与模式切换3.3 vim编辑器的使用3.3.1 命令模式下的常见命令&#xff1a;3.3.2 vim…

【安装mysql】centos7 安装mysql

文章目录 1.卸载不用的环境2.获取mysql官方yum源3.开始安装4.常规登录4.1方法一&#xff1a;【博主可以】4.2方法二&#xff1a;直接用client登录4.3方法三&#xff1a;修改配置文件 5.设置配置文件5.1配置my .cnf5.2开机自启动 1.卸载不用的环境 查看有无mysql/mariadb ps ax…

优雅的记录日志,拒绝打印模糊信息导致bug定位难

想必大家都有过这样的经历&#xff1a;在项目中遇到报错需要紧急修复时&#xff0c;却因为日志信息模糊不清&#xff0c;无法迅速准确地定位到错误源头&#xff0c;这确实让人感到十分苦恼和无奈。 在新入职一家公司并着手修改遗留bug时&#xff0c;经常发现之前的开发者并未记…

Java Day9 Stream流

Stream流 1、认识2、Stream流使用步骤3、如何获取Stream流4.Stream流的中间方法5、 Stream流终结方法 1、认识 2、Stream流使用步骤 3、如何获取Stream流 //list获取stream流List<String> listnew ArrayList<>();Collections.addAll(list,"崔十一","…

NUMA简介

NUMA 1 什么是NUMA 早期的计算机&#xff0c;内存控制器还没有整合进 CPU&#xff0c;所有的内存访问都需要经过北桥芯片来完成。如下图所示&#xff0c;CPU 通过前端总线&#xff08;FSB&#xff0c;Front Side Bus&#xff09;连接到北桥芯片&#xff0c;然后北桥芯片连接到…