目录
2.2 Transformation Consistent Self-ensembling Model(变换一致性自集成模型)
2.3 Training and Inference Procedures(训练和推理阶段)
3 Experiments and Results(实验和结果)
3.1 Dataset and Evaluation Metrics
3.2 Analysis of Our Method(我们的方法分析)
本周完成的计划
- 读半监督分割论文《Semi-supervised Skin Lesion Segmentation via Transformation Consistent Self-ensembling Model》
- 学习了两种典型通道和空间注意力机制模块的知识和代码实现
论文阅读1
Semi-supervised Skin Lesion Segmentation via Transformation Consistent Self-ensembling Model(基于变换一致性自集成模型的半监督皮肤病变分割)
ABSTRACT(摘要)
皮肤镜图像上皮肤病变的自动分割是黑色素瘤计算机辅助诊断的重要组成部分。近年来,人们提出了许多基于全监督深度学习的皮肤病变自动分割方法。然而,这些方法需要经验丰富的皮肤科医生进行大量的像素级注释,这是非常昂贵和耗时的。
在这篇文章中,我们提出了一种新的半监督皮肤病变分割方法,其中网络通过加权组合来优化网络,该加权组合仅针对已标记输入的公共监督损失和针对已标记和未标记数据的正则化损失,
我们的方法只用了300个带标签的训练样本,在国际皮肤成像合作组织(ISIC)2017年皮肤病变分割挑战赛的基准上创造了新的纪录。这样的结果显然超过了使用2000个标签数据进行训练的完全受监督的最新技术。
1 INTRODUCTION(介绍)
仅仅通过视觉解释来识别恶性黑色素瘤是耗时的,而且容易出现观察者间和观察者内的差异。为了辅助皮肤科医生的诊断,临床上迫切需要一种黑色素瘤的自动分割方法。
黑色素瘤的自动分割是一项非常具有挑战性的任务,因为不同患者的病变大小、位置、形状和颜色差异很大,而且存在毛发和静脉等伪影;如图1。
近年来,卷积神经网络(CNNs)在各种视觉识别任务中得到了广泛的应用并取得了显著的成功。许多研究人员提出了皮肤病变分割方法,并取得了较好的效果。例如,Yuan等人,提出了一种深卷积神经网络(DCNN),并用多种颜色空间对其进行训练,在ISIC 2017皮肤病变分割挑战赛中取得了最好的效果。
然而,所有上述方法都是基于全监督学习的,这需要大量的标注图像来训练网络的准确性和鲁棒性。这种像素级的注释费时费力,而且很难获得,特别是对于皮肤镜图像中的黑色素瘤,这严重依赖于有经验的皮肤科医生。此外,有限的带像素级标注的标签数据也限制了深度网络的性能。
我们通过半监督学习来解决皮肤病变分割问题,该学习利用了有限数量的标记数据和任意数量的未标记数据。作为副产品,我们的半监督方法是健壮的,并且有可能容忍模糊的标签。
本文提出了一种新的用于皮肤病变分割的半监督学习方法。整个框架采用监督损失和非监督损失的加权组合进行训练。为了利用未标记的数据,我们的自集成方法鼓励网络在不同的正则化(例如,随机高斯噪声、网络丢弃和随机数据变换)下对相同的输入数据进行一致的预测。具体地说,我们通过最小化同一输入的不同变换下网络预测之间的差异来设计无监督/正则化损失。
综上所述,我们的工作做出来以下贡献:
- 针对实际的生物医学图像分割问题,我们提出了一种新的半监督学习方法,该方法利用了大量的未标记数据,极大地减少了皮肤科医生的标注工作量。
- 为了更好地利用未标记数据进行分割,我们在自集成模型中提出了一种变换一致性方案,并证明了半监督学习的有效性。
- 我们在ISIC 2017皮肤病变分割挑战的基准上创造了一个仅有300个标记数据的新记录,这超过了基于2000个标记数据的基于完全监督学习的最新记录。
2 Method (方法)
2.1 Overview(概述)
我们首先描述了我们的半监督分割方法的概述。训练集由N个输入组成,包括M个标记输入和N−M个未标记输入,L = 是有标签数据的集合,是无标签数据的集合,xi表示的是输入的图片,yi表示的是标签图片,我们提出的半监督分割方法可以用来通过优化来学习网络参数θ:
表示的是网络的映射(表征),是有监督的损失,是无监督损失(正则化损失),是控制 正则化强度的超参数。第一个组件(第公式的前半部分)用于有监督的训练,通过交叉熵损失进行优化,仅用于评估网络输出对已标记输入的正确性。而第二个正则化组件(第公式的后半部分)通过对有标签和无标签输入的网络的输出进行正则化来设计用于无监督训练。
其中ξ和ξ0表示输入数据的不同正则化或扰动。
2.2 Transformation Consistent Self-ensembling Model(变换一致性自集成模型)
图3:(A)我们希望分割是旋转等变的。如果旋转输入图像,则预测的的分割掩码应该与原始分割掩码具有相同的旋转。(B)卷积一般不是旋转等变的。
这一特性限制了随机数据变换对于分割问题的无监督正则化效果。为了增强正则化,更有效地利用无标记数据进行分割,我们在无监督正则化项中引入了一种变换一致性方案。具体的算法流程如下:
最后,通过最小化无监督正则化损失和有监督交叉熵损失的加权组合来训练网络。
2.3 Training and Inference Procedures(训练和推理阶段)
在上述变换一致性方案中,我们对输入进行了四种旋转操作,角度为γ·90◦,其中γ∈{0,1,2,3},我们还应用了水平翻转操作。总共获得了8个可能的转换操作,我们在每个训练过程中随机选择一个操作。我们采用中的2D DenseUNet-167架构作为我们的网络主干,并在每层卷积层后加上Dropout操作。
3 Experiments and Results(实验和结果)
3.1 Dataset and Evaluation Metrics
我们在2017年ISIC皮肤病变分割挑战的数据集[6]上对我们的方法进行了评估,其中包括包含2000张带注释的皮肤镜图像的训练集、包含150幅图像的验证集和包含600幅图像的测试集。评价指标包括Jaccard指数(JA)、Dice系数(DI)、像素级准确度(AC)、敏感度(SE)和特异度(SP)五个评价指标来评价分割性能。
3.2 Analysis of Our Method(我们的方法分析)
具有50个标记数据的定量和可视化结果
显然,与纯监督方法相比,我们的半监督方法在所有评价指标上都能获得更高的性能,在JA、DI和SE上分别提高了2.46%、2.64%和3.60%。
同时,半监督学习的分割性能也可以通过更多的标记训练图像来提高;见图5中的橙线。但是,随着标记样本的增加,半监督和仅监督的分割精度的差异变得更小。观察结果符合我们的预期,即我们的方法利用了来自未标记数据集的分布信息。
4 Conclusion(结论)
本文提出了一种新的用于皮肤病变分割的半监督学习方法。具体地说,我们引入了一种新的变换一致性自集成模型用于分割任务,该模型利用未标记的数据来增强正则化效果。在ISIC 2017皮肤病变分割挑战数据集上的综合实验分析证明了我们的半监督学习的有效性和我们方法的健壮性。该方法具有较强的通用性,可以推广到医学成像领域的其他半监督学习问题。在未来,我们将探索更多的正则化形式和集成技术,以便更好地利用未标记的数据。
典型通道和空间注意力机制模块和代码实现
注意力机制的核心就是让网络关注到它更需要关注的地方,当我们使用卷积神经网络去处理图片的时候,我们会更希望卷积神经网络去注意应该注意的地方,而不是什么都关注,一般而言,在CV领域中注意力机制可以分为通道注意力机制,空间注意力机制,以及二者的结合。
1.SENet模块(通道注意力机制)
对于卷积操作,很大一部分工作是提高感受野,即空间上融合更多特征融合,或者是提取多尺度空间信息,如Inception网络的多分支结构。对于channel维度的特征融合,卷积操作基本上默认对输入特征图的所有channel进行融合。而SENet网络的创新点在于关注channel之间的关系,希望模型可以自动学习到不同channel特征的重要程度。为此,SENet提出了Squeeze-and-Excitation (SE)模块,如上图所示。SE模块首先对卷积得到的特征图进行Squeeze操作,得到channel级的全局特征,然后对全局特征进行Excitation操作,学习各个channel间的关系,也得到不同channel的权重,最后乘以原来的特征图得到最终特征。本质上,SE模块是在channel维度上做attention。这种注意力机制让模型可以更加关注信息量最大的channel特征,而抑制那些不重要的channel特征。另外一点是SE模块是通用的,这意味着其可以嵌入到现有的网络架构中。即SENet模块是即插即用的,所以学习其代码实现很有必要,我们可以加入到我们网络中,对输入特征图进行通道上的更加关注。
SENet模块的代码实现
class senet(nn.Module):
def __init__(self,channel,ratio=16):
super(senet,self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(output_size=1)
self.fc = nn.Sequential(
# False 不需要偏置
nn.Linear(channel,channel//ratio,False),
nn.ReLU(),
nn.Linear(channel//ratio,channel,False),
# 一定要对最后通道值进行Sigmoid,求概率操作 0-1
nn.Sigmoid()
)
def forward(self,x):
b,c,h,w = x.size()
# 对输入特征图进行全局平均池化 b,c,1,1->b,c
avg = self.avg_pool(x).view(size=(b,c))
# 对平均池化后的结果进行两次全连接 b,c->b,channel,1,1
# fc就代表对通道的加权
fc = self.fc(avg).view(size=(b,c,1,1))
# 输入特征图x * fc加权值 = 对通道加权后的特征图
print("获得的通道权值为fc = ",fc)
return x * fc
2.CBAM模块(通道和空间注意力机制)
CBAM将通道注意力机制和空间注意力机制进行一个结合,相比于SENet只关注通道的注意力机制,CBAM可以取得更好的效果。
对于通道注意力机制的实现可以分为两个部分,我们会对输入进来的单个特征层,分别进行全局平均池化和全局最大池化。之后对平均池化和最大池化的结果,利用共享的全连接层进行处理,我们会对处理后的两个结果进行相加,然后取一个sigmoid,此时我们获得了输入特征层每一个通道的权值(0-1之间)。在获得这个权值后,我们将这个权值乘上原输入特征层即可。
对于空间注意力机制的实现,我们会对输入进来的特征层,在每一个特征点的通道上取最大值和平均值。之后将这两个结果进行一个堆叠,利用一次通道数为1的卷积调整通道数,然后取一个sigmoid,此时我们获得了输入特征层每一个特征点的权值(0-1之间)。在获得这个权值后,我们将这个权值乘上原输入特征层即可。
CBAM模块的代码实现
"""
channel_attention 通道注意力模块
"""
class channel_attention(nn.Module):
def __init__(self,channel,ratio=16):
"""
在初始化函数中定义的是对输入数据的操作
是操作,在forward中需要用到什么操作,在初始化方法中先写好这些对输入图像(特征图)的操作,
在forward中就可以直接调用了,方便简洁
:param channel:
:param ratio:
"""
super(channel_attention, self).__init__()
# 对特征图进行全局MaxPool操作
self.max_pool = nn.AdaptiveMaxPool2d(output_size=1)
# 对特征图进行全局AvgPool操作
self.avg_pool = nn.AdaptiveAvgPool2d(output_size=1)
# 对特征图进行两次全连接操作
# 使用的是整除//,使用单个除号/可能会有小数,出错
self.fc = nn.Sequential(
nn.Linear(in_features=channel,out_features=channel//ratio),
# 激活
nn.ReLU(),
nn.Linear(in_features=channel//ratio,out_features=channel),
# 激活
nn.ReLU()
)
# 进行sigmoid操作
self.sigmoid = nn.Sigmoid()
def forward(self,x):
# 获取输入特征图的batch,channel,height,width
b,c,h,w = x.size()
# 送入全连接之前,先要展成一维向量的形式
max_pool_out = self.max_pool(x).view([b,c])
avg_pool_out = self.avg_pool(x).view([b,c])
max_fc_out = self.fc(max_pool_out)
avg_fc_out = self.fc(avg_pool_out)
out = self.sigmoid(max_fc_out + avg_fc_out)
print("out.shape =", out.shape)
print("获得的通道注意力权重: ",out)
# 使用channel attention * 输入特征图 得到 在通道上加权后的特征图
# 在乘之前,需要讲channel attention变为和输入特征层一样的形式即b,c,h,w
out = out.view([b,c,1,1])
return out * x
"""
空间注意力模块
"""
class spatial_attention(nn.Module):
def __init__(self,kernel_size=7):
super(spatial_attention, self).__init__()
self.conv = nn.Conv2d(in_channels=2,out_channels=1,kernel_size=kernel_size,stride=1,padding=kernel_size//2)
self.sigmoid = nn.Sigmoid()
def forward(self,x):
b,c,h,w = x.size()
# b,c,h,w -> b,1,h,w
max_pool_out,_ = torch.max(x,dim=1,keepdim=True)
avg_pool_out = torch.mean(x,dim=1,keepdim=True)
# print("max_pool_out = ",max_pool_out)
# print("avg_pool_out = ",avg_pool_out)
pool_out = torch.cat([max_pool_out,avg_pool_out],dim=1)
out = self.conv(pool_out)
out = self.sigmoid(out)
print("out.shape =", out.shape)
print("获得的空间注意力权重: ", out)
# 在空间上对特征图进行加权
return out * x
""""
将空间注意力模块和通道注意力模块组合一下,变成CBAM模块
"""
class Cbam(nn.Module):
def __init__(self,channel,ratio=16,kernel_size=7):
"""
下面forward需要用到通道和空间注意力模块,所以
在初始化方法里面就需要定义通道和空间注意力模块
:param channel:
:param ratio:
:param kernel_size:
"""
super(Cbam, self).__init__()
self.channel_attention = channel_attention(channel=channel,ratio=ratio)
self.spatial_attention = spatial_attention(kernel_size=kernel_size)
def forward(self,x):
out = self.channel_attention(x)
out = self.spatial_attention(out)
return x
本周工作总结
1.学习了半监督分割论文《Semi-supervised Skin Lesion Segmentation via Transformation Consistent Self-ensembling Model》,里面主要就是利用了无标签数据分布的信息,讲其当做是一种正则化损失函数。
2.学习了两种注意力机制模块,SENet为通道注意力机制模块,CBAM是空间和通道结合的注意力机制模块,可以使得网络更加关注需要关注的地方,以后加入到自己的网络中看看能否提升分割性能。