Advertisement

基于YOLOv8深度学习的医学影像肺结节检测与诊断系统研究与实现(PyQt5界面+数据集+训练代码)

阅读量:

本研究开发了一种新型基于YOLOV8深度学习模型的医学影像肺结节检出与诊断系统;主要目标在于为肺结早期检出与确诊提供智能化支持。其中将肺结组织形态特征作为重要的分析指标;能够有效识别并判别潜在异常病变;其准确检出与确诊对于提高早期肺癌治疗效果至关重要;传统的检出方法主要基于医生经验和人工标注的方法进行操作;存在明显的主观性和较大的工作量问题需要解决;如何借助人工智能技术实现快速且精准的自动化检出成为亟需解决的关键问题。

基于最新开发的YOLOV8深度学习模型

经过这一系列严格的预处理步骤后

研究结果表明,在肺结节检测任务中所提出的系统表现出了较高的检测准确率和召回率,在降低假阳性及假阴性发生方面取得了显著效果。相较于传统检测方法,在检测速度与准确性方面本系统展现了显著优势,并成功提供了切实可行的技术方案以解决医学影像智能分析问题。本系统不仅能够有效缓解临床医生的工作压力,并且通过其高效的性能与可靠的特性为临床医疗诊断提供了可靠的技术支撑。

本系统旨在为肺结节的智能化检测和诊断提供一种高效的先进工具,并展现了深度学习技术在医学影像分析领域具有广泛的应用前景。未来研究可以进一步增强系统的功能多样性,并探索多模态数据分析和跨设备影像检测技术的应用方案;这些改进措施将有助于提升其在各种临床情境下的适用性和可靠性

算法流程

项目数据

为了收集多种类型的肺结节影像数据集,并利用Labelimg标注工具对所有图片进行注释。将检测类别设定为单一,并使Noodle用于标识其中的肺结节区域。

目标检测标注工具
(1)labelimg: 免费提供的一种图像标注工具,默认支持分类标签和目标检测功能,默认采用Python编写,并基于Qt构建了可视化的图形界面,默认操作简单且易于上手(尽管是英文界面)。该软件默认以PASCAL VOC格式保存标注结果为XML文件,默认适用于ImageNet数据集的使用场景,并支持COCO数据集格式的应用场景。(2)在CMD中安装labelimg可通过以下命令完成:pip install labelimg -i https://pypi.t tuna.tsinghua.edu.cn/simple

结束后,在cmd中输入labelimg

初识labelimg

打开后,我们自己设置一下

在View中勾选Auto Save mode

接下来我们打开需要标注的图片文件夹

并配置好存储位置(如上图所示为Change Save Dir)
随后开始操作流程:首先进行标注工作;接着使用框选工具进行选择;然后为选定的目标对象贴上相应的标签;之后按下快捷键D截取下一张图片;如此反复操作直至完成任务。

Labelimg的快捷键

(3)数据准备
为了方便后续操作,在此建议您新建一个名为data的数据集目录结构(这一做法并非唯一的选择),然后在其中设置一个名为images的文件夹用于存储您需要打标签的所有图片;接着设置另一个名为labels的目录用于详细记录对应的标签信息;最后设置一个命名为classes.txt的文本文件来存储您需要标注的所有类别名称。

data目录下的文件组织如下:
├── image_dir
│ └── image_files 需要做标注处理的图片集合
├── label_dir
│ └── label_files 保存对应图像的分类标记信息
└── classes.txt


(该分类标记方案可选可不建立;但在我们面对较多分类任务时建议为每个类别创建一个对应的标记方案)

首先,在images目录中放置待标记的照片。这一类图片均来自手机拍摄。

“classes.txt”定义了你的 YOLO 标签所引用的类名列表。

(4)YOLO模式创建标签的样式

存放标签信息的文件命名为与图片名称一致,在内容上则由N行及每行5列的数据构成。
每个条目对应一个待标记的目标,并包含以下五个属性:
依次排列着以下五个参数:类别ID(category ID)、x中心坐标(x center)、y中心坐标(y center)、宽度(width)和高度(height)。
其中:
类别的唯一标识符即为该条目中的类别ID;
位置信息主要由x中心坐标和y中心坐标的比值决定。

注意:这里的中心点坐标、宽和高都是相对数据!!!

存放标签类别的文件的文件名为classes.txt(固定不变),用作存储创建的标签类别

完成后可进行后续的yolo训练方面的操作。

模型训练

模型的训练、评估与推理

1.YOLOv8的基本原理

YOLOv8是当前领先的模型,并基于Yolo系列的历史版本构建而来。它新增了一系列功能与优化内容,并通过增强计算能力和适应性来提高性能水平。此方法被认为是实现这些任务的理想解决方案。具体而言,在以下方面进行了优化:首先,在算法层面引入了一个全新的骨干网络;其次,在检测阶段采用了全新的Ancher-Free架构;最后,在损失函数设计上也做出了创新性调整。这些改进使其能够在CPU至GPU等多种硬件平台上稳定运行,并展现出卓越的性能优势

YOLOv8作为Yolo系列的最新版本,在各方面表现更为卓越。它不仅在各项关键指标上实现了显著超越,在各项关键指标上实现了显著超越的同时还特别值得关注的是它汲取了包括But what's the point of this?在内的多个前作优化方案的核心优势。基于对提升原有基础架构的深入优化而实现这一成就的同时继承并强化了其工程化设计中的简便性和高效性特点。

Yolov8模型网络结构图如下图所示:

2.数据集准备与训练

本研究采用了包含多种类别的肺结节相关图像的数据集,并借助Labelimg标注工具对每张图像中的目标边界框及其分类信息进行了精确标注操作。随后主要基于YOLOv8n这一模型开展模型训练工作,在完成训练后系统对模型在验证集的表现进行了全面评估与对比分析。具体包括以下几个方面:首先是数据集准备阶段;其次是模型训练过程;最后是模型评估环节。本次研究设定的目标类别为肺结节,在所涉数据集中共有1,186张图片参与其中。其中一些典型实例如图所示

部分标注如下图所示:

图片数据的存储格式如下,在项目目录中创建datasets目录,并将检测到的图片按照训练集与验证集进行归类于该目录下。

接下来需要创建一个data.yaml文件 用以保存训练数据的路径以及模型需进行检测的类别 YOLOv8在执行模型训练的过程中 会调用该数据信息来完成相应的训练与验证 data.yaml的具体内容如下

training_set: E:\PulmonaryNodulesDetection_v8\datasets\images\train 训练数据集位置
validation_set: E:\PulmonaryNodulesDetection_v8\datasets\images\val 验证数据集位置

nc: 1 模型检测的类别数,共有1个类别。
names: [‘nodule’]

该文件明确了用于模型训练与验证的数据集路径,并指定了模型需检测的目标类别。

在完成数据准备后,在完成数据准备后

通过调用 epochs 参数设定循环次数

通过 batch 参数配置每个循环中的样本批量数量

CPU/GPU训练代码如下:

导入预定义的YOLov8n.pt模型文件,并加载该模型以供后续使用。

3.训练结果评估

在深度学习的学习过程中

各损失函数作用说明:
定位损失box_loss:计算预测框与标定框之间的GIoU差异(越小表示定位越精准);
分类损失cls_loss:判断锚框对应的分类是否正确(越小表示分类越精准);
动态特征损失dfl_loss:DFLLoss是一种用于回归预测框与目标框之间距离的损失函数,在YOLOv8训练流程中发挥重要作用。该过程包括两个步骤:首先将目标框调整至特征图尺度(即除以相应的stride值),然后分别计算该目标框与预测边界框的CIoU损失以及与预测锚框中心点到各边距离的DFL回归损失。通过这一设计,在优化DFLLoss时能够更加精确地调整预测结果的位置信息,从而提升整体检测精度。

训练结果如下:

该图表详细呈现了YOLOv8模型在训练与验证过程中各关键指标的变化情况

(1)分类误差衡量了模型对目标物体进行分类时的误判程度。
(2)数值明显降低表明模型在分类任务中的识别能力得到了提升。

train/cls_loss:
(1)在训练过程中,分类损失(Classification Loss)的变化情况反映了模型在预测物体类别时出现的误差程度。
(2)随着训练过程的发展,在分类任务中观察到的损失值持续下降,并且模型的准确性不断提高。

train/dfl_loss:
(1)焦点焦点损失 (DFL) 识别了边界框与真实值之间的差异。
(2)这一指标持续下降,表明模型在边界框预测上的预测精度更高。

metrics/precision(B):
(1)精确率(Recall),即模型准确识别出的目标占所有被识别目标的比例。
(2)随着迭代次数的增加,精确率持续提升(improve),这表明模型在识别检测目标方面的能力得到了增强。

metrics/recall(B):
(1)Recall值定义为模型识别出的实际目标数量相对于所有真实存在的目标数量的比例。
(2)图形显示Recall值持续增长,并表明该模型能够有效识别出越来越多的目标。

val/box_loss:
(1)在验证集上观察到了边界框回归损失的波动情况。
(2)该指标用于衡量模型在检测阶段对边界框预测的准确性。

val/cls_loss:
(1)验证集上的分类损失持续下降。
(2)表明模型在验证集上的分类性能得到了提升。

val/dfl_loss:
(1)该损失在验证集中的分布度较高。
(2)趋势显示模型在处理边界框与真实标签差异方面表现出色。

metrics/mAP50(B):
(1)当IoU阈值设定为0.5时的平均精度指标。
(2)随着训练进程的推进而不断提升的表现指标。

metrics/mAP50-95(B):
(1)基于Recall的不同IoU阈值下的平均精度指标。
(2)随着模型训练的深入过程持续提升,在多个IoU阈值下均表明了较高的检测性能。

这些图表展示了YOLOV8模型在训练与验证过程中的各项关键指标变化趋势。随着迭代次数的增加,训练与验证损失均呈现逐步下降的趋势;同时精度与召回率均持续提升,并在多项关键指标上展现出稳定的优化趋势

为了评估分类模型的性能尤其是在处理失衡数据集时 PR 曲线成为评估检测性能的关键指标

Precision(精确率):
(1)Precision指的是,在所有被模型预测为肺结节的对象中,并非全部都是真实存在的肺结节的概率值。
(2)当Precision达到较高水平时,在所有被预测为肺结点的对象中发现真实肺结节的能力也会相应增强。

Recall(召回率):
(1)召回率R值衡量了模型识别出的肺结节数量与实际数量之间的关系。
(2)数值越大,则表明模型识别能力越强。

不同颜色曲线:象征不同类别的PR曲线分布情况。其中:
(1)蓝色曲线(Ballooning):该类别检测效果最优,在该类别的平均精度上达到最佳水平。
(2)红色曲线(Steatosis):其平均精度为0.739,在多数情况下仍能保持较高检测效能。
(3)橙色曲线(Fibrosis):该类别的检测能力相对薄弱,在精确度与召回率方面均呈现较低水平。
(4)绿色曲线(Inflammation):平均精度仅为0.390,在各类别中处于最低水平,表明模型对该类别的识别能力仍有显著提升空间

曲线分析:
(1)观察图表时可以发现,在召回率达到高峰时对应的精确度反而有所下降的现象正是典型的PR曲线上升过程特征表现形式之一。
(2)较高的精确度表明在减少误检数量的同时仍能够捕获更多的实际阳性案例数据样本特征表现形式之一是基于模型输出结果的具体分布特性分析方法应用基础前提下得出的重要结论之一。
(3)总体而言,在评估PR曲线的过程中需要综合考虑其平滑度与斜率的变化情况这些指标的变化趋势能够较为全面地反映出模型在不同阈值下的检测性能表现形式包括但不限于灵敏度与特异性之间的平衡关系等多方面因素共同作用下的综合性能评估结果

该研究主要旨在显示模型在肺结节检测任务中的性能,并借助PR曲线帮助研究者或开发者考量模型在不同阈值下的精确率与召回率之间的平衡。

4.检测结果识别

模型训练完成之后, 我们将能够生成一份最优的训练成果报告, 其中包含了编号为best.pt的模型文件, 该文件夹位于runs/train/weights这一特定路径中. 在完成上述操作后, 我们还可以依此文件为基础开展后续步骤中的推理分析工作

加载所需库:
(1)从ultralytics库导入YOLO模型类,并用于实现目标检测功能。
(2)导入OpenCV库以便以图像处理和视觉化的方式工作。

请指定模型路径及图片路径:

加载预训练模型:
(1)model = \text{YOLO}(path, task='detect'):按照指定路径配置YOLO模型,并将检测任务设为目标检测 (detect)。 (2)利用 \text{conf} 参数配置目标检测的置信水平阈值,并利用 \text{iou}$ 参数设定非极大值抑制(NMS)中的交并比(IoU)阈值。

识别图像内容:
(1)调用模型进行图像分析:
results = model(img_path)
得到的结果存储在 results 变量中。
该操作会将输入的图像数据传递给模型进行推断。
结果将被保存到 results 中供后续使用。

显示检测结果:
(1)res = results[0].plot():该处将通过调用 plot() 方法呈现检测结果。
(2)cv2.imshow("YOLOv8 Detection", res):该函数将通过 OpenCV 库展示检测结果,并将窗口标题设置为 "YOLOv8 Detection"。
(3)cv2.waitKey(0):该指令将并等待用户提供按键指令以关闭显示的窗口。

此代码的作用是导入预训练好的YOLOv8模型架构,并针对指定输入图像执行目标识别操作后输出相应的检测结果

执行imgTest.py代码后,会将执行的结果直接标注在图片上,结果如下:

此段输出基于YOLOv8模型针对图片' image.jpg '进行了检测结果展示如下

图像信息:
(1)涉及的图像路径是:E:\PulmonaryNodulesDetection_v8\TestFiles\0229.png。
(2)该图像具有 640×640 像素的分辨率。

检测结果:
(1)模型检测到 1个结节 (nodule)。
(2)每张图片的推理时间为9.2毫秒。

处理速度:
(1)预处理时间:5.283 毫秒
(2)推理时间:9.213 毫秒
(3)后处理时间:99.137 毫秒

检测类别:
YOLOv8模型检测的1类病变:
(1)1 个结节 (nodule)

此YOLOv8模型识别出图像中的一个结节。其处理流程包含预处理、推理及后处理步骤。整体运行效率较高。结果存储在预先指定的文件夹中。

运行效果

– 运行 MainProgram.py

1.主要功能:
(1)本系统具备实时检测能力,特别适用于分析肺结节图像中的肝病类别。
(2)系统不仅能够处理图像、视频流以及摄像头采集的画面,并且支持批量处理多幅图像。
(3)操作界面能实时展示定位坐标、数量统计以及准确率评价的相关信息。
(4)系统设计充分考虑了实用性,在完成检测后即可将结果存储在本地设备中。

2.检测结果说明:

该图表展示了基于YOLOv8模型的目标检测系统的结果界面。具体而言,请参阅以下各字段的详细说明:

(1)该模型完成一次检测所需的时间精确到小数点后四位是0.025秒。
(2)该系统揭示了其优异的实时性能,并且能够实现快速检测能力。

目标数目(Number of objects detected):
(1)检测到的目标数目为1,即表示这是本次检测所识别的第一个目标。

(1)该设置包含一个下拉菜单项,允许用户浏览目标类型.
(2)在当前状态下,默认选项已设置为'全部'状态.此时状态会详细列举所有被检测到的目标信息.

当前选中的行为类别为 "肺结节" 表示系统正在对检测出的 "nodule" 进行高亮显示

置信度(Confidence):
(1)表明该系统识别出的目标被分类为"肺结节"的概率是92.74%。
(2)置信度体现了系统对该检测结果的信任程度,在此情况下数值越高则表示系统对该结果越有信心。

目标位置(Object location):
(1)x_min: 100, y_min: 131:目标区域左上方坐标的数值为x_min及y_min。
(2)x_max: 120, y_max: 151:该区域右下方坐标的数值分别为x_max及y_max。

这些坐标表示在图像中的目标区域范围,框定了检测到的“肺结节”的位置。

这张图呈现了肺结节检测系统的一次检测结果,并包含了一系列关键数据点如检查时间、分类结果、行为特征的置信水平以及目标位置信息等。通过图形化界面直观查看并深入分析这些数据信息后能显著提升医学影像诊断效率。

3.图片检测说明

单击图片按钮启动,并选择待检测的图片文件;或者单击文件夹按钮启动以指定批量检测文件夹路径。
操作步骤如下:
(1)在目标下拉框中进行设置并选定目标参数;
(2)完成设置后点击保存按钮即可实现结果存储。

分析结果:系统对图片进行肺结节识别,并生成分析报告。报告中包含以下关键信息:统计共有多少个目标;该过程耗时多少分钟;所识别的目标类型;每个目标的置信度值;以及每个目标的具体坐标位置数据。

4.视频检测说明

单击视频按钮后会启动选择待检测的视频流程;系统将立即呈现检测结果画面;再次单击可切换回主界面。单击保存按钮后会执行对当前检测结果的保存操作;存储路径为:save_data目录下。

该系统实现了对视频流的实时处理,并能够识别出肺部结节并呈现分析数据。通过表格形式展示了各检测点的置信度评分及其具体位置坐标。

这个界面呈现了系统在视频帧上的多目标检测能力,并具备精准识别肺结节的能力。同时提供了详细的检出结果及相应的置信度评估。

5.摄像头检测说明

按下启动摄像头按钮,则会实现摄像头的开启,并具备实时检测功能。随后再次按下该按钮即可关闭摄像头。

检测结果:通过摄像头实时采集数据,并识别出病变区域并记录检查报告。动态更新监控画面的同时,在图像中标记出发现的病变部位,并将具体数据信息整理成电子表格形式供后续分析参考

6.保存图片与视频检测说明

当点击‘保存按钮’时,
会被选中的图片(包括批量图片)以及视频的检测结果也被保存。
这些被检测到的图片以及视频的结果将会被存储于save_data目录中。
保存的结果文件如下:

该CSV文件存储了关于图片信息的相关数据包括但不限于图片路径目标在图片中的编号目标类别置信度以及目标坐标的详细信息。注:其中坐标位置表示检测框的左上角与右下角两个顶点对应的x轴和y轴坐标值

(1)图片保存

(2)视频保存

– 运行 train.py
1.训练参数设置

data=data_yaml_path: 由data.yaml文件中的数据集定义。
epochs=150: 训练周期设定为150次循环。
batch=4: 每个批次包含4幅图像(批次大小)。
name=’train_v8′: 训练结果将被存储于名为train_v8的目录中。
optimizer=’SGD’: 本模型将采用SGD算法进行优化运算。

然而,在多数深度学习任务中,GPU往往能显著提升训练速度。
尽管如此,在一些特定场景下,可能会遇到硬件限制或其他因素导致用户不得不选择使用CPU进行训练。

温馨提醒:在CPU上进行深度学习模型的训练通常会相较于GPU而言表现得较慢许多,尤其是像YOLOv8这类计算密集型的任务。除非特殊情况下需要CPU处理,否则建议优先选择GPU以提升训练效率

2.训练日志结果

这张图展示了使用YOLOv8进行模型训练的详细过程和结果。

训练总时长:
(1)模型在训练了150轮后,总共耗时0.687小时。

性能指标:
(1)mean Average Precision (mAP)指标数值设定为0.721:当IoU阈值设定在0.5时,该均值达到72.1%。
(2)mean Average Precision (mAP)指标数值设定为0.317:多个IoU阈值范围内的均值达到31.7%。

速度:
(1)预处理步骤所需的时间为每张图像 0.2 毫秒。
(2)推理过程所需的时间为每张图像 1.4 毫秒。
(3)损失计算所需的时间为每张图像 无耗时。
(4)后处理步骤所需的时间为每张图像 无耗时,并可执行操作如绘制边界框等。

结果被保存:
(1)runs\detect\train\_v8:验证的结果被存储在 runs\detect\train\_v8 这个目录中。

整个验证过程以成功退出码0结束,并表明其已完成状态且未出现错误信息

该模型在验证阶段显示出较高的精确度与召回率指标,在较低的IoU门限条件下实现了72.1%的平均精度,在较高要求的标准下也保持了31.7%的平均精度水平

全部评论 (0)

还没有任何评论哟~