近年来,深度学习在医学领域慢慢的火热了起来。在图像领域,经典的各种任务包括但不限于:图像分类、目标检测、全连接网络。在医学领域,主要是将上述方式应用于医学领域中,例如:用图像分类去判断X照肺部图片判断是否出现病变(图像分类)、图片中出现的细胞与背景区分(全连接层)等等,在医学图像中使用深度学习的方法前提条件便是知道经典网络的任务。
为什么会出现这些网络呢?
在图像领域中一般都会听到例如Lenet、Alexnet、resnet、mnasnet等网络,最开始这些网络被用在imagenet比赛中对图片进行特征提取,然后将提取到的特征进行分类任务以及目标检测任务,由于这些网络表现比较好,取得了当年的第一名或者前几名的成绩,后来呢,有一些人把这些网络用于其他任务对图片进行特征提取,效果也比较的好,所以可以说,主体网络的作用是对图片进行特征提取。
提取到的网络的特征是什么样子的呢?
卷积网络中,数据的形式都是浮点数的形式,输入图像是三个维度,分别为图片的宽度、高度、通道数。它被存储在一个三维矩阵中,主体网络则是对图像的三维矩阵进行相应的运算以获取到运算对应的结果,例如如图所示:
这是一个经典的卷积神经网络,由于当时显卡显存的限制,使用gpu训练需要利用多gpu训练,上述网络使用了两张显卡,我们仅仅只需要了解其中一张显卡的计算过程,另外一张显卡和第一张显卡计算是一样的。看图片中的下半部分是其中一张显卡的计算过程。最开始,图片的输入是224x224x3,然后通过卷积核为11x11,以及stride为1的卷积操作后,得到了输出矩阵的维度是55x55x48的特征属性图,然后分别通过最大池化层卷积层(Max pooling),获取得到的数据维度是13x13x128,这时候,原始图像通过了各种层结构后二维平面维度变成了13x13,这时候,主体网络的作用完成了。我们所说的对网络进行设计以达到更好的精确度便是主要通过修改主体网络进行。
可以看到softmax最终得到的是一个范围是(0,1)的输出值,而1000个全连接层通过softmax后的维度不会改变、而它们的输出范围被限定到了(0,1),然而它们之和是1。这些便是分类任务前向传播的全部过程了,利用这些能够得到预测值了,如果我们需要训练,将其放入交叉熵损失函数中就可以训练了。
全连接网络结构最典型的莫过于fcn了,如下图:
看着挺多网络层结构的,但是其实挺简单的,它和分类网络是一样的,只不过分类网络是对整幅图片进行分类的,而fcn是对图片上的像素点进行分类(输出颜色代表类别),看里面所使用到的网络结构,用到了Conv(卷积层)、Batch Normalisation层(归一化层)、Pooling(池化层)、上采样层(与卷积层正好相反),这些层结构处理后的数据都不会改变特征图的空间特性(这点很重要),
如下图:
空间不变性可以简单的归结于:对于输出的特征属性图,特征图上各特征点都能够对应到输入图片相对应的区域。
如上图所示,卷积网络是如何保证他的空间不变性的呢?卷积输出的一个特征点是通过一个卷积核卷积得到的,所以对应原图区域是相对应的3x3这输入区域,而每一个特征点对应到原图的区域都具有具体的位置,这样这个卷积操作就具有空间不变性,而全连接层为什么不具有空间不变性呢?主要的原因在于,全连接层输入是一个一维维度的数组,而输入的依旧是一个一维的数组,连输入输出结构都不是二维,维度信息早就让全连接层给丢弃了。
我们继续看fcn网络,图片通过网络模型结构后,最终的特征属性图的长宽和原图是一致的,而仅仅是通道维度不一样,而用到的网络的由于没有舍弃空间性质,所以得到的结果还具有空间不变性,这时候,可以利用输出特征图上的每个点对应原图上的每个点像素的类别,这时候,我们设置dense(全连接层)是对通道维度上进行全连接,输出结果通道维度是类别的数量,例如输入是特征图宽×特征图高×特征图的通道数,输出为:特征图的宽×特征图的高×类别数。这样就能够分类出原图像素点对应的类别数了。训练方式和普通的分类网络是一样的。
在医疗图像中,依旧可以概括为三个方面:分类、目标检测、像素级分割。然而,由于医学领域数据集难以收集到,而且在医学领域也有医学领域的特点,一般来说,医学领域也有医学领域的特点,应用上,我们仅仅需要重新设计主体网络架构就可以了,例如在器官区域切割领域,以及其他相应的领域,使用unet网络作为主题网络,Unet网络如下:
可以看到,不同的颜色代表不同的网络,output代表输出的特征图,相对于图像领域经典的网络来说,Unet网络的形状就好像一个U型网络结构,里面依旧用到了经典的网络结构外,还用到了上采样层(up conv),灰色的线条代表将特征图做加法。相对于fcn网络,一般可以理解为不同深度的网络提取的特征图的含义不一样,网络深度越深,提取到的特征图语音特征越高级。结合不同的深度特征图,可以使得分割图恢复的边缘越精细。
在医疗领域,医疗图像主要具有一下几个特点:
场景较为单一、结构固定。一般我们需要去做那个部位的CT就会拍哪个部位的照片,并不想图像领域包含大量的场景,所以高级语义特征以及低级予以特征都非常重要(所以会结合高级语义特征以及低级语义特征)。例如下图:
最终的样本场景都会和此图片类似。
数据量少,医学图片数据获取比较专业、标注也需要专业的人士,很多比赛提供不到100例数据,所以我们设计的模型不应该过大,过大的模型会导致过拟合。
多种模式下的图片。相对普通图像识别领域,医疗影像比较有趣的一点是,医疗图像是具有多种模态的。如下图:
肺结核会给出一组图片,这些图片都具有含义,我们有时候需要将它都用进去。
以下给出几个医学图像的几个比赛:
器官分割(用到了fcn以及unet网络),数据集在相应的源码中:https://github.com/ithet1007/MTL-SegTHOR
肺部肿瘤检测:
https://zhuanlan.zhihu.com/p/46714479,可以在百度云中下载:链接: https://pan.baidu.com/s/1jcbMUCjLEDxMzNfN5fFEQg 密码: pqnf
肌肉骨骼相关的疾病检测
乳腺癌检测研究,链接如下:https://web.inf.ufpr.br/vri/databases/breast-cancer-histopathological-database-breakhis/
百度云下载地址:链接: https://pan.baidu.com/s/1oVgedMdEeFd2QPHNnxwkgQ 密码: f70a
可以参考的源码:
代码部分并不太容易讲解,准备后续在做一个视频,在视频里面讲解代码
深度学习的前向传播比较的简单,仅仅是计算操作,而深度学习中的反向传播是如何推导的呢?比较好的资料关于深度学习反向传播的理论推导,例如刘建平的:
深度神经网络(DNN)反向传播算法(BP)
当然,掌握上述知识的前提最好对矩阵的一些基本知识了解:
矩阵求导术(上)
矩阵求导术(下)
以及我们经常用到的,softmax操作以及损失函数:
简单易懂的softmax交叉熵损失函数求导
如何可以,可以不同深度学习框架,仅仅用python实现一个简单的神经网络算法,当然了,这需要十分熟悉理论部分,这样就能够参照这源码是自己实现一个了:
Implementing a Neural Network from Scratch in Python – An Introduction