| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 【计算机视觉】新冠肺炎COVID-19 CT影片阳性检测,感染区域分割,肺部分割,智慧医疗实践,医疗影像处理示例 -> 正文阅读 |
|
[人工智能]【计算机视觉】新冠肺炎COVID-19 CT影片阳性检测,感染区域分割,肺部分割,智慧医疗实践,医疗影像处理示例 |
引言新型冠状病毒肺炎(Corona Virus Disease 2019,COVID-19),简称“新冠肺炎”,世界卫生组织命名为“2019冠状病毒病”。截止至2021年12月5日,全球累计确诊病例264047110例,累计死亡5240683例,并且这个数字还在继续高速攀升。 基于肺部CT(computed tomography)影像的人工智能诊断是针对新型冠状病毒肺炎的有效辅助诊断方法之一。 本次实验基于COVID-19 CT scans数据集,根据患者肺部的CT扫描分析,对患者COVID阳性还是阴性进行分类。如果患者Covid阳性,则这行肺部和感染区域的分割。实验还实现了交互性良好的可视化界面,更有助于医护人员对病情的快速筛查。 数据集概述COVID-19 CT scans数据集包含20例诊断为COVID-19的患者的CT扫描以及专家对肺部和感染的分割。具体参数如下: 实验方法为了系统的完善,本次实验切分为五个小任务:图像预处理、新冠肺炎阴阳性识别、肺部分割、感染区域分割、可视化界面搭建。 图像预处理主要应用本学期所学的图像增强的一些方法,比如直方图均衡,轮廓检测等,然后还引入了形态学的腐蚀和膨胀操作。 阴阳性识别是一个经典的二分类任务,我们使用较为简单的CNN网络进行分类任务的训练,最终的准确率达到0.96以上。 肺部分割与感染区域分割是语义分割任务,前者的语义相对简单,而后者的语义相对比较复杂。这两个任务都基于U-net网络进行训练,不同的是,用于训练感染区域分割任务的U-net网络要更为复杂一些。此外,使用dice loss作为损失函数(后续具体介绍),最终得到的dice系数分别为0.8353、0.7821。 可视化界面的搭建使用pyqt5依赖包,搭建较为简易的交互界面,并将训练好的网络模型应用到该界面,从而得到一个具有实际应用价值的新冠肺炎识别系统。 结果预览实验步骤与过程1. 图像预处理1.1 加载metadatametadata文件存放着COVID-19 CT scans数据集的文件目录,我们可以通过read_scv函数加载这个文件,从而获得所有数据文件的目录,并在后续能够访问他们。
1.2 图像增强为了后续更好的识别与预测,我们需要对图像进行增强,最简单的做法便是增强图像的对比度。这里我们使用OpenCV的createCLAHE函数以统一的方式进行直方图均衡化,使得暗区可见,而亮区以动态格式清晰可见,从而增强图像的对比度。 1.3 图像分割(ROI提取)观察CT图片,除了我们感兴趣的肺部区域之外,还有一些黑色的背景,当然为了后续更好的识别与预测,我们只提取感兴趣的肺部区域,所以我们需要对图像进行一个剪裁。因为这个数据集有lung mask已经为我们标注了大概的位置,所以具体的做法如下: (1)检测轮廓 为了更好地提取出整个肺部区域,经过探索分析,发现肺部的像素值都比较接近,可以和其他背景很好地分开,换言之我们可以使用聚类的方法,将肺部检测出来。 做完聚类之后,可以使用形态学技术里面的腐蚀和膨胀(参考:https://zhuanlan.zhihu.com/p/110330329)对聚类得到的肺部区域先进行腐蚀,然后接着进行膨胀(即开操作),这样做的目的是使对象的轮廓变得光滑,断开狭窄的间断和消除细的突出物。 (3)图像剪裁 这样我们就完成了肺部的ROI提取,下面我们挑取10张图片,分别打印出它们对应的原图、增强图、以及提取到的ROI。 1.4 推广到infection和lung mask两个数据集前面是基于ct_scan这一组数据做的处理,现在我们需要将这一处理方法推广到其他两个数据集,处理的流程与前面的大致相同,都是先图像增强然后再做ROI的提取,详细的代码可以参见提交的附件中的DataPreprocessing中的print_all函数。这个函数里面,我们挑取了5张图片,分别打印出其对应的原图、增强之后的图像、原来的lung mask、处理之后的lung mask、原来的infection mask以及处理之后的infection mask。 2. 阴阳性分类2.1 网络架构新冠肺炎的阴阳性分类属于一个二分类任务,标签‘1’代表阳性,‘0’代阴性。由于上面对数据做了预处理,并保存在文件中,所以做分类任务的时候只需要加载出来就可以了。 二分类任务有很多的方法可以做,比如经典机器学习的SVM、LDA、线性回归等模型,或者深度学习 的U-net网络、CNN、AlexNet等网络模型。在本任务中,我们选择自己设计一个简单的CNN网络,该网络有4个卷积层,每个卷积层之后有一个最大池化层和normalization,其网络架构如图3-2-1所示。我们可以看到该网络的输入是1281281大小的图像,经过神经网络处理之后,输出一个一维特征。 2.2 网络搭建本次实验使用TensorFlow框架搭建2DCNN网络,网络搭建分为两步,首先是定义网络框架,然后是定义网络的学习率等参数然后编译网络。 (1)定义网络框架
2.3 数据集准备我们都知道神经网络需要大量的数据进行训练,因此我们定义好神经网络之后,要先准备好数据,然后再进行训练。 数据集只需要从前面的数据预处理保存的文件中加载出来即可,然后我们需要将数据集划分为训练集/验证集/测试集,其比例分别为6:2:2。注意,这里比经典机器学习多了一个验证集,其作用是验证网络的好坏,计算loss作为梯度反向传播的依据,这样做有利于防止网络过拟合。 2.4 训练网络准备好网络框架和数据集之后,我们接下里就是训练网络了,训练的过程中,网络会进行梯度反向传播,不断优化各个参数,然后我们只取其中loss最小的一个模型。 3. 阳性肺部区域分割3.1 肺部区域分割的必要性与做法为什么要做肺部区域的预测分割呢?虽然在数据集上已经标记好了肺部的区域,但是这是人工所标记的,后续我们搭建的可视化界面,作为一个应用平台,用户不会告诉你肺部在哪个位置。这个时候就要求我们的系统可以自动地对肺部区域进行分割,然后再出感染的部位(这将在第四个部分进行叙述)。因此,肺部区域的分割不仅有利于提高系统的交互性,更有利于后续感染区域的分割。 同时,因为我们这个时候不是分类任务了,而是图像分割任务,因此我们需要定义新的网络框架进行训练,当然也可以使用其他粗糙的方法,但是往往并不鲁棒。这里我们选择使用U-net网络(后续会详细介绍)进行特征的提取,然后使用Dice Loss作为损失函数,其中dice看理解为是两个轮廓区域的相似程度。 3.2 网络架构(1)关于语义分割 (2)关于U-net Unet网络非常的简单,前半部分就是特征提取,后半部分是上采样。在一些文献中把这种结构叫做编码器-解码器结构,由于网络的整体结构是一个大些的英文字母U,所以叫做U-net。 由于网络层越深得到的特征图,有着更大的视野域,浅层卷积关注纹理特征,深层网络关注本质的那种特征,所以深层浅层特征都是有格子的意义的;另外一点是通过反卷积得到的更大的尺寸的特征图的边缘,是缺少信息的,毕竟每一次下采样提炼特征的同时,也必然会损失一些边缘特征,而失去的特征并不能从上采样中找回,因此通过特征的拼接,来实现边缘特征的一个找回。 而医疗影像语义较为简单、结构固定。因此语义信息相比自动驾驶等较为单一,因此并不需要去筛选过滤无用的信息。医疗影像的所有特征都很重要,因此低级特征和高级语义特征都很重要,所以U型结构的skip connection结构(特征拼接)更好派上用场。 3.3 网路搭建跟前面一样,我们依然使用TensorFlow框架搭建网络,这里代码比较长,就不截图了,详细的可以参考附件的代码。 3.4 Dice Lossdice loss 的提出是在V-net中,其中的一段原因描述是在感兴趣的解剖结构仅占据扫描的非常小的区域,从而使学习过程陷入损失函数的局部最小值。所以要加大前景区域的权重。 4. 阳性感染区域分割4.1 肺部区域分割的必要性与做法当我们预测出新冠肺炎阳性之后,工作做得还是不够的,一个好的系统除了能帮助医生诊断之外,更理想的效果是同时预测出感染的区域。阳性感染区域的预测正是在做这个工作。 我们用数据集中标记好的infection mask作为目标,使用更加复杂的U-net网络去提取拟合特征,使用dice loss损失函数,最终我们的dice系数达到了0.78219,已经可以很好的预测出感染区域了。 4.2 网络架构阳性感染区域的分割说到底还是一个语义分割的任务,只不过这个语义相对于肺部分割来说要更加困难和复杂。具体体现在:1)感染区域的位置不稳定,分布方差很大,2)感染区域的大小也有很大的差别,3)感染区域的形状不像肺部那样有潜在的规律。 因此,为了达到阳性感染区域分割的目的,我们必须使用更加复杂的网络来训练。但我们还是在U-net的基础上进行设计,多加了一些卷积层和池化层,使得网络的非线性特征提取能力更强,使网络语义分割能力更加鲁棒。 在损失函数上,我们依然使用衡量两个区域相似度的dice系数,并由dice系数表达出dice loss。 除此之外,在学习率的设置上,这次我们区别于之前固定的学习率,让网络自适应去调整学习率,具体怎么做的呢?TensorFlow框架开放了相关的接口,我们只需要调用就可以了。 4.3 网络搭建这一次为了实现更加复杂的网络结构,区别于上两个任务的网络搭建,这次采用block的形式来搭建网络。Block的好处是将网络相同结构的块进行包装形成一个新的block,这样既方便代码的编写,也有助于理清网络架构。 4.4 训练训练和之前也类似,但是这一次因为数据量大,网络复杂,我们需要自己定义batch size(实际上最好是自己定义),防止笔记本吃不消,这里选择的是8。训练过程如图3-4-3所示,可以看到最好的dice是0.78219,已经达到了初步应用的基础。 5. 可视化系统搭建5.1 预览
然后上方最左侧是文件路径,可以用于我们选择输入的CT,往右是开始诊断按钮,再往右用于显示识别结果,黄色表示阴性,红色表示阳性。 5.2 操作说明进入界面之后,首先点击“…”选择CT图像,然后会看到加载出来原CT图像,CT增强之后的图像和相应的像素分布直方图。然后点击开始诊断按钮,即可进行诊断,等待3s左右,便可看到结果。由于有一定的误差,建议多次识别以获得更加准确的结果。 5.3 原理介绍怎么实现的呢?界面的设计我使用的是pyqt5,这要是粘贴图片和显示文字,然后识别的过程是用前几个任务训练好的模型(已经保存)进行识别。 首先需要注意的是pyqt5不能直接显示pyplot画的图,这里采用的做法比较粗暴,就是先保存下来,然后再用图片的方式给pyqt5获取. 另外一个比较关键的是,如何加载模型并进行识别,我的做法是保存训练好的模型参数,然后load进来之外,以处理后的CT图作为输入,先做阴阳性识别任务,如果识别的是阳性,再进行infection区域的分割,然后将分割之后的图像和处理后的CT图像进行图层复合。 参考文献[1]. 唐迁, 杜博, 恽爽, 高莉, 吴爽, 张超, 兰猛, 陈紫业, 李亮, 查云飞, 张良培, 李平湘. COVID-19 CT影像智能诊断系统[J]. 武汉大学学报·信息科学版, 2020, 45(6): 846-853. doi: 10.13203/j.whugis20200225. http://ch.whu.edu.cn/cn/article/doi/10.13203/j.whugis20200225. [2]. 百度百科·新型冠状病毒肺炎. [3]. Kaggle COVID-19 CT scans. https://www.kaggle.com/andrewmvd/covid19-ct-scans. [4]. 知乎·图像分割必备知识点 | Unet详解 理论+ 代码: [5]. 知乎·最全综述 | 图像分割算法:https://zhuanlan.zhihu.com/p/70758906. [6]. 知乎·U-Net:https://zhuanlan.zhihu.com/p/311519960. [7]. 博客园·python+opencv+dlib+pyqt5人脸识别实践: 附加说明实验环境说明:操作系统为Windows10,python版本为3.8,pycharm为2021专业版,TensorFlow=v2.4.0,keras=v2.2.5,nibabel=3.2.1,可视化界面使用pyqt5,网络模型3D作图使用PlotNeuralNet。 如需源码,或者有学术交流的需要,请私信联系我。需要源码的请在评论区留下您的邮箱。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 16:59:10- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |