0. 前言

  今天读了U-Net觉得很不错,同时网上很多很好很详细的讲解,因此就不再自己写一个overview了,互联网的意义就是给了我们相互学习,相互借鉴的黄金机会(懒惰完美的接口)。

1. 第一篇

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

1. Abstract

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

1. Introduction

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

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

  我们修改并延展了 FCN 的网络结构,使之在仅使用少量的数据进行训练的情况下获得精确的分割结果,具体结构如下图所示



              图 1 U-net 网络结构图

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

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

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

  Overlap-tile 策略如下图所示



                图2 Overlap-tile 策略示意图

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

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

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

  进行细胞的分割,另一种挑战是同一类物体的分类,如下图所示



                  图3 .像素点分类权重示意图

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

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

2. Network Architecture

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

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

3. Training

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

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

其中 αk(x) \alpha_k(x)" role="presentation">αk(x)αk(x) \alpha_k(x)αk​(x) 代表在位置 x 处的像素在特征图中的第 k 层的激活值,其中 x∈Ω,Ω⊂Z2 x\in\Omega,\Omega\subset Z^2" role="presentation">x∈Ω,Ω⊂Z2x∈Ω,Ω⊂Z2 x\in\Omega,\Omega\subset Z^2x∈Ω,Ω⊂Z2 ,即 x 属于空间 Ω \Omega" role="presentation">ΩΩ \OmegaΩ ,而空间 Ω \Omega" role="presentation">ΩΩ \OmegaΩ 是整数集合 Z2 Z^2" role="presentation">Z2Z2 Z^2Z2 的子集。K 是像素点的类别总数, pk(x) p_k(x)" role="presentation">pk(x)pk(x) p_k(x)pk​(x) 是近似最大函数。这里面的定义和我们平时使用的 sift-max 是一样的。损失函数是交叉熵损失函数,或者也可以成为 log-likelihood,具体如下所示

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

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

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

其中的 wc w_c" role="presentation">wcwc w_cwc​ 是用于平衡类别频率的权重图,d1 d_1" role="presentation">d1d1 d_1d1​ 是该像素点到最近的细胞边界的距离;d2 d_2" role="presentation">d2d2 d_2d2​ 是该像素点到第二近的细胞边界的距离。在我们的实验中,将 w0 w_0" role="presentation">w0w0 w_0w0​ 设置为10,将 σ \sigma" role="presentation">σσ \sigmaσs设置为大约 5 个像素。

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

3.1 Data Augmentation

  当只有少量的训练样本,对于让网络学习到所需的不变性和鲁棒性来讲,数据增强是必要的。这里尤其需要注意的是,这里指的少量数据样本究竟少到一种什么样的程度,就 IBSI 2012 数据集来讲,它仅仅有 30 张 512×512 512 \times512" role="presentation">512×512512×512 512 \times512512×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 \sqrt{2/N}" role="presentation">2/N−−−−√2/N \sqrt{2/N}2/N​ 的高斯分布来进行初始化,其中需要注意的是,对于不同的卷积层,N 的大小也是不同的。

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

2. 第二篇

论文题目:U-Net: Convolutional Networks for Biomedical Image Segmentation

论文地址:https://arxiv.org/pdf/1505.04597v1.pdf

本论文主要亮点:

(1)改进了FCN,把扩展路径完善了很多,多通道卷积与类似FPN(特征金字塔网络)的结构相结合。

(2)利用少量数据集进行训练测试,为医学图像分割做出很大贡献。

由于文章比较短,我在这里先贴出主要翻译:

摘要

训练DNN需要很多数据,这是业内公认。本文提出了一种网络结构和一种训练策略,训练策略基于对数据增强方法的使用,以便对有限的标记样本进行充分利用。

1、 简介

该结构包含一个用于捕捉语义的收缩路径和一个用于精准定位的对称扩展路径。该网络只使用少量数据,就可以训练出一个端对端(图像入,图像出)网络,并且性能很好(跑赢使用滑窗法的CNN方法,该方法之前是基于)。我们的结构在透射光显微镜图像数据集上获得了ISBI2015关键。我们的结构速度也非常快,处理一副512*512的图像,在最新的GPU上不到1s。

CNN之前一直面临的困境有两方面的原因,一是没有足够的标记数据,二是人们使用的网络规模一直很小。

Krizhevsky在ImageNet数据集上使用了8层CNN和百万级别的参数数量,同时他使用的训练集规模也在百万。他之后CNN的网络规模越来越大。

过去在CNN用于分类任务时,人们只能图像输入,标签输出,但是在许多视觉任务中,比如生物医学图像处理中,人们希望得到针对每个像素的分类结果,还有,获取大量的医学图像数据用于训练是不可能的。

因此,Ciresan训练了一种滑窗网络用来预测每个像素的标签,该网络的输入是以像素为中心的一个区域。

该网络的优点有: 

1、网络具有局部感知能力 

2、用于训练的样本数量远大于训练图像的数量 

该网络获得了EM分割挑战 ISBI2012冠军。

该网络的缺点有: 

1、对于每个patch(以像素为中心的区域)都要运行一次检测,所以速度很慢,并且由于patch的重叠,所以有很多运行都是多余的 

2、必须在局部标记准确性和语义的确定之间进行权衡,大的patch需要更多的池化层,但是池化层降低了局部标记的准确性,而小的patch无法获得充分的语义信息

本文中我们的设计基于一种更加优雅的结构,FCN,我们对这种结构进行了一定的修改和拓展,以使其使用更少的训练图像,产生更高精度的分割。

FCN的主要思想是对常规的收缩网络进行补充,补充的内容是连续的layer,在这些层中,池化操作被上采样操作代替。因此,这些层提高了输出的解析度(resolution)。为了局部化(图像局部像素的label一样),将从收缩网络得到的高维特征与上采样的结果相结合,这样连续的卷积层就能从这种结合中汇聚更加准确的输出。

我们对FCN的重要改进之一是在上采样部分,我们也有大量的feature channels,这些feature channel允许网络将范围信息(context)传播到高分辨率层扩展层或多或少对称于收缩层产生了一个U型的结构。该网络不包含任何全连接层,只使用每次卷积的有效部分,如,分割映射只包含像素,后面的高维特征包含全部语义信息。该方法允许任意大小的图像通过overlap-tile策略进行无缝分割。overlap-tile策略就是,要预测一个batch的标签,你必须输入比之大的一个框的图像,输入图像没有的部分,用镜像法外推。这种策略对于将网络应用于大型图像是有非常重要的意义的,否则可能会受到GPU内存的限制。

我们的任务中训练数据非常少,所以我们对仅有的数据进行弹性形变操作,以获得更多的数据。这样使得网络可以学习到形变特征。生物医学图像形变非常常见。【他们的这种方法等于加入了额外特征】数据增强的的学习不变性数据已经发表在Dosovitskiy的论文中,在非监督特征学习那部分。

另一个挑战是分割开连在一起的同种细胞,最终,我们提出使用加权损失,这样分离*连在一起的细胞的label功能*获得更大的权重。

我们的方法在比赛中拿了头筹。

2、 网络结构

收缩路径就是常规的卷积网络,它包含重复的2个3x3卷积,紧接着是一个RELU,一个max pooling(步长为2),用来降采样,每次降采样我们都将feature channel减半。扩展路径包含一个上采样(2x2上卷积),这样会减半feature channel,接着是一个对应的收缩路径的feature map,然后是2个3x3卷积,每个卷积后面跟一个RELU,因为每次卷积会丢失图像边缘,所以裁剪是有必要的,最后来一个1x1的卷积,用来将有64个元素的feature vector映射到一个类标签,整个网络一共有23个卷积层。

为了允许对最终的分割map**无缝tile**,选择输入tilesize非常重要因为这样所有的2x2的max池化操作应用到偶数x和y

3、训练

输入图像和他们对应的分割map用来训练网络,用得方法是SGD,框架是caffe。由于unpadded卷积,输入图像大于输出图像,大一个border width常数。为了降低系统消耗,并且最大利用GPU memory,我们对大batch使用了大的输入tiles,因此降低了单图像的batch。对应地,我们使用了一个高的momentum(0.99),这样大量的训练数据决定当前优化步骤的更新。

能量函数是用softmax函数计算最后一步算出的feature map,该feature map用交叉熵损失函数处理,再用softmax。 

softmax公式如下:

ak(x)表示每一像素点(x)对应特征通道(k)的得分 

K是类的数量 ,pk(x)是类k的对像素点x的分类结果 

然后交叉熵对于每个像素点的进行惩罚,惩罚所用的公式为:

是每个像素的真实标签 
是之前介绍的权重图,用来让某些像素更加重要

我们预先计算每个真实样本的权重图,以补偿训练数据集中某个类的像素的不同频率,并强制网络学习我们在接触的细胞之间引入的小分离边界。

分离边界是用形态学operation计算的,然后使用以下公式计算权重图:

ωc:Ω→R是用来平衡类频率的权重图 

d1:Ω→R表示到背景的某个像素点到最近细胞边界的距离 

d2:Ω→R表示到背景的某个像素点到第二近的细胞边界的距离 

经过实验,我们将的设置为ω0=10,σ≈5个像素

权重初始化相当重要,我们使用高斯分布初始化权重,标准差为,其中N表示一个神经元的输入节点是的数量,如,对于一个3x3的卷积,前一层有64个feature channel,那么N=3∗3∗64=576

3.1、数据增强

当只有一点点训练数据的时候,数据增强就是必要的,它可以教给网络什么是任务所需的不变的东西,什么是需要学习的属性,例如显微镜图像,我们初期要做平移、旋转不变性的复制,还有变形的健壮性,以及灰度值差异(亮度)。尤其是对训练数据进行随机形变,感觉这是在用少量训练数据做数据增强时的核心方法。我们使用随机位移矢量在粗糙的3×3网格上生成平滑变形。位移矢量是从标准差为10的高斯分布中采样的。然后使用双三次方插值计算每个像素位移。 收缩路径末端的dropout层执行进一步的隐式数据增强。

4、实验

实验部分就是一些表格,对比了不同算法在一些数据集上的表现,这里就不一一列出了。

5、结论

u-net架构在不同的生物医学分割应用中实现了非常好的性能。 由于具有弹性变形的数据增强功能,它只需要很少的注释图像,并且在NVidia Titan GPU(6 GB)上的训练时间非常短,只需要10个小时。 我们提供完整的Caffe 实现和训练好的网络。 我们相信,u-net架构可以轻松应用于更多的任务。

这里做出几点解析:

(1)文中所说的Ciresan训练了一种滑窗网络的定位准确性和上下文间不可兼得问题:

因为大的patches需要更多的max-pooling层这样减小了定位准确性(为什么?因为你是对以这个像素为中心的点进行分类,如果patch太大,最后经过全连接层的前一层大小肯定是不变的,如果你patch大就需要更多的pooling达到这个大小),因为Pooling层会降低分辨率,丢失信息),而小的patches只能看到很小的局部信息,包含的背景信息不够。许多现在的方法使用不同层的特征来同时兼容定位和利用context。

(2)网络结构中的一些问题:

右边的网络expansive path:使用上采样与左侧contracting path ,pooling层的featuremap相结合,然后逐层上采样到392X392的大小heatmap。(pooling层会丢失图像信息和降低图像分辨率且是不可逆的操作,对图像分割任务有一些影响,对图像分类任务的影响不大,为什么要做上采样?:因为上采样可以补足一些图片的信息,但是信息补充的肯 定不完全,所以还需要与左边的分辨率比较高的图片相连接起来(直接复制过来再裁剪到与上采样图片一样大小),这就相当于在高分辨率和更抽象特征当中做一个折中,因为随着卷积次数增多,提取的特征也更加有效,更加抽象,上采样的图片是经历多次卷积后的图片,肯定是比较高效和抽象的图片,然后把它与左边不怎么抽象但更高分辨率的特征图片进行连接),我在这里有一个想法,可不可不做串联(concat),将左边复制裁剪后的特征与右边相对于的特征做elementwise操作会怎么样? 

(3)网络输出与Loss问题

网络在扩张路径最后经过了两次卷积,达到最后的heatmap,再用一个1X1的卷积做分类,有没有发现这里最终输出的是两个通道的特征图这里是分成两类,背景和前景,因为这个是对医学图像做的处理,只分背景和前景,所以用的是两个神经元做卷积,得到最后的两张heatmap,例如第一张表示的是第一类的得分(即每个像素点对应第一类都有一个得分),第二张表示相同位置的像素点的第二类的得分heatmap,然后作为softmax函数的输入,算出概率比较大的softmax类,选择它作为输入给交叉熵进行反向传播训练。

在这里有一个权重的分配问题:

这个是怎么理解的呢,你先看看要分割的图和金标准:

这是给像素分配权重然后进行加权,d1(x)表示图中某一背景像素点到离这个点最近的细胞边界的距离,d2(x)表示离这个像素点第二近的细胞的距离,你们可以举一下特例算一下这个权重公式会发现(距离越远,后面那一块越小,几乎为0,所以你看到的远离细胞的地方,基本上权值都是一样的,接近于Wc),即在细胞边界附近的像素点给的权重会大一些,离细胞比较远的像素点的权重会小一些,为什么这么做呢?因为,如果同类细胞贴的比较近,可能就会增大训练的难度,减少准确率,毕竟卷积会考虑该像素点周围的一些特征,而两个相同的类的细胞贴在一起,就容易误判,所以对这种两个相同类贴在一起的细胞边界,给予较大的权重,使的训练之后分类分割更准确 。

(4)图像输入与输出不一样大的问题:  

      有没有发现网络的输入与输出的图像不一样大,对的,那是因为在网络做卷积的过程中没有进行pad,导致每次卷积都会有些损失,到最后导致输出小于输入,其实在进行Loss回归的过程中,是用金标准上的每个点与输出的图像的每个点进行对比,然后得到Loss,但是这个不一样大怎么进行每个像素点的对比,这个时候作者是这样做的,他把输入图像先扩大,怎么扩大呢,就是对图像做镜像操作,四个边做镜像往外翻一下就扩大了图像,你看看下图就知道了,然后把扩大后的图像输入网络,然后输出后刚好和金标准的图像大小是一样的,这样就可以进行Loss回归了。

(5)关于数据增强:

其实数据增强在现在来看已经很普遍了,很容易理解了,就是为了防止过拟合,让网络不易学习到数据的细节方面,在本文中,医学图像是怎么做数据增强的呢,这个时候就是把输入图像与金标准做同等的变化,输入图像怎么办,金标准怎么变,说起来比较好弄,但是做起来比较难,有一个比较巧妙的方法就是,把输入图像看做一个通道,金标准看做一个通道,两个通道合成一个图像,用Keras里的数据增强函数就可以一步完成了两种图像的增强。

总结

U-net网络是在众多网络中比较简单的一个网络,容易应用和改进,有很大的改进空间,我在想能不能用U-net做自然图像分割,估计已经有人做出来了。

谢谢大家,我叫冯爽朗!

3. 第三篇keras实现

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

全卷积神经网络

大名鼎鼎的FCN就不多做介绍了,这里有一篇很好的博文 http://www.cnblogs.com/gujianhan/p/6030639.html

不过还是建议把论文读一下,这样才能加深理解。

医学图像分割框架

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

基于CNN 的框架

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

这是一篇发表在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 ,网络结构如下:

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

问题分析

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

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

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

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

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

实现的效果如下:

这是扭曲之前:

这是扭曲之后:

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

keras 实现

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

效果

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

效果如下所示:

4. 一篇关于U-Net的改进

代码地址(包含预训练权重):https://github.com/ternaus/TernausNet

随着处理密集计算的计算机硬件的发展和平民化,研究者能够处理拥有数百万参数的模型。卷积神经网络在图像分类、目标识别、场景理解等领域都取得了极大的成功。对几乎所有的计算机视觉问题,基于 CNN 的方法都优于其他技术,在很多情况下甚至超越了人类专家。目前,几乎所有的计算机视觉应用尝试使用深度学习技术来改进传统方法。它们影响到我们的日常生活,且这些技术的潜在应用场景似乎也很惊人。

可靠的图像分割是计算机视觉领域的重要任务之一。该问题对医疗图像领域极为重要,可以提高诊断能力,在场景理解领域中有助于创造安全的自动驾驶汽车。密集图像分割本质上是把图像分为有意义的区域,可看作是像素级别的分类任务。处理此类问题最直接(也缓慢)的方法是手动分割图像。然而,这种方法极为耗时,而且人类数据管理员不可避免地会出错、存在不一致问题。自动化该过程能提供尽可能快的、系统性的图像分割。该过程需要达到一定的准确率,以在生产环境中使用。

在过去几年中,研究者提出了不同的方法来解决该问题:创造一种 CNN,为一整张输入图像在单个前向传递中生成分割图。其中,最成功的最优方法基于全卷积网络(FCN)[2]。其核心思想是将 CNN 中的全连接层替换成卷积层,成为强大的特征提取器,直接输出空间特征图,而不是全连接层输出的分类分数。然后,上采样这些图,生成密集的逐像素输出。该方法以端到端的方式训练 CNN,分割任意大小的输入图像。此外,在 PASCAL VOC 等标准数据集上,该方法极大地改进了分割的准确率。

后来,这一方法进一步被改进为 U-Net 神经网络 [4],U-Net 架构使用跳过连接(skip connection)将低层特征图与高层特征图结合起来,带来精确的像素级定位。在上采样部分,大量的特征通道向更高的分辨率层传播上下文信息。在卫星图像分析、医疗图像分析等二值图像分割竞赛中,这种类型的网络架构已经证明了自己。

在此论文中,作者展示了如何使用预训练权重轻松改进 U-Net 的性能。作者还将它应用到航空图像标注数据集 [8] 中,该数据集包含多个城市的高清航空图像。这些图像的每个像素都被标注为「建筑」或「非建筑」类别。该架构另一个成功应用案例与初始化方案是 Kaggle Carvana 图像分割竞赛 [9],本论文作者之一使用它作为解决方案的一部分,获得了第一名。

II. 网络架构

通常,U-Net 架构包含一个收缩路径来捕捉上下文信息,以及一个对称的扩张路径以进行精准的定位(见图 1)。收缩路径遵循典型的卷积网络架构,即交替卷积和池化运算,并逐步下采样特征图,同时逐层增加特征图的数量。扩张路径的每个阶段由一个特征图上采样和紧随的卷积构成。

图 1:编码器-解码器神经网络架构,亦称为 U-Net,使用无全连接层的 VGG11 作为编码器。每个蓝色的矩形块代表一个经过一系列变换的多通道特征图。矩形的长度代表相对的图尺寸(像素级),其宽度和通道数量成正比。左边编码器部分的通道数逐渐增加,而右边解码器部分的通道数逐渐减少。顶部的箭头表示每个编码层的信息迁移,并传输至对应的解码层。

因此,扩张分支可以提高输出的分辨率。为了进行定位,扩张路径通过跳过连接将上采样特征和来自收缩路径的高分辨率特征结合起来 [4]。模型的输出是一个逐像素掩码,展示了每个像素的类别。该架构被证明对有限数据的分割问题很有用,示例参见 [5]。

U-Net 可以从相对较小的训练集中学习。多数情况下,图像分割的数据集由至多几千张图像构成,因为手动标记掩码是非常繁重的工作。通常 U-Net 以随机初始化权重开始训练。众所周知,要使网络训练避免过拟合,数据集应该足够大,包含数百万张图像。在 ImageNet [10] 数据集上训练的网络被广泛地用于其它任务的网络初始化。用这种方法,可以让网络非预训练的几层(有时仅仅是最后一层)利用数据集的特征进行学习。

我们使用 VGG 族 [11] 中非常简单的 CNN 作为 U-Net 网络的编码器,它由 11 个顺序层构成,称为 VGG11,参见图 2。VGG11 包含 7 个卷积层,每个紧随着一个 ReLU 激活函数和 5 个最大池化运算,每个运算之后将特征图减半。所有卷积层都有 3x3 的卷积核,通道数如图 2 所示。第一个卷积层有 64 个通道,然后网络加深,每个卷积层和最大池化运算之后通道数会加倍,直到通道数变为 512。在之后的卷积层中,通道数不变。

图 2:VGG11 网络架构。在这张图中,每个卷积层之后是 ReLU 激活函数。每个框中的数字表示对应特征图的通道数量。

为了构建解码器,我们移除所有的全连接层,并用包含 512 个通道的单一卷积层来替换它们,该层是网络的瓶颈中间部分,分离编码器与解码器。为了构建解码器,我们使用两倍于特征图大小的转置卷积层,同时把通道数量减少一半。转置卷积的输出接着被连接到解码器对应部分的输出。由此得到的特征图通过卷积运算来处理,以保持通道数量与对称编码器项相同。上采样步骤被重复 5 次以配对 5 个最大池化层,如图 1 所示。严格来说全连接层可以采用任何大小的输入,但是由于我们有 5 个最大池化层,每个层下采样图像两次,只有可被 32(2^5)整除的图像可以用作当前网络实现的输入。

图 3:三种以不同权重初始化的 U-Net 模型的 Jaccard 指标随训练 epoch 的变化。蓝线表示随机初始化权重的模型,橙线表示编码器以在 ImageNet 上预训练的 VGG11 网络权重初始化的模型,绿线表示整个网络在 Carvana 数据集上预训练的模型。

图 4:绿色像素的二进制掩膜表示分类族群(建筑)。图 A 展示初始图像和叠加的真实掩膜。图 B 到图 D 表示使用三种权重初始化方案并训练了 100 个 epoch 后得到的预测结果。图 B 表示随机初始化权重的模型,图 C 中的模型使用随机初始化权重,编码器以在 ImageNet 上预训练的 VGG11 网络权重进行初始化,图 D 中的模型使用在 Carvana 数据集上预训练的权重。

在本论文中,通过使用微调(fine-tuning)技术初始化网络编码器的权重,我们展示了如何提升 U-Net 的性能。这种神经网络被广泛用于图像分割任务,并在许多二值图像分割、竞赛中取得了当前最优结果。微调已广泛用于图像分类任务,但是就我们所知还未用于 U-Net 类型的架构。对于图像分割问题,微调应该是更自然的选择,因为收集大量数据集(尤其是医疗图像)并进行很好地标注是很困难的。此外,预训练网络可以大幅减少训练时间,同时有助于防止过拟合。考虑到存在更多先进的预训练编码器比如 VGG16 [11] 或任何预训练的 ResNet 网络,我们的方法还可进一步提升。有了这些改进的编码器,解码器可以像我们使用的一样简单。

论文:TernausNet: U-Net with VGG11 Encoder Pre-Trained on ImageNet for Image Segmentation

论文链接:https://arxiv.org/abs/1801.05746

摘要:像素级的图像分割是计算机视觉中的艰巨任务。由编码器和解码器构成的经典 U-Net 架构经常用于分割医学影像、卫星影像等。通常,神经网络使用在大型数据集(例如 ImageNet)上预训练的网络权重进行初始化,相比用小型数据集从零开始训练的网络能获得更好的性能。在某些特定的应用中,特别是医学和交通安全,模型的准确率至关重要。在本文中,我们展示了 U-Net 类型的架构如何利用预训练的编码器提升性能。我们的代码和相关的预训练权重已开源。我们比较了三种权重初始化方案:LeCun uniform、取自 VGG11 权重的编码器和在 Carvana 数据集上训练的完整网络。该网络架构是 Kaggle 竞赛(Carvana Image Masking Challenge)中获胜解决方案(在 735 名参赛者中排名第一)的一部分。

【Semantic Segmentation】U-Net: Convolutional Networks for Biomedical Image Segmentation 论文解析(转)的更多相关文章

  1. Paper | U-Net: Convolutional Networks for Biomedical Image Segmentation

    目录 故事背景 U-Net 具体结构 损失 数据扩充 发表在2015 MICCAI.原本是一篇医学图像分割的论文,但由于U-Net杰出的网络设计,得到了8k+的引用. 摘要 There is larg ...

  2. U-Net: Convolutional Networks for Biomedical Image Segmentation(理解+github代码)

    github代码:https://github.com/Chet1996/pytorch-UNet 0 - Abstract 这篇文章是生物学会议ICMICCAI2015的文章,主要针对的是生物影像进 ...

  3. 论文阅读笔记五:U-Net: Convolutional Networks for Biomedical Image Segmentation(CVPR2015)

    前面介绍了两个文本检测的网络,分别为RRCNN和CTPN,接下来鄙人会介绍语义分割的一些经典网络,同样也是论文+代码实现的过程,这里记录一下自己学到的东西,首先从论文下手吧. 英文论文原文地址:htt ...

  4. 【Semantic segmentation】Fully Convolutional Networks for Semantic Segmentation 论文解析

    目录 0. 论文链接 1. 概述 2. Adapting classifiers for dense prediction 3. upsampling 3.1 Shift-and-stitch 3.2 ...

  5. SPP Net(Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)论文理解

    论文地址:https://arxiv.org/pdf/1406.4729.pdf 论文翻译请移步:http://www.dengfanxin.cn/?p=403 一.背景: 传统的CNN要求输入图像尺 ...

  6. 【网络结构】MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications论文解析

    目录 0. Paper link 1. Overview 2. Depthwise Separable Convolution 2.1 architecture 2.2 computational c ...

  7. 【Network Architecture】Feature Pyramid Networks for Object Detection(FPN)论文解析(转)

    目录 0. 前言 1. 博客一 2.. 博客二 0. 前言   这篇论文提出了一种新的特征融合方式来解决多尺度问题, 感觉挺有创新性的, 如果需要与其他网络进行拼接,还是需要再回到原文看一下细节.这里 ...

  8. Fully Convolutional Networks for Semantic Segmentation 译文

    Fully Convolutional Networks for Semantic Segmentation 译文 Abstract   Convolutional networks are powe ...

  9. Fully Convolutional Networks for semantic Segmentation(深度学习经典论文翻译)

    摘要 卷积网络在特征分层领域是非常强大的视觉模型.我们证明了经过端到端.像素到像素训练的卷积网络超过语义分割中最先进的技术.我们的核心观点是建立"全卷积"网络,输入任意尺寸,经过有 ...

随机推荐

  1. LRU算法的Python实现

    http://flychao88.iteye.com/blog/1977653文章中介绍了常见的几种缓存淘汰策略 LRU:least recently used,最近最少使用算法.其实就是按使用时间倒 ...

  2. oracle入门(5)——java连接oracle数据库

    [本文介绍] 前面几篇说了那么多,最终还没讲到如何用java连接数据库,本文实用一点,讲讲如何连接数据库. [java连接oracle数据库] 1.导入jdbc驱动:看到这里,就忙着上网找驱动?不,安 ...

  3. vs中nodejs代码 resharper 提示 ECMAScript2015 Feature. your Current language level is ECMAScript5的解决办法

    问题如图 错误信息:ECMAScript 2015 Feature. your Current language level is: ECMAScript5 解决方法, 打开 Resharper -& ...

  4. Kafka笔记整理(二):Kafka Java API使用

    下面的测试代码使用的都是下面的topic: $ kafka-topics.sh --describe hadoop --zookeeper uplooking01:,uplooking02:,uplo ...

  5. vue 动画过渡

    一.过渡(动画) 1. 简介 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果,本质上还是使用CSS3动画:transition.animation 2. 基本用法 1.使用t ...

  6. Deep learning与Neural Network

    深度学习是机器学习研究中的一个新的领域,其动机在于建立.模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本.深度学习是无监督学习的一种. 深度学习的概念源于人工神经网络的 ...

  7. 在debian9上安装mongodb

    MongoDB是一个免费的开源NoSQL文档数据库,在现代Web应用程序中常用.在本教程中,您将安装MongoDB,管理其服务,并可选择启用远程访问.要遵循这个...... 介绍 MongoDB是一个 ...

  8. 【转】深入浅出UML类图

    转自:http://www.cppblog.com/API/archive/2013/07/04/201506.html 在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin ...

  9. struct2的xml文件中result的配置(转)

    一个result代表了一个可能的输出.当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出.在com.opensymphony.xwor ...

  10. python中统计计数的几种方法

    以下实例展示了 count() 方法的使用方法: 1 2 3 4 5 6 # !/usr/bin/python3   T = (123, 'Google', 'Runoob', 'Taobao', 1 ...