U-Net和Graph U-Net

1. 基础知识

1. 1什么是灰度图像、通道数等等?

每个图像都是由像素组成的,每个像素都是由颜色的组合组成的,更准确地说,就是原色。通道是彩色图像的灰度图像,它仅由构成彩色图像的一种原色组成。

灰度图像仅仅由彩色图像的某一个原色所构成,也就是灰度图像是单通道图像,其中每个像素只携带有关光强度的信息。这些图像完全由灰色阴影组成。

灰度图像与仅包含黑白像素的黑白图像(二值图像)不同。
二值图像中一个像素要么是黑色,要么是白色。它们之间没有颜色。
灰度图像的像素有很大的灰度范围。

灰度图像的shape是二维的,例如(6016,4016),其中每个数字代表一个像素,数字的值是该像素中的光强度,因此称为单通道图像。
计算机视觉中每个像素的光强度是从0到255测量的,称为像素值。像素值为0时为黑色,像素值为255时为白色。在这里,图像沿y轴(高度)有6016个像素,沿x轴(宽度)有4016个像素。

1. 2 RGB图像的高、宽、通道数等

与灰度图像不同,RGB图像是三通道的。每个像素由三个通道组成,每个通道代表一种颜色。

RGB图像的shape是(6016,4016,3),输出是一个三维数组!在此图像中,每个像素有三个通道。第二维度中的每个数组表示一个像素。第0个指标是红光强度,第1个指标是绿光强度,第2个指标是蓝光强度。

打印此图像的形状时,它将打印一个包含高度、宽度和通道数的元组。将这三个值相乘,得到图像数组中的值总数

2. U-Net模型

2.1 U-Net模型的前因

U-Net和FCN非常的相似,U-Net比FCN稍晚提出来,但都发表在2015年,和U-Net与FCN的区别:
U-Net完全对称,也就是左边和右边是很类似的,而FCN的decoder相对简单,只用了一个deconvolution的操作,之后并没有跟上卷积结构
skip connection,FCN用的是加操作(summation),U-Net用的是叠操作(concatenation)。这些都是细节,重点是它们的结构用了一个比较经典的思路,也就是编码和解码(encoder-decoder),早在2006年就被Hinton大神提出来发表在了nature上.

当时这个结构提出的主要作用并不是分割,而是压缩图像和去噪声。
输入是一幅图,经过下采样的编码,得到一串比原先图像更小的特征,相当于压缩,然后再经过一个解码,理想状况就是能还原到原来的图像。这样的话我们存一幅图的时候就只需要存一个特征和一个解码器即可。

后来把这个思路被用在了图像分割的问题上,也就是现在我们看到的U-Net结构,在它被提出的三年中,有很多很多的论文去讲如何改进U-Net或者FCN,不过这个分割网络的本质的拓扑结构是没有改动的。

2.2U-net的拓扑结构

输入是一幅图,输出是目标的分割结果。继续简化就是,一幅图,编码,或者说降采样,然后解码,也就是升采样,然后输出一个分割结果。根据结果和真实分割的差异,反向传播来训练这个分割网络。我们可以说,U-Net里面最精彩的部分就是这三部分:
下采样;
上采样;
skip connection (这个就是下采样和上采样得到的相同尺度的特征度在通道维度上的拼接,concatenate)

Net是在医学图像分割领域获得较大成功的一种网络模型,是一种类似编码器-解码器的结构,模型呈现对称性(U形),是一种FCN的改进;降采样的特征图与同维度大小的上采样特征图通过skip connection拼接连接,使高低层次的特征更好得融合;能够适用于样本量少的应用场景,且运算速度快。


Net模型主要包括contracting path(降采样)和expansive path(上采样)两部分。
Contracting path采用典型的卷积网络结构,每个特征尺度采用两个3*3卷积(unpadded,每次卷积特征图都会缩减),然后用2*2的max pooling做降采样(stride=2)。每次降采样特征的通道数都会增加一倍。
Expansive path使用2*2的上卷积(特征通道数量减少一半),与同尺度的降采样部分的特征图(先crop以保持大小一致)直接拼接,然后再用两个3*3的卷积
网络最后用1*1卷积将特征图映射到实际需要的分类数目的通道数。


Net主要使用softmax交叉熵损失,为了解决医学图像同类目标边界不易识别的问题,U-Net在目标函数中给每个pixel都增加了权重,使网络更能区分出边界。

Example 1:

当输入的图像大小为512x512x3的时候,具体执行方式如下:
1、conv1:进行两次[3,3]的64通道的卷积,获得一个[512,512,64]的初步有效特征层,再进行2X2最大池化,获得一个[256,256,64]的特征层。
2、conv2:进行两次[3,3]的128通道的卷积,获得一个[256,256,128]的初步有效特征层,再进行2X2最大池化,获得一个[128,128,128]的特征层。
3、conv3:进行三次[3,3]的256通道的卷积,获得一个[128,128,256]的初步有效特征层,再进行2X2最大池化,获得一个[64,64,256]的特征层。
4、conv4:进行三次[3,3]的512通道的卷积,获得一个[64,64,512]的初步有效特征层,再进行2X2最大池化,获得一个[32,32,512]的特征层。
5、conv5:进行三次[3,3]的512通道的卷积,获得一个[32,32,512]的初步有效特征层。

利用第一步我们可以获得五个初步的有效特征层,在加强特征提取网络这里,我们会利用这五个初步的有效特征层进行特征融合,特征融合的方式就是对特征层进行上采样并且进行堆叠。

为了方便网络的构建与更好的通用性,我们的Unet和上图的Unet结构有些许不同,在上采样时直接进行两倍上采样再进行特征融合,最终获得的特征层和输入图片的高宽相同。

2.3 为什么U-Net结构适用于医学图像?

医疗影像语义较为简单、结构固定。医疗影像的所有特征都很重要,因此低级特征和高级语义特征都很重要,所以U型结构的skip connection结构(特征拼接)更好派上用场
医学影像的数据较少,获取难度大,数据量可能只有几百甚至不到100,因此如果使用大型的网络例如DeepLabv3+等模型,很容易过拟合。大型网络的优点是更强的图像表述能力,而较为简单、数量少的医学影像并没有那么多的内容需要表述,因此也有人发现在小数量级中,分割的SOTA模型与轻量的Unet并没有优势
医学影像往往是多模态的,往往需要自己设计网络去提取不同的模态特征,因此轻量结构简单的Unet可以有更大的操作空间

2.4 U-Net输入和输出图像尺寸不一致问题

U-Net的输入大小是572x572,但是输出却是388x388,按理说它们应该相等(因为图像分割相当于逐像素进行分类,所以要求输入图像和输出图像大小一致),但是为什么这里的输入尺寸要比输出尺寸大呢?

那是因为下图这个结构图是当年论文作者绘制的,该作者对输入图像的边缘进行了镜像填充,通过镜像填充将边界区域进行扩大,这样可以给模型提供更多信息来完成模型的分割。

按照论文中的解释,镜像填充的原因是:因为图像 的边界的外面是空白的,没有其它有效像素,而我们预测图像中的像素类别时往往需要参考它的周围像素作为上下文信息,这样才能保持分割的准确性,为了预测边界像素,论文对边界区域进行镜像,来补全边界周围缺失的内容,然后进行预测。这种策略叫做"overlap-tile"

2.5 U-Net中各个操作的含义和作用

如上图,Unet 网络结构是对称的,形似英文字母 U 所以被称为 Unet。整张图都是由蓝/白色框与各种颜色的箭头组成,其中,蓝/白色框表示 feature map;蓝色箭头表示 3x3 卷积,用于特征提取;灰色箭头表示 skip-connection,用于特征融合;红色箭头表示池化 pooling,用于降低维度;绿色箭头表示上采样 upsample,用于恢复维度;青色箭头表示 1x1 卷积,用于输出结果。

可能你会问为啥是 5 层而不是 4 层或者 6 层,emmm,这应该去问作者本人,可能对于当时作者拿到的数据集来说,这个层数的表现更好,但不代表所有的数据集这个结构都适合。我们该多关注这种 Encoder-Decoder 的设计思想,具体实现则应该因数据集而异。

Encoder 由卷积操作和下采样操作组成,文中所用的卷积结构统一为 3x3 的卷积核,padding 为 0 ,striding 为 1。没有 padding 所以每次卷积之后 feature map 的 H 和 W 变小了,在 skip-connection 时要注意 feature map 的维度(其实也可以将 padding 设置为 1 避免维度不对应问题),pytorch 代码:
nn.Sequential(nn.Conv2d(in_channels, out_channels, 3),
nn.BatchNorm2d(out_channels),
nn.ReLU(inplace=True))
上述的两次卷积之后是一个 stride 为 2 的 max pooling,输出大小变为 1/2 *(H, W):

pytorch 代码:
nn.MaxPool2d(kernel_size=2, stride=2)
上面的步骤重复 5 次,最后一次没有 max-pooling,直接将得到的 feature map 送入 Decoder。
网络结构具备一些基本的超参数,这些参数直接影响着网络最终的泛化能力、训练效率、对过拟合的控制等等,而这些参数的合理区间往往随着网络结构的不同、实际应用场景的不同而发生变化,并且这种变化是不可预测的,因此也成为当前人工神经网络难以训练的一大难题,也涌现了一批优秀的调参方法和策略。

3. Graph U-Net

受到类似 encoder-decoder architecture 的 U-Nets 影响,作者希望能在图数据上使用这种 pooling 和 up-sampling 的操作。Note:Encoder 一般是降维,可以看成 pooling ;而 Decoder 一般是升维,可以看成 up-sampling 操作。

gPool层根据节点在可训练投影向量上的标量投影值,适应地选择节点,即对重要节点的子集进行采样,形成较小的图,从而增大了感受野并有效编码了高级特征。
gUnpool层是gPool层的逆操作。gUnpool层使用在相应gPool层中选择的节点的位置信息将图恢复到其原始结构。
基于gPool和gUnpool层,文中提出了一个作用在图上的编码器-解码器模型,称为graph U-Nets。graph U-Nets可以编码高维特征,然后解码生成网络embedding。
文中在节点分类和图分类任务上进行了实验,结果表明,graph U-Nets在transductive learning任务上比以前的GNNs取得了更好的性能。
为了避免采样图中可能存在的孤立节点问题,文中采用图2次幂来改进了图的连通性。

3.1 Gpool

池化层在CNNs中对网格状数据起着重要的作用,可以减小feature map的大小,扩大感受域,从而产生更好的性能,泛化能力也增强。在图像等网格数据上,将特征图分割成不重叠的矩形,并对其使用非线性下采样函数,例如max,mean pooling。除了局部池化之外,还有全局池化,全局池化层(Self-adaptive hierarchical sentence model,IJCAI 2015)还对所有输入单元执行下采样操作,从而将每个feature map为一个数字。k-max池化层(Aconvolutional neural network for modelling sentences, 2014)从每个特征图中选择k-max的单元。

大脑皮层表面分割应该用的是局部池化,因为是分成不同的脑区,节点分类而不是进行图分类

但是,不能将这些池化操作直接应用到图数据上,特别是因为图中节点之间没有局部性信息。因此,分区操作不适用于图。全局池化操作将所有节点映射为一个节点,限制了网络的灵活性。k-max池化操作输出可能来自图中不同节点的k个最大单元,导致所选节点的连接性不一致。

文中使用图池化层(gPool)来对图数据进行向下采样。在图池化层中,自适应地选择节点的一个子集来形成一个新的但是更小的图。为此,使用了一个可训练的投影向量P,将所有节点特征投影到1D,然后执行k-max池化来选择节点。
因为这种选择是基于每个节点的一维footprint,所以新图中的连接在节点之间是一致的。

给定一个具有特征向量X_i的节点i,X_i在P上的投影标量为:
y_i=(X_i P)/(||P||)
其中y_i度量了将节点i投影到P方向上,可以保留多少i的信息。

为了在采样节点的过程中尽可能多地保留原始图中的信息,选择在p上投影的标量最大的值的节点来形成一个新的图。
y=(X^l Pl)/|(|pl |)|
Idx=rank(y,k)
y ̃=sigmoid(y(idx))
X ̃l=Xl (idx,∶)
A(l+1)=Al (idx,idx)
X^(l+1)=X ̃^l⊙(y ̃1_C^T)

假设选择的K个索引为i_1, i_2, …, i_k,其中i_m

gUnpool

参考

https://baijiahao.baidu.com/s?id=1685106130579635242&wfr=spider&for=pc
https://zhuanlan.zhihu.com/p/67528079?utm_id=0
https://blog.csdn.net/qq_58529413/article/details/125704059
https://blog.csdn.net/m0_56192771/article/details/128708591
https://zhuanlan.zhihu.com/p/79204199
https://www.bilibili.com/read/cv10165424/
https://blog.csdn.net/yyl424525/article/details/103342855/

U-Net
Graph U-Net

你可能感兴趣的:(笔记)