原文来源:WordPress
作者:Luke Oakden-Rayner
「雷克世界」编译:嗯~是阿童木呀、KABUDA、EVA
医疗数据很难处理。
在医学成像中,数据存储(档案)是基于临床假设进行操作的。不幸的是,这意味着当你想提取一个图像(比如一个正面的胸部x光片)时,你通常会得到一个装满其他图像的文件夹,并且没有简单的方法来区分它们。
这些全部是相同的文件夹是合情合理的,因为在放射学中我们报告的是病例,而不是图像。这是病人在经历创伤后同时扫描的所有东西
根据制造商的不同,最终可能会得到水平或垂直翻转的图像。它们可能有反向的像素值(inverted pixel values)。它们可能会旋转。问题在于,当处理一个庞大的数据集(比如,50-100k的图像)时,如何在没有医生查看所有这些畸变(aberration)的情况下发现这些畸变?
你可以尝试编写一些简练的解决方案,比如:
在许多胸部x光片的两侧有黑色的边界(因为大多数胸部都比宽度高),所以如果底部有超过50个黑色像素行,那么它可能旋转了90度。
但是一如既往,我们陷入了失效模式(failure mode)。
这里只有中间的图像有经典的“两侧黑色边界”外观
这些脆弱的规则无法为我们解决这些问题。
进入软件2.0,我们使用机器学习来构建解决方案以解决我们无法自己编码的问题。令人尴尬地是,像旋转图像这样的问题是可学习的。这意味着,像人类一样,机器可以很容易地(几乎)完美地完成这些任务。
因此,使用深度学习来为我们修复数据集是显而易见的答案。本文将说明这些技术的工作原理,如何以最少的努力完成工作,并展示一些使用方法的示例。举个例子,我将使用Wang等人的CXR14数据集,该数据集看起来是精雕细琢的,但仍然包含偶然的坏图像。如果你使用CXR14数据集,我甚至会给你一套新的~430标签,这样你就不用担心那些潜在的坏图像了!
非常令人尴尬
我们真正需要问的第一个问题是——
问题1:这个问题是令人尴尬地可学习的吗?
考虑到大多数的研究都是常规的,你需要非常高的精确度来防止排除太多“好的”研究。我们应该把目标定在99.9%。
很酷的一点是,这些我们可以很好地执行的简单问题,在视觉上是可以识别的。所以,一个很好的问题是“你能想象一个单一的视觉规则来解决这个问题吗?”在区分狗和猫时当然不是这种情况,这是ImageNet数据集的主要目的。
有太多的变化和太多的相似点。我经常在演讲中使用这个例子——我甚至无法想象如何编写一般意义上在视觉上区分这两种动物的规则。这并不是令人尴尬地可学习的。
但在医疗数据中,许多问题其实很简单。变化很小。解剖学、角度、照明、距离和背景都很稳定。为了说明这一点,让我们看一个来自CXR14的简单示例。在数据集中的普通胸部x光片中,有一些是旋转的(这在标签中未被识别,所以我们不知道是哪些)。它们可以左右旋转90度左右,或180度(上下颠倒)。
这是令人尴尬地可学习的吗?
旋转和垂直的胸部x光片之间的区别真的简单得令人尴尬
答案是肯定的。在视觉上,非常规研究与常规研究完全不同。你可以使用一个简单的视觉规则,比如“肩膀应该高于心脏”,你就会得到所有的例子。鉴于解剖学是非常稳定的,而且所有人都有肩膀和心脏,这应该是一个可学习的卷积网络规则。
非常渴望
我们需要问的第二个问题是——
问题2:我们拥有足够的训练数据吗?
在旋转图像的情况下,我们当然会拥有,我们做得到!我们所需要的只是几千个常规的胸部x光片,然后对它们进行随机旋转。例如,如果你在图像中使用numpy数组(numpy array),你可能会使用这样的函数:
这只是将图像按照顺时针方向旋转90、180度或270度。在这种情况下,绕着第二个和第三个轴(axis)旋转,因为第一个轴是信道的数量(鉴于theano dim排序规则)。
请注意:在这种情况下,CXR14数据集中几乎没有旋转的图像,所以意外“纠正”已经旋转图像的几率非常小。我们可以假设数据中没有数据,并且模型将会学习得很好。如果有更多非常规的图像,那么你最好手动选择常规和非常规图像。因为像旋转这样的问题很容易被识别,我发现我可以在一个小时内进行几千个标记,所以这并不需要太多的精力。由于这些问题很简单,我经常发现我只需要几百个样本即可“解决”这个挑战。
所以我们建立了一个常规图像的数据集,对其中的一半进行旋转,并相应地标记它们。在我的例子中,我选择了4000个训练案例(其中2000个是经过旋转的)和2000个验证集(validation set)案例(其中有1000个是经过旋转的)。这似乎是一个很好的数据量(请记住,经验法则(the rule of thumb):1000个样本可能是好的,加上误差范围(margin of error)),而且它适合于RAM,所以很容易在我的家用计算机上进行训练。
为了在机器学习中进行有趣的改变,我不需要一个单独的测试集。证据需要实践来检验(in the pudding)——无论如何,我都将在整个数据集上运行这个模型,并将输出作为我的测试进行检查。
一般来说,对于这类研究,我会让自己的生活变得轻松。我将图像缩小(因为旋转检测看起来不需要高分辨率)到256 x 256像素,并且使用一个经过预先训练的以keras作为基础网络的resnet50。使用经过预先训练的网络并没有真正的理由,因为几乎所有你使用的网络都会在一个简单的解决方案上聚合,但是它很简单,并且不会减慢任何速度(无论如何,训练时间都是快速的)。我使用了一组默认的参数,并且不为这个如此简单的任务进行任何调优。
你可以使用手边的经过编码的任何网络,VGG-net可行, Densenet可行,任何网络都可行,真的。
在几十个轮数之后,我得到了我的结果(这是在val集上的):
AUC = 0.999, ACC = 0.996, PREC = 0.998, REC = 0.994
很好,如果这是一项令人尴尬地可学习的任务,我希望能找到的就是这个。
检查结果
正如我之前所说的,在医学图像分析中,我们总是需要检查我们的结果。查看图像,确保模型或过程做到了你想要它做的事情。
所以最后一步是在整个数据集上运行模型、进行预测、然后排除旋转研究(the rotated studies)。由于数据中几乎没有旋转研究,所以我可以简单地查看被预测为旋转的所有图像。
如果相反的话,这就是一个有很多异常图像的问题(比如超过5%的数据),那么收集几百个随机案例和手工标记一个测试集将会更为高效。然后,你可以通过适当的指标追踪模型的精确度。
我特别关心的是任意一个被称之为旋转(假阳性)的正常研究,因为我不想失去宝贵的训练案例。这实际上是一个比你所能够想象的更大的问题,因为这个模型可能会过度调用某种特定类型的病例(也许是那些让病人变得懒散和倾斜的病例),如果我们排除这些作为规则,那我们将会引入偏差进入我们的数据中,且不再有“真实世界”的代表性数据集。这显然与医疗数据有很大关系,因为整个目标就是生产出能够在真正的诊所中运行的系统。
该模型总共将171个案例识别为“旋转”。有趣的是,它实际上作为一个“异常”检测器,识别出许多实际上并没有旋转的坏案例。这是有道理的,因为它可能是学习解剖学的标志。任何异常的东西,如旋转的胶片或其他身体部位的X射线,都不具有相同的标志。所以我们实际上能够收获更多的东西,而不仅仅是寻找异常旋转的图像。
在171个预测中,51个是旋转了的正面胸部X射线。鉴于低的离谱的患病率(120,000中有51个),这已经是一个极低的假阳性率了。
旋转的胸部胶片样本
在余下的120个案例中,56个不是正面胸部胶片。主要是侧面影片和腹部X光片的混合。无论如何,我还是想把这些摆脱掉。
其余的呢?有一些混合的缩小性研究(黑色或白色的大边界)、淘汰性研究(整个研究灰色)、反向像素水平研究等等。
总的来说,大约有10项研究,我将称其为明确的假阳性(意味着它们是我可能想要保存的良好的正面X射线)。值得庆幸的是,即使你想将它们重新添加进去,由于只有171个预测值,所以手动对其进行操作也是非常容易的。
所以旋转检测器看起来像是部分解决了一些其他问题(如像素值反转)。要知道它做的有多好,我们需要检查它是否漏掉了其他不好的案例。我们可以测试这一点,因为像素值反转(pixel value inversions)很容易为(图像中的x,x = max-x)生成数据。
所以我使用与旋转检测器相同的方法训练了一个快速的“反向检测器”,并取得了很好的结果。
AUC = 1.0,ACC = 0.9995,PREC = 0.999,REC = 1.0
在这种情况下,可能有一些方法可以在没有机器学习的情况下做到这一点(直方图应该看起来很不一样),但是这也很简单。
那么,这个特定的检测器是否比旋转探测器发现了更多的反向结果呢?是的。旋转检测器在整个数据集中发现4个,而反向检测器发现38个反向研究。所以旋转检测器发现了一些不好的研究结果,但不是全部。
观点重申:培养单一模型来解决每个问题是正确的方法。
所以,我们需要特定的模型来完成附加的清洁任务。
每一点帮助
为了显示少量的标记数据是有用的,我拍摄了使用旋转检测器(n = 56)所发现的横向和不良区域的胶片,并在它们上面训练了一个新模型。由于我没有很多这样的胶片所以试图做得更为详尽,甚至没有使用验证集。由于这些任务是可学习的,一旦它接近100%,它应该就会具有很好的泛化能力。显然这里有过度训练的风险,但我认为是值得冒险的。
它效果很好!我发现了额外的几百张侧面胶片、腹部胶片和几个骨盆。
显然,如果我从头开始构建这个数据集,解决这个问题会更加容易,因为我可以访问很多相关的非正面胸部图像。对于我来说,想要比现在做得更好,我需要从当地的医院档案中提取来自各个身体区域的一组图像,这超出了本博客的范围。所以我不能确定我是否掌握了大部分这些内容,但从这样一个小数据集中获得了相当好的效果。
除了关于CXR14的数据外,我注意到我的模型总是会对关于幼儿的胶片显现崩溃的状态。这些儿科胶片在外观上与成人胶片有很大不同,且它们被旋转检测器、反向检测器和不良身体部位检测器识别为“异常”。我建议它们应该被忽视,但是因为患者年龄被包含在标签集中,所以可以在没有深度学习的情况下完成。考虑到数据集中只有286名5岁以下的患者,除非我特别想要研究这个年龄段的患者,并且真正知道我在做什么,所以从医学成像的角度来看,我会排除所有这些患者。实际上,我可能会把所有10岁以下的人排除在外,因为这是一个合理的年龄,可以将体型和病理特征更加“成人化”。有兴趣的是,10岁以下的人约有1400人,因此约有1%的数据。
观点重申:幼儿胸部X光与成人非常不同。考虑到数据集中低于10岁的数据只有大约1%,除非有很好的理由,否则应该将其排除在外。
根据你的任务,放置不良和放大的胶片可能是一个问题,但是武断地定义一个“坏胶片”对于所有任务来说都是不可能的,这不是我想做的。还有一件事是特定于任务的。
就是这样。总的来说,使用深度学习来解决简单的数据清理问题效果很好。经过大约一个小时的工作,我清理了数据集中大部分旋转和反向的图像(这里需要注意一个名为csv的文件)。我我可能已经确定了相当一部分的侧面胶片和其他身体部位的胶片,但确定我需要为它们构建特定的检测器。
从更广泛得角度来查看CXR14数据,没有太多的图像误差。美国国立卫生研究院团队(NIH team)可能相当好地管理了他们的数据。在医疗数据集中情况并非总是如此,如果要构建高性能医疗AI系统,制定有效的方法来处理来自将临床基础设施用于研究任务的噪声是非常重要的。
更进一步
截至目前,我们已经解决了一些非常简单的挑战,但这并不意味着我们在医学成像方面遇到的问题都如此简单。我们的团队在构建一个大型髋骨骨折数据集时,应用到了这些技术。特别是,我们排除了其他身体区域的图像,也排除了植入金属(如髋关节置换)的病例,并且我们放大了髋关节区域,同时舍弃了与我们的问题无关的图像区域(髋部骨折不会发生在臀部以外)。
排除金属是通过自动文本挖掘过程实现的。因为这些假体在出现时几乎总是被报道,因此我们找到了与植入相关的关键词。这些标记仅花费了10分钟左右的时间就被创建了出来。
在躯体部分检测(body part detection)和边界框预测(bounding box prediction)错误的情况下,无法自动生成标记。所以我自己做了。即使是像边界框预测那样复杂的事物(这实际上是解剖学中里程碑式的识别任务),我们也仅需要约750个案例。每个数据集仅需要1小时左右的时间即可完成。
在这种情况下,我们使用手工创建的测试集来量化结果。
相比于实际标记骨折需要几个月的时间,额外标记一小时或两小时以获得清晰的数据集是非常小的代价。特别是因为该系统目前可以接收任何临床图像,并且据我们所知,它可以自动排除无关或低质量胶片。这正是AI系统需要在“自然环境”中进行操作的方式,除非你想要付费给某人让其手工整理它分析的所有图像。
结论
我们都认同一个观点,那就是在数据充足的前提下,深度神经网络在解决视觉问题方面的能力,与人类水平相差无几。同样显而易见却少有人提及的一点是,“数据充足”在很大程度上依赖于任务的难易程度。
对于医学图像分析问题的一个子集(这也是我们在构建医学数据集时经常要解决的问题)而言,其任务是非常简单的,这使得问题很容易用少量的数据来解决。一般而言,仅用不到一个小时的时间即可完成对图像组的识别,但同样的任务,医生需要花费数小时的时间进行手工处理才可完成。
为了证明这一方法,同时感谢你的阅读,我提供了一组约含有430张标记为不良的图像,以将其从CXR14数据集中排除(同时建议你排除约1400名10岁以下的儿童,除非你明确知道为什么要保留他们)。这不会改变任何论文的任何结果,但对于这些数据集而言,图像越清晰越好。
我在本文中所探讨的内容,没有涵盖任何开创性技术,这也是我为什么不写一篇正式论文的原因。但对于我们这些正在构建新数据集的人,特别是那些没有大量深度学习经验的医生而言,我希望本文能引发他们关于软件2.0是如何凭借比人工方法更低的成本解决数据问题的些许思考。
注释:解释我的示例审查/标记过程
我在Windows文件浏览器中查阅所有图像。
我在本文末的实际工作空间,用于旋转检测器的预测
我只需将我想要查看的案例转移到一个新的文件夹,然后打开该文件夹(以“特大号图标”作为试图模式)。这种尺寸的图像大约是你屏幕高度的四分之一,而且在大多数现实屏幕上都足够大,可以检测到诸如旋转这样的明显异常。当我标记具有明显异常的图像时,我只需按住Ctrl键并单击文件夹中的所有样本,然后将它们剪切/粘贴到新文件夹中。这样我每小时能筛选出1000张图像。
尽管这一系统非常简陋,但它比我从网上回购或自己编码中尝试的大多数事物要好很多。
用于移动文件的python代码非常简单,但是在构建数据时,它是我最常使用的代码之一,所以我认为我应该收录它:
然后我可以去那个文件夹浏览一下。如果我做了一些人为处理,并且想要重新读取图像,那么这非常简单:
原文链接:
https://lukeoakdenrayner.wordpress.com/2018/04/30/the-unreasonable-usefulness-of-deep-learning-in-medical-image-datasets/amp/?__twitter_impression=true
未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。
未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网(城市)云脑研究计划,构建互联网(城市)云脑技术和企业图谱,为提升企业,行业与城市的智能水平服务。
如果您对实验室的研究感兴趣,欢迎加入未来智能实验室线上平台。扫描以下二维码或点击本文左下角“阅读原文”