VGAN实现视网膜图像血管分割(基于pytorch)

这篇具有很好参考价值的文章主要介绍了VGAN实现视网膜图像血管分割(基于pytorch)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景介绍

VGAN(Retinal Vessel Segmentation in Fundoscopic Images with Generative Adversarial Networks)出自2018年的一篇论文,尝试使用生成性对抗网络实现视网膜血管分割的任务,原论文地址:https://arxiv.org/abs/1706.09318
在github上有相应的源码仓库,不过由于版本的原因也会出现一些bug,本篇博客在复现项目的过程中也对源码进行了相应的修改,源码地址: https://github.com/guyuchao/Vessel-wgan-pytorch?tab=readme-ov-file

另一方面,刚好这个项目作为我2023年的最后一个项目,就斗胆当作是2023年编程之旅的回顾,博主是在茫茫知识海洋漂泊的一叶小舟,还有许多的知识尚未学习,希望可以和大家互相交流学习!

2024年,冲鸭!!!!!


前言

生成对抗网络(Generative Adversarial Networks)在提出的时候是为了实现模型创造性的能力,如今在AI图像生成领域已经有非常广阔的应用,例如知名的Midjourney网站,就是通过用户输入的prompt提示,利用GAN的框架生成对应用户想要生成的图片;我自己对于这个模型的名声也是早有耳闻,刚好前一段时间看到了《Retinal Vessel Segmentation in Fundoscopic Images with Generative Adversarial Networks》这篇文章,内容里探究了把GAN模型应用到视网膜血管分割的领域,刚好可以与我本学期的生物医学创新实践联系在一起。

生成对抗网络介绍

生成对抗网络(Generative Adversarial Network)简称GAN,是深度学习领域的一种重要模型,由Ian Goodfellow在2014年提出。

GAN模型包括两部分:一个是生成器(Generator),另一个是判别器(Discriminator)。这两部分模型相互博弈,共同训练,赋予网络生成特定分布的数据的能力。

1. 生成器(Generator):该部分的目标是生成尽可能真实的数据。例如,如果我们想让网络生成一张风景图片,生成器的目标就是生成一张看上去就像是某个摄影师拍摄的风景照片。

2. 判别器(Discriminator):该部分的目标是尽可能好地区分出真实的和生成的数据。在风景图片的例子中,判别器需要区分出哪些图片是真实的风景照片,哪些是生成器生成的假照片。

两者相互博弈的过程中,判别器会不断提高对真假数据的判断能力,生成器也会不断提高生成数据的逼真度,理想状态下,生成器生成的数据将和真实数据无法区分,判别器对生成器的生成结果的判断是50%,即做出了随机猜测。这样,就完成了GAN的训练过程。

视网膜分割的GAN模型(VGAN)

VGAN实现视网膜图像血管分割(基于pytorch),pytorch,人工智能,python

从上图中可以看出,模型中的GAN的generator是一个U-net形状的网络模型,每一层上采样层都与对称的下采样的输出进行连接,能够很好的处理图像的边缘及其他的细节特征;discriminator是一个多层的下采样的网络模型,最后是输出是实现一个二分类的效果,即,接近0表示判断机器生成的(generator),接近1表示判断为真实的血管分割标签,每层的generator和discriminator都是由基本的block卷积神经网络组成,block的代码构建为:

class block(nn.Module):
    def __init__(self,in_filters,n_filters):
        super(block,self).__init__()
        self.deconv1 = nn.Sequential(
            nn.Conv2d(in_filters, n_filters, 3, stride=1, padding=1),
            nn.BatchNorm2d(n_filters),
            nn.ReLU())
    def forward(self, x):
        x=self.deconv1(x)
        return x

 是用nn.Sequential()连接的包含卷积,标准化和池化的经典卷积层,卷积核为,步长为1,边缘补充为1,处理的视网膜图片是三通道彩色图盘,第一层的intput_channel为3;下面用pytorch的tensorboard工具对搭建的generator和discriminator进行网络结构的可视化

VGAN实现视网膜图像血管分割(基于pytorch),pytorch,人工智能,python

VGAN实现视网膜图像血管分割(基于pytorch),pytorch,人工智能,python

这里需要注意的是,在原论文中,Discriminator的输入并不是Generator直接生成的图片或者原数据集中的label,而是需要在C通道上与进行分割的原视网膜图片进行合并再进行输入。

损失函数

在训练Generator和训练Discriminator时,使用不同的损失函数,我们最后是使用Generator进行mask的生成,也就是使用Generator输入需要进行视网膜血管分割的图片,输出分割的结果,所以我们更加注重Generator损失函数的设计。

GAN整体的损失函数可以定义为

VGAN实现视网膜图像血管分割(基于pytorch),pytorch,人工智能,python

对于D(Discriminator),在代码中不设计具体的损失函数,从任务设计中可以得出,当输入到D的是真实的标签图像时,我们期望D输出越接近1越好;当输入到D的是Generator生成的图像时,我们期望D输出越接近0越好,基于这种关系,我们直接把D的输出作为损失函数,同时,为了避免GAN模型中常见的断层问题,引入了经典的WGAN方法(Gradient Penalty),即获得一个1-Lipschitz函数,保证GAN模型的训练曲线是足够平滑从而生成稳定的图片,在梯度计算中引入VGAN实现视网膜图像血管分割(基于pytorch),pytorch,人工智能,python作为梯度惩罚,则D的损失函数可以表示为:

VGAN实现视网膜图像血管分割(基于pytorch),pytorch,人工智能,python

对于G,为适应分割的任务不需要使用隐含空间的向量而是直接获取img的输入,具体地,在代码中使用二分类交叉熵损失函数获取与对应标签的loss值,同时加上来自D的反馈,具体的损失函数为:

VGAN实现视网膜图像血管分割(基于pytorch),pytorch,人工智能,python

数据集预处理

本次项目使用的数据集是经典的视网膜血管分割数据集,含有20张训练集和20张测试集,每张视网膜眼底的图片是像素的三通道彩色tif格式图片,对应的标签是像素单通道灰度tif图片

VGAN实现视网膜图像血管分割(基于pytorch),pytorch,人工智能,python

对img的预处理包括随机改变图片的亮度、对比度和色相,图片像素标准化、转换成tensor数据的经典图片训练格式[B,C,H,W];

对label的预处理包括图片像素标准化、转换成tensor数据的经典图片训练格式[B,C,H,W];

同时对img和label的预处理包括随机裁剪图片高和宽为像素大小,随机水平翻转和垂直翻转;

下面是对训练数据中的进行预处理后的结果可视化

VGAN实现视网膜图像血管分割(基于pytorch),pytorch,人工智能,python

训练过程

一开始打算把本项目放到colab上跑或者服务器上跑,在此之前抱着试一试的态度先用本地的显卡1080ti加4G显存跑了50个epoch,结果竟然能跑得动!于是就先跑了300个epoch,显卡没崩,结果保存在./pth中。

对于GAN的结果,除了使用传统的评估方法外,也会对训练过程的结果进行输出可视化看看结果有没有生成奇奇怪怪的图像从而停止训练重新调整,不过对于本次项目,Generator的输入不包含隐含空间z,而且加入了WGAN进行约束,所以生成的图像基本上是比较完整的;作为视觉上直观地对GAN的效果进行评估,我们每跑50个epoch对应输出测试集生成的分割图像,保存在对应的文件夹名称里面,跑完全部epoch后,对应把D和G训练好的checkpoint也保存在./pth路径下。

300个epoch跑了一个多小时,显卡的散热吹风机感觉可以起飞了,不过结果其实可圈可点,为了不浪费训练好的资料,后面又写了一个re_train脚本,读取前一次训练好的模型权重再进行训练,又花了一个小时跑了300个epoch,结果保存在./pth2目录下,结构与./pth中文件相同,所以综合起来一共训练了600个epoch。

结果分析

 先对比每50个epoch生成的图像,选取测试集中的第一张图片

VGAN实现视网膜图像血管分割(基于pytorch),pytorch,人工智能,python

VGAN实现视网膜图像血管分割(基于pytorch),pytorch,人工智能,python

对于测试集的预处理也包括随机裁剪像素像素大小与随机水平翻转与垂直翻转,所以生成的图像包含有不同的方向和裁剪风格。

从第50个epoch到第600个epoch结果,可以明显的看出图片质量提升的效果,说明Generator的学习是非常有效果的,没有出现GAN中经常出现的图片断层效果。

对比一下对应的眼底原图和血管分割标签图:

VGAN实现视网膜图像血管分割(基于pytorch),pytorch,人工智能,python

从视觉上来看,GAN生成图像与原图像的分割标签是比较接近的。

接下来我们使用训练好的Generator模型进行量化的对比:

VGAN实现视网膜图像血管分割(基于pytorch),pytorch,人工智能,python

绘制对应的PR曲线与ROC曲线:

VGAN实现视网膜图像血管分割(基于pytorch),pytorch,人工智能,python

从两个曲线的效果可以看出,训练出来的模型在测试集上也具有比较好的效果,本次项目使用的VGAN在处理视网膜血管分割的任务上体现出比较好的性能。

参考文献

  1. Son, J., Park, S.J., & Jung, K. (2017). Retinal Vessel Segmentation in Fundoscopic Images with Generative Adversarial Networks. ArXiv, abs/1706.09318.
  2. Arjovsky, M., Chintala, S., & Bottou, L. (2017). Wasserstein GAN. ArXiv, abs/1701.07875.

彩蛋

我们都知道GAN以创作能力而闻名,那我们试一下用上面训练好的模型接受随机初始化满足正态分布的z隐含空间的数据会输出怎么样的图像

VGAN实现视网膜图像血管分割(基于pytorch),pytorch,人工智能,python

嗯...看来想要GAN生成像样的图片,还是需要再训练机制里面下手文章来源地址https://www.toymoban.com/news/detail-794319.html

到了这里,关于VGAN实现视网膜图像血管分割(基于pytorch)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于U-Net网络实现图像分割

    黎长淼,男,西安工程大学电子信息学院,2022级研究生 研究方向:控制科学与工程 电子邮件:1043626870@qq.com 陈梦丹,女,西安工程大学电子信息学院,2022级硕士研究生,张宏伟人工智能课题组 研究方向:机器视觉与人工智能 电子邮件:1169738496@qq.com U-Net是2015年提出的一种

    2024年02月09日
    浏览(40)
  • 毕业设计-基于 MATLAB 的图像分割算法研究及实现

    目录 前言 课题背景和意义 实现技术思路 一、MATLAB 开发环境简介 二、图像分割算法设计  MATLAB代码  实现效果图样例 最后     📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要

    2024年02月02日
    浏览(69)
  • python 图像处理——图像分割及经典案例篇之基于颜色的图像分割

    前言 作者在第一部分向大家介绍了图像处理的基础知识,第二部分介绍了图像运算和图像增强,接下来第三部分我们将详细讲解图像分割及图像处理经典案例,该部分属于高阶图像处理知识,能进一步加深我们的理解和实践能力。图像分割是将图像分成若干具有独特性质的区

    2024年02月11日
    浏览(56)
  • 【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割7(数据预处理)

    在上一节:【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6(数据预处理) 中,我们已经得到了与 mhd 图像同 seriesUID 名称的 mask nrrd 数据文件了,可以说是一一对应了。 并且, mask 的文件,还根据结节被多少人同时标注,区分成了4个文件夹,分别是标注了一、二、三、四次,

    2024年02月07日
    浏览(52)
  • (图像分割)基于图论的归一化分割

    解释:将图像映射成图,以图为研究对象,利用图的理论知识获得图像的分割。 下面介绍:图的基本理论,基于图论的归一化分割算法 图G=(V,E,),分别是:节点、边、顶点和边的对应关系。简单记为G=(V,E)。 图的几个基本概念 1.顶点的度【无向图、有向图(入度、

    2024年02月07日
    浏览(41)
  • 【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割2(基础数据流篇)

    构建 pytorch 训练模型读取的数据,是有模版可以参考的,是有套路的,这点相信使用过的人都知道。我也会给出一个套路的模版,方便学习和查询。 同时,也可以先去参考学习之前的一篇较为简单的 3D 分类任务的数据构建方法,链接在这里:【3D图像分类】基于Pytorch的3D立体

    2024年02月05日
    浏览(54)
  • 基于深度学习的图像分割

    摘要 遥感图像分割是利用遥感技术获取的高分辨率图像进行像素级别的分类,将图像中的不同物体或不同地物提取出来的过程。这个过程对于遥感应用具有重要意义,因为它能够提取出地物和地表特征,如河流、道路、建筑、植被、水体等,并且这些特征是地面实际存在的。

    2024年02月06日
    浏览(44)
  • 基于区域的图像分割

    基于区域的图像分割是数字图像处理中常用的一种方法,它通过将图像中的像素分配到不同的区域或对象来实现图像分割的目的。相比于基于边缘或阈值的方法,基于区域的图像分割更注重像素之间的相似性和连续性,能够更好地捕捉到图像中不同对象的区域特征。本文将介

    2024年02月05日
    浏览(44)
  • 基于边缘的图像分割

    基于边缘的图像分割是数字图像处理中常用的一种方法,它通过检测图像中的边缘信息来实现图像的分割。边缘通常代表着图像中不同区域之间的边界或目标的轮廓,因此基于边缘的图像分割方法能够较好地提取出图像中不同对象的边界信息。本文将介绍基于边缘的图像分割

    2024年02月05日
    浏览(35)
  • OpenCV数字图像处理基于C++:图像分割

    图像阈值化分割是一种常用的、传统的图像分割技术,因其 实现简单、计算量小、性能比较稳定 而成为图像分割中基本和应用广泛的分割技术。特别 适合于目标和背景占据不同灰度级范围的图像 。不仅 可以极大地压缩数据量 ,而且大大 简化了分析和处理的步骤 ,是进行

    2024年02月11日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包