AI医疗场景化业务:如何用AI技术做食管癌识别和辅助诊断?
AI运用于医疗,通过机器学习的特点,可以辅助诊断。笔者分享了运用AI技术做食道癌识别和辅助诊断的经历,阐释了各阶段的难点。
影辅助诊断主要做两件事情:
- 医学知识图谱构建;
- 基于疾病的诊断。
今天我们来分析如何用AI技术做食道癌识别和辅助诊断。
食道癌是世界五大恶性肿瘤之一,我国又是食道癌的高发地区。这个项目的目标是通过影像判别病人是否可能患有癌症。
项目的整体流程如下:
- 采集数据集:内窥镜探头一般从患者鼻腔进入,然后经过咽喉和食管,最后到达胃。我们采集食管数据的时候,可能会引入大量非食管数据。
- 数据标注与模型建立:然后对这些数据做区分,通过食管判别模型,只保留食管数据。然后将食管数据送到下一个模型,这个模型只做一件事情,就是把正常的食管和异常的食管区别开来。
- 图像分析:区分之后,再把病变的食管数据送到下一个环节,判断这个图像代表的是癌症还是炎症。
整个流程大致可以分为这样三个阶段,接下来我会简单介绍每个阶段的难点。
图像数据集少、表现不一
通常的图像分类任务动辄几十万、上百万,甚至上千万的数据量相比,医疗影像它的数据量是非常少的。同时,由于设备参数、医生的拍照手法或拍摄角度、光照的明暗不同,食管的表观变化非常复杂。
那么,我们怎样才能在这样的条件下得到一个可靠稳定的模型?
采用Feature map。Feature Map是卷积核卷出来的,你用各种情况下的卷积核去乘以原图,会得到各种各样的feature map。你可以理解为你从多个角度去分析图片。而不同的特征提取(核)会提取不同的feature,模型想要达成的目的是解一个最优化,来找到能解释现象的最佳的一组卷积核。
在同一层,我们希望得到对于一张图片多种角度的描述,具体来讲就是用多种不同的卷积核对图像进行卷,得到不同核(这里的核可以理解为描述)上的响应,作为图像的特征。
他们的联系在于形成图像在同一层次不同基上的描述。下层的核主要是一些简单的边缘检测器(也可以理解为生理学上的simple cell)。
在拿到食管数据之后,如何判别这个食管属于健康正常食管还是病变食管呢?
这个问题跟前面的问题比较类似,也是一个判别模型。
它们的不同之处在哪呢?
当我们判断一个食管是否异常食管时,只需要找到一个病变区域,就能够说明这个食管是异常的。
但是反过来,在正常图像中,并不能说找到一个正常特征,就说明这个食管是正常的。只能说在这张图像中我们没有找到异常特征,它可能是见正常的。
因此,在正常特征和异常特征之间,我们更倾向于提取病变特征,抑制正常特征。
我们是怎么做到呢?
病变和正常的case都会经过神经网络,以得到特征向量。对于这个向量,我们希望尽可能凸显异常特征,让正常特征趋近于0。
我们是如何把这种信息建模到模型中的呢?
我们对模型进行了重新建模,最后准确率大概在97%左右。
前面的模型相对来说比较简单,第三个模型主要是区分炎症和癌症,它与前两个问题不大一样。
一般情况下,病变的食管图像里都会伴随着一些炎症的特征。
我们对癌症的判断往往是通过一个纹理特别小的区域得出的,因此需要提取出更加精细化的特征。比较好的做法就是让很多专家把病灶区非常严谨地标注出来,这样我们只需要对这个区域进行识别就好了。
这个标注量非常大,因此数据异常匮乏。我们没有癌症区域的标注数据,但又希望得到非常精细化的特征,如何解决这个矛盾呢?
幸运的是,我们虽然无法获取到非常精准的病变区域标注影像,却能够相对容易地知道一张图像是否包含癌症,因为只需要跟病例对应关联起来就好了。这样一来,我们可以更容易地得到图像全局的标签。
如果一张图像包含了癌症,必然会有一个或几个区域包含了癌症的特征。也就是说,如果我们把图像切分成几个patch,必然会有某个或某几个patch包含癌症特征。基于这样一种思路,我们采取了多序列的学习方式。这个方法的内在思想很简单,就是把图像切分成若干个patch,然后对每个patch建模,判别这个patch发生癌症的概率。
我们最后把所有patch里面癌症概率最高的那块,作为图像是否包含癌症的标签。
做的过程当中,我们会逐渐积累精准标注的数据,这些数据非常少,不足以虚拟一个模型。但图像中的特征都是最精准的,是经过人为校验和标注的。
我们怎样才能把这种少量的、精准的数据强化到癌症识别中去呢?
这是个非常有意思的问题,如果能解决这个问题,即使只有少量标准数据,我们也能不断提升。
这里主要采用了多任务学习的方法,这个方法需要完成两个任务:
- 基于有病变区域标注的数据建立有监督的学习任务;
- 对于没有病变区域标注的数据,建立前面提到的多序列学习任务。
这两个模型共享特征提取网络,特征提取网络必须同时满足两大任务,这样才能把精准标注的特征强化到癌症识别中去。
以上是我们食道癌项目的简单介绍,下面再简单介绍一下我们在辅助诊断方面做的一些工作。
辅助诊断的目的是什么呢?
我们希望机器最终能够像临床医生一样具备诊断疾病的能力。
在介绍辅助诊断项目之前,我们先来看看一个医生或者一个普通的学生是如何成长为一名专家的:一个学生从刚入学开始,学习了大量专业课程,阅读了大量专业医学文献后,就可以积累一定程度的医学知识。
当医学知识达到一定程度之后,就可以去医院里面实习,由临床医生结合一些真实案例,指导他去学习诊断的技能。
当我们具备了这些技能,就能够成为一名普通的医生,医生可以看到大量的病人,学习大量经验,经验足够丰富之后就成了专家。
机器成长的过程与人类大致相似。
我们可以将其分为三个阶段:
- 医学知识图谱的构建,也就是机器学习知识的过程;
- 有了知识之后学习诊断的能力,也就是建立疾病判别的一些模型;
- 让机器在与专家的博弈过程中,不断提升诊断水平,逐渐逼近甚至超过专家。
医疗知识图谱的构建过程中,我们首先要对文本数据进行处理。文本数据分成两类,一类是半结构化数据,一类是非结构化数据。
这里我列举一个例子,说明我们如何把非结构化的文本变成结构化文本,也就是计算机可以理解的形式。
我们可以把病史分为几个部分:疾病的情况、入院的治疗经过、入院的依据等;把病史分为这样几部分信息后,再对每一类信息进行细化和提取;经过提取之后,非结构化的文本就变成了计算机能够理解的结构化文本;我们会把这些信息转化为医学知识图谱存在电脑里,于是计算机就把这个知识学会了。
以上就是医学知识图谱的构建过程。
第二步我们会有一个诊断模型。
诊断的过程是这样的,首先把一段人类语言描述的病情转化成计算机可以理解的结构化知识。有了结构化的知识以后,机器就能理解这个人的情况,把知识推送到疾病诊断模型当中,模型将给出一个疾病列表,诊断模型的流程大致就是这样。
下面我们来看一个病情理解的实例。
通过技术对病人病情的理解可以得到一些基本信息,其中包含性别、年龄,这个人的主动描述、现病史和既往史等。
主动描述里会提到症状以及持续的时间,甚至一些更复杂的信息,比如说唾沫是什么样子的,咳嗽是否带痰。这些信息都会详细刻画出来,按照前面提到的模式画出病历,完成对病情的理解。
理解病情以后,将其输入诊断模型当中。
诊断的demo包含几个部分:对病情的人类语言的描述,通过病情理解后得到结构化的病情表示,之后得出机器诊断的结果,按照概率从高到低给出5个结果。
我们还给医生留了一个接口,医生可以对诊断结果评分,通过评分将结果反馈到模型当中。
通过医生和机器之间的交互,可以将模型迭代得越来越好。
我们在实验室数据里选择了大概10万个真实病例进行测试,TOP1的结果与医生的一致率大概是92%,TOP3是90%,但这种模型还需要更多临床病例做验证。
本文由 @pms-rolia 原创发布于人人都是产品经理,未经许可,禁止转载
题图来自 Unsplash,基于 CC0 协议
想请教下,建模是程序员写的还是产品经理负责的?
非常棒,在智慧医疗领域知名产品经理
要考虑召回率,I类错误和II类错误
是的,这里忘记写了,感谢
非常棒,很有意思,我也是CV方向的PM,欢迎交流
哈哈哈可以相互交流,相互学习 vx:bluebless