使用深度学习进行颅内出血检测Intracranial Haemorrhage Detection using Deep Learning | by Gopal B | Medium

环球医讯 / AI与医疗健康来源:medium.com美国 - 英文2026-09-13 10:22:30 - 阅读时长14分钟 - 6567字
本文详细介绍了作者在Kaggle竞赛中利用深度学习检测头部CT扫描中急性颅内出血亚型的工作。作者基于北美放射学会提供的数据集,构建了端到端的深度学习流水线,包括数据处理、窗口化操作、多种卷积神经网络(VGG‑16、ResNet50、Inception V3、MobileNetV2、Xception和EfficientNet系列)的迁移学习与比较分析。通过多标签分类方法,作者评估了各模型的准确率和AUC得分,最终发现EfficientNet‑B3表现最佳,并讨论了数据不平衡、训练时长等挑战。文章强调了将放射科医生的窗口化领域知识融入深度学习方法的重要性。
颅内出血健康医疗头部CT急性中风出血亚型脑实质内脑室内蛛网膜下腔硬膜下硬膜外放射科诊断医学图像CT扫描疾病检测
使用深度学习进行颅内出血检测

在本文中,我介绍了自己在Kaggle竞赛中的工作,该竞赛旨在利用深度学习检测头部CT扫描中急性颅内出血的亚型。数据集由北美放射学会(RSNA)提供。竞赛链接可在此处找到。

引言

颅内出血是指发生在颅骨内的出血,是一种严重的健康问题,需要快速且通常是密集的医疗处理。例如,颅内出血约占美国中风的10%,而中风是第五大死因¹。

出血有五种亚型:脑实质内、脑室内、蛛网膜下腔、硬膜下和硬膜外(见图1)。患者可能表现出不止一种脑出血类型,这些出血可能出现在同一图像中。

图1:颅内出血亚型。[2]

虽然所有急性(或新发)出血在CT上表现为高密度(白色),但帮助放射科医生确定出血亚型的主要影像学特征是位置、形状以及与周围结构的邻近性²。

RSNA颅内出血检测挑战赛于2019年9月在Kaggle上启动。竞赛的目标是构建一个算法来检测急性颅内出血及其亚型。

由于患者可能同时患有多种出血,该挑战归结为一个多标签分类问题。在下一节中,我们将概述我们的方法。

方法概述

主要目标是对流行的深度学习架构进行比较研究。具体来说,是那些在最近几年年度**ImageNet大规模视觉识别挑战赛(ILSVRC)**中表现优异的卷积神经网络。

我们比较了以下模型:VGG‑16、ResNet50、Inception_v3、MobileNetV2、Xception、EfficientNet‑B0、B2和B3。

我们构建了一个端到端的深度学习流水线,包括:

• 数据处理、清洗和预处理。

• 使用迁移学习的模型实现。

• 模型评估(使用准确率和AUC得分)。

• 八个深度学习模型的比较分析。

以下部分详细介绍了解决该问题和构建模型流水线的方法。

方法论

数据描述

头部CT扫描以DICOM格式提供。DICOM(医学数字成像和通信)是用于处理、存储、打印和传输医学信息的标准³。

训练数据提供为一组图像ID和多个标签,每种出血亚型一个标签,外加一个用于任何(any)的额外标签,如果任何亚型标签为真,则该标签应为真。还有一个目标列Label,表示该类型出血在指定图像中存在的概率。数据集大小约为180GB

训练数据集的一个样本。[2]

数据清洗与预处理

以下步骤按时间顺序执行:

  1. 去除重复项(针对图像ID)在训练集中。
  2. 对硬膜外亚型进行8倍上采样(通过将硬膜外阳性样本重复连接到数据集)。观察到训练数据存在严重的类别不平衡。数据集中阳性样本的百分比:

上采样硬膜外类别(8倍)后,

注意:

(A)其他亚型的阳性样本百分比也有所上升,因为图像可能包含不止一种脑出血。因此,在其他亚型中也观察到了一些上采样。

(B)阴性样本(即不包含任何出血亚型的样本)的百分比为82.74%。事后看来,本可以对阴性DICOM图像进行下采样,以促进模型学习。在下面的实验中,阳性样本与阴性样本的比例为1:4.8。本应降低到1:2。

  1. 数据集大小: DICOM图像数据集的总大小约为180 GB。由于所使用的机器的内存容量和RAM限制,处理如此大量的数据不可行。

因此,使用iterative_stratification包提供的MultilabelStratifiedShuffleSplit函数,我们获得了原始数据的10%,并按多标签进行分层。这确保了新数据集中标签的分布与原始数据相同。

  1. 训练‑验证划分: 这个新数据集使用MultilabelStratifiedShuffleSplit函数进一步划分为训练集和验证集。执行了90‑10划分,得到训练集65,859张图像,验证集11,623张图像。

窗口化操作

窗口化,也称为灰度映射、对比度拉伸、直方图修改或对比度增强,是通过CT数值操纵图像灰度分量的过程;这样做会改变图像的显示效果,以突出特定结构(如脑或软组织)。

图像的亮度通过窗位(WL)调整。对比度通过窗宽(WW)调整。WL是显示的CT数值范围的中间点。WW是图像中包含的CT数值范围的度量。当给出WW和WL时,可以计算出上下灰度级,即高于x的值显示为白色,低于y的值显示为黑色⁴。

通过使用窗口,我们可以突出和强调特定的体素(3D像素)。放射科医生对每次扫描至少查看5个窗口!它们分别是:

  1. 脑实质:WW:80;WL:40
  2. 血液/硬膜下:WW:130‑300;WL:50‑100
  3. 软组织:WW:350‑400;WL:20‑60
  4. :WW:2800;WL:600
  5. 灰白质分化:WW:8;WL:3 2

使用了三种窗口(已加粗),每个窗口被分配到一个通道。因此,在训练时,我们使用数据生成器动态构建图像(以窗口作为通道)。

图2:不同的窗口突出并捕获不同的信息。这些窗口中的每一个都作为通道输入到CNN中(与自然图像中的RGB通道形成对比)。

生成上述DICOM图像窗口的代码如下所示。[10]

python

def window_image(dcm, window_center, window_width):

if (dcm.BitsStored == 12) and (dcm.PixelRepresentation == 0) and (int(dcm.RescaleIntercept) > -100):

correct_dcm(dcm)

img = dcm.pixel_array * dcm.RescaleSlope + dcm.RescaleIntercept

img_min = window_center - window_width // 2

img_max = window_center + window_width // 2

img = np.clip(img, img_min, img_max)

return img

def bsb_window(dcm):

brain_img = window_image(dcm, 40, 80)

subdural_img = window_image(dcm, 80, 200)

soft_img = window_image(dcm, 40, 380)

brain_img = (brain_img - 0) / 80

subdural_img = (subdural_img - (-20)) / 200

soft_img = (soft_img - (-150)) / 380

bsb_img = np.array([brain_img, subdural_img, soft_img]).transpose(1,2,0)

return bsb_img

因此,我们成功地将医学图像分析中的领域知识扩展到深度学习解决方案中,通过结合放射科医生在分析CT扫描时使用的窗口化技术。

网络架构

我们现在介绍我们方法中使用的网络,并强调其关键特征。表1列出了项目中使用的所有深度学习架构。它显示了参数数量以及在流行的ImageNet‑1K数据集上的性能结果(Top‑1和Top‑5验证准确率)。我们选择这些网络是为了按时间顺序展示架构的演变。这些模型的一些关键特性是:

表1:模型在ImageNet挑战中的性能。[6]

VGG16

VGG‑16网络由视觉几何组(VGG)的研究人员发明。它包含13个卷积层和3个全连接层。它是ILSVRC 2014竞赛的亚军。VGGNet因其统一的架构而变得流行。VGG‑16中的卷积层都是3×3卷积层,步长为1,采用相同填充,池化层都是2×2池化层,步长为2。然而,VGGNet由1.38亿个参数组成,处理起来可能具有挑战性。

VGG‑16网络架构

ResNet50

由何恺明等人提出的ResNet或残差网络引入了“恒等快捷连接”的概念,这是一种跳跃连接。他们提出了一种残差学习框架,允许训练比以前使用的网络深得多的网络。他们在ILSVRC 2015分类任务中获得了第一名。其top‑5错误率为3.57%(集成残差网络后),超过了该数据集上的人类水平表现。

ResNet‑50网络架构。[8]

Inception V3

ILSVRC 2014竞赛的获胜者是来自谷歌的GoogLeNet(也称为Inception V1)。它实现了6.67%的top‑5错误率。这里大量使用了网络中的网络方法。谷歌引入的Inception模块专注于构建更宽更深的网络,同时通过使用1×1卷积进行降维来保持计算预算不变。他们的架构(Inception V1)由22层深度CNN组成,但参数数量从6000万(AlexNet)减少到400万。

Inception V3是Inception‑v1的后续版本,拥有2400万个参数。Inception‑v2和Inception‑v3的动机是避免表征瓶颈(即大幅减少下一层的输入维度),并通过使用分解方法实现更高效的计算。[7]

Inception V3架构。[9]

MobileNetV2

MobileNet是一种在移动设备上运行非常高效的神经网络架构。它由谷歌的研究人员创建。MobileNetV1的主要思想是使用深度可分离卷积,它执行与传统卷积大致相同的功能,但速度更快。

MobileNetV2建立在MobileNetV1的思想之上,使用深度可分离卷积作为高效的构建块。然而,V2为架构引入了两个新特征:1)层之间的线性瓶颈,以及2)瓶颈之间的快捷连接。[13]

它只有350万个参数。然而,它在ImageNet上的性能与VGG16(拥有1.38亿个参数,几乎是MobileNetV2的40倍)相当。这显示了多年来算法改进和网络设计方面取得的巨大进步。

MobileNetV2网络架构。[14]

Xception

Xception,即Inception的极端形式,是Inception架构的扩展,用深度可分离卷积(即深度卷积后接逐点卷积)替换了标准的Inception模块。由于参数和乘法加法运算的减少,它提供了显著的性能优势。其参数数量与Inception‑v1相似(2300万)。

Xception网络架构。[11]

EfficientNet

谷歌的EfficientNet引入了复合模型缩放的概念。他们提出了一种新颖的模型缩放方法,使用简单但高效的复合系数以更结构化的方式扩展CNN。与任意缩放网络维度(如宽度、深度和分辨率)的传统方法不同,他们的方法使用一组固定的缩放系数均匀缩放每个维度。EfficientNet模型在现有CNN上实现了更高的准确率和更好的效率,将参数大小和FLOPS减少了一个数量级。[15]

模型大小 vs. 准确率比较。EfficientNet‑B0是由AutoML MNAS开发的基线网络,而Efficient‑B1到B7是通过扩展基线网络获得的。[16]

结果与讨论

表2:模型在RSNA颅内出血检测中的性能。[6]

表2列出了项目中使用的所有深度学习架构,包括它们的Top‑1准确率、AUC分数和参数数量。不幸的是,结果之间的差异不如预期显著。然而,仍然可以观察到一些趋势:

  1. EfficientNet‑B3在准确率和AUC分数方面是表现最好的模型。
  2. 在EfficientNet系列中,我们观察到随着模型容量(参数数量)和规模(深度、宽度和分辨率)的增加,准确率和AUC分数都有提高。简单来说,指标从B0到B2到B3逐渐改善。
  3. VGG16(最老的网络)表现最差,尽管它拥有最高的模型容量(1.38亿参数)。
  4. MobileNet的AUC分数比VGG16高出近1%,而参数数量少了40倍。
  5. ResNet50和EfficientNet‑B0表现相似。EfficientNet‑B0的参数数量是ResNet50的五分之一。这两个网络在EfficientNet论文和表1中进行了比较。
  6. Xception模型的表现与EfficientNet‑B2和B3相当。然而,它的参数数量比这两个模型的总和还要多。
  7. Xception作为Inception V3的扩展,显示出比后者更好的实证性能。

实现细节

整个项目的代码可以在此处找到。在本节中,我们将深入探讨代码实现的具体细节以及某些决策背后的理由。

  1. 数据生成器: 用于规避由于内存空间限制而无法加载和处理大型数据集的问题。数据生成器用于实时生成数据批次,并直接馈送到网络中。在数据生成器类的实现中,我们执行实时图像增强和窗口化操作,如前所述(即从DICOM中获取脑、硬膜下和软组织窗口,并将其用作CT图像的通道)。
  2. 图像增强: 我们执行水平翻转(概率0.25)、垂直翻转(概率较低,0.10)和裁剪(概率0.25)。由于训练数据集规模庞大,决定不使用其他增强方法,如颜色抖动、仿射变换、旋转等。
  3. 网络修改: 深度学习模型的卷积基被用作特征提取器。在卷积基输出之后(经过全局平均池化),添加了一个包含6个单元(每个类别一个单元)的密集层。所有模型都使用了ImageNet预训练权重。因此,使用Imagenet权重对医学图像数据集进行了迁移学习。由于Imagenet类别与头部CT图像之间存在显著的图像域差异,决定微调所有层(即所有层参数都是可训练的,并且可以接受梯度更新)。
  4. 损失函数: 使用了二元交叉熵损失。由于这是一个多标签分类问题,输出层使用了sigmoid激活函数。如果是多类分类而不是多标签分类,则会使用softmax激活和分类交叉熵损失。但在我们的情况下,单张图像可能具有不止一种脑出血。因此,使用了sigmoid激活和BCE损失。
  5. 评估指标: 我们跟踪两个指标——准确率和AUC分数。由于严重的类别不平衡,准确率可能会产生误导。即使对于虚拟分类器(即始终预测多数类别的分类器,在我们的例子中为0),准确率也很高。因此,我们还跟踪ROC曲线下的面积,它考虑了精确率‑召回率的权衡。它本质上指示了正类概率与负类概率的分离程度。
  6. 优化器: 使用了Adam。Adam优化器与普通随机梯度下降(SGD)的主要区别在于,Adam试图确定自适应学习率。而SGD假设固定学习率。像Adam这样的自适应方法通过跟踪过去的梯度(一阶矩)和过去的平方梯度(二阶矩)来估计梯度的变化(即Hessian)。这使得更新更好,收敛更快,同时计算时间与一阶方法(如SGD)相似。
  7. 训练轮数: 每个模型仅训练了10个epoch。我们的目标是比较不同模型的性能,而不是最大化每个模型的验证准确率。
  8. 学习率: 我们保持学习率为0.0001。选择较低的学习率是因为高学习率会增加丢失预训练参数先前知识的风险。高学习率会导致更大幅度的梯度更新。因此,为了微调网络,我们使用了较低的学习率。
  9. 批次大小: 我们保持固定的批次大小为32。大量研究表明,在多个基准上,小批次大小(2‑32)比大批次大小能产生更稳定和可泛化的结果。[12]
  10. 回调函数: 我们只使用了ModelCheckpoint来保存具有最佳验证准确率的模型参数。没有使用学习率调度器或早停。

面临的挑战(可选)

    1. 事后看来,我们选择的数据集是我们所有挑战的根源。

整个项目的代码可以在此处找到。

参考文献

[1] 竞赛链接说明

[2] 竞赛出血类型说明

[3] DICOM库说明

[4] 放射学助手:CT窗口化

[5] 放射学助手:CT头部方法

[6] Keras应用

[7] 图解10种CNN架构

[8] CodeProject:使用Python和Keras进行深度学习

[9] Medium:回顾Inception V3

[10] Kaggle笔记本:窗口化

[11] Xception:深度可分离卷积的深度学习

[12] Dominic Masters,重新审视深度神经网络的小批量训练,2018

[13] Google AI博客:MobileNetV2

[14] arXiv:MobileNetV2

[15] Mingxing Tan、Quoc V. Le,EfficientNet:重新思考卷积神经网络的模型缩放,2019

[16] Google AI博客:EfficientNet

【全文结束】

猜你喜欢
  • AI通过读取微小脑变化可提前数年检测阿尔茨海默病AI通过读取微小脑变化可提前数年检测阿尔茨海默病
  • 健康父亲在工作视频会议中发现自己中风健康父亲在工作视频会议中发现自己中风
  • 23岁医学生症状被医生忽视50次,如今患上不治之症脑癌23岁医学生症状被医生忽视50次,如今患上不治之症脑癌
  • 光声显微镜实现超分辨率里程碑光声显微镜实现超分辨率里程碑
  • 动脉瘤性蛛网膜下腔出血后早期脑损伤:发病率与机制动脉瘤性蛛网膜下腔出血后早期脑损伤:发病率与机制
  • 创伤性脑出血创伤性脑出血
  • 创伤后脑梗死创伤后脑梗死
  • 变革性技术:人工智能如何进入医生办公室和急诊室变革性技术:人工智能如何进入医生办公室和急诊室
  • 一张简单的手部照片可能是检测严重疾病的关键一张简单的手部照片可能是检测严重疾病的关键
  • 24岁同卵双胞胎确诊绝症被告知“只剩6个月”,仅1个月后离世24岁同卵双胞胎确诊绝症被告知“只剩6个月”,仅1个月后离世
热点资讯
全站热点
全站热文