论文地址:http://www.arxiv.org/pdf/1505.04597.pdf
图像分割在从自动驾驶汽车到卫星的许多领域都很有用。也许其中最重要的是医学影像。医学图像的微妙之处是相当复杂的。一台能够理解这些细微差别并识别出必要区域的机器,可以对医疗保健产生深远的影响。
卷积神经网络在简单的图像分割问题上取得了不错的效果,但在复杂的图像分割问题上却没有取得任何进展。这就是UNet的作用。UNet最初是专门为医学图像分割而设计的。该方法取得了良好的效果,并在以后的许多领域得到了应用。在本文中,我们将讨论UNet工作的原因和方式
UNet背后的直觉
卷积神经网络(CNN)背后的主要思想是学习图像的特征映射,并利用它进行更细致的特征映射。这在分类问题中很有效,因为图像被转换成一个向量,这个向量用于进一步的分类。但是在图像分割中,我们不仅需要将feature map转换成一个向量,还需要从这个向量重建图像。这是一项巨大的任务,因为要将向量转换成图像比反过来更困难。UNet的整个理念都围绕着这个问题。
在将图像转换为向量的过程中,我们已经学习了图像的特征映射,为什么不使用相同的映射将其再次转换为图像呢?这就是UNet背后的秘诀。用同样的 feature maps,将其用于contraction 来将矢量扩展成segmented image。这将保持图像的结构完整性,这将极大地减少失真。让我们更简单地理解架构。
摘要
- 本文中提出了一种网络结构的训练策略,它依赖于充分利用数据增强技术来更高效的使用带有标签的数据。在U-Net结构中,包括一个捕获上下文信息的收缩路径和一个允许精确定位的对称拓展路径。这种方法可以使用非常少的数据完成端到端的训练,并获得最好的效果。
介绍
- 卷积网络的典型用途是分类任务,其中图像的输出是单个类别标签。 然而,在许多视觉任务中,尤其是在生物医学图像处理中,期望的输出应该包括定位,即,应该将类标签分配给每个像素。(也就是分割)
- Ciresan等人用滑动窗口取像素像素周围的局部区域俩训练网络,训练数据远远大于训练图像的数量。
-
本文提出一种新的完全卷积网络,即U-Net网,主要思想是在收缩网络的后面补充一个与前面类似的网络,其中池化运算符由上采样运算符替换。因此,这些层增加了输出的分辨率。为了定位,从收缩路径的高分辨率特征与上采样输出相结合。然后,连续卷积层可以学习基于该信息组装更精确的输出。
-
作者提出U-Net的本意是将其用于医学图像分割,在以往的CNN中,想将其用于医学图像存在两个困难:
- 通常CNN都是应用于分类,生物医学图像更关注的是分割以及定位的任务;
- CNN需要获取大量的训练数据,而医学图像很难获得那么大规模的数据。
- 以往解决上面两点困难的方法是使用滑窗的方法,为每一个待分类的像素点取周围的一部分邻域输入。这样的方法有两点好处,首先它完成了定位的工作,其次因为每次取一个像素点周围的邻域,所以大大增加了训练数据的数量。但是这样的方法也有两个缺点,首先通过滑窗所取的块之间具有较大的重叠,所以会导致速度变慢;其次是网络需要在局部准确性和获取上下文之间进行取舍。因为更大的块需要更多的池化层进而降低了定位的准确率,而小的块使网络只看到很小的一部分上下文。
论文解读
network
该架构看起来像一个'U'。该体系结构由三部分组成:contraction,bottleneck和expansion 部分。contraction部分由许多contraction块组成。每个块接受一个输入,应用两个3X3的卷积层,然后是一个2X2的最大池化。在每个块之后,核或特征映射的数量会加倍,这样体系结构就可以有效地学习复杂的结构。最底层介于contraction层和expansion 层之间。它使用两个3X3 CNN层,然后是2X2 up convolution层。
这种架构的核心在于expansion 部分。与contraction层类似,它也包含几个expansion 块。每个块将输入传递到两个3X3 CNN层,然后是2X2上采样层。此外,卷积层使用的每个块的feature map数量得到一半,以保持对称性。每次输入也被相应的收缩层的 feature maps所附加。这个动作将确保在contracting 图像时学习到的特征将被用于重建图像。expansion 块的数量与contraction块的数量相同。之后,生成的映射通过另一个3X3 CNN层,feature map的数量等于所需的segment的数量。
Architecture
a. U-net建立在FCN的网络架构上,作者修改并扩大了这个网络框架,使其能够使用很少的训练图像就得到很 精确的分割结果。
b.添加上采样阶段,并且添加了很多的特征通道,允许更多的原图像纹理的信息在高分辨率的layers中进行传播。
c. U-net没有FC层,且全程使用valid来进行卷积,这样的话可以保证分割的结果都是基于没有缺失的上下文特征得到的,因此输入输出的图像尺寸不太一样(但是在keras上代码做的都是same convolution),对于图像很大的输入,可以使用overlap-strategy来进行无缝的图像输出。
tile strategy
d.为了预测输入图像的边缘部分,通过镜像输入图像来外推丢失的上下文(不懂),实则输入大图像也是可以的,但是这个策略基于GPU内存不够的情况下所提出的。
e.细胞分割的另外一个难点在于将相同类别且互相接触的细胞分开,因此作者提出了weighted loss,也就是赋予相互接触的两个细胞之间的background标签更高的权重。
weighted loss
UNet中的损失计算
UNet对每个像素使用了一种新颖的损失加权方案,使得分割对象的边缘具有更高的权重。这种损失加权方案帮助U-Net模型以不连续的方式分割生物医学图像中的细胞,以便在binary segmentation map中容易识别单个细胞。
首先,在所得图像上应用pixel-wise softmax,然后是交叉熵损失函数。所以我们将每个像素分类为一个类。我们的想法是,即使在分割中,每个像素都必须存在于某个类别中,我们只需要确保它们可以。因此,我们只是将分段问题转换为多类分类问题,与传统的损失函数相比,它表现得非常好。
FCN与U-net的区别
- FCN的主要思想是使用连续的层补充通常的收缩网络,在判别输出的位置添加上采样层,这些层增加了输出层的分别率,为了定位。来自于收缩路径的高分别率与上采样输出相结合,基于这个信息,一个连续的卷积层可以学习组装更精确的输出。(关于FCN详细内容可以参考我的上一篇文章:论文笔记:用于语义分割的全卷积网络 (fully convolutional networks for semantic segmentation))
- 而U-net与FCN的不同在于,U-net的上采样依然有大量的通道,这使得网络将上下文信息向更高层分辨率传播,作为结果,扩展路径与收缩路径对称,形成一个U型的形状(如上图所示)。 网络没有全连接层并且只是用每一个卷积层的有效部分。
总结
图像分割是一个重要的问题,每天都有一些新的研究论文发表。UNet在这类研究中做出了重大贡献。许多新架构的灵感都来自UNet。在业界,这种体系结构有很多变体,因此有必要理解第一个变体,以便更好地理解它们。
- 本文提出了很多数据预处理的技巧,有较强的实用性。
本文的创新点
- 提出了U-net这种网络结构。它同时具备捕捉上下文信息的收缩路径和允许精确定位的对称扩展路径,并且与FCN相比,U-net的上采样过程依然有大量的通道,这使得网络将上下文信息向更高层分辨率传播。
Overlap-tile
策略,这种方法用于补全输入图像的上下信息,可以解决由于现存不足造成的图像输入的问题。- 使用随机弹性变形进行数据增强。
- 使用加权损失。预先计算权重图,一方面补偿了训练数据每类像素的不同频率,另一方面是网络更注重学习相互接触的细胞间边缘。
但是上面的这些创新点并不适合所有任务,比如说对刚体进行分割,那么久很难通过弹性变形对数据进行增强。
本文学到的一些实用的技巧
- 因为使用了 valid conv ,所以采用 Overlap - tile 策略补充图像,其中空白的部分用镜像的方法进行补充;
- 因为有池化层,因此要保证输入的图像在经过每一次池化的时候都要是边长偶数。这点与一般的卷积神经网络不同,因为一般的网络会使用 padding ,这样会保证卷积前后的大小不变,但是 valid conv 会使卷积后的尺寸变小,所以要特别注意输入图像的尺寸。一个比较好的方法是从最小分辨率出发沿收缩路径的反方向进行计算,得到输入图像的尺寸。
- 预先计算权重图,以此计算后面的加权损失函数;
- 加权损失的权重中有一部分是经验值,因此对于不同的任务可以进行调整(只是理论上可以进行调整,并没有试验过);
- 使用标准差为√2/N的高斯分布来进行权值初始化,其中需要注意的是,对于不同的卷积层,N 的大小也是不同的。
- 在收缩路径的最后部加入了 dropout ,隐式地加强了数据增强。
附:
code1:
https://github.com/jakeret/tf_unet
代码解读参见:这里
code2:
使用Keras实现ENet,FCN,UNet,Segnet,PSPNet等语义分割网络
参见这里
json文件批量转化——labelme制备分割数据集
code3:
keras版本Unet
参见这里
code4:
参见Unet
参考文献:
1.https://www.seoxiehui.cn/article-106308-1.html