颅内出血(颅骨内出血)是医疗领域严重的健康问题,需要快速且经常进行密集的医学治疗。在美国,颅内出血约占中风的10%,其中中风是导致死亡的第五大原因。在医学界,识别任何出血的位置和类型是治疗患者的关键步骤。现在的情况下需要医生或者是训练有素的专家对于病人的颅骨的医学影像进行查看并找出出血的位置从而判断出具体的出血亚型。通常这个过程很复杂、很耗时间而且会浪费很多的人力物力。所以急需一种图像处理的方法来根据医学影像来检测是否有颅内出血的现象以及具体的颅内出血的类型(亚型)。2019年底,由北美放射学会(RSNA)与美国神经放射学会和MD.ai成员共同组织了基于AI的智能急性颅内出血类型检测的活动,旨在全球范围内寻找最优的自动识别颅内出血类型的算法。其中RSNA是放射医学领域的工人的领头羊,其中有来自全球146个国家的54,000多名成员,其中不乏医学物理学家和其他医学专业人士。这个项目所用的数据集以及标注的工作是由斯坦福大学、托马斯·杰斐逊大学、多伦多团结健康大学和圣保罗联邦大学(UNIFESP)以及美国神经放射学会(ASNR)的60多名志愿者组成的团队完成的。其中的ASNR是神经放射学未来的全球领先组织,代表5300多位放射科医生,研究人员,干预人员和影像学家。基于以上的技术支持以及技术指导,也使得这个项目的意义重大,如果可以准确的确定是否出血进而判断出血的类型,这对于治疗患者、争取宝贵的救援时间等等方面都非常有帮助。常见的颅内出血按照位置可以分为硬膜外出血(epidural)、硬膜下出血(subdural)、蛛网膜下腔出血(subarachnoid)、实质内出血(intraparenchymal)以及脑室内出血(intraventricular)。其中实质内出血是指完全位于大脑内部的血液。脑室内或蛛网膜下腔出血是指渗入通常含有脑脊液(脑室或蛛网膜下腔池)的大脑空间的血液。轴外出血是指血液聚集在大脑周围的组织覆盖物中(例如,硬膜下或硬膜外亚型)患者可能会出现多种类型的脑出血。下面是总结的5中颅内出血类型以及其基本特征。
1.硬膜外出血(epidural):硬膜外出血是在硬脑膜外发生的,硬膜外出血是指硬脑膜和颅骨之间发生的出血。该膜是最顶层的脑膜,是颅骨内稳态的重要组成部分。由于硬脑膜对维持大脑位置的重要结构作用,硬脑膜损伤可导致许多临床功能障碍。它强大的结构耐久性为其取了名字(拉丁语中的“ dura mater”意为“坚韧的母亲”!)。这种组织屏障对于血液向大脑的运输至关重要。具体的位置见下图:
2.硬膜下出血(subdural):硬膜下出血是在硬脑膜和蛛网膜脑膜之间发生的出血。由于硬脑膜的双重性质,其一侧负责将动脉血液(输送到大脑),而另一侧负责输送静脉血(输送到大脑之外)。与这两种不同类型的血液相互作用的出血可能对患者的健康和成像输出产生许多不同的影响。3. 实质内出血(intraparenchymal):实质内出血是发生在脑实质内的那些出血。实质包含大脑的功能单元,主要是神经胶质细胞和神经胶质细胞维持/辅助的神经元。因此,我们的大脑区域出现了出血,这意味着“遍及整个区域”。实际上,整个区域通常是指解剖结构内的任何块状物质。因此,我们将大脑描述的大部分是大脑的实质。这意味着实质内出血非常严重!4. 脑室内出血(intraventricular):脑室内出血是发生在脑室内的出血。我们大多将大脑想象为肉质的肉质球,但是大脑的一个重要的解剖特征是其负空间或心室的存在(拉丁文的venter表示腹部或子宫)。心室在尝试诊断大脑疾病时非常有用,并且在脑部生理中起着至关重要的作用。当查看图像时,知道人在大脑中的什么位置通常很有用,并且心室可用于将自己定向到大脑中的某个区域。5. 蛛网膜下腔出血(subarachnoid):蛛网膜下腔出血是血液进入蛛网膜下层的蛛网膜下腔时发生的出血。蛛网膜下腔出血与我们已经讨论过的其他类型的出血具有许多相同的危险。
目前已经有了该领域的数据集,该数据集提供了包含这五种出血类型的CT图像,所有图像采用Dicom格式,这在CT图中是一个非常常见的图片格式,其除了我们认为的“图片”像素信息(其本质是X射线在人体组织中的吸收率,再经过CT图像重建得到的像素)之外,还有其他的特征,例如病人的ID,具体窗的位置等等,下图是数据集中某Dicom图的内部信息:另外,考虑CT的工作原理,我们可以得到更加原始颅内出血的特征。所以我们也考虑到了CT的原理和其图像的特征。其中,CT的工作程序是这样的:它根据人体不同组织对X线的吸收与透过率的不同,应用灵敏度极高的仪器对人体进行测量,然后将测量所获取的数据输入电子计算机,电子计算机对数据进行处理后,就可摄下人体被检查部位的断面或立体的图像,发现体内任何部位的细小病变。其中CT的“窗宽与窗位”这个两个特征,对于我们提取不同的颅内不同部分的特征非常重要。这是由于正常或异常的组织具有不同的CT值,范围波动在-1000~+1000 Hu范围内,而人类眼睛的分辨能力相对有限,因此欲显示某一组织结构的细节时,应选择适合观察该组织或病变的窗宽以及窗位,以获得最佳的显示。在该领域中,使用窗函数对于CT不同位置的切片进行分析是极为重要的一点,其中HU(Hounsfield单位)用于测量X射线在人体组织中的吸收率,还可以反映人体组织的密度。人体CT图像的一般取值范围是-1000HU〜1000HU。如果将整个范围映射到灰度(8bit,0〜255),则会丢失大量信息,并且不同HU组织之间的灰度值差异会很小,并且对比度会降低。因此,只有在一定范围内的HU值需要映射范围以保留不同组织之间的差异信息。由于各种组织具有不同的CT值,因此当您要显示特定组织的详细信息时,应选择适合查看组织或病变的“窗口”以获得最佳显示 。在颅内出血的数据集中,我们主要可以考虑三种“窗”,脑窗( W:80 L:40)、硬膜下(血)窗(W:130-300 L:50-100)以及骨窗(W:2800 L:600),当然也有专家说可以进一步考虑软组织窗(W:350–400 L:20–60)等等信息。下面我们对于同一幅图进行了不同的窗函数的操作,其结果依次为不加窗的结果、加脑窗的结果、加硬膜下窗的结果以及加骨窗的结果。于该数据集的颅内CT,选择脑窗进行举例,脑窗的窗宽为80。 此时“窗口”映射的CT值范围为0〜80HU。当CT值大于该范围时,显示为白色阴影; 当CT值低于此范围时,将显示为黑色阴影。当然所有的窗的信息都可以从对应的Dicom文件中读出。再使用下图的公式,就可以得到经过窗运算后的“图像”。下面对于整个的数据集进行分析:
具体来说,仅仅有6.1%的图片有至少一种类型的颅内出血症状。在具体的颅内出血症状中,样本的分布也不是十分均衡,尤其是硬膜外出血类型(epidural)仅仅是第二少的颅内出血类型的10%。所以必须要对于不均衡样本(imbalanced data)进行针对性的操作。进行高亮后的结果图如下。数据集样本的具体统计结果如图所示:
为了说明窗函数的作用,下面我也测试了如果不使用“窗函数”的话,不同的子类下的区别效果其中“+”为label是这个亚型,“-”为不是这个亚型:从结果可以看出,如果不使用窗函数的话,不同的亚型间的区别肉眼还是很难分清楚的。接下来是对于具体识别网络的尝试:在这里,我们将这个颅内出血亚型识别问题视为图像的分类问题,而图像的分类问题中的基本思路就是,使用深度学习网络作为特征工程进行特征提取,并在使用分类器对于这些特征分类,从而分类出不同的图像。基本流程如下:从2010年开始,基于ImageNet项目提出的图像分类的特征工程的深度学习网络已经非常多了,所有的这些网络都可以进行初步的特征提取工作。这里我们也使用了在ImageNet中大放异彩的网络作为我们自己的特征工程。其中我们收集到的基于ImageNet的深度学习网络预训练模型的性能天梯图如下表:根据上面天梯图给出的性能指标以及模型的复杂程度,我们分别使用了4个模型(InceptionV3、Keras EfficientNet B3、ResNeXt-101 32x8d、se_resnext50_32x4d)进行特征提取,并使用一层全连接网络进行最后的模型分类工作,得到了以下的4个baseline。ResNext101来自Facebook何恺明团队,其有8亿个参数,用Instagram上面的9.4亿张图做了弱监督预训练,用ImageNet做了微调。我们可以直接从网上下载其.h5的权重以及.pth的model。ResNext101的基本结构为叠构建块,其构建块内部采用分支结构。并将分支的数目称为 “基数”,而且增加分支的数量比增加深度、宽度更高效。ResNext采用 VGG / ResNet 类似的堆叠方式,同时以一种简单,可扩展的方式实现了 Inception(Inception 就是精心设计的多分支结构)中的 split-transform-merge 策略。在ImageNet数据集中也表现了较好的性能。其模型的示意图如下:在模型中,我们设置学习率为,优化器为Adam,loss函数使用BCEWithLogitsLoss,在epoch=6的参属下,得到了score=0.084的结果。跑模型的截图如下图:Inception模型是一个有很多版本的模型,现在已经有V1-V4等模型。Inception的主要创新点在于同时扩展网络的宽度和深度,网络的结构中采用了辅助分类器。我们这里使用的Inception V3网络是与Inception V2网络同时提出的,其中Inception-v3比Inception-v2增加了几种处理:(1)RMSProp优化器;(2)使用了LabelSmoothing;(3)7*7卷积变成了1*7和7*1的卷积核叠加;(4)辅助分类器使用了 BatchNorm。同时输入图像大小变成299*299。下面为Inception模型的具体结构:我们可以直接从网上下载其.h5的权重以及.pth的model。在模型中,学习率为,优化器为Adam,loss函数也是使用了binary crossentropy,在epoch为5的时候得到了0.078的分数。具体的loss下降曲线和代码训练过程如下图:Efficient Net是谷歌的研究人员在ICML2019中提出的模型,在这个文章中提出了一种新型模型缩放方法,该方法使用一种简单但高效的复合系数(compound coefficient)以更加结构化的方式扩展 CNN。与任意扩展网络维度(如宽度、深度、分辨率)的传统方法不同,该新方法使用固定的一组缩放系数扩展每个维度。该模型的准确率超越了当时的最优模型,且效率是后者的 10 倍(模型更小,速度更快)。例如,EfficientNet-B1的参数量远远小于ResNet-152,但是其速度为后者的5.7倍。其baseline模型的结构图如下:使用EfficientNet-B3在学习率为,优化器为Adam,loss函数为binary crossentropy,我们的评判矩阵为AUC,在6次迭代的情况下最终的score为0.076。具体的模型训练过程如下图:Se_ResNext就是把SeNet中bottleneck换成ResNext的bottleneck。具体代码就是在ResNeXt代码的residual layer中transition后加入squeeze_excitation_layer。下图是ResNext的group=32的bottleneck结构,第二幅图是SE block的示意图以及其bottleneck结构。SE block 由两个非常关键的操作,Squeeze 和 Excitation 构成, 其核心思想是:显式地建模特征通道之间的相互依赖关系,通过自适应学习的方式来获取每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征(有用 feature map 权重增大 )并抑制对当前任务用处不大的特征(无效或效果小的 feature map 权重减小),达到更好的模型效果。在这里我们的模型中,设置初始学习率为并进行指数衰减,选择优化器为Adam,loss函数为BCEWithLogitsLoss,在三个epoch下,最终得分为0.071。实验过程如下图:通过以上四种网络结构,我们分别得到了四个不同的baseline。其中ResNeXt-101 32x8d模型最终得分0.084、InceptionV3模型的最终得分为0.078、Efficient Net B3模型的最终得分为0.076、Se_resnext50_32x4d的最终得分为0.071。所以接下来考虑进行模型融合。我们的模型融合方法就是直接将四个baseline的结果进行加权平均。计算公式如下:数据集中,硬膜下出血的数量比其他颅内出血的症状要少很多,甚至只有数量为倒数第二的出血类型的10%,所以需要采取必要的对于不平衡问题的处理方法。在这里我们主要使用了两种方法,首先是数据增广方法。由于数据总量很庞大,所以我们无需再对于整个大数据集进行数据的增广操作。而且我们最好也不应采取数据删减的方法,因为这样极有可能会造成特征的缺失。所以最终我们选择仅仅将硬膜下出血进行数据增广,具体的话采用旋转、翻转、平移等操作进行扩容。另一方面,我们在loss函数计算时,考虑到即使数量较小的硬膜下出血大部分分错,也不会对于最终得模型识别准确率有极高的影响。所以这里我们采用将硬膜下出血的loss权重增大的操作,即增加硬膜下出血这一类别分错的惩罚程度。在最终的模型中为了测试对于不平衡数据的处理效果,我们使用了AUC(Area under Curve)作为评判标准。AUC的值代表Roc曲线下的面积,其可以作为分类器好坏的评价指标。AUC值是一个概率值,当随机挑选一个正样本以及负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值,AUC值越大,当前分类算法越有可能将正样本排在负样本前面,从而能够更好地分类。下面是最终每一个类别的分类AUC的数值,可以看到我们比较好的将数据量较少的硬膜下出血类型识别了出来。上图中对于验证集的loss值分别为[0.115454 0.019861 0.0951 0.07395 0.03101 0.052185],可以看出loss值没有特别大的区别。在以上的所有模型中,都使用了交叉验证的方法,都是设置fold=5,最后再将交叉验证的结果进行融合;在Se_resnext50 32×4d模型中,我们也设置了梯度截断,来进一步保证不出现“梯度爆炸”;在模型训练过程中也使用了TTA的方法(即test time augmentation测试时增强),其可将准确率提高若干个百分点,它的原理是为原始图像造出多个不同版本,包括不同区域裁剪和更改缩放程度等,并将它们输入到模型中,然后对多个版本进行计算得到平均输出,作为图像的最终输出分数。这种技术很有效,因为原始图像显示的区域可能会缺少一些重要特征,在模型中输入图像的多个版本并取平均值,就或许能解决上述的问题,选择三种不同类型的“窗”的识别效果是最好的,但是如果选择一个窗函数的话,“脑窗”是最好的选择。以上是一个比较简单的解决方案,不过其实我们最终得到的训练集中每一名病人都会有很多张CT图片,其对应不同切片位置的CT图,它们都代表着同一种病况,所以将其在特征提取完后使用类似于时间序列的方法继续进行,同一病人不同位置的图片的特增提取,这样可以更加准确的预测类别。业界人士称其为2.5D的方法,最终的算法流程图如下图所示:读入原始的Dicom文件后使用三个“窗函数”进行处理(Brain windows、Bone windows、Subdural windows);接着使用图像处理的方法对于CT图像的机器伪影进行消除(CT图像的机器伪影是机器本身的问题造成的,伪影一般会对于图像的分辨有比较大的影响);接着使用水平翻转、垂直翻转、提升亮度、resize等等操作进行数据的扩充,并将数据分为5折,但仅对其中3进行训练;进行完以上的操作后,使用resnext101_32×8d的深度神经网络进行特征的提取(一个图像提取出2048维特征,仅仅输出GAP层),不过没有在最后使用全连接层进行分类,而是将所有的特征矩阵进行了序列的处理,通过读取Dicom文件中病人ID信息,可以将同一个病人的CT切片视为一个序列,并放入Bi-BLSTM结构中进行双向的训练,将最后提取得到的特征再使用全连接层进行分类,最终得到的是整个10个切片的所有预测信息。由于同一序列中的颅内出血类型必定相同,所以我们可以从这输出的10组预测值中,选择出现概率最大的作为我们的预测结果。从上图的结果可以看出,这样做的话,最终的10个预测结果中,有5组的预测值为[0,0,0,0,0,0],有三组的预测值为[0,0,0,0,1,1],有两组的预测值为[0,0,1,0,1,1]。所以先考虑any的情况下,有5组是认为有出血情况的,有5组是认为没有出血情况的。所以认为是有颅内出血的情况。在有颅内出血的5类中,其中判断为[0,0,0,0,1,1]结果的概率最大,所以这里最终这一个序列的10组预测值均为[0,0,0,0,1,1]。这就是这个整个算法的流程。不过这个整个流程如果完整训练的话需要在4个NVIDIA Tesla V100下连续训练10天。算力以及时间的花销还是比较大的。[1] Chang P D, Kuoy E, Grinband J, et al. Hybrid 3D/2D convolutional neural network for hemorrhage evaluation on head CT[J]. American Journal of Neuroradiology, 2018, 39(9): 1609-1616.
[2] Arbabshirani M R, Fornwalt B K, Mongelluzzo G J, et al. Advanced machine learning in action: identification of intracranial hemorrhage on computed tomography scans of the head with clinical workflow integration[J]. NPJ digital medicine, 2018, 1(1): 1-7.
[3] Lee H, Kim M, Do S. Practical window setting optimization for medical image deep learning[J]. arXiv preprint arXiv:1812.00572, 2018.
[4] Ren S, He K, Girshick R, et al. Faster r-cnn: Towards real-time object detection with region proposal networks[C]//Advances in neural information processing systems. 2015: 91-99.
[5] He K, Zhang X, Ren S, et al. Deep residual learning for image recognition[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 770-778.