首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深度学习第14期:图像分割问题

导语:上期,我们已经大致介绍了目标检测方法。这期,我们来看图像分割问题。乍一看二者似乎很像,但是实际上二者之间的差别是很大的。我们主要来介绍一下图像分割问题中常见的一些技巧,以及目前最常用的模型U-Net。

图像分割的传统方法

传统上,为了对一个像素分类,使用该像素周围的一个图像块作为CNN的输入用于训练和预测。依次对每一个像素点都进行这种分类,则完成了对整个图片的分割。

但是这种方法有几个缺点:一是存储开销很大。例如对每个像素使用的图像块的大小为15x15,然后不断滑动窗口,每次滑动的窗口给CNN进行判别分类,因此所需的存储空间根据滑动窗口的次数和大小急剧上升。二是计算效率低下。相邻的像素块基本上是重复的,针对每个像素块逐个计算卷积,这种计算也有很大程度上的重复。三是像素块的大小限制了感知区域的大小。通常像素块的尺寸比整幅图像的尺寸小很多,只能提取一些局部的特征,从而导致分类的性能受到限制。

下面,我们来介绍深度学习做图像分割的主要办法——U-Net。它可以很好地解决上述的问题,即能够使得每个像素的分类尽可能考虑全局信息,也要尽量节约计算量。不过在此之前,我们要先介绍一种上采样的技术。U-Net中会用到这种技术。

上采样

在普通的CNN中,为了降维,我们会采用下采样。常见的下采样包括pooling、subsample以及使用带有stride的卷积(相当于先采用stride=1的卷积然后再进行subsample)。通过下采样,我们可以对每一个k×k的方块只找出一个元素做为代表元,以达到降维的目的。

而这里,我们要考虑如何才能实现上采样。即如何从1个元素中生成出k×k个元素。常见的上采样都是通过转置卷积(transpose convolution)实现的。

由于卷积是线性的,所以我们能够将其转化为仿射变换,即矩阵的乘积。而矩阵自然是可以转置的,这也就让我们自然想到如下问题:如果将一个卷积核K对应于一个矩阵A,找它的转置为A’,它也对应于一个矩阵乘积运算。如果将这个矩阵运算对应回一个卷积核K’,K’会是怎么样的呢?

首先要注意到的是,如果一个卷积核K,某一维输入的长度i,输出长度o,则卷积核K’应该以o为输入长度,i为输出长度。如果原来的卷积核把输入变小了,则转置卷积核会把输入变大作为输出。

下面,我们来看stride与zero padding在转置下分别会发生哪些变化:

假定卷积核K的kernel size=k,stride=1,而zero padding=p(p取值范围为0到k-1),则卷积核K’的kernel size为k,stride=1,而zero padding=k-p-1。也就是说,越大的zero padding在转置后会变得越小,越小的zero padding在转置之后会变得越大。

我们假设卷积核为(A,B,C),则其对应的一维卷积的矩阵,以及其卷积如下所示:

下面我们再来看看stride在转置下是什么:

假定卷积核K的kernel size=k,zero padding=0,而stride=s,则卷积核K’的kernel size为k,stride为1/s。这被称作fractionally strided convolutions(分数stride卷积),它就相当于,kernel每一次往右滑动1/s步。就具体操作而言,它是首先在输入的任意两个元中插入s-1个元素,使得输入扩大s倍,然后再进行stride=1的卷积。

一维的fractionally strided convolutions示例如下:

二维的分数stride卷积示意图如下(输入的蓝色元素被拆开扩大后进行卷积):

与zero padding类似,越大的stride在transpose之后会变得越小,越小的stride在transpose之后变得越大。不过zero padding是一种加减的关系,而stride是一种乘除的关系。所以从上采样的角度而言,无疑stride是更加有意义的。

此外,我们还可以用另一种角度来看分数stride卷积——我们可以想象它是将一个卷积核给拆开成为几份。如下是示意图,假设有一个一维卷积,卷积核为(A,B,C),则stride=2的卷积对应的矩阵,以及该矩阵的转置如下图所示:

U-Net

在分割问题中,我们期望输入与输出在空间尺度上具有同样的大小。例如当我们的输入是一个128×128×3(3为通道数)的图片,有20种候选类别的时候,我们希望输出一个128×128×20的张量,表示每一个像素属于各个类别的概率。

对于每一个具体的像素而言,其属于哪一个类别,不但与其本身的性质有关,更加与其旁边的像素的性质有关,它在整个图片结构中的地位有关。所以,我们必须要提取出图片中的宏观结构,才能更好地对区域进行划分。但是另一方面,由于分割问题中确定具体边界的位置也是很重要的,所以我们也要保持住像素的细节,保持微观的信息。

在一般分类问题的CNN中,随着输入的前传,我们逐渐提取了宏观的信息,而舍弃了微观的信息。而在分割问题中,我们则希望在不丢失微观信息的情况下,提取宏观信息。最后,我们希望输出的结果中既考虑到微观信息,也考虑到宏观信息。U-Net的结构正是根据这种需求而设计出来的。

在U-Net中,从输入端到输出端可以分为两个阶段。第一个阶段被称作编码,第二个阶段被称作解码。第一个阶段中,我们逐渐使用卷积与pooling,将输入降维,以提取出图片的宏观信息。而在第二个阶段中,我们则需要使用上一节介绍的特殊卷积(up-conv)让feature map逐渐地变大,变回原来的大小。然而,由于pooling会导致丢失信息,所以即使采用up-conv,也无法让第一阶段丢失的微观信息重新出现。为此,我们要使用skip connection,从第一阶段的编码器中直接提取信息,将其传递到解码器中。这样,U-Net就可以在解码阶段逐步获得编码阶段丢失的微观信息,使得最后的输出同时包括微观信息与宏观信息。每一个像素点最终被分为哪一类,都可以同时兼顾其本身的信息,以及其周边小的区域、周边大的区域,甚至总体的宏观细心决定。其示意图如下:

在Daniel M. Pelt与James A. Sethian的论文《A mixed-scale dense convolutional neural network for image analysis》中,也提出,可以将DenseNet的密集连接的思想运用于U-Net中,这样有利于多种尺度的信息高效传递,便于在U-Net各个层分别高效地提取出各个尺度的信息。其示意图如下:

到此,本期【深度学习科普系列-图像分割问题】的知识科普完成~!

本章课程

结束

文章推荐

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180628G0OWGI00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券