【Semantic Segmentation】U-Net: Convolutional Networks for Biomedical Image Segmentation 论文解析(转)...

1. 按论文章节回顾具体内容

1. Abstract

  在本文中我们提出了一种网络结构和训练策略,它依赖于充分利用数据增强技术来更高效地使用带有标签的数据。在U-net的结构中,包括捕获一个上下文信息的收缩路径和一个允许精确定位的对称拓展路径。这种方法可以使用非常少的数据完成端到端的训练,并获得最好的效果。

1. Introduction

  CNN 存在很久了,但是一直受限于过大的数据量和神经网络的规模,并没有获得很大的成功,直至 Krizhevsky 才开始爆发。但是将 CNN 用于生物医学图像存在着两点困难,首先CNN常用于分类,但是生物医学往往关注的是分割之类的定位任务;其次医学图像很难获得那么大规模的数据。

  以往解决上面两点困难的方法是使用滑窗的方法,为每一个待分类的像素点取周围的一部分邻域输入。这样的方法有两点好处,首先它完成了定位的工作,其次因为每次取一个像素点周围的邻域,所以大大增加了训练数据的数量。但是这样的方法也有两个缺点,首先通过滑窗所取的块之间具有较大的重叠,所以会导致速度变慢(由FCN的论文分析可知,前向传播和反向传播的速度都会变慢);其次是网络需要在局部准确性和获取上下文之间进行取舍。因为更大的块需要更多的池化层进而降低了定位的准确率,但是小的块使网络只看到很小的一部分上下文。现在一种常见的作法是将多个层放在一起进行考虑(比如说FCN)。

  我们修改并延展了 FCN 的网络结构,使之在仅使用少量的数据进行训练的情况下获得精确的分割结果,具体结构如下图所示
【Semantic Segmentation】U-Net: Convolutional Networks for Biomedical Image Segmentation 论文解析(转)...
              图 1 U-net 网络结构图

如上图所示,这里我们假设U- net 的最低分辨率为 32*32。每一个蓝色的块代表一个多通道的特征图。特征图的通道数被标注在块的顶部。X-Y尺寸设置在块的左下边缘。箭头代表着不同的操作。其中左半部分是收缩路径,右半部分扩展路径

  FCN的主要思想是使用连续的层补充通常的收缩网络,其中的池化层被上采样层取代。因此这些曾增加了输出层的分辨率。为了定位,来自收缩路径的高分辨率与上采样输出相结合。基于这个信息,一个连续的卷积层可以学习组装(集成)更精确的输出。

  U-net 与 FCN 的不同在于,U-net 的上采样依然有大量的通道,这使得网络将上下文信息向更高层分辨率传播。作为结果,扩展路径多多少少与收缩路径对称,形成一个U的形状。网络没有全连接层并且只是用每一个卷积层的有效部分,例如分割图(指图像的输出)只包含这样的一些像素点,它们的上下文(它周围的像素点)都出现在了输入图像中。这种策略使得我们通过一个 Overlap-tile 策略可以使得任意大小的输入图像都可以获得一个无缝分割。

  Overlap-tile 策略如下图所示
【Semantic Segmentation】U-Net: Convolutional Networks for Biomedical Image Segmentation 论文解析(转)...
                图2 Overlap-tile 策略示意图

上图是针对任意大小的输入图像的无缝分割的 Overlap-tile 策略。如果我们要预测黄色框内区域(即对黄色的内的细胞进行分割,获取它们的边缘),需要将蓝色框内部分作为输入。缺失的数据使用镜像进行补充。因为进行的是 valid 卷积(即上文讲的只取有效部分,可以理解为 0 padding),所以需要取比黄色框大的图像来保证上下文的信息是有意义的,缺失的部分用镜像的方法补充是填充上下文信息最好的方法了~

  或许你会有一个问题,为什么作为一种全卷积神经网络不直接输入整张图像,还在做分块呢?答案是因为内存限制,需要分块输入。虽然还是要分块处理,但比之前的滑窗取块要好很多,一方面不用取那么多块,另一方面块之间也没有那么大的区域重叠。通过Overlap-tile 策略可以将图像分块输入,否则的话就只能对图像进行 resize 了,但是这样会降低输入图像的分辨率。

  应用弹性形变进行大量的数据增强。这允许网络可以学习到这种形变的不变性,并且并不要求在带有标签的原始语料库进到这样的变化(指弹性形变)。

  进行细胞的分割,另一种挑战是同一类物体的分类,如下图所示
【Semantic Segmentation】U-Net: Convolutional Networks for Biomedical Image Segmentation 论文解析(转)...
                  图3 .像素点分类权重示意图

上图是用DIC(二次干涉对比)显微技术记录的玻璃上的 HeLa 细胞。其中图 (a) 是原始图像;图 (b) 是基于 gt 的分割覆盖。其中不同的颜色表示不同的 HeLa 细胞示例。图 © 是生成的分割掩膜,其中白色部分是前景,黑色部分是后景;图 (d) 是像素级损失权重图,使得网络强制学习边缘像素。

  为了解决这个问题,作者使用加权损失,对于位与细胞接触部分的像素加大权重,如图 (d) 中的红色的部分。

2. Network Architecture

  网络结构就是最上面的那张图,其中需要注意的是,每经过一次上采样都会将通道数减半,再与收缩路径对应的特征图进行拼接。在拼接之前进行 crop 是必要的,因为两者的尺寸并不相同(主要是因为 valid conv 造成的)。最后一层使用 1×1 大小的卷积核,将通道数降低至特定的数量(如像素点的类别数量)。

  网络对于输入的大小也是有要求的。为了使得输出的分割图无缝拼接,重要的是选择输入块的大小,以便所有的 2×2 的池化层都可以应用于偶数的 x 层和 y 层。一个比较好的方法是从最下的分辨率从反向推到,比如说在网络结构中,最小的是 32×32 ,沿着收缩路径的反向进行推导可知,输入图像的尺寸应该为 572×572

3. Training

  作者使用 caffe 框架,并且采用带动量的SGD方法,其中动量的值设为 momentum=0.99。动量设这么大的原因是这样可以使用大量先前看到的训练样本确定当前最优步骤中的更新。相比于大的 batchsize,作者喜欢大的 input tiles (指的是 oveelap-tile)中的那种图像块,因此我们可以将一个 batch 缩小为一个当张图片的输入。

  能量函数通过结合交叉熵损失函数的最后特征图上的像素级 soft-max 值来计算。其中 soft-max 的计算方法如下

【Semantic Segmentation】U-Net: Convolutional Networks for Biomedical Image Segmentation 论文解析(转)...

其中 αk(x) 代表在位置 x 处的像素在特征图中的第 k 层的**值,其中 xΩΩZ2 ,即 x 属于空间 Ω ,而空间 Ω 是整数集合 Z2 的子集。K 是像素点的类别总数, pk(x) 是近似最大函数。这里面的定义和我们平时使用的 sift-max 是一样的。损失函数是交叉熵损失函数,或者也可以成为 log-likelihood,具体如下所示

【Semantic Segmentation】U-Net: Convolutional Networks for Biomedical Image Segmentation 论文解析(转)...

其中需要注意的是这里使用的是加权的损失函数,对于每一个像素点有着自己的权重,这点可以在图 3 中看到。

  我们通过预先计算权重图的来获得每一个像素在损失函数中的权值,这种方法补偿了训练数据每类像素的不同频率,并且使网络更注重学习相互接触的细胞间的边缘。

  分割边界使用形态学运算,特征图的计算方法如下

【Semantic Segmentation】U-Net: Convolutional Networks for Biomedical Image Segmentation 论文解析(转)...

其中的 wc 是用于平衡类别频率的权重图,d1 是该像素点到最近的细胞边界的距离;d2 是该像素点到第二近的细胞边界的距离。在我们的实验中,将 w0 设置为10,将 σs设置为大约 5 个像素。

  初始化对于模型的正确训练起着很大的作用,一个好的初始化应该保证网络中的每一个特征图有近似的单位方差。在这里使用服从标准差为 2/N 的高斯分布来进行初始化(实际上就是 He normal),其中的 N 代表着一个神经元的传入节点的数目,比如说某一个卷积层,他的卷积核的大小为 3×3,通道数是 64,那么 N=9×64=576

3.1 Data Augmentation

  当只有少量的训练样本,对于让网络学习到所需的不变性和鲁棒性来讲,数据增强是必要的。这里尤其需要注意的是,这里指的少量数据样本究竟少到一种什么样的程度,就 IBSI 2012 数据集来讲,它仅仅有 30 张 512×512 的图像作为训练集!

  显微图像一般需要旋转平移不变性,弹性形变和灰度值变化鲁棒性。训练样本的随机弹性形变似乎是训练之后少量标注图像的分割网络的关键。

  此外在收缩路径的最后加入了 Drop-out,隐式地加强了数据增强。

2. 论文归纳总结

  与其说这是一篇论文,我更认为这一篇很实用的打怪升级刷比赛的指南。里面提出的很多技巧是令我眼前一亮,并且具有较强的使用价值的。

2.1 本文的创新点

  我认为本文主要有四个创新点

   (1) 提出了 U-net 这种网络结构。它同时具有捕捉上下文信息的收缩路径和允许精确定位的对称扩展路径;并且与 FCN 相比,U-net 的上采样依然有大量的通道,这使得网络将上下文信息向更高层分辨率传播。

   (2) Overlap-tile 策略。这种方法用于补全输入图像的上下文信息,可以解决由于现存不足造成的图像分块输入的问题。

   (3) 使用随机弹性形变进行数据增强。

   (4) 使用加权损失。预先计算权重图,一方面补偿了训练数据每类像素的不同频率,另一方面使网络更注重学习相互接触的细胞间的边缘。

  但是上面的这些创新点并不是适合所有的任务,比如说对刚体进行分割,那么就很难通过弹性形变进行数据增强。

2.2 实践中需要注意的技巧

  (1) 因为使用了 valid conv ,所以采用 Overlap - tile 策略补充图像,其中空白的部分用镜像的方法进行补充。

   (2) 因为有池化层,因此要保证输入的图像在经过每一次池化的时候都要是边长偶数。这点与与一般的卷积神经网络不同,因为一般的网络会使用 padding ,这样会保证卷积前后的大小不变,但是 valid conv 会使卷积后的尺寸变小,所以要特别注意输入图像的尺寸。一个比较好的方法是从最小分辨率出发沿收缩路径的反方向进行计算,得到输入图像的尺寸。

   (3) 预先计算权重图,以此计算后面的加权损失函数

   (4) 加权损失的权重中有一部分是经验值,因此对于不同的任务可以进行调整(只是理论上可以进行调整,并没有试验过)

   (5) 使用标准差为 2/N 的高斯分布来进行初始化,其中需要注意的是,对于不同的卷积层,N 的大小也是不同的。

   (6) 在收缩路径的最后部加入了 dropout ,隐式地加强了数据增强。

最近在研究全卷积神经网络在图像分割方面的应用,因为自己是做医学图像处理方面的工作,所以就把一个基于FCN(全卷积神经网络)的神经网络用 keras 实现了,并且用了一个医学图像的数据集进行了图像分割。

全卷积神经网络

大名鼎鼎的FCN就不多做介绍了,这里有一篇很好的博文 http://www.cnblogs.com/gujianhan/p/6030639.html
不过还是建议把论文读一下,这样才能加深理解。

医学图像分割框架

医学图像分割主要有两种框架,一个是基于CNN的,另一个就是基于FCN的。

基于CNN 的框架

这个想法也很简单,就是对图像的每一个像素点进行分类,在每一个像素点上取一个patch,当做一幅图像,输入神经网络进行训练,举个例子:

【Semantic Segmentation】U-Net: Convolutional Networks for Biomedical Image Segmentation 论文解析(转)...

这是一篇发表在NIPS上的论文Ciresan D, Giusti A, Gambardella L M, et al. Deep neural networks segment neuronal membranes in electron microscopy images[C]//Advances in neural information processing systems. 2012: 2843-2851.

这是一个二分类问题,把图像中所有label为0的点作为负样本,所有label为1的点作为正样本。

这种网络显然有两个缺点:
1. 冗余太大,由于每个像素点都需要取一个patch,那么相邻的两个像素点的patch相似度是非常高的,这就导致了非常多的冗余,导致网络训练很慢。
2. 感受野和定位精度不可兼得,当感受野选取比较大的时候,后面对应的pooling层的降维倍数就会增大,这样就会导致定位精度降低,但是如果感受野比较小,那么分类精度就会降低。

基于FCN框架

在医学图像处理领域,有一个应用很广泛的网络结构—-U-net ,网络结构如下:

【Semantic Segmentation】U-Net: Convolutional Networks for Biomedical Image Segmentation 论文解析(转)...

可以看出来,就是一个全卷积神经网络,输入和输出都是图像,没有全连接层。较浅的高分辨率层用来解决像素定位的问题,较深的层用来解决像素分类的问题。

问题分析

我采用的数据集是一个isbi挑战的数据集,网址为: http://brainiac2.mit.edu/isbi_challenge/

数据集需要注册下载,我的GitHub上也有下载好的数据集。

这个挑战就是提取出细胞边缘,属于一个二分类问题,问题不算难,可以当做一个练手。

【Semantic Segmentation】U-Net: Convolutional Networks for Biomedical Image Segmentation 论文解析(转)...

这里最大的挑战就是数据集很小,只有30张512*512的训练图像,所以进行图像增强是非常有必要的。

在这里,我参考了一篇做图像扭曲的论文,http://faculty.cs.tamu.edu/schaefer/research/mls.pdf

实现的效果如下:

这是扭曲之前:

【Semantic Segmentation】U-Net: Convolutional Networks for Biomedical Image Segmentation 论文解析(转)...

这是扭曲之后:

【Semantic Segmentation】U-Net: Convolutional Networks for Biomedical Image Segmentation 论文解析(转)...

这是我进行图像增强的代码: http://download.****.net/detail/u012931582/9817058

keras 实现

keras是一个非常简单地深度学习框架,可以很方便的搭建自己的网络,这是我的keras实现: https://github.com/zhixuhao/unet

效果

最后在测试集上的精度可以达到95.7。

效果如下所示:

【Semantic Segmentation】U-Net: Convolutional Networks for Biomedical Image Segmentation 论文解析(转)...

【Semantic Segmentation】U-Net: Convolutional Networks for Biomedical Image Segmentation 论文解析(转)...