医学图像分割经典网络:U-Net论文笔记

昨晚看完U-Net论文了,做了好详细好详细(吹!摁吹!)的笔记嘿嘿嘿,在损失函数和输入镜像上实在很强,又让人惊艳到,就很有兴趣动力一直读下去!

可根据目录自己选阅,有问题直接骂我就行了:)

论文原文:https://arxiv.org/abs/1505.04597v1

我的FCN详细总结(继续吹!):https://blog.csdn.net/HustQbw/article/details/114295331

我是把U-Net和FCN对比来看的,感觉还是比较不错的,可参考!

前言:

CNN体系语义分割存在的问题:

最初的语义分割是patch-wise的,原因主要在于分类网络通常都会加入全连接层,要求固定尺寸的图像输入,因此只好按图像块进行分类

缺点:①运行过慢,每个patch都要分开运行(run separately)

②定位信息和语义信息间存在trade-off,即难以兼顾(原文提到了池化层导致定位准确度下降: Larger patches require more max-pooling layers that reduce the localization accuracy, while small patches allow the network to see only little context.)

FCN体系语义分割:

FCN的提出,使得CNN无需使用fc层就可以进行dense pixels prediction tasks,实现了像素级别的语义分割。使用这种方法可允许任意尺寸的输入和同等尺寸的输出(图像分割图),且该方法在速度上比图像块分类法要快上很多。

而且,FCN里的skip layer设计,实现了浅层特征和深层特征的特征融合,一定程度上解决了语义信息和定位信息之间的trade-off

池化层带来的另一个问题

但除了全连接层,CNN进行语义分割还有一个问题————池化层。

池化层虽然可以扩大感受野、融合语义信息;但也会造成位置信息的损失。

而语义分割则要求分割图(segmentation map)完全贴合,对位置信息的保留是非常有必要的。(尤其是原文提到的医学图像的处理,通常对定位信息要求严格)

U-Net的策略:

U-Net介绍了编码器-解码器的结构来解决池化层导致位置信息丢失的问题

Encoder-Decoder Structure编码器逐渐减少空间维度,译码器逐步修复物体的细节和空间维度。编码器和解码器之间通常存在快捷连接,因此能帮助解码器更好地修复目标的细节。U-Net 是这种方法中最常用的结构。

摘要:

个人翻译:

①(夸夸群):需要成千上万有标注的训练样本的训练成果的深层网络得到了广泛的认可。

②(他们滴方法):在这篇论文,我们介绍一种依赖于强健地数据增强的网络和训练策略,从而可以更高效地使用可用的标注样本。该网络架构由一条用于捕捉语境(/语义)的下采样路径和一条与之对称的用于获得准确定位信息的上采样路径组成。

③(他们滴发现和成果):我们发现这样的网络可以用很少的训练样本进行端到端训练,而且在ISBI竞赛上对电子显微镜堆栈中的神经元结构进行分割的性能好过先前的最好的方法(滑动窗口的CNN)。我们用这个网络在ISBI竞赛的细胞边缘分割上取得了第一名。此外,网络速度很快。在最近的GPU上分割512x512图像只需要不到一秒的时间。

总结:

①结构上:U-Net也是端到端的神经网络,用下采样路径捕捉语义信息,用对应的上采样路径获得准确定位信息

②训练上:U-Net使用了很好用的数据增强策略来更高效地使用可用的训练样本

③性能上:U-Net可以用很少的训练样本得到很好地结果,并且网络进行图像分割的速度很快很快

重点一、网络架构—————针对FCN进行modify和extend

原文:“One important modification in our architecture is that in the upsampling part we have also a large number of feature channels, which allow the network to propagate context information to higher resolution layers.”

“我们架构的一个重要修改是在上采样部分我们也有大量的特征通道,这允许网络将语义信息传播到有更高分辨率的层。”

一些解读:

①网络架构是U型(左侧4次下采样,右侧是对称的4次上采样),因此叫做U-Net

②左侧可以看作在对图像进行编码,即编码器;右侧可以看作再进行解码,即解码器

③编码器和解码器之间存在快捷连接(copy and crop),且根据图中来看,这里的crop应该是center crop

这里的快捷链接和FCN里的add(对应位置像素值直接相加)不同,应该是在channel这个维度进行concate拼接(整合定位信息和语义信息,帮助解码器对目标的细节进行更好地修复)

⑤这里的3x3 conv都是no padding,stride=1的,所以每次卷积后尺寸缩小2;上采样是用2x2的transpose conv,stride=2,no padding

⑥每次max pooling下采样后都要将通道数翻倍

⑦最后一个1x1conv来讲通道数改为class数

⑧输入图像是大于输出图像的,因为使用了no padding的卷积,所以输入比输出少一圈恒定的边界宽度(Due to the unpadded convolutions, the output image is smaller than the input by a constant border width.)且论文中对输入图像进行了镜像操作

Q:为什么说Encoder-Decoder结构可以解决解决池化层导致位置信息丢失的问题?

个人理解:关键在于这个快捷连接,保存了池化前的feature map,和后面上采样时的feature map进行concate,从而实现更好地对目标细节的修复

重点二、对输入进行镜像从而更好的处理边缘细节

高能原文(来自Introduction):

①This strategy allows the seamless segmentation of arbitrarily large images by an overlap-tile strategy (see Figure 2).
该策略允许通过重叠策略无缝分割任意大的图像(见图2)。

②To predict the pixels in the border region of the image, the missing context is extrapolated by mirroring the input image.为了预测图像边界区域的像素,通过镜像输入图像来推断缺失的语义。

③This tiling strategy is important to apply the network to large images, since otherwise the resolution would be limited by the GPU memory.这种平铺策略对于将网络应用于大型图像非常重要,否则分辨率将受到GPU内存的限制。

我们知道,输出是比输入小一圈固定的边界宽度的(因为卷积没有pad)
而最后计算交叉熵损失的时候,输入和输出的每个像素都要计算,输入和输出不一样大是无法计算的。

作者聪明地想到了,对原图进行镜像,把这个固定的(网络结构确定则确定)的边界宽度填上,这样得到的预测就可以直接和原图的标签进行误差计算(如文中,输出是388x388,则原图就是388x388,做镜像之后变成572x572作为输入,因为卷积固定会减少184的固定宽度)

那么他是怎么做镜像呢?比如这个黄色矩形就是原图的尺寸388x388,他是对这个矩形的四条边以及四个角都做镜像,再做(572,572)的center crop即可作为输入

个人理解:巧妙地是,这种镜像不仅使输入输出尺寸一样,还让原本的图片边界变得更加平滑,对图片边界的预测也会更加准确

为什么对边缘预测更准确了呢?

首先,实际要进行图像分割的区域是图中的黄色区域;但是如果只用黄色区域进行分割,那很明显在黄色区域边缘的分割效果就可能很差,因为它们周边能提供的特征信息相比中间图像区域要少很多。所以,为了保证边缘的分割效果,输入网络的实际图像尺寸应该要略大于目标区域,也就是图中的蓝色区域。如果蓝色区域超出了原始图像的边界,那也不能用zero-padding的方式填充,而是要用镜像的方式进行padding,这样至少能保证细胞轮廓的完整性。因此,其实蓝色区域就是网络输入尺寸572×572572×572,而黄色目标区域就是388×388388×388。这样,在完成下一个388×388388×388区域的预测时,前后两次预测的蓝色区域会有所重叠,所以才叫"Overlap-tile strategy"。

重点三、加权损失函数的引入

Introduction描述

依然是高能原文:

Another challenge in many cell segmentation tasks is the separation of touching objects of the same class; see Figure 3. To this end, we propose the use of a weighted loss, where the separating background labels between touching cells obtain a large weight in the loss function.

在许多细胞分割任务中,另一个挑战是分离发生接触的同类别的对象;参见图3。为此,我们提出使用加权损失,即在接触细胞之间的分离背景标签在损失函数中获得较大的权重。

个人理解:为损失函数加权,接触细胞间的背景获得较大的权重,则会优先优化细胞间的背景,这样使得细胞的边缘更加清晰

引入权重的原因以及函数数学解释


这是U-Net里的损失函数,可以看到,他其实就是对crossentropy函数加上了一个权重,由于是每个像素都要做交叉熵的损失函数运算,所以每个像素都有一个权重,这里w(x)就是一个权重图weight map(其实就是个和原始图片一样大小的矩阵)

原文:We pre-compute the weight map for each ground truth segmentation to compensate the different frequency of pixels from a certain class in the training data set, and to force the network to learn the small separation borders that we introduce between touching cells (See Figure 3c and d).“我们预先计算每个ground truth 分割的权重图,以补偿训练数据集中某类像素的不同频率个人理解:解决class balance问题,因为背景很多,前景很少),并迫使网络学习我们在触摸细胞之间引入的小的分离边界(见图3c和d)。”

而根据Introduction以及这段原文,作者加入weight map的目的是①class balance类别平衡;②更好地对靠的很近甚至发生接触的同类细胞进行预测(因为靠的近,所以很容易出现误判导致两个靠的很近的细胞被预测为一整个大细胞),所以,这里主要是要更好地分割两个靠的很近同类细胞的边缘

key words:①(touching)靠的很近甚至接触 ②same class同类 ③separation border边缘 ④class balance类别平衡

根据这个需求,就得到了weight map的定义目标了,接下来便是数学式子:

原文:where wc : Ω → R is the weight map to balance the class frequencies, d1 : Ω → R denotes the distance to the border of the nearest cell and d2 : Ω → R the distance to the border of the second nearest cell. In our experiments we set w0 = 10 and σ ≈ 5 pixels.

根据这段原文可以看到,wc(x)是一个事先规定好的weight map,这个是用来解决第一个问题————class balance类别平衡的,原文是有两个类别,即前景(这里是细胞)和背景,即要让这两个部分尽可能的平衡(个人认为这种balance一般认为是1:1,有时候也要看需求)

Q:为什么FCN里没有这个wc来解决class balance呢?

A:FCN论文里讲,认为class balance在他们的问题里不重要,但在U-Net这个问题就很重要,要视问题而改变。

其次,后面的补偿项就是用来进行靠的很近的同类细胞之间的边缘分割的,d1(x)是这个x(x就是一个像素点)到最近的细胞的距离,d2(x)是x到距离第二近的细胞的距离

根据这个权重的公式,d1和d2越小,后面那项会越接近于w0,而d1和d2越大,后面那项会越小,越接近于0

即离细胞远的会获得小的权重(其实,离最近的近,离第二近的较远也会获得较小的权重,甚至和两个都远差别不大,因为用的是e的指数函数)

离两个细胞都近的会获得大的权重,在优化器优化损失函数时是会率先优化的,这样就让靠的很近的同类细胞的边界有更好的权重,分割性能更好更清晰。

看Fig3的最后一个heatmap可以看到,对于背景而言,权重图几乎都是一个颜色(蓝色)的,而靠的很近的细胞中间的背景是红色的,权重很大,是符合这个数学式子和我们的理解的

数据增强及其意义

在分类问题中做数据增强时不需要考虑GT,因为增强之后的GT依然是个Label不变,但是在分割问题中的GT却是个图片或者是对应的feature map,在做数据增强时候其对应的GT也要跟着变化。

原文Introduction:

再次高能原文:(说明了所用的数据增强以及在医学分割中的意义)

As for our tasks there is very little training data available, we use excessive data augmentation by applying elastic deformations to the available training images. This allows the network to learn invariance to such deformations, without the need to see these transformations in the annotated image corpus. This is
particularly important in biomedical segmentation, since deformation used to be the most common variation in tissue and realistic deformations can be simulated efficiently. The value of data augmentation for learning invariance has been shown in Dosovitskiy et al. [2] in the scope of unsupervised feature learning.

对于我们的任务来说,可用的训练数据非常少,我们通过应用弹性变形对可用的训练图像进行过度的数据增强。这允许网络学习这种变形的不变性,而不需要在带注释的图像库中看到这些转换。(个人理解:没有保存在本地图像库,不占用本地内存,而是输入进dataset就会做这一道预处理)

**这在生物医学分割中尤其重要,因为变形通常是组织中最常见的变化,并且真实的变形可以有效地模拟。**Dosovitskiy等人的[2]表明了数据
增强对于学习不变性的价值

意义:

Data augmentation is essential to teach the network the desired invariance and robustness properties, when only few training samples are available.在只有很少的训练样本可用时,数据增强在教会神经网络所需的不变性和鲁棒性至关重要。

关于显微镜下图像的数据增强

In case of microscopical images we primarily need shift and rotation invariance as well as robustness to deformations and gray value variations. Especially random elastic deformations of the training samples seem to be the key concept to train a segmentation network with very few annotated images.

对于显微图像,我们首先需要平移和旋转不变性以及对变形和灰度值变化的鲁棒性。特别是训练样本的随机弹性变形,是训练带标注图像较少的分割网络的关键概念。

作者采用的数据增强策略

We generate smooth deformations using random displacement vectors on a coarse 3 by 3 grid. The displacements are sampled from a Gaussian distribution with 10 pixels standard deviation. Per-pixel displacements are then computed using bicubic interpolation. Drop-out layers at the end of the contracting path perform further implicit data augmentation.

我们在3 × 3的粗糙网格上使用随机位移向量生成平滑变形。位移的采样是一个带有10个像素标准差的高斯分布。然后使用双三次插值计算逐像素位移。下采样路径末尾的dropout层执行进一步的隐式数据扩展。

训练细节

1.optimizer: SGD+momentum=0.99

(Accordingly we use a high momentum (0.99) such that a large number of the previously seen training samples determine the update in the current optimization step.因此,我们使用一个高动量(0.99),以使大量之前看到的训练样本决定当前优化步骤中的更新。)

2.To minimize the overhead and make maximum use of the GPU memory, we favor large input tiles over a large batch size and hence reduce the batch to a single image.

为了最小化开销并最大限度地利用GPU内存,我们更喜欢大的输入图块而不是大的batch size,从而将批处理减少到单个图像

每个图像可以看成多个向量嘛,所以大的batch和大的图像效果是类似的(都是向量更多)但大的图像可以更充分的利用gpu

网络权重的初始化及其重要性

重要性:(原文)
In deep networks with many convolutional layers and different paths through the network, a good initialization of the weights is extremely important. Otherwise, parts of the network might give excessive activations, while other parts never contribute. Ideally the initial weights should be adapted such that each feature map in the network has approximately unit variance. For a network with our architecture (alternating convolution and ReLU layers) this can be achieved by drawing the initial weights from a Gaussian distribution with a standard deviation of sqrt(2/N), where N denotes the number of incoming nodes of one neuron [5]. E.g. for a 3x3 convolution and 64 feature channels in the previous layer N = 9 · 64 = 576.
在深度网络中,有很多卷积层和不同的网络路径,一个好的权值初始化是非常重要的。否则,网络的某些部分可能会过度激活,而其他部分则永远不会参与。

理想情况下,初始权值应该被调整,使网络中的每个特征映射具有近似的单位方差。对于具有我们架构的网络(卷积层和ReLU层交替),这可以通过从标准偏差为sqrt(2/N)的高斯分布中绘制初始权值来实现(其中N表示一个神经元[5]的传入节点数。例如,对于一个3x3的卷积和前一层的64个特征通道:N = 9·64 = 576。)

总结:

1.初始化权重的方法:标准差为sqrt(2/N)的0均值高斯分布来初始化权重

2.其中,N为一个神经元的传入节点数

3.N的计算解释:3x3:一个通道共9个参数,共64个,所以9x64

参考

1.https://blog.csdn.net/hduxiejun/article/details/71107285

2.https://blog.csdn.net/mieleizhi0522/article/details/82025509

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值