GitChat 作者:王晓明
更多IT技术分享,尽在微信公众号:GitChat
医学影像与人工智能的结合,是数字医疗领域较新的分支和产业热点。医学影像的解读需要长时间专业经验的积累,医生的培养周期相对较长,很多程度上,深度学习和医生的学习过程是一样的,通过海量知识的学习理解和应用,而人工智能在对图像的检测效率和精度两个方面,可以做得比专业医生更快。
大数据与人工智能等前沿技术在医疗领域应用已经成为一种趋势,将大数据驱动的人工智能应用于癌症诊断中,无疑为患者僻出一线生机,不仅可以挽救无数患者的生命,而且对于缓解医疗资源和医患矛盾也有重大意义。
医学影像是指为了医疗或医学研究,对人体或人体某部分,以非侵入方式取得内部组织影像的技术与处理过程。它包含以下两个相对独立的研究方向:医学成像系统(medical imaging system)和医学图像处理(medical image processing)。前者是指图像行成的过程,包括对成像机理、成像设备、成像系统分析等问题的研究;后者是指对已经获得的图像作进一步的处理,其目的是或者是使原来不够清晰的图像复原,或者是为了突出图像中的某些特征信息,或者是对图像做模式分类等等。
现代医学影像学的高速发展,医学影像技术已经由传统单一普通X线加血管造影检查形成包括UI、CT、CR、DR、MRI、PET、PET-CT、数字减影血管造影以及PACS等多种技术组成的医学影像学体系。影像成像技术的不断丰富使医学影像从“辅助检查手段”变为现代医学最重要的临床诊断和鉴别诊断方法。接下来医学影像将向三个方向发展:(1)由单一形态学影像检查设备向“形态+功能”的融合型影像发展;(2)由大型设备转向小型、简便的床边化仪器,未来将越来越多地投入应用到重症监护、家庭医疗、预防保健等领域;(3)现代医学影像技术与放射治疗手段结合,使诊断与治疗一体化。我们认为,更先进和便利的影像诊断设备将使临床诊疗将更加依赖于影像检查,带来影像需求增多,循环促进影像设备领域的发展。
大数据人工智能分析技术使得医学影像诊断软硬件变得更智能化。用深度学习技术分析医学影像和视频是一个新的研究方向。通过已训练好的卷积神经网络,能很快地搭建并训练自己的深度学习系统。
用于图像处理的库有很多,其中 OpenCV(Open computer vision) 比较主流,基于C/C++,支持Linux/Windows/MacOS/Android/iOS,并提供了Python,Matlab和Java等语言的接口,因为其丰富的接口,优秀的性能和商业友好的使用许可,不管是学术界还是业界中都非常受欢迎。作为当前非常流行的动态语言之一,Python不仅使用非常简单,而且功能强大。通过Python来学习OpenCV框架,可以让你很快理解计算机视觉的基本概念以及重要算法。
安装时,既可以用 pip install opencv-python,也可以从 opencv.org 下载源码。本文简单介绍pip安装的方式。
pip install --upgrade setuptools
pip install numpy Matplotlib
pip install opencv-python
1943年,心理学家W.S.McCulloch和数理逻辑学家W.Pitts建立了神经网络和数学模型,称为MP模型。他们通过MP模型提出了神经元的形式化数学描述和网络结构方法,证明了单个神经元能执行逻辑功能,从而开创了人工神经网络研究的时代。
卷积神经网络是对人工神经网络的进一步改进,是一种专门为了识别二维图像而设 计的一种能够自动提取图像特征的特殊的多层感知器。原始图像不需要太多的预处理就 可以较好的学习到图像的不变性特征。目前,典型的卷积神经网络是一个多层的、可训练的体系结构。包括输入、卷积层(局部连接层)、抽样层、归一化层、全连接层、逻辑回归层和输出层等等。如何提高卷积神经网络对图像的识别效果,需要识别的数据集 如何找到最合适的网络结构和参数配置,以及对于不同的数据集都具有一定兼容性的网络结构成为现在研究的热点。
典型的卷积神经网络的概念模型如图 3-1 所示。每一层是由多个二维平面组成。网络中包括卷积层和池化层,分别表示为 C 层和 S 层。网络中间还包含着一些隐藏层,它们在全连接层。在网络体系结构中,输入层只有一个,它直接接收二维对象,对于样本的特征提取过程是嵌套在卷积和池化过程中。在全连接层内包含多个隐含层,主要实现分类的过程。
图3-2中显示了卷积层神经网络结构中最重要的部分,这个部分被称之为过滤器(filter)或者内核(kernel)。因为TensorFlow文档中将这个结构称之为过滤器(filter),所以我们将统称这个结构为过滤器。如图4所示,过滤器可以将当前层神经网络上的一个子节点矩阵转化为下一层神经网络上的一个单位节点矩阵。单位节点矩阵指的是一个长和宽都为1,但深度不限的节点矩阵。
在一个卷积层中,过滤器所处理的节点矩阵的长和宽都是由人工指定的,这个节点矩阵的尺寸也被称之为过滤器的尺寸。常用的过滤器尺寸有3×3或5×5。因为过滤器处理的矩阵深度和当前层神经网络节点矩阵的深度是一致的,所以虽然节点矩阵是三维的,但过滤器的尺寸只需要指定两个维度。过滤器中另外一个需要人工指定的设置是处理得到的单位节点矩阵的深度,这个设置称为过滤器的深度。注意过滤器的尺寸指的是一个过滤器输入节点矩阵的大小,而深度指的是输出单位节点矩阵的深度。如图3-2所示,左侧小矩阵的尺寸为过滤器的尺寸,而右侧单位矩阵的深度为过滤器的深度。
TensorFlow对卷积神经网络提供了非常好的支持,下面的程序实现了一个卷积层的前向传播过程。从以下代码可以看出,通过TensorFlow实现卷积层是非常方便的。
# 通过tf.get_variable的方式创建过滤器的权重变量和偏置项变量。上面介绍了卷积层
# 的参数个数只和过滤器的尺寸、深度以及当前层节点矩阵的深度有关,所以这里声明的参数变
# 量是一个四维矩阵,前面两个维度代表了过滤器的尺寸,第三个维度表示当前层的深度,第四
# 个维度表示过滤器的深度。
filter_weight = tf.get_variable(
'weights', [5, 5, 3, 16],
initializer=tf.truncated_normal_initializer(stddev=0.1))
# 和卷积层的权重类似,当前层矩阵上不同位置的偏置项也是共享的,所以总共有下一层深度个不
# 同的偏置项。本样例代码中16为过滤器的深度,也是神经网络中下一层节点矩阵的深度。
biases = tf.get_variable(
'biases', [16], initializer=tf.constant_initializer(0.1))
# tf.nn.conv2d提供了一个非常方便的函数来实现卷积层前向传播的算法。这个函数的第一个输
# 入为当前层的节点矩阵。注意这个矩阵是一个四维矩阵,后面三个维度对应一个节点矩阵,第一
# 维对应一个输入batch。比如在输入层,input[0,:,:,:]表示第一张图片,input[1,:,:,:]
# 表示第二张图片,以此类推。tf.nn.conv2d第二个参数提供了卷积层的权重,第三个参数为不
# 同维度上的步长。虽然第三个参数提供的是一个长度为4的数组,但是第一维和最后一维的数字
# 要求一定是1。这是因为卷积层的步长只对矩阵的长和宽有效。最后一个参数是填充(padding)
# 的方法,TensorFlow中提供SAME或是VALID两种选择。其中SAME表示添加全0填充,
# “VALID”表示不添加。
conv = tf.nn.conv2d(
input, filter_weight, strides=[1, 1, 1, 1], padding='SAME')
# tf.nn.bias_add提供了一个方便的函数给每一个节点加上偏置项。注意这里不能直接使用加
# 法,因为矩阵上不同位置上的节点都需要加上同样的偏置项。虽然下一层神经网络的大小为
# 2×2,但是偏置项只有一个数(因为深度为1),而2×2矩阵中的每一个值都需要加上这个
# 偏置项。
bias = tf.nn.bias_add(conv, biases)
# 将计算结果通过ReLU激活函数完成去线性化。
actived_conv = tf.nn.relu(bias)
在卷积神经网络中,卷积层之间往往会加上一个池化层(pooling layer)。池化层可以非常有效地缩小矩阵的尺寸,从而减少最后全连接层中的参数。使用池化层既可以加快计算速度也有防止过拟合问题的作用。和卷积层类似,池化层前向传播的过程也是通过移动一个类似过滤器的结构完成的。不过池化层过滤器中的计算不是节点的加权和,而是采用更加简单的最大值或者平均值运算。使用最大值操作的池化层被称之为最大池化层(max pooling),这是被使用得最多的池化层结构。使用平均值操作的池化层被称之为平均池化层(average pooling)。
# tf.nn. max_pool实现了最大池化层的前向传播过程,它的参数和tf.nn.conv2d函数类似。
# ksize提供了过滤器的尺寸,strides提供了步长信息,padding提供了是否使用全0填充。
pool = tf.nn.max_pool(actived_conv, ksize=[1, 3, 3, 1],
strides=[1, 2, 2, 1], padding='SAME')
我们通过一个图像分类问题介绍卷积神经网络是如何工作的。下面是卷积神经网络判断一个图片是否包含“儿童”的过程,包括四个步骤:图像输入(InputImage)→卷积(Convolution)→最大池化(MaxPooling)→全连接神经网络(Fully-ConnectedNeural Network)计算。
首先将图片分割成如下图的重叠的独立小块。接下来将每一个独立小块输入小的神经网络;这个小的神经网络已经被训练用来判断一个图片是否属于“儿童”类别,它输出的是一个特征数组。 标准的数码相机有红、绿、蓝三个通道(Channels),每一种颜色的像素值在0-255之间,构成三个堆叠的二维矩阵;灰度图像则只有一个通道,可以用一个二维矩阵来表示。
将所有的独立小块输入小的神经网络后,再将每一个输出的特征数组按照第一步时77个独立小块的相对位置做排布,得到一个新数组。
第二步中,这个小的神经网络对这77张大小相同的小图片都进行同样的计算,也称权重共享(SharedWeights)。这样做是因为,第一,对图像等数组数据来说,局部数组的值经常是高度相关的,可以形成容易被探测到的独特的局部特征;第二,图像和其它信号的局部统计特征与其位置是不太相关的,如果特征图能在图片的一个部分出现,也能出现在任何地方。所以不同位置的单元共享同样的权重,并在数组的不同部分探测相同的模式。数学上,这种由一个特征图执行的过滤操作是一个离散的卷积,卷积神经网络由此得名。
卷积步骤完成后,再使用MaxPooling算法来缩减像素采样数组,按照2×2来分割特征矩阵,分出的每一个网格中只保留最大值数组,丢弃其它数组,得到最大池化数组(Max-PooledArray)。 接下来将最大池化数组作为另一个神经网络的输入,这个全连接神经网络会最终计算出此图是否符合预期的判断。
在实际应用时,卷积、最大池化和全连接神经网络计算,这几步中的每一步都可以多次重复进行,总思路是将大图片不断压缩,直到输出单一的值。使用更多卷积步骤,神经网络就可以处理和学习更多的特征。
在医学影像领域,病理图片向来是医疗领域的“金标准”,病理诊断是对疾病下最终判断的环节。人工读片会有:主观性高、重复性低、定量及信息利用度不足、耗时及劳动强度和知识经验的传承困难等问题。而人工智能病理切片识别系统的优势在于能自动分析、分割、检测感兴趣区域、能够定量地评估病变区域的变异程度,结果具有可重复性。
图4-1被橙色曲线所标注的区域是为此图中可见的部分癌巢(细胞发生癌变的区域);癌巢与正常区域看起来十分不同,几个蓝色方框选取的区域即是正常区域的示例。这些不同主要是由于癌细胞的形态学特征和相互间的排列分布,与正常区域的细胞截然不同而造成的。
胃癌病理切片识别的目标是利于深度卷积神经网络技术,使计算机能够自动地将胃癌数字组织病理切片的局部视野中的癌巢快速精准地标识出来。
选取胃癌病理切片,为常规HE染色,放大倍数20×,图片大小为2048×2048像素,tiff 格式。选取200个病人案例(80%癌症、20%非癌症),共计2000张病理切片图片,训练集数量1500张,测试集数量500张。
数据标注:
病理专家将数据标记(双盲评估+验证)为有无癌症,并用线条画出肿瘤区域轮廓,提供知识图谱说明。
关于胃癌病理切片AI识别其实是2017中国大数据人工智能创新创业大赛的一个赛题。大赛官网:http://www.datadreams.org/race-race-3.html 我是2016年上海BOT大赛聊天机器人的参赛者,这里算是免费给他们打个广告,有兴趣的同学可以找我组团打比赛。
人工智能的最大特点就是高效的计算和精准的分析与决策,这一点刚好击中现在的医疗痛点,或能从根本上解决医疗资源供不应求的局面。医学影像的识别是人工智能切入医疗行业的一个切入点,因为病理科,放射科医生读片是医疗领域的一个明显的痛点。未来医疗一定是向精准个性化医疗的方向发展,但是发展路途上也有很多障碍,比如电子病历数据分散在各家医院,数据的收集整理工作是一个漫长而艰难的任务。分析病历文本的NLP技术目前也不是很成熟,在构建医疗知识图谱的过程中,需要大量专业医生的参与等等。人工智能+医疗,一定是需要人工智能人才+医生通力合作才能研发出适合医生的智能辅助诊断系统。
实录:《王晓明:肿瘤医疗影像 AI 识别技术实战解析》