CS231n: Lecture 11 | Detection and Segmentation
Lecture 11主要讲解的是分割、定位与检测。具体包括语义分割、分类定位、目标检测和实例分割四部分。其中语义分割主要介绍了上采样技术。
文章目录
语义分割(Semantic Segmentation)
语义分割为每一个像素产生一个分类标签,但并不区分同类目标。
Semantic Segmentation Idea: Sliding Window
输入一幅图像,将其打碎为许多小的局部图像块。以图中为例,三个包含牛头的小块,对其分别进行分类,判断它的中心像素属于哪类。这个计算复杂度相当的高,因为我们想要标记图像中的每个像素点,我们需要为每个像素准备单独的小块。当我们希望区分彼此相邻甚至重叠的两块图像块时,这些小块的卷积特征最终通过同样的卷积层,因此,我们可以共享这些图像块的很多计算过程。
Semantic Segmentation Idea: Fully Convolutional
通过数个卷积层最后得到的张量数据的大小是,是类的数量,这个张量会对每一个像素的分类进行评分,因此我们可以通过堆叠卷积层一次性完成所有计算。但这种方法存在一个问题,我们的每一个卷积层都保持着与原始输入图像相同的尺寸,这导致计算量非常大。
Semantic Segmentation Idea: downsampling+upsampling
对输入图像做下采样,之后再做上采样。相较于基于图像的全维度做卷积,我们仅仅对一部分卷积层做原清晰度处理,之后对特征进行下采样(最大池化,或stride>1的卷积)。在后部分网络中我们希望增加清晰度,这样能使我们的输出维持原有的图像尺寸。这种方法更加方便计算,因为我们可以让网络很深,每层的清晰度降低但是有很多层叠加。
上采样(upsampling):去池化(unpooling)
平均池化在下采样中是针对每个池化区域取平均,而在上采样中做的是最近距离(nearest neighbor)去池化。如上图左所示,输出是输入的 stride 2 nearest neighbor去池化结果,在去池化区域中使用输入的当前元素进行填充。如上图右所示为钉床函数的去池化,我们将输入元素放在去池化区域的左上角,并将去池化区域的其他元素置0。
许多神经网络结构是对称的,尤其是下采样的神经网络之后会进行上采样。我们在下采样时用最大池化的同时,会记住池化区域中的最大元素索引,之后我们会执行类似钉床函数去池化的操作,不过这里我们是将输入的元素放在去池化区域中与之前记住的最大元素索引相对应的地方。
将向量去池化可以帮助我们很好地处理细节,存储空间信息(在池化后会丢失这些信息)。
上采样(upsampling):卷积转置(Transpose Convolution)
前面所谈到的各种去池化方法都是使用固定的方程,并不是真的在学习如何上采样。而strided convolution既是一种可学习的层,它可以学习如何下采样,与之对应的我们称之为卷积转置,用于进行上采样,即上采样特征图,又能学习权重。
上图所示为3x3卷积的常规操作。
上图所示为3x3的 strided convolution的常规操作。
上图所示为卷积转置操作。卷积转置依次取出特征图的输入元素(标量),我们用这个标量乘以filter,以filter的size复制到输出的相应位置,这样输出便是带有权重的filters的叠加(把输入看做权重)。
如上图所示我们在一维情况下来理解卷积转置。上图中输入为,filter为。我们可以看到输出是对输入做加权,最后对输出中的感受野重叠部分进行叠加。
我们可以把卷积写成矩阵相乘的形式。如上图所示,表示有三个元素的卷积向量,表示有4个元素的输入向量。我们将向量转变成矩阵形式X,X包含很多由不同区域偏移的卷积核。卷积转置的意思是我们乘以相同权重矩阵的转置。
当步长为2时情况会有些不一样。对应的转置矩阵不再是卷积。
关于卷积转置有不理解的地方可以参考下****的这篇[深度学习]转置卷积(Transposed Convolution)或是知乎的如何理解深度学习中的deconvolution networks?。
分类与定位
目标检测
实例分割
持续更新中,预计10.5完成全部内容