深度学习彻底改变了医学影像分析。
医学数据集上的 YOLOv9 实例分割
源代码(数据集):
http://www.gitpp.com/pating/med-yolo
通过识别医学图像中的复杂模式,它可以帮助我们解释有关生物系统的重要见解。因此,如果您希望利用深度学习进行医疗诊断,本文可以成为在医疗数据集上微调 YOLOv9 实例分割的良好起点。
实例分割模型不是简单地将区域分类为属于特定单元类型,而是精确定位和描绘单个单元实例的确切边界。首先,我们将讨论,使用 Ultralytics 在自定义医学数据集上微调最新的 YOLOv9 分割模型,然后将其与更精细的 YOLOv8-seg 模型进行比较。
什么是实例分段?
实例分割涉及将给定图像或体积的每个像素或体素分类为特定类,并为单个对象的像素分配唯一标识。另一方面,语义分割也将图像的每个像素分类为特定类,但它不区分同一类的单个对象。属于单个类的所有像素都分配有相同的标签,而不区分不同的对象。
这使得 Instance Segmentation 适用于对象轮廓、空间分布和个体身份很重要的应用程序。如此细致,实例分割是对象检测(类级定位)和分段(像素级分类)的组合。
YOLOv9 实例分割
要学习 YOLOV9
先简要介绍 YOLO
YOLO(You Only Look Once)是一种基于深度学习的目标检测算法,其核心思想是将目标检测任务转化为一个回归问题,通过单个卷积神经网络同时预测图像中多个目标的边界框和类别概率。这种算法由Joseph Redmon等人于2016年提出,并在计算机视觉领域引起了广泛关注。
YOLO算法的主要特点包括:
实时性强:由于YOLO算法将目标检测视为整体回归问题,实现了端到端的快速检测,因此其检测速度非常快,通常可以在实时应用中达到较好的性能。这种特性使得YOLO在自动驾驶、智能监控等领域具有广泛的应用前景。
准确性高:尽管YOLO算法在速度上表现出色,但其准确性也相对较高。通过不断地迭代和优化,YOLO算法在保持高速检测的同时,也逐步提高了检测精度。
通用性强:YOLO算法具有很强的通用性,可以轻松地扩展到不同的数据集和任务上,而不需要进行大量的修改或调整。这使得YOLO成为一种非常灵活和易于使用的目标检测方法。
YOLO算法的工作原理大致如下:
图像划分:首先,YOLO算法将输入图像划分为一个S×S的网格,每个网格负责检测落入其中的物体。
边界框预测:每个网格都会预测固定数量的边界框(bounding boxes),并对这些边界框进行打分,以确定它们是否包含物体以及物体的类别。每个边界框由五个参数构成,分别为框的中心坐标(x, y)、宽和高(w, h)以及置信度。
类别预测:除了边界框的预测外,每个网格还会预测目标类别的概率。这些概率与边界框的置信度相结合,可以得到每个边界框包含特定类别物体的最终得分。
非极大值抑制(NMS):最后,通过非极大值抑制算法去除重叠的边界框,得到最终的检测结果。
YOLO算法自提出以来已经发布了多个版本,如YOLOv2、YOLOv3、YOLOv4等,每个版本都在前一个版本的基础上进行了改进和优化。例如,YOLOv2引入了anchor boxes的概念,可以更好地预测不同形状的物体;YOLOv3则通过引入多尺度预测和特征金字塔网络(FPN)等技术,进一步提高了检测精度。
总的来说,YOLO算法以其快速、准确和通用的特点在计算机视觉领域占据了重要地位,并在自动驾驶、智能监控等多个领域展现出了巨大的应用潜力。
为什么选择 YOLOv9 实例分割?
对于 YOLO 和 SSD 等轻量级模型,在正向传递过程中存在信息降级的风险。因为,信息丢失主要是由于其架构中使用的下采样操作而发生的。
这些模型通过池化和跨步卷积快速减小空间维度,以将输入图像压缩为紧凑的特征表示。虽然这有助于增加感受野并降低计算成本,但它会导致精细细节的丢失,而这些细节对于检测小而密集的物体至关重要。
为了解决这个问题,YOLOv9 利用广义高效层聚合网络 (GELAN) 来实现卓越的参数利用率和计算效率。YOLOv9 主要侧重于使用可编程梯度信息 (PGI) 和可逆函数解决深度神经网络中的信息丢失问题。
从此表中可以明显看出,与 YOLOv8 分割模型相比,YOLOv9 实例分割模型在 COCO 分割任务上的 mAP 有了显著改进。
了解 YOLOv9 实例分段的数据集
医学专业知识在增强模型在不同成像模式中的泛化性方面发挥着不可或缺的作用。这是通过在整个模型训练和评估阶段精心策划高质量的带注释数据集和专家指导来实现的。
因此,我们将使用一个这样的高质量医学 NuInsSeg Kaggle 数据集,其中包含来自 31 个人类和小鼠器官的 30 多个手动分割的细胞核,以及从 H&E 染色的全玻片显微图像中提取的 665 个图像块。
该数据集包含各种人类和小鼠器官的组织。人类和小鼠的主要器官包括小脑、肾脏、肝脏、胰腺等。
该数据集包含一个 Nuclei 类和总共 665 张图像。让我们用 80:20 的火车价值分割比来分割它。
然后,最终拆分分别有 532 张训练图像和 133 张验证图像。
所有图像的尺寸为 512 x 512。
代码演练
最近,YOLOv9 实例分割模型已集成到 Ultralytics 包中。我们将利用它来设置我们的训练管道。
让我们安装将数据集转换为 YOLO 格式所需的必要软件包。这里,用于评估指标,并将数据集拆分为 train 和 validation。pycocotools
scikit-learn
让我们为可重复性设置 seed 。
下载数据集
该功能块用于下载和解压指定目录下的数据集。
删除不需要的目录
数据集带有许多子目录。但是,对于我们的 YOLOv9 实例分割微调,我们只需要原始图像和标记的掩码,并将它们转换为适当的格式。
对于我们的任务,只需保留子目录名为 'tissue images' 、 'mask binary without border' 和 'label masks modify ' 的目录。
修剪后,我们的数据集树将如下所示:
此外,让我们尝试将 annotation 从二进制掩码转换为 YOLO 格式。作为中间步骤,让我们将它们转换为 COCO JSON 格式,这很容易解释。
YOLOv9 实例分割实用程序函数
get_image_mask_pairs()
返回数据集中附加到列表的所有图像和掩码路径。
二进制掩码是在分割任务中表示对象注释的常用方法。它们在像素级别有效地对对象的形状进行编码。但是,将这些蒙版转换为多边形以执行可视化或计算对象属性等任务通常是有益的。mask_to_polygons()
显示了一种从二进制掩码中提取多边形的此类方法。
我们需要将组织的二进制掩码转换为可操作的多边形点。为此,我们使用 cv2.findContours
来提取二进制掩码的近似多边形。这可确保我们获得一个有效的闭合多边形,该多边形具有 4 个以上的边和遮罩边界周围的轮廓。通过使用 cv2.RETR_TREE
作为轮廓检索模式,我们可以重建所有检测到的轮廓之间的层次关系。
这篇关于轮廓检测的文章将帮助您全面了解这个概念。
YOLO 注释格式
在继续代码之前,让我们花点时间了解实例分割任务的 YOLO 注释格式。在 YOLO 实例分割格式中,注释存储在与每个图像对应的单独 .txt
文件中,图像和注释文件共享相同的基本文件名。
例如,图像human_kidney01.png应具有名为 human_kidney01.txt 的匹配注释文件。
.txt 文件中的每一行对应于在该关联图像文件中找到的单个对象实例。
每行包含有关实例的以下信息:
对象类索引:引用对象的类索引的整数(例如,0 表示 Nuclei)。
对象边界坐标:这些是围绕对象分割区域的标准化边界坐标,确保注释可以在不同维度的图像之间扩展。
因此,.txt 文件中的每一行都类似于
<class-index> <x1> <y1> <x2> <y2> ...<xn> <yn>
数据集准备
process_data
实用程序会将注释和图像初始化为空列表,所有元数据都将附加到该列表。此外,image ID 和 ann ID 的初始值将为零。
接下来,同时迭代从 get_image_mask_pairs
实用程序函数获取的 and 列表。 对于每个图像,在每次迭代后递增 1 来分配一个唯一值。然后,使用 OpenCV 读取图像和掩码。cv2.IMREAD_UNCHANGED
有助于读取蒙版,包括 Alpha 通道(如果存在)。image_paths
mask_path
image_id
首先,将有关每张图像的关键信息(如 、 、 等)分配为字典,并将其附加到图像列表中。image_id, width
height
filename
COCO 到 YOLO 格式转换
现在我们的注解已经是 COCO json 格式了。接下来,将 COCO 注解有条不紊地转换为 YOLOv9 实例分割格式。
为此,请迭代每个图像的字典,并从 annotations 列表中检索其唯一标识符 () 和关联的 annotations ()。coco_input
img_id
img_ann
现在,对于每个图像,都会创建一个相应的 .txt 注释文件,并在循环中提取当前对象实例。然后,相对于当前图像尺寸对多边形进行规格化。因此,将在 output labels 目录中为所有图像创建一组 .txt 文件,该文件将在微调期间使用。category_id
polygon
准备 data.yaml
我们会将所需的数据集转储到单独的 data.yaml
文件中,以适应任何 YOLO 模型的训练管道。此文件包含训练、验证和测试图像目录的路径,以及数据集中的类和类数。names
数据集目录应具有以下树结构:
现在,yolo_dataset_preparation()
函数定义所有路径,然后调用所需的实用程序函数集。简单来说,这个函数负责从原始二进制掩码中提取多边形,并将它们转换为 YOLO 格式。最后,它为 YOLOv9 实例分段微调创建一个 data.yaml
文件。
YOLOv9 实例分割模型设置
Ultralytics 软件包具有两个 YOLOv9 实例分段模型。
此外,我们将对 YOLOv9e-seg 和 YOLOv9c-seg 进行微调,并将它们分别与等效参数大小的 YOLOv8l-seg 和 YOLOv8m-seg 模型进行比较,以适应不同的图像大小。
在本实验中,我们将在 COCO 数据集上使用预先训练的 YOLOv9e-seg 模型权重,所有层均未冻结。
但是,您也可以尝试
YOLOv9 实例分段:使用部分冻结的层进行微调 –
冻结模型的主干层,这些层负责可生成特征提取,并且只解冻专门用于分割的 YOLOv9-seg 头层。
YOLOv9 实例分割:迁移学习 –
完全冻结预先训练的 YOLOv9e-seg 模型,只训练特定于分割任务数据集的最终头层。
下面的代码片段读取并获取训练数据集的类数。data.yaml
训练
让我们训练模型 70 个 epoch 并将训练日志保存到指定的项目目录中。
现在,让我们通过使用 .我们将微调 YOLOv9e-seg 模型,使其批量大小为 ,图像大小为 ,使其适合 GPU 内存。model.train()
3
1024
注意:如果您遇到 CUDA 内存不足 (OOM) 错误,请尝试相应地减小批处理和图像大小,以便有效利用 GPU 内存。
为了确保模型进行充分训练并在准确性或最小损失方面实现最佳性能,将 patience
设置为 0
会停用提前停止。
硬件规格:
训练是在具有 4090 GB vRAM 和 AMD Ryzen 7532 32 核 128 线程 CPU 的 RTX 24 GPU 上进行的。
要使用 Colab T4 免费套餐(Intel Xeon(R) @2.00Ghz 单核,每个内核 2 个线程)进行训练,您可以将批量大小设置为 ,并将图像大小减小为 。4
640x640
让我们设置训练并监控 Ultralytics 训练日志。通过观察 Ultralytics 日志,可以深入了解默认增强、自动混合精度 (AMP) 和优化器配置是如何自动应用的。
对于实例分割任务,请务必观察边界框和分割的主要 mAP(即 mAP50-95)指标。
训练总结
总结
我们还可以使用 tensorboard 实时监控日志,并观察微调的持久性。
让我们看看保存在 “yolov9e_1024_dataset/results/70_epochs-/results.png” 中的results.png。Ultralytics 训练摘要和results.png提供了模型微调情况的总体概念。
对于具有 imgsz=1024
训练的 70 个时期的 YOLOv9e-seg 实例分割,我们实现了约 0.506
的验证框 mAP50-95 和约 0.457
的验证 seg mAP50-95。
YOLOv9 实例分割推理
加载了最佳模型权重,让我们对几个组织样本进行推理。
我们可以观察到,对于上述结果,我们微调的 YOLOv9e-seg 模型(置信度分数阈值为 0.7)几乎能够捕获所有实例,只有 3 到 4 个角落实例未被检测到。
所有推理都在 (512,512) 图像维度 和 上完成,其中 img 大小会自动调整为模型的训练配置。在 Ultralytics 中,默认 imgsz
为 640x640
。conf=0.7
因此,当我们使用使用 训练的 YOLOv9e-seg 模型执行推理时,我们的输入图像会自动调整为 。正向传递期间的输入维度将如下所示,其中批次大小 = 1 且通道维度 = 3。
这是一个包含键和值的字典,如下所示:imgsz=1024
1024
(1,3,1024,1024)
inference_result
boxes
:的对象 ,表示检测到的边界框实例。这些框具有以下关键属性:dtype=float32
cls
:一个张量,显示所有检测到的对象的类名。conf
:一个张量,显示模型检测到这些对象实例的置信度。边界框格式(xywh, xywhn, xyxy, xyxyn):
推理图像中实例标准化坐标位置的张量。keypoints
:无(对于 Instance Segmentation 任务)。masks
:表示检测到的 Mask 实例的对象。掩码具有以下关键属性:xy
:一个数组,具有每个蒙版的多边形点位置。dtype=float32
names
:训练模型的数据集的类映射。
YOLOv9 实例分割自定义绘图功能
为了便于使用,可以直接使用 Utralytics plot()
函数。但是,提取掩码、框和类名并执行自定义绘图在直觉上更有益。那么,让我们来看看使用字典的自定义绘图。
我们将以大于 的置信度过滤掉检测。从输出中,对于所有预测的实例,提取 mask 和 box 属性。inference_result
thresholded_indices
0.5
分段映射
draw_segmentation_map()
函数使用 cv2.fillPoly()
和 cv2.addWeighted()
将预测的掩码和边界框叠加、提取到输入图像上。
使用 将输出保存在指定目录中。cv2.imwrite()
YOLOv9 实例分段训练总结
从表 2 中,我们观察到 YOLOv9 seg 和 YOLO V8 seg 的验证框 mAP 和 seg mAP 几乎相同,小数精度略有不同。
比较 1 : YOLOv9e-seg 与 YOLOv8l-seg ,imgsz=1024
让我们绘制两个模型的验证框和 seg mAP (50-95)。
从上图中可以观察到,对于 imgsz=1024
的训练配置,
与 YOLOv9e-seg 模型相比,YOLOv8l-seg 模型从基线 mAP 开始,相对较高,并在更短的 epoch 内实现更高的 mAP。
mAP
此外,YOLOv8l-seg 模型的 box mAP 和 seg mAP 略高于 YOLOv9e-seg。
现在,让我们对置信度分数阈值 进行深入比较。0.7
关于基本实况,绿色框是 YOLOv9e-seg 模型无法检测到对象实例的实例。
同样,黄色框是 YOLOv8l-seg 模型未检测到的对象实例。
注意:在这里,在比较 below 中,绿色和黄色框不是预测区段的边界框;相反,它们只是装饰。 这些是手动绘制的,作为参考,以便我们了解模型未能捕获的与 Ground Truth 的差异。
在 和 的这个特定图像中,我们可以观察到 YOLOv9e-seg 错过了实例,而 YOLOv8l-seg 错过了实例。imgsz=1024
conf=0.7
24
18
即 YOLOv8l-seg 在这里表现更好。
关于 Ground Truth 的定量分析
现在,让我们用蓝色框分解特定区域中两个模型之间检测的定量差异。
注意:在下面的比较中,蓝色框不是预测实例的边界框;相反,它们只是手动绘制的装饰,以显示与 Ground Truth 的差异。
我们再次观察到,YOLOv8l-seg 检测到的实例比 YOLOv9e-seg 多得多。当图像大小增加到 1024 时,YOLOv9e-seg 的性能相对较差,但相反,增加图像大小使 YOLOv8l-seg 的性能更好。
比较 2 : YOLOv9e-seg v/s YOLOv8l-seg 与 imgsz=640
让我们绘制两个模型的验证框和 seg mAP(50-95)。
从上图中可以看出,对于 ,imgsz=640
与 YOLOv9e-seg 模型相比,YOLOv8l-seg 模型的基线 mAP 开始相对较高,并在更短的时期内实现更高的 mAP。
在这里,在训练结束时,两个模型具有几乎相同的验证框 mAP 和 seg mAP。
让我们专注于组织图像的特定区域。两者的性能几乎相同,但 YOLOv8l-seg 略好一些,真阳性更多。
比较 3:YOLOv9c-seg 与 yolov8m-seg 与 imgsz=640
让我们绘制两个模型的验证框和 seg mAP(50-95)。
从图表中可以看出,对于 imgsz=640
的训练配置,
与 YOLOv9c-seg 模型相比,YOLOv8m-seg 模型从相对较高的基线 mAP 开始,并在更短的时期内实现更高的 mAP。
在训练结束时,两个模型的验证 mAP 几乎相同。
对于此特定图像,我们可以观察到 YOLOv9c-seg(绿色)错过了 21 个实例,而 YOLOv8m-seg(黄色)错过了 21 个实例。conf=0.7
现在,让我们分解一下特定区域中两个模型之间现有检测的差异。
在这里,对于这个特定区域,观察到 YOLOv9c-seg 检测到的 True Positive 实例比 YOLOv8m-seg 多得多。
YOLOv9 多张图片实例分割预测
为了更好地了解所有模型分割掩码的精度,让我们从验证集中推断出一组广泛的人体组织图像预测。在推理期间查看没有边界框的预测,请传递 boxes=False
参数。我们将可视化我们并排实验的 YOLOv9 和 YOLOv8 模型的所有预测,这些模型具有不同的图像大小和置信度分数阈值,并比较预测的分割掩码。0.7
通过训练配置和推理,尽管 YOLOv8l-seg ( 46M ) 的参数比 YOLOv9e-seg ( 60.5 M )相对少,但在许多情况下 YOLOv8l-seg 的表现优于 YOLOv8l-seg。imgsz=1024
conf=0.7
另一方面,将 YOLOv9c-seg ( 27.9M ) 与 YOLOv8m-seg ( 27.3M ) 进行比较,两者的整体表现几乎相同。imgsz=1024
YOLOv9 实例分段关键要点
我们关于微调 YOLOv9 seg 的实验结果概述如下:
YOLOv9-seg 和 YOLOv8-seg 模型在实例分割任务上均具有良好的定量性能。
从本文的广泛实验中可以观察到,在某些情况下,即使模型参数相对较少,YOLOv8-seg 模型在这个细胞核单元实例数据集上也比 YOLOv9-seg 模型略有优势。
当图像大小增加到 时,YOLOv9e-seg 模型的性能比其参数相对较少的模型(如 YOLOv8l-seg、YOLOv8m-seg 和同一系列 YOLOv9c-seg)表现更差。
1024
结论
在本文中,我们介绍了一组关于微调 YOLOv9 模型的全面实验,例如分割任务,强调了它在医学成像中的强大效用。
我们的研究强调了实例分割提供精确的对象级见解的能力,这对于从癌症研究到神经生物学和发育生物学的应用至关重要。
源代码(数据集):
http://www.gitpp.com/pating/med-yolo