利用机器学习诊断糖尿病


这两幅图像有什么不同?

左边的一个没有糖尿病视网膜病变的征兆,而另一个有严重的糖尿病视网膜病变征兆。

如果你不是一个训练有素的临床医生,很有可能,你会发现很难正确地识别这种疾病的迹象。那么,一个计算机程序能做得多好呢?

7月,我们参加了一个Kaggle竞赛,目标是在提供的视网膜图像中对糖尿病视网膜病变的严重程度进行分类。

正如我们从组织者那里了解到的,这是一项非常重要的任务。糖尿病性视网膜病变是发达国家劳动年龄人口致盲的主要原因。估计有9300万人受到影响。

比赛于今年2月开始,共有超过650支队伍参加,争夺10万美元的奖金。

参赛者获得了超过35,000张视网膜图像,每一张都有严重程度等级。严重程度有5个级别,级别分布很不平衡。大部分的图像都没有显示出这种疾病的迹象。只有百分之几的人有两个最严重的评级。

对预测进行评级的度量是二次加权kappa,我们将在后面描述。

比赛一直持续到七月底。我们队在个人排名中得了0.82854分,这使我们获得了第6名。不算太坏,考虑到我们进入得相当晚。
你可以看到我们在这个情节上的进展:

xxx

此外,你可以阅读更多关于比赛的信息here

解决方案概述

在一个图像识别任务中不应该感到惊讶的是,大多数顶尖的参赛者都使用了深度卷积神经网络(CNNs),我们也是。

我们的解决方案包括多个步骤:

  • 图像预处理
  • 训练多个深层CNN
  • 眼睛混合
  • kappa评分优化

我们在下面简要描述这些步骤中的每一个。在整个比赛过程中,我们使用了多种方法进行图像预处理,并训练了许多具有不同架构的网络。当集成在一起时,相对于最佳预处理方法和最佳网络结构的增益很小。因此,我们仅限于描述单一的最佳模式。如果您不熟悉卷积网络,请查看Andrej Karpathy的这篇精彩介绍:http://cs231n.github.io/convolutional-networks/

预处理

由组织者提供的输入图像是由非常不同的设备制作的,具有不同的大小和非常不同的色谱。它们中的大多数也太大了,以至于无法对它们进行任何非微不足道的模型拟合。使网络训练成为可能的最小预处理是标准化维度,但理想情况下,还需要标准化所有其他特征。最初,我们使用了以下简单的预处理步骤:

  • 将图像裁剪到包含高于某个阈值的所有像素的矩形边界框
  • 将其缩放到256×256,同时保持宽高比和黑色背景填充(原始图像也有黑色背景,或多或少)
  • 对于每个RGB分量,分别重新映射颜色强度,使CDF(累积分布函数)看起来尽可能接近线性(这称为“直方图归一化”)

所有这些步骤都可以在一次调用ImageMagick的命令行工具中实现。随着时间的推移,我们意识到一些输入图像包含了相当密集的噪声区域。当使用上面描述的简单包围盒裁剪时,这会导致非常糟糕的质量作物,即实际眼睛占据图像的任意且相当小的部分。

noise

你可以在图像的顶部看到灰色噪声。使用最先进的边缘检测器(如Canny)并没有多大帮助。最终,我们开发了一套专用的种植程序。该过程根据对所提供图像的分析,利用两个假设,自适应地选择阈值:

  • 总是存在一个阈值电平,将噪声与眼睛的轮廓分开
  • 眼睛的轮廓呈椭球形,接近圆形,可能在顶部和底部被截断。特别地,它是相当平滑的曲线,并且可以使用这种平滑性来识别阈值的最佳值

由此产生的收割器几乎为所有图像产生了理想的作物,并且是我们用于我们的最终解决方案。我们还将目标分辨率更改为512×512,因为与较小的256×256分辨率相比,这似乎显著提高了神经网络的性能。
下面是预处理后的图像的样子。

eye_prepro
就在将图像传递到下一阶段之前,我们对图像进行了变换,因此所有图像上的每个通道(R,G,B)的平均值约为0,标准偏差约为1。

Convnet体系结构

我们解决方案的核心是一个深度卷积神经网络。虽然我们开始使用相当浅的模型--4个卷积图层,但我们很快发现添加更多的图层,以及图层内部的过滤器会有很大帮助。我们最好的单一模型由9个卷积层组成。

详细的体系结构是:

| Type    | nof filters | nof units |
|---------|-------------|-----------|
| Conv    | 16          |           |
| Conv    | 16          |           |
| Pool    |             |           |
| Conv    | 32          |           |
| Conv    | 32          |           |
| Pool    |             |           |
| Conv    | 64          |           |
| Conv    | 64          |           |
| Pool    |             |           |
| Conv    | 96          |           |
| Pool    |             |           |
| Conv    | 96          |           |
| Pool    |             |           |
| Conv    | 128         |           |
| Pool    |             |           |
| Dropout |             |           |
| FC1     |             | 96        |
| FC2     |             | 5         |
| Sofmax  |             |           |

所有Conv层都有3×3内核,跨步1和填充1。这样,卷积输出的大小(高度,宽度)与输入的大小相同。在我们所有的卷积层中,我们按照卷积层逐批归一化层进行处理ReLu激活。分批归一化是一种简单但功能强大的方法,可以对神经网络中的预激活值进行归一化,使得它们的分布在训练过程中不会发生太大的变化。人们经常对数据进行标准化,使均值和单位方差为零。批处理规范化则更进一步。检查this论文由谷歌了解更多。我们的池层总是使用最大池。池窗口的大小为3×3,步幅为2。这样,图像的高度和宽度被每个池层减半。在FC(全连接)层中,我们再次使用ReLu作为激活函数。第一个完全连接的层FC1也采用批处理规范化。对于正则化,我们在第一个全连通层之前使用了Dropout层,并且对一些参数应用了L2正则化。

总体而言,该网络有925,013个参数。

我们使用带有动量的随机梯度下降和多类logloss作为损失函数来训练网络。而且,在训练过程中,已经手动调整了几次学习率。我们使用了自己的基于Theano和Nvidia CUDNN的实现。

为了进一步使网络规则化,我们在训练过程中通过随机选取448×448幅图像,并以0.5的概率独立地水平和垂直翻转它们来增加数据。在测试期间,我们随机选取了几个这样的作物,每只眼睛都要翻转一下,然后平均我们对它们的预测。预测也是多个时期的平均值。

训练和计算测试预测需要相当长的时间,即使对于一个单一的网络也是如此。在G2.2xLarge AWS实例(使用Nvidia GRID K520)上,大约需要48小时。

眼睛混合

在某个时候我们意识到一对眼睛中两只眼睛的分数之间的相关性相当高。例如,左眼得分与右眼得分相同的眼睛对的百分比为87.2%。对于95.7%的配对,得分最多相差1分,对于99.8%,最多相差2分。这种相关性可能有两个原因。

第一种是,两只眼睛的视网膜在糖尿病的损害作用下暴露的时间相同,而且结构相似,因此推测它们应该以相似的速度发展成视网膜病变。另一个不太明显的原因是,地面真相标签是由人类产生的,可以想象的是,一个人类专家更有可能给同一幅图像不同的分数,这取决于这对图像中另一幅图像的分数。

有趣的是,人们可以利用一双眼睛的分数之间的这种相关性来产生一个更好的预测指标。
一种简单的方法是分别取左眼和右眼的预测分布D_L和D_R,并使用线性混合产生新的分布,如下所示。对于左眼,我们预测C=Dl+(1-C)..Dr同样地,我们预测了C=Dr+(1-C)..Dl对于右眼,对于[0,1]中的一些c。我们尝试了c=0.7和其他几个值。即使是这种简单的混合也能显著提高我们的kappa评分。然而,当我们训练一个神经网络而不是一个ad-hoc线性混合时,得到了更大的改进。这个网络以两个分布(即10个数字)作为输入,并返回前5个输入的新的“混合”版本。它可以使用验证集上的预测进行训练。至于架构,我们决定采用一个非常强正则化的(通过dropout)架构,该架构有两个内部层,每个层包含500个整流线性节点。

一个明显的思想是将卷积网络和混合网络集成到一个单一的网络中。直觉上,这可能导致更强的结果,但这样的网络可能也很难训练。不幸的是,我们没有设法在比赛截止日期前尝试这个想法。

Kappa优化

主办方提出的损失函数二次加权kappa(QWK)似乎是视网膜病变诊断领域的标准函数,但从主流机器学习的角度来看却很不寻常。提交的分数被定义为1减去提交的总平方误差(TSE)和以与提交相同的分布随机回答的估计器的期望平方误差(ESE)之间的比率(看here以获得更详细的描述)。

这是一个相当硬的损失函数直接优化。因此,我们不尝试这样做,而是使用两步程序。我们首先针对多类logloss优化我们的模型。这给出了每个图像的概率分布。然后,我们使用基于模拟退火的优化器为每幅图像选择一个标签。当然,在不了解实际标签的情况下,我们无法真正优化QWK。相反,我们按照以下方式定义和优化QWK的代理。回想一下,QWK=1-TSE/ESE。我们通过假设真标签是从我们的预测所描述的分布中得出的,然后将这些预测插入QWK公式中,而不是真值来估计TSE和ESE。注意,上面的过程低估了TSE和ESE。这两种影响在某种程度上相互抵消,但我们对QWK的预测与排行榜得分相比还是有很大差距。

尽管如此,我们并没有找到更好的方法来提交意见书。特别是,上面描述的优化器的性能胜过我们尝试的所有ad-hoc方法,例如:整数舍入期望,模式等。

我们要感谢California Healthcare Foundation作为提案国,EyePACS提供图片,和Kaggle设置这个比赛。我们学到了很多,也很高兴参与开发能够潜在帮助诊断糖尿病视网膜病变的工具。我们期待着解决下一个挑战。