Advertisement

【深度学习】眼底图像的视杯和视盘分割解析

阅读量:

该研究提出了一种基于改进的UNet架构的眼底图像分割方法(称为AttU_Net),旨在更有效地对眼底图像中的视杯和视盘进行分割。通过引入注意力机制(Attention Gate),该模型能够自动分配计算资源并聚焦于重要特征。研究还比较了该方法与传统UNet的性能差异,并验证了其有效性。实验使用DRION数据集进行训练,并在测试中取得了良好的结果。

【深度学习】眼底图像的视杯和视盘分割解析

复制代码
    文章目录
    1 背景
    2 概念
    	2.1 视盘
    	2.2 视杯
    3 数据
    4 医学图像分割-Attention Unet
    5 注意力机制到底是什么-资源分配给更重要的特征(任务)
    6 对比
    7 代码

1 背景

眼睛是人类视觉感知的关键器官,在入射光线的作用下通过人眼神经细胞形成视觉信号并传递至大脑。眼睑由巩膜(眼白)、虹膜、角膜、晶状体、脉络膜以及视网膜等多个部分构成。眼底图像辅助诊断因其操作简便、成本低廉且对人体无害的优势已成为大规模视网膜疾病筛查的主要手段之一。眼底视网膜作为视觉形成的核心结构,在眼科诊疗中常借助非侵袭性且便捷的眼底图像方法对眼底视网膜进行检查以辅助判断眼部疾病。该部位由血管网、视盘区域及黄斑区等组成部分构成,并可能包含多种病变特征表现。在眼底图像辅助诊断过程中,通过分析杯盘比(即视杯与视盘的垂直直径比率或面积比率)、视杯与周边边缘之间的相对位置关系等参数的变化具有重要意义尤其对于青光眼这类眼部疾病的认识具有关键价值。此外根据相关数据统计显示杯盘面积比在医学遗传学领域内仍具有研究潜力其中遗传学贡献率为61%环境因素占比约为39%这些数据表明该指标可能在医学遗传研究中发挥重要作用因此,在完成眼底图像定位的基础上科学准确地分割杯与盘区域已成为现代眼科医学中一项不可或缺的技术任务

迁移学习一直是计算机视觉的重要研究领域之一,并通过利用一个或多个相关源域中的标记数据在目标域中完成特定任务。其中一种特殊的迁移学习技术被称为域适应,在其设定下,一个或多个源域中含有标签数据而目标域中的数据标签稀少或完全缺乏信息。不同阶段进行的领域自适应过程大致上将现有方法分为样本、特征层面以及模型层面的适应。生成式对抗网络(GAN)由Goodfellow于2014年首次提出,并基于对抗网估计生成模型的新框架展开工作;同时训练两个模型:生成模型G用于捕获数据样本分布特征;判别模型D则用于识别样本是否来自训练数据集或由G生成的数据流中。这种训练模式采用了一种最大最小化博弈的方式进行优化。研究表明,在医学图像分割任务中提出了一种新型端到端对抗生成网络SegAN;该方法采用多尺度L1损失函数以尽量缩短像素间的最短距离空间;其分割性能较最新的U-Net架构表现出更为优异的结果表现。

当前研究中发现,在实际应用中存在多种眼底成像系统间的兼容性问题。具体而言,在现有模型难以实现对视杯视盘的分割时(如图1所示),基于不同采集方式获得的眼底图像数据无法进行有效的统一处理

2 概念

在这里插入图片描述

2.1 视盘

位于视网膜中央部的是一个黄色区域——即所谓的视盘部位——它是进入整个视网膜系统中负责输出血管的重要入口点。这个区域通常呈现出圆形形态但因个体差异可能会有所变化。在视觉科学领域该区域被专业上称为"盲区"这是因为它并不包含任何用于捕获光线的颜色感知功能——具体来说这里指的是那些重要的光感受器即所谓的视杆细胞和双锥体细胞(维管束细胞)。从结构上讲这个区域主要由成百上千个神经元构成它们构成了视觉系统中的重要组成部分。通常情况下这个区域呈现的是橙至粉红色调但若出现苍白状态则提示可能存在某种疾病性病变。

2.2 视杯

该区域被称为视野中央明亮区域,在诊断青光眼中有重要价值。 当该区域向前发展时会阻挡视野从而导致青光眼的发展。 与整个视野相比较而言它是一个较小的空间仅相当于正常人视野面积的三分之一。

3 数据

在这里插入图片描述

一项创新性研究涵盖眼底图像处理领域,并特别关注一种眼底图像视杯视盘分割技术。

The model is trained on DRION dataset. 90 images to train. 19 images to test.

4 医学图像分割-Attention Unet

相较于原版的Unet架构,作者在此基础上设计了一种 novel 的 attention gate模块。该模块被巧妙地安置在每个跳跃连接处后端段,并通过这一机制对提取到的特征信息进行增强处理。整体结构如下图:

在这里插入图片描述

Attention Gate的具体结构如下:

在这里插入图片描述
在这里插入图片描述
复制代码
    def _concatenation(self, x, g):
        input_size = x.size()
        batch_size = input_size[0]
        assert batch_size == g.size(0)
    
        # theta => (b, c, t, h, w) -> (b, i_c, t, h, w) -> (b, i_c, thw)
        # phi   => (b, g_d) -> (b, i_c)
        theta_x = self.theta(x)
        theta_x_size = theta_x.size()
    
        # g (b, c, t', h', w') -> phi_g (b, i_c, t', h', w')
        #  Relu(theta_x + phi_g + bias) -> f = (b, i_c, thw) -> (b, i_c, t/s1, h/s2, w/s3)
        phi_g = F.upsample(self.phi(g), size=theta_x_size[2:], mode=self.upsample_mode)
        f = F.relu(theta_x + phi_g, inplace=True)
    
        #  psi^T * f -> (b, psi_i_c, t/s1, h/s2, w/s3)
        sigm_psi_f = F.sigmoid(self.psi(f))
    
        # upsample the attentions and multiply
        sigm_psi_f = F.upsample(sigm_psi_f, size=input_size[2:], mode=self.upsample_mode)
        y = sigm_psi_f.expand_as(x) * x
        W_y = self.W(y)
    
        return W_y, sigm_psi_f

该卷积核参数设置为kernel_size=2和strides=2,在无偏置设置的情况下,对上一层图像进行空间分辨率降维处理,并减少输出通道数量以确保能够与下一层的门控信号进行叠加运算。

phi为kernel_size=1和strides=1的卷积层(带有偏置)将导致下一层的feature map通道数量降低

由ψ组成的卷积层参数配置中,kernel size为K×K(其中K=1),stride为S×S(其中S=1),并且在该层中加入偏置项以提高模型性能。该层通过激活函数处理后的输出结果是注意力权重矩阵(C_out = 1)

其中θ_x的尺寸是φ_g的两倍,在降采样处理后其尺寸与原尺寸保持一致,并对为何仍采用上采样感到不解。
在基础UNet架构之上增添注意力机制,在自适应调节激活强度的同时实现了较高的可视化效果。值得注意的是与非局部方式不同的是无需每个像素点都与所有像素点建立关联关系本研究中所提出的这种上采样机制可被视为一种隐式的注意力传递方式。

5 注意力机制到底是什么-资源分配给更重要的特征(任务)

起源于人类视觉研究的注意力机制是一种信号处理机制。在认知科学中由于信息处理能力的限制人类倾向于聚焦于可感知信息的一部分而忽略其他可见信息这一特性被称为视觉注意机制即视网膜上不同区域具有 varying 处理能力其中视网膜中央凹部具有最强的敏感度为了有效利用有限的视觉资源人类会专注于特定区域并集中精力进行分析例如阅读时仅有少量关键词会被重点处理这种方法体现了注意力机制两大核心功能:一是识别需要关注的信息区域二是将有限的认知资源分配到重要部分目前基于自注意(self-attention)机制的设计已成为深度学习领域尤其是自然语言处理领域最广泛应用的核心组件之一过去两年关注度极高的BERT GPT以及Transformer等模型/架构都采用了这一关键的技术手段

起源于人类视觉研究的注意力机制是一种信号处理机制。在认知科学中由于信息处理能力的限制人类倾向于聚焦于可感知信息的一部分而忽略其他可见信息这一特性被称为视觉注意机制即视网膜上不同区域具有 varying 处理能力其中视网膜中央凹部具有最强的敏感度为了有效利用有限的视觉资源人类会专注于特定区域并集中精力进行分析例如阅读时仅有少量关键词会被重点处理这种方法体现了注意力机制两大核心功能:一是识别需要关注的信息区域二是将有限的认知资源分配到重要部分目前基于自注意(self-attention)机制的设计已成为深度学习领域尤其是自然语言处理领域最广泛应用的核心组件之一过去两年关注度极高的BERT GPT以及Transformer等模型/架构都采用了这一关键的技术手段

当我站在超市货架前凝视时,在人群里不期而遇了我的妻子。她的存在仿佛让我拥有了第六感,在她身边琳琅满目的商品中能够清晰辨识出哪些是我特别需要注意的物品——这些商品在我的视觉捕捉范围内呈现出独特的形态特征、鲜明的颜色对比以及富有韵律的纹理走向。面对如此繁杂的画面大脑表示压力重重难以完成信息处理任务因此我不得不采取策略性的方式进行信息筛选:即暂时过滤掉一些细节信息专注于那些能够直接帮助定位目标的关键特征——包括人物发型着装颜色以及站姿姿态等特征点。通过持续调节头部转向角度从而扩大视野范围有效帮助大脑整合更多关键信息最终锁定了目标对象。

在这里插入图片描述

在非正式语境中,人们常说:神经网络可以通过神经注意力机制聚焦于其输入的一部分:无论输入的类型或形状如何变化,这一机制都能有效执行任务,从而帮助模型更好地完成目标。当计算能力受限时,在信息处理中占据主导地位的关键手段就是通过...

图像是指对视觉感知对象进行捕捉并表达其特征的过程,在这一过程中需要将复杂的视觉信息转化为易于理解的文字描述。该过程通常采用编码器-解码器架构来进行处理:其中编码器部分设计为卷积神经网络结构,并负责提取图像中的高层抽象特征;而解码器部分则由循环神经网络构成,并用于语言建模任务。与传统方法相比,在处理复杂场景时可能会遇到编码效率和长距离依赖的问题;为此,可以引入注意力机制来优化信息提取过程。具体而言,在生成描述的每一个词语时,在输入端不仅考虑前一个词的信息,并且通过注意力机制整合与图像相关的关键特征。

6 对比

在这里插入图片描述
在这里插入图片描述

该方法通过融合下采样层的空间结构特征与当前层纹理细节,在结合sigmoid函数进行归一化处理后,能够有效提取出具有高关联性的区域,并将其与当前层激活结果相乘以突出显示本层的重要特征区域。

7 代码

Post-Process Methods
Although directly using the UNet model often leads to some prediction errors, I apply a post-processing algorithm:

The predicted area must not be too small.
The aspect ratio of the minimum bounding rectangle must fall within the range of 0.45 to 2.5.
The left-hand side area represents the final output, and one of the issues with this algorithm is that its parameters are not automatically adjustable, necessitating manual adjustment when comparing it to previous sizes.

Project Structure
本项目的结构基于自定义的DL_Segmention_TEMPLATE框架。与基准项目的区别在于, 我们在此项目中引入了perception/metric/目录中的度量模块。有关本项目结构的详细信息, 请参阅DL_Segmention_TEMPLATE中的README文件。

You can find model parameter in configs/segmention_config.json.

启动之前,请先运行main_trainer.py第一遍程序。这样,在实验目录中将能够找到data_route文件。之后,请将您的数据放置在那里。现在您可以再次运行main_trainer.py来训练模型。

How to store the Pretrained Model?

为了测试您的自定义图像,请将您的图像放置到(OpticDisc)/test/origin文件夹内,并在configs/segmention_config.json文件中调整预测设置中的img_type字段配置为自定义类型。然后运行main_test.py脚本以生成您的测试结果。请注意,测试结果位于该目录下的(OpticDisc)/test/result文件夹中。

复制代码
    class AttU_Net(nn.Module):
    def __init__(self,img_ch=3,output_ch=1):
        super(AttU_Net,self).__init__()
        
        self.Maxpool = nn.MaxPool2d(kernel_size=2,stride=2)
    
        self.Conv1 = conv_block(ch_in=img_ch,ch_out=64)
        self.Conv2 = conv_block(ch_in=64,ch_out=128)
        self.Conv3 = conv_block(ch_in=128,ch_out=256)
        self.Conv4 = conv_block(ch_in=256,ch_out=512)
        self.Conv5 = conv_block(ch_in=512,ch_out=1024)
    
        self.Up5 = up_conv(ch_in=1024,ch_out=512)
        self.Att5 = Attention_block(F_g=512,F_l=512,F_int=256)
        self.Up_conv5 = conv_block(ch_in=1024, ch_out=512)
    
        self.Up4 = up_conv(ch_in=512,ch_out=256)
        self.Att4 = Attention_block(F_g=256,F_l=256,F_int=128)
        self.Up_conv4 = conv_block(ch_in=512, ch_out=256)
        
        self.Up3 = up_conv(ch_in=256,ch_out=128)
        self.Att3 = Attention_block(F_g=128,F_l=128,F_int=64)
        self.Up_conv3 = conv_block(ch_in=256, ch_out=128)
        
        self.Up2 = up_conv(ch_in=128,ch_out=64)
        self.Att2 = Attention_block(F_g=64,F_l=64,F_int=32)
        self.Up_conv2 = conv_block(ch_in=128, ch_out=64)
    
        self.Conv_1x1 = nn.Conv2d(64,output_ch,kernel_size=1,stride=1,padding=0)
    
    def forward(self,x):
        # encoding path
        x1 = self.Conv1(x)
    
        x2 = self.Maxpool(x1)
        x2 = self.Conv2(x2)
        
        x3 = self.Maxpool(x2)
        x3 = self.Conv3(x3)
    
        x4 = self.Maxpool(x3)
        x4 = self.Conv4(x4)
    
        x5 = self.Maxpool(x4)
        x5 = self.Conv5(x5)
    
        # decoding + concat path
        d5 = self.Up5(x5)
        x4 = self.Att5(g=d5,x=x4)
        d5 = torch.cat((x4,d5),dim=1)        
        d5 = self.Up_conv5(d5)
        
        d4 = self.Up4(d5)
        x3 = self.Att4(g=d4,x=x3)
        d4 = torch.cat((x3,d4),dim=1)
        d4 = self.Up_conv4(d4)
    
        d3 = self.Up3(d4)
        x2 = self.Att3(g=d3,x=x2)
        d3 = torch.cat((x2,d3),dim=1)
        d3 = self.Up_conv3(d3)
    
        d2 = self.Up2(d3)
        x1 = self.Att2(g=d2,x=x1)
        d2 = torch.cat((x1,d2),dim=1)
        d2 = self.Up_conv2(d2)
    
        d1 = self.Conv_1x1(d2)
    
        return d1

全部评论 (0)

还没有任何评论哟~