摘要:本文介绍了一种基于深度学习的癌症图像检测系统的代码,采用最先进的YOLOv8算法并对比YOLOv7、YOLOv6、YOLOv5等算法的结果,能够准确识别图像、视频、实时视频流以及批量文件中的摘要:本篇博客深入介绍了如何借助深度学习技术开发癌症图像检测系统,以提高医疗诊断的精度和速度。系统基于先进的YOLOv8算法,并对比分析了YOLOv7、YOLOv6、YOLOv5的性能,如mAP和F1 Score。详细解释了YOLOv8的原理,并附上了相应的Python代码和训练数据集,以及一个集成了PySide6的用户友好界面。
该系统能精确识别医疗图像中的癌症标记,支持图片、视频和实时摄像头输入,具备热力图、类别标记、统计分析等高级功能,并允许调整检测参数。还包括一个SQLite用户管理界面,以及易于操作的模型切换和界面定制选项。本文为初学者提供了一套完整的实践指南,代码和数据集链接可在文末找到,方便下载和实操。本文结构如下:
目录演示与介绍视频:https://www.bilibili.com/video/BV13J4m1h7MK/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZuakp5y
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuakp5s
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuakp5t
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuakp5u
前言
在当今社会,癌症已成为全球范围内对人类健康构成重大威胁的疾病之一。据世界卫生组织(WHO)统计,癌症是全球第二大死因,每年导致数百万人死亡。早期发现和诊断是提高癌症治疗效果、降低死亡率的关键。随着医学技术的进步,特别是人工智能和深度学习技术在医疗领域的广泛应用,癌症图像检测系统成为了研究的热点。这些系统利用先进的图像处理和分析技术,能够在早期阶段准确识别和定位癌症组织,为临床提供有力的辅助诊断工具。
深度学习算法,尤其是YOLO(You Only Look Once)[1]系列模型,因其在图像识别和对象检测方面的高效性和准确性,已经被广泛应用于医学图像的处理和分析中。从YOLOv5[2]到最新的YOLOv8[3],这些模型不断地在性能、速度和准确性方面进行优化和改进,使得癌症图像检测的准确度和效率得到显著提升。此外,随着医学图像数据集的不断更新和扩充,以及图像处理技术的进步,基于YOLO模型的癌症检测系统正逐渐克服早期版本中存在的数据不足和模型泛化能力弱的问题。
Mask R-CNN作为一种先进的实例分割框架,通过精确分割图像中的对象,为癌症病变区域的精确识别提供了可能。U-Net,特别设计用于医学图像的分割,其独特的对称结构使得它在细节捕捉上特别有效,被广泛应用于肿瘤、病变区域的识别和分割。EfficientNet作为一种高效的CNN架构,通过复合缩放方法优化网络结构,达到了在准确性和计算效率之间的良好平衡,被成功应用于医学图像的分类和检测任务中。
随着Transformer模型在自然语言处理领域的成功,其在图像处理领域的应用也开始受到关注。一项最新研究开发了一个基于Transformer的模型,用于检测CT图像中的肝癌。该模型采用自注意力机制来捕捉图像中的长距离依赖关系,从而提高了对肝癌病灶的识别准确性。在公开的肝癌数据集上进行的测试表明,这种基于Transformer的方法在检测性能上优于传统的CNN模型。
DeepBreast是一个新颖的深度学习框架,专为乳腺癌检测设计。该框架采用了基于EfficientNet的卷积神经网络,并结合了一个复杂的图像增强和预处理流程来提高模型对乳腺X光图像中微小病变的识别能力。在DDSM(数字数据库筛查乳腺X射线摄影)数据集上的测试结果表明,DeepBreast在乳腺癌检测方面达到了高于现有方法的性能。
Capsule Networks(CapsNet)由于其独特的架构设计,能够捕捉图像中的层次关系,使其特别适合处理医学图像。最近的一项研究使用CapsNet来检测CT图像中的肺部结节。通过利用动态路由机制,该模型能够更有效地处理空间关系,从而提高检测的准确性。在LUNA16数据集上的实验结果显示,该方法在肺结节检测方面表现出了优异的性能。
本博客所展示的工作基于最新的YOLOv8算法构建了一个高效的癌症图像检测系统,不仅在理论研究上进行了深入探讨,而且在实际应用开发上取得了显著成果。本文的主要贡献归纳如下:
- 采用最先进的YOLOv8算法进行癌症图像检测:我们详细介绍了如何利用YOLOv8这一最新的目标检测算法进行癌症图像的准确检测,并与先前版本的YOLO算法(YOLOv7[4]、YOLOv6[3:1]、YOLOv5)进行了细致的比较。这一部分不仅展现了YOLOv8在效率和精确度上的优势,也为相关领域的研究人员和实践者提供了全新的研究思路和工具。
- 利用PySide6实现癌症图像检测系统:本文探讨了如何使用Python的PySide6库开发一个用户友好的癌症图像检测系统界面。该界面的设计使用户能够更直观、便捷地进行癌症图像检测,促进了YOLOv8算法的广泛应用,并推动了癌症图像检测技术的实际应用前进一大步。
- 包含登录管理功能:我们在系统中设计了登录管理功能,确保了使用系统的安全性,并为将来添加更多个性化功能留出了空间。这一创新不仅提升了系统的专业性,也增强了用户的信任度。
- 对YOLOv8模型进行深入研究:本文不仅应用了YOLOv8算法于癌症图像检测,还对该算法的性能进行了全面的研究,包括对模型的精准度、召回率等关键性能指标的评估。这一深入的分析有助于我们更全面地理解YOLOv8算法的细节,为进一步的优化和改进提供了坚实的基础。
- 提供完整的数据集和代码资源包:为了便于读者更好地理解和应用YOLOv8及其前版本算法在癌症图像检测系统中的操作,我们提供了完整的数据集和代码资源包。这些资源不仅包括用于训练和测试的详细数据集,还包括实现癌症图像检测系统的完整代码。通过这些资源,读者可以直接复现实验结果,并在此基础上进行进一步的研究和开发。
1.数据集介绍
在本研究中,我们专门为训练和评估基于YOLOv8算法的癌症图像检测模型而设计,包含了3076张图像,其中包括2634张用于训练的图像、301张用于验证的图像,以及141张用于测试的图像。这一细致的分配确保了模型能够在足够大的数据集上进行训练,同时拥有独立的测试集和验证集,以评估模型的性能和泛化能力。
在数据预处理方面,我们采取了一系列标准化步骤来确保数据集的一致性和可用性。所有图像均经过自动方向调整处理,确保了图像方向的统一性,并去除了EXIF方向信息,消除了由于拍摄角度不同可能带来的变量。此外,考虑到YOLOv8算法的输入要求,所有图像均被调整至416x416像素的尺寸。这种统一的尺寸不仅有利于算法处理,也有助于减少模型训练和推断过程中的计算开销。
通过对数据集标签的分析,我们发现了一些关键的特征。数据集的实例主要分为两大类:良性和恶性肿瘤。在实例数量上,恶性肿瘤的数量远超过良性,这可能是因为研究的重点是更有效地检测癌症。然而,这种不平衡的分布也提示我们,在训练过程中可能需要使用特定的技术来解决类别不平衡的问题,如调整类别权重或应用过采样技术。
进一步分析边界框的大小和分布,我们发现恶性肿瘤的边界框在大小上相对一致,而良性肿瘤的边界框则呈现出较大的变异性。这可能意味着恶性肿瘤在成像上表现出较为规律的形状和尺寸,而良性肿瘤则在形态上更加多样。这一发现对于设计模型的检测窗口和锚框策略至关重要。
边界框的空间分布分析揭示了数据集中的实例在图像内的分布均匀,这有助于模型学习到在不同位置检测肿瘤的能力。同时,边界框的宽度和高度分布显示出大部分肿瘤在图像中占据较小的区域,这对于设置检测模型的分辨率和感受野具有指导意义。博主使用的类别代码如下:
Chinese_name = {'Benign': "良性", 'Tumor': '肿瘤'}
总之,我们介绍的数据集经过精心设计和预处理,以适应癌症图像检测模型的需求。数据集的类别分布、边界框的大小和形状、以及空间位置的多样性,都是在设计和训练YOLOv8模型时必须要考虑的因素。通过充分利用这些特性,我们能够提高模型的泛化能力和检测精度,进一步推动癌症检测领域的研究和应用发展。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行癌症图像检测的图片或视频,或者启动摄像头进行实时检测。在进行癌症图像检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8作为一种先进的目标检测算法,其设计理念是通过对模型的不同部分进行优化,提高检测的精度和速度。YOLOv8的架构主要包括输入层、Backbone网络、Neck部分、以及Head部分。
在输入层,YOLOv8采用了C2f模块与SPPF模块结合的方式,这一设计的目的是为了增强模型对不同尺寸目标的检测能力。C2f模块结合了YOLOv5的C3模块和YOLOv7的ELAN结构的优势,它能够提高模型对特征的提取效率和精确度。而SPPF模块则是一种空间金字塔池化模块,它可以提取多尺度的特征,这对于检测不同大小的目标至关重要。
在Backbone网络中,YOLOv8采用了PPAN结构,其核心思想是通过一个更大的感受野和更多样化的特征提取,以增强模型对于目标的识别和定位能力。这种结构相比传统的Backbone网络,如ResNet或VGG,能够更有效地处理图像中的复杂信息。
在Neck部分,YOLOv8则进一步加强了特征的传递和融合。这一部分采用FPN-PAN的结构进行特征的融合和传递,这有助于模型捕捉到更加精细的特征信息,并提高检测的精确度。FPN-PAN结构通过自顶向下和自底向上的特征流,有效地在不同尺度之间传递信息。
在Head部分,YOLOv8采用了解耦合头(Decoupled-Head)的设计,这种设计允许模型更精确地进行分类和定位。解耦合头的优势在于它将分类和定位任务分开处理,每个任务都有专门的网络结构,从而使得模型在这两个方面都能有更好的性能。
最后,YOLOv8在损失函数上也进行了创新。它结合了多种损失函数,包括BCE Loss、Distribution Focal Loss和CIoU Loss。这样的组合旨在从不同角度优化模型的性能,其中BCE Loss主要用于分类任务,Distribution Focal Loss用于解决类别不平衡问题,而CIoU Loss则专注于改善边界框的精确度。
通过这些创新的设计,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 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
在博客的这一部分,我们将深入探讨如何使用Python和PyTorch框架来训练一个基于YOLOv8的癌症图像检测模型。
在进行模型训练前,正确地设置计算环境是至关重要的一步。在这段代码中,我们首先导入了必要的Python库,包括os用于操作系统路径操作,torch为PyTorch框架的核心库,yaml用于读取配置文件,以及ultralytics中的YOLO模型。此外,我们还通过QtFusion.path获取了绝对路径,确保无论代码在哪里运行,都能够正确地找到数据和权重文件。在这段代码中,我们设置了设备变量device,这使得模型能够根据系统是否有可用的CUDA设备自动选择使用GPU或CPU进行训练。
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"
接下来,我们处理数据集配置文件。在这个代码块中,我们定义了数据集的名称,并获取了相应的.yaml配置文件的路径。这个配置文件包含了训练过程中所需的数据路径和其他配置信息。通过替换路径分隔符,确保路径字符串在不同操作系统中都是有效的。我们读取了YAML文件,并在必要时更新了其中的路径项,这样做的目的是为了确保无论数据集位于何处,模型都能够正确地找到它。
workers = 1
batch = 8
data_name = "Tumor"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current') # 数据集的yaml的绝对路径
unix_style_path = data_path.replace(os.sep, '/')
# 获取目录路径
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类来加载一个预训练的YOLO模型,并使用train方法开始训练过程。我们指定了许多重要的训练参数,如工作进程的数量、批量大小、图像尺寸、训练周期等。这些参数的选择对训练效率和模型性能有直接影响。
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 # 指定训练任务的名称
)
在训练和验证损失的图像中,我们观察到模型在训练初期迅速进步,随后稳步提升。对于box损失,即目标框的回归损失,它衡量的是预测框与真实框之间的差异。训练和验证损失的快速下降表明模型很好地学习到了如何定位目标。在cls损失,即分类损失方面,这代表了模型预测的类别与真实类别之间的不一致性。损失的下降表明模型在区分不同类别的细胞方面变得更加精确。而df1损失,可能是指YOLOv8特有的'Distribution Focal Loss',其下降趋势表示模型在处理不平衡数据集方面变得更加有效,提高了对少数类的检测性能。
从性能指标图像中,我们可以看到模型在精度和召回率方面的表现。精度指的是模型预测正确的正样本占所有预测为正的样本的比例,而召回率是指模型正确预测的正样本占所有实际为正的样本的比例。图像显示随着训练的进行,模型的精度和召回率都逐渐提高,这表明模型在识别目标方面变得越来越可靠。特别是召回率的快速提升,意味着模型错过的目标数量显著减少。
最后,我们评估了模型在不同IoU阈值下的平均精度(mAP)。mAP是目标检测领域中常用的评价指标,用来衡量模型整体的性能。从图像中可以看到,随着训练的进行,mAP50(IoU=0.5时的mAP)和mAP50-95(IoU从0.5到0.95的mAP的平均值)都呈现上升趋势。这表明模型在各种不同程度的重叠情况下,都能保持较高的性能,这对于实际应用来说非常重要。
PR曲线展示了模型在每个类别上的表现,通过精度和召回率两个维度的变化关系来评估。精度是指模型正确预测正样本的能力,而召回率衡量的是模型识别出的正样本占所有正样本的比例。理想的模型在这两个指标上都应该表现出高值。在图中,我们可以看到一条非常接近右上角的曲线,这表明您的YOLOv8模型在癌症图像检测任务上表现出色。图中还提供了一个关键的性能指标:[email protected](在IoU=0.5时的平均精度)值为0.966。这个值非常高,意味着模型在将检测框与真实框进行匹配时,能够以极高的精确度识别出癌症区域。[email protected]是衡量目标检测模型性能的常用指标,数值越高表明模型的预测越准确。
从图中还可以看出,在召回率很高的情况下,精度依然保持在一个非常高的水平。这意味着即使在尝试检测更多的癌症区域(即提高召回率)的情况下,模型依然能够保持低误报率。这对于医学图像检测尤为重要,因为我们需要模型尽可能地检测到所有潜在的癌症区域,同时避免对患者造成不必要的惊慌。
整体而言,模型在所有类别上的平均精度[email protected]为0.815,这是一个相当高的性能指标,意味着模型在IoU阈值为0.5时,能够达到81.5%的平均精度。这个结果表明模型对于大多数类别都有着可靠的检测能力,是在癌症图像检测应用中非常有前景的性能表现。然而,我们也应该注意到mAP仅是一个综合性能指标,它可能掩盖了个别类别上的性能不足。因此,对于那些表现不佳的类别,我们应该进行更细致的分析和优化,以确保模型在所有类型的癌症图像检测上都能表现出色。
总结来说,这个YOLOv8模型的PR曲线和[email protected]的值显示了模型在癌症图像检测上的强大性能。这种性能表明模型在保持低误报率的同时,成功地识别出了大部分的癌症区域,对于实际的临床应用来说具有极大的意义。这样的结果不仅展示了深度学习在医学图像分析领域的巨大潜力,也为进一步的研究和实际应用奠定了坚实的基础。在未来的工作中,我们可以进一步探索如何将这样的模型集成到实际的医疗诊断流程中,以辅助医生更快更准确地诊断癌症,从而为患者提供更好的治疗方案。
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.960 | 0.968 | 0.935 | 0.966 |
F1-Score | 0.92 | 0.93 | 0.92 | 0.93 |
(3)实验结果分析:
在比较不同版本的YOLO模型时,我们需要细致分析每个模型的性能指标,特别是在同一数据集上的表现。这里我们使用了两个核心的度量指标:mAP(mean Average Precision)和F1-Score。mAP衡量了模型在不同置信度阈值下的平均精确度,而F1-Score则是精确度和召回率的调和平均,能够综合反映模型的性能。
首先,mAP(平均精度均值)是目标检测领域中评估模型性能的关键指标,它综合考量了模型在不同置信度阈值下的表现。在我们的实验中,YOLOv6n以0.968的mAP值领先,紧随其后的是YOLOv5nu和YOLOv8n,分别为0.960和0.966。YOLOv7-tiny则相对落后,其mAP值为0.935。这表明,在处理我们的特定数据集时,YOLOv6n展现出最佳的检测性能,能够以较高的准确度定位和分类癌症图像中的目标。
F1-Score作为精确度和召回率的调和平均,是衡量模型稳健性的另一个重要指标。在实验结果中,YOLOv6n和YOLOv8n的F1-Score均为0.93,表现出相同的优秀性能,而YOLOv5nu和YOLOv7-tiny的F1-Score稍低一些,为0.92。F1-Score的高值表明了YOLOv6n和YOLOv8n在维持召回率的同时,也保持了较高的精确度,这对于医疗图像检测来说尤为重要,因为漏检和误检的代价都非常高。
综合这两个指标,我们可以得出一些有趣的结论。尽管YOLOv6n在mAP上略胜一筹,但YOLOv8n在综合F1-Score的稳健性上与YOLOv6n持平,显示了其强大的平衡能力。而YOLOv5nu虽然在mAP上略低于YOLOv8n,但在F1-Score上与YOLOv7-tiny持平,这可能意味着在某些情况下YOLOv5nu与YOLOv7-tiny有着类似的性能表现。不过,YOLOv7-tiny在两个指标上都是最低的,这可能表明在资源受限或需要更快速检测的场景下,它可能是一个更合适的选择,尽管牺牲了一些性能。
在选择最合适的YOLO版本进行癌症图像检测时,除了考虑F1-Score和mAP之外,我们还需要考虑模型的运行速度、内存占用以及是否易于部署等实际因素。例如,对于需要在移动设备上实时检测的场景,YOLOv7-tiny可能是一个更实用的选择,因为它牺牲了一些精度以换取更快的推理速度和更低的资源消耗。
4.4 代码实现
在这篇博客中,我们将深入探讨如何将最新的目标检测技术YOLOv8应用于癌症图像检测,并实现一个能够实时显示检测结果的图形用户界面(GUI)。下面,让我们逐步解析构建这一系统的核心代码。
(1)导入必要的模块和配置
首先,我们必须导入程序运行所需的模块。sys模块使我们能够与Python解释器交互,time模块用于监控模型处理帧的时间,确保我们的模型足够快以处理实时视频。OpenCV库是处理视频帧不可或缺的,而QtFusion库则负责构建GUI并管理媒体流。
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.Tumor.label_name import Label_list
QF_Config.set_verbose(False)
(2)定义类别和模型
在开始处理视频之前,我们需要加载我们的预训练YOLOv8模型,并获取每个可能的类别的颜色编码,这些颜色将用于在视频帧中标识检测到的肿瘤。这一步是为了使检测结果更加直观和易于理解。
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)创建主窗口
在我们的GUI设计中,MainWindow类扮演了核心角色。它继承自QMainWindow,定义了窗口的基本属性,如大小和标签。这个标签用于展示处理后的视频帧,使用户能够看到YOLOv8模型检测的结果。我们还为这个窗口定义了一个键盘事件处理函数,允许用户通过简单地按下“Q”键来关闭应用程序。
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() # 关闭窗口
(4)主程序流程
frame_process函数负责处理每一帧视频。我们首先调整帧的大小,然后将其传递给预先加载的YOLOv8模型进行检测。该函数还会计算并打印出处理每一帧所需的时间。如果模型在帧中检测到肿瘤,drawRectBox函数将在图像上绘制边界框并添加相应的标签。这样,用户就可以直观地看到模型的检测结果。
def frame_process(image): # 定义帧处理函数,用于处理每一帧图像
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: # 遍历检测信息
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上显示图像
一旦我们的模型准备就绪,我们就可以创建MainWindow的实例,并准备视频流进行处理。我们利用MediaHandler对象来读取视频文件,并将新的视频帧发送到frame_process函数进行处理。通过将这些组件组合起来,我们构建了一个可以处理视频流、运行目标检测模型并实时更新GUI的完整系统。
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())
最后,我们启动应用程序的主循环。现在,当用户打开这个程序时,它会自动播放视频,实时检测并显示肿瘤检测结果。通过实时的图像处理和直观的用户界面,这个应用程序将成为医疗诊断工具的一个有价值的补充,能够帮助医生快速准确地诊断癌症。
5. 癌症图像检测系统实现
在设计交互式癌症图像检测与识别系统的过程中,我们的系统设计思路着重于实现一个既直观又高效的工作流程,以便用户可以无缝地与系统交互。我们的目标是创建一个集成了图像处理、机器学习模型和用户界面的全面解决方案,使得医学影像分析既准确又用户友好。
5.1 系统设计思路
在我们的系统设计中,我们致力于打造一个直观且功能强大的交互式癌症图像检测与识别系统,旨在提高用户的操作便利性,并充分利用YOLOv8模型的强大功能。
(1)架构设计
为了实现这一目标,我们首先设计了MainWindow类,它是用户交互的中心。这个类不仅负责渲染用户界面,还作为用户命令的响应中心,处理来自界面层的输入,并调用后端处理层的功能。在这个系统中,MainWindow类的设计充分利用了面向对象编程的优势,通过对象的组合,将各个独立的功能模块 —— 用户界面、媒体处理和模型预测 —— 组织在一起,实现了高内聚、低耦合的系统架构。
- 处理层(Processing Layer):在处理层,我们集成了YOLOv8Detector类,它内嵌了预训练的深度学习模型,专门负责视频流中癌症图像的实时检测和识别。这个模型是我们系统的核心,负责处理图像数据并返回识别结果。为了提高系统的性能和响应速度,这一层采用了高效的算法优化,确保在不牺牲准确性的前提下实现快速推理。
- 界面层(UI Layer):界面层是与用户直接交互的前端,由Qt设计的元素构成,如窗口、按钮、标签等,它们不仅为用户提供了操作的界面,也通过视觉元素展示了检测结果。为了增强用户体验,我们在设计时注重界面的直观性和操作的简便性,使得非专业人员也能轻松使用。
- 控制层(Control Layer):控制层起着承上启下的作用,它通过MainWindow类的槽函数响应用户的操作,如开始检测、停止检测等,并控制媒体处理器和模型的行为。控制层的设计充分考虑了用户的使用习惯和操作逻辑,使得用户可以通过简单的操作来控制复杂的图像处理和检测任务。
此外,我们的系统还采用了Qt的信号和槽机制,这一机制在模块间提供了强大的交互和数据传输能力。当用户在界面层进行操作时,相应的信号被发射,并由控制层中的槽函数进行捕获和处理。这种设计不仅使得我们的代码更加清晰和易于维护,还提高了系统的响应速度和稳定性。
通过这种分层的架构设计,我们确保了各个组件可以独立更新和维护,同时保证了整个系统的一致性和稳定性。这样的设计理念使得我们的交互式癌症图像检测系统既能满足专业医疗影像分析的需求,又能为用户提供友好的操作体验,极大地提高了癌症图像检测的准确性和效率。
(2)系统流程
在本次博客的探讨中,我们将深入了解交互式癌症图像检测与识别系统的工作流程。此系统的流程设计紧扣用户体验与高效率的原则,涵盖从应用启动到图像检测结果呈现的每一个环节。这个过程体现了软件工程的最佳实践,确保了即便是非专业用户也能轻松上手,同时为专业人员提供了强大的功能支持。
-
当用户启动应用程序时,系统的第一步是实例化MainWindow类。这个实例不仅是用户交互的中心枢纽,也是整个应用的大脑。它初始化了应用程序的界面和所有必要的参数配置,从而为用户提供了一个清晰、简洁的操作界面。用户通过这个界面可以轻松选择输入源,无论是即时的摄像头图像、视频文件还是静态图片。
-
选择好输入源后,应用程序会调用内置的媒体处理器来配置摄像头、读取视频文件或加载图像文件。这一过程不仅高效,而且用户几乎感知不到任何延迟,这得益于我们优化的后端处理流程。这个流程包括了一系列的预处理步骤,确保每一帧图像都被适当地调整和转换,以符合YOLOv8模型的输入需求。
-
随着媒体输入源的准备就绪,系统进入了连续帧处理的循环。在这个循环中,每一帧图像都会经历一个全面的预处理阶段,包括图像缩放、色彩空间转换等,以确保图像数据最适合模型的检测。接着,在检测与识别阶段,预处理后的图像被喂入先进的YOLOv8模型。模型凭借其强大的算法,迅速输出了肿瘤位置及其相关属性。
-
界面更新阶段则是用户见证智能检测魅力的时刻。随着检测结果的产生,用户界面会即时刷新,展示肿瘤检测框和相关属性。此外,我们还设计了实时数据展示,如表格和条形图,它们将统计数据以直观的方式呈现给用户。通过这种方式,用户不仅能看到每一帧图像的检测结果,还能对检测性能进行深入分析。
-
此外,系统的交互设计允许用户执行多种操作,从保存检测结果到查询帮助信息,再到筛选特定的检测结果。这些操作都通过界面上的按钮轻松完成,用户甚至可以通过下拉菜单进行更精细的结果分析。
-
最后,媒体控制功能赋予了用户对播放状态的完全掌控。用户可以随时启动或停止摄像头捕捉、视频播放或图像分析,提供了高度的操作自由度。这种设计理念不仅保证了系统的灵活性和用户的自主性,也确保了系统可以适应不同的使用场景和需求。
总之,这一癌症图像检测与识别系统通过精心设计的用户界面和强大的后端处理能力,为用户提供了一个高效、直观且功能丰富的工具,极大地促进了癌症图像检测技术的应用和发展。
5.2 登录与账户管理
在本博客中,我们将探讨如何通过结合高效的癌症图像检测技术与细致的用户账户管理系统,为使用者提供一个既安全又个性化的使用体验。这个体验始于用户第一次接触我们系统时的登录界面,延伸至他们每一次使用我们的癌症检测功能。我们的系统不仅仅是一个普通的癌症图像检测工具,它还是一个能够理解并适应每个用户独特需求的智能平台。
从安全性的角度出发,我们首先为用户提供了一个结合了PySide6和SQLite的登录系统。这个系统不仅支持新用户的注册流程,还允许用户在保护个人隐私的同时,修改密码和设置个性化头像。我们意识到,每个用户的检测结果都是极其私人且敏感的信息,因此我们采取了强化的安全措施来确保这些数据的安全。此外,账户注销和重新登录的功能确保了用户可以在任何需要的时候,对自己的账户进行完全的控制。
一旦用户完成了账户的设置,他们便可以进入主界面,开始使用癌症图像检测功能。我们的系统支持多种输入方式,包括图片、视频、实时摄像头捕捉以及批量文件处理,这样的多样性使得无论用户的需求是即时检测还是大规模分析,我们的系统都能够满足。主界面不仅实时显示检测框、类别和置信度等关键信息,还允许用户保存和管理自己的检测结果。这种设计使用户能够回顾和分析自己的检测历史,以便进行长期的健康监控或数据分析。
此外,我们的用户界面的设计旨在提供便捷的个性化服务。用户可以在登录界面轻松地修改密码、设置头像,甚至在不再需要使用系统时注销账户。这些功能不仅提升了用户的体验,也提供了一层个性化,使得用户可以根据自己的喜好和需求调整系统的使用。
通过这种多层次、多功能的设计,我们的癌症图像检测系统既具备了强大的技术核心,也拥有了贴心的用户关怀。我们相信,一个好的技术解决方案应当不仅仅是高效和先进,它还应该是安全、私密和用户友好的。正是这种设计理念,让我们的系统不仅能够满足用户在实时目标检测场景下的需求,还能够成为他们日常生活中不可或缺的健康助手。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV13J4m1h7MK/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZuakp5y
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuakp5s
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuakp5t
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuakp5u
在文件夹下的资源显示如下,下面的链接中也给出了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. ↩︎
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. ↩︎
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. ↩︎ ↩︎
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. ↩︎