paddle实践---基于Unet的右心室内膜分割

2023-11-01 11:50

本文主要是介绍paddle实践---基于Unet的右心室内膜分割,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于UNet的右心室分割

任务说明

利用UNet网络对RSCV数据集进行分割预测。

RSCV数据集简介:解压该数据集后,我们可以得到5个文件:一个训练集,两个测试集及其各自心内膜心外膜的坐标。

训练集中包含16个病人的目录,每个病人目录下有原始图像集合P0Xdicom,里面都是dcm文件;心内膜心外膜的坐标目录P0Xcontours-manual;以及人工标注的图像列表P0Xlist.txt

开发工具

Python版本:Python3.7

框架版本:Paddlepaddle2.2.2

相关库:pandas、os、tqdm、logging、numpy、PIL中的Image、

cv2、pydicom、matplotlib.pyplot、scipy.misc

设计内容

软件的设计框架逻辑图为:

image-20220524233842668

数据处理

该部分我们首先将dcm文件转化成png文件,再把心内膜与心外膜的坐标列表txt文件转化成坐标数组,利用cv2的fillConvexPoly函数将轮廓转成掩膜图片并保存成png格式。

同时,因为PaddleSeg采用通用的文件列表方式组织训练集、验证集和测试集,所以我们在训练、评估、可视化过程前必须准备好相应的文件列表。文件列表的格式为原始图片路径 标注图片路径

image-20220524233907086

构建网络

我们另外定义了一个BCEloss的函数,并调用Diceloss。我们将会通过训练和测试选择其一作为我们最后的损失函数。

  • BCEloss:用于二分类的交叉熵损失函数

image-20220524233938993

  • Diceloss:集合相似度函数。

image-20220524233951092

Dice系数,一种集合相似度度量函数,通常用于计算两个样本点的相似度(值范围为[0, 1])。计算公式为:image-20220524234014279

|X⋂Y| - X 和 Y 之间的交集;|X| 和 |Y| 分别表示 X 和 Y 的元素个数. 其中,分子中的系数 2,是因为分母存在重复计算 X 和 Y 之间的共同元素的原因。

如果Dice系数越大,表明集合越相似,Loss越小;反之亦然。

训练部分

我们基于paddleSeg里面的train.py文件,重写了一遍train函数,使之更符合我们的训练要求。为了选择最好的模型,我们在调整了部分超参数。

损失函数:BCEloss和Diceloss

优化器:Adam和SGD

(其余固定的超参数可以在代码中观察到)

经过我们的测试,模型训练两千轮的效果基本达到最好,往后效果无太大变化。

在该环节中,为了能够观察到损失函数的变化趋势,我们另外将三种损失函数画在同一张图中,详见第7部分。

测试部分

在评估模型过程中,由于paddle自带的predict函数没有算miou的,所以我们重新写了一个计算miou函数。同样为了匹配predict函数的输入,我们需要将输入图像转化成图像列表。

为了更好更直观地看到模型的性能优劣,我们计算miou并画出miou变化曲线图。

我们发现,miou曲线非常跌宕,在部分图像中,miou值特别低。为了解释该现象,我们另外还绘制了箱型图,观察离群值。观察后我们发现,除了极端部分(及右心室太小了),大部分情况下都是正常预测的。

算法原理

Unet

image-20220524234217978

Unet包括两部分:第一部分,特征提取;第二部分上采样部分。由于网络结构像U型,所以叫Unet网络。

特征提取部分,每经过一个池化层就一个尺度,包括原图尺度一共有5个尺度。

上采样部分,每上采样一次,就和特征提取部分对应的通道数相同尺度融合,但是融合之前要将其裁剪到合适的尺寸再拼接。可以看到,输入是572x572的,但是输出变成了388x388,这说明经过网络以后,输出的结果和原图不是完全对应的。

蓝色箭头代表3x3的卷积操作,红色箭头代表2x2的最大池化操作,需要注意的是,如果pooling之前featuremap的大小是奇数,有可能会损失一些信息。所以要选取合适的输入大小,因为2*2的max-pooling算子适用于偶数像素点的图像长宽。绿色箭头代表2x2的反卷积操作,操作会将featuremap的大小乘2。灰色箭头表示复制和剪切操作,可以发现,在同一层左边的最后一层要比右边的第一层要大一些,这就导致了,想要利用浅层的feature,就要进行一些剪切。输出的最后一层,使用了1x1的卷积层做了分类。最后输出了两层:前景和背景。

Unet++

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2n4woWRO-1653408228309)(https://s2.loli.net/2022/05/25/tEzlYAudCkaTJXx.png)]

我们需要图像的浅层特征和深层特征,但是如果每次都是用UNet来训练得到这些数据的话,所耗费的时间过久。而UNet++解决了不同数据量、不同场景应用对网络深度的要求,直接省去对UNet网络深度修改的时间。

观察Unet++的网络架构,很明显看出来它是一个可以被剪枝的网络架构,这样子它就可以达到任务所需要的任意深度。

Unet3+

image-20220524234320998

UNet3+有一个全尺寸连接模块,通过这个模块可构造出最后的特征图。它的全尺寸连接主要是来自三个部分:

\1. 较小尺度编码器,此部分保留了细节信息,即融合细粒度语义。编码器分别下采样4倍和2倍,以统一特征图的大小。

\2. 相同尺度编码器,此部分直接进行3*3卷积,64通道操作。

\3. 较大尺度解码器,此部分融合了粗粒度语义信息。分别进行2倍与4倍的上采样,同样是为了保证特征图大小的统一。

f3dcb4ddb99f4879a9c941dcfaa749db

UNet3+相比与前两个网络,还有个全尺度监督。UNet++也有个全尺度监督,但是它是只对第一层进行深连接,即对全分辨率特征图进行深监督。而UNet3+是每个解码器对应一个侧输出,通过ground truth进行监督。为了实现深度监控,每个解码器的最后一层被送入一个普通的3 × 3卷积层,然后是一个双线性上采样和一个sigmoid函数。

加上双线性上采样可以将第2、3、4、5层扩展成全分辨率特征图,保证与第一层相同,这也是全尺寸深监督的关键操作。另外,它还可以最大限度保证上采样过程中边缘信息的完整性(医学图像边缘的不确定性决定要尽量保障边缘信息不丢失)。

IMG_256

另外,为了防止非器官图像的过度分割、提高模型的分割精度,UNet3+中添加一个额外的分类任务来预测输入图像是否有器官,从而实现更精准的分割。主要通过对不同尺度的解码器模块的结果进行一系列的操作来实现,包括Dropout,1x1的卷积,max pooling和 sigmoid函数,就可以得到一个分类结果(0表示没有器官,1表示有器官)。然后,将分类结果和分割结果相乘,这样就可以抑制对非器官图像的过度分割,从而提高模型的分割精度,实现精准分割。

IMG_256

程序实现的核心部分我觉得有两个:对原数据的处理及重写train函数。

原数据的处理主要就是如何将坐标转化成掩膜图片,然后就是匹配PeddleSeg的输入。

截屏2022-05-21 23.10.54

Train函数:

计算损失函数并且更新学习率。

截屏2022-05-21 23.13.54

每次训练完模型都要经过验证集,验证集的作用是筛出在验证集上miou最高,及效果最好的模型参数,并加以保存。

截屏2022-05-21 23.03.09

调试过程

在调试过程中我们主要做的工作是针对不同的超参数做修改。

得到以下的图表:(均以测试集的miou作为比较的指标)

  • lr:2e-3,以UNet为基准模型,iters=1000
BCElossDiceloss
Adam0.6731700.623592
SGD0.013464(但是loss图像下降的很好看)(跑2000轮之后,到达0.67655, 2500/3000轮到0.71)0.634773(但是loss跌宕特别强,没有很明显的下降趋势)
  • lr=2e-3,iters=1000
BCElossDiceloss
UNetUNet++UNetUNet++
Adam0.6543210.6577970.6278490.648341
SGD0.0195780.0923490.6270370.663573
  • l Loss function=BCEloss, optimizer=Adam,iters=1000
lr\网络模型UNetUNet++
2e-30.6543210.657797
2e-40.6958800.698098

结果分析

  • UNet,UNet++,UNet3+在相同超参数下训练两千轮的loss变化图和miou变化图:

lr=2e-3,iters=2000,optimizer=Adam,loss function=BCEloss

loss_2000

miou_2000

网络模型UNetUNet++UNet3+
测试集上的miou0.7065860.7247830.7067295

观察一下结果,发现大部分结果是正常的,除了少数离群值

img

找一下识别效果不太好的图片,就是这些心内膜已经很小的图片,此时比较难识别,经常识别就是空的

image-20220524235124176

而像这种面积很大的很好识别

image-20220524235102818

另外还有一个问题,有时识别会出现两块这种情况,这样或许能通过增大感受野去解决

image-20220524235221984

源码已经公开于paddle平台

欢迎fork欢迎讨论

源码地址

最后再略微吐槽下,paddle的在线环境实在不太好用

感谢我的两位队友的支持!

这篇关于paddle实践---基于Unet的右心室内膜分割的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/322750

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测

MyBatis-Plus 自动赋值实体字段最佳实践指南

《MyBatis-Plus自动赋值实体字段最佳实践指南》MyBatis-Plus通过@TableField注解与填充策略,实现时间戳、用户信息、逻辑删除等字段的自动填充,减少手动赋值,提升开发效率与... 目录1. MyBATis-Plus 自动赋值概述1.1 适用场景1.2 自动填充的原理1.3 填充策略

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

虚拟机Centos7安装MySQL数据库实践

《虚拟机Centos7安装MySQL数据库实践》用户分享在虚拟机安装MySQL的全过程及常见问题解决方案,包括处理GPG密钥、修改密码策略、配置远程访问权限及防火墙设置,最终通过关闭防火墙和停止Net... 目录安装mysql数据库下载wget命令下载MySQL安装包安装MySQL安装MySQL服务安装完成