机器之心专栏
本专栏由机器之心SOTA!模型资源站出品,每周日于机器之心公众号持续更新。 本专栏将逐一盘点自然语言处理、计算机视觉等领域下的常见任务,并对在这些任务上取得过 SOTA 的经典模型逐一详解。前往 SOTA!模型资源站(sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及 API 等资源。
本文将分 3 期进行连载,共介绍 19 ****个在图像分割任务上曾取得 SOTA 的经典模型。
-
第 1 期:FCN、ReSeg、U-Net、ParseNet、DeepMask、SegNet、Instance-Aware Segmentation
-
第 2 期:DeepLab、DeepLabv3、RefineNet、PSPNet、Dense-Net、Mask-Lab
-
第 3 期:PANet、DANet、FastFCN、Gated-SCNN、OneFormer、PSPNet-ResNet50_PSSL
您正在阅读的是其中的第 1 期。前往 SOTA!模型资源站(sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及 API 等资源。
本期收录模型速览
模型 | SOTA!模型资源站收录情况 | 模型来源论文 |
---|---|---|
FCN | sota.jiqizhixin.com/project/fcn 收录实现数量:12 支持框架:PyTorch、TensorFlow等 | Fully convolutional networks for semantic segmentation |
ReSeg | sota.jiqizhixin.com/project/res… 收录实现数量:2 支持框架:PyTorch | ReSeg: A Recurrent Neural Network-based Model for Semantic Segmentation |
U-Net | sota.jiqizhixin.com/project/une… 收录实现数量:16 支持框架:PyTorch、TensorFlow等 | U-net: Convolutional networks for biomedical image segmentation |
ParseNet | sota.jiqizhixin.com/project/par… 收录实现数量:4 支持框架:TensorFlow | ParseNet: Looking Wider to See Better |
DeepMask | sota.jiqizhixin.com/project/dee… 收录实现数量:2 支持框架:TensorFlow、Torch | Learning to Segment Object Candidates |
SegNet | sota.jiqizhixin.com/project/seg… 收录实现数量:6 支持框架:PyTorch、TensorFlow等 | Segnet: A deep convolutional encoder-decoder architecture for image segmentation |
Instance-Aware Segmentation | sota.jiqizhixin.com/project/ins… 收录实现数量:1 支持框架:Caffe2 | Instance-aware semantic segmentation via multi-task network cascades |
图像分割是计算机视觉中的一项基本任务,其应用领域包括场景理解、医学图像分析、机器人感知、视频监控、增强现实和图像压缩等。图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。相比图像分类和检测,分割是一项更精细的工作,因为需要对每个像素点分类。
图像分割可以表示为带有语义标签的像素分类问题(语义分割,Semantic Segmentation)或单个对象的分割问题(实例分割,Instance Segmentation) 。语义分割是对所有图像像素进行一组对象类别(如人、车、树、天空)的像素级标记,即简单地对图像中各个像素点分类。实例分割进一步扩展了语义分割的范围,需要检测和描绘图像中每个感兴趣的对象(例如,对个人的分割),即区分开不同的物体。从一定意义上来说,实例分割可以看作是语义分割加检测。
此外,还有全景分割(Panoramic segmentation),全景分割是语义分割和实例分割的结合。跟实例分割不同的是:实例分割只对图像中的object进行检测,并对检测到的object进行分割,而全景分割是对图中的所有物体(包括背景)都要进行检测和分割。本文不涉及全景分割的方法。
随着深度学习技术的应用,已经产生了新一代的图像分割模型,其性能有了显著的提高——通常在流行的基准测试中获得了最高的准确率——致使许多研究人员认为该领域发生了范式转变。
本文聚焦于深度学习技术,回顾图像分割中必备的TOP模型,包括语义分割模型和实例分割模型。
1、 FCN
本文提出了全卷积网络(Fully convolutional network,FCN)的概念,针对语义分割训练一个端到端、点对点的网络,达到了state-of-the-art。这是第一次训练端到端的FCN用于像素级的预测,也是第一次用监督预训练的方法训练FCN。其主要思想是建立一个“全卷积”网络,它接受任意大小的输入,通过密集的前向计算和反向传播进行有效的推理和学习并生成相应大小的输出。在构建网络过程中,通过将经典的分类网络(AlexNet、VGG和GoogleLeNet等)调整为全卷积网络(去掉了全连接层),并通过微调将它们的学习表示传递给分割任务;之后定义了一个skip结构,它将来自深层、粗层的语义信息与来自浅层、细层的外观信息结合起来,以生成精确和详细的分段。
CNN的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:较浅的卷积层感知域较小,可以学习到一些局部区域的特征;较深的卷积层具有较大的感知域,能够学习到更加抽象的特征。FCN与CNN“在卷积层后使用全连接层得到固定长度的特征向量再进行分类”的处理方式不同。在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个类别的概率。FCN将这3层表示为卷积层,卷积核的大小(通道数,宽,高)分别为(4096,7,7)、(4096,1,1)、(1000,1,1)。FCN的所有层都是卷积层,故称为全卷积网络。FCN可以接受任意尺寸的输入图像,采用反卷积层(deconvolution)对最后一个卷积层的特征图(feature map)进行上采样,使它恢复到输入图像相同的尺寸,从而可以对每一个像素都产生一个预测,从抽象的特征中恢复出每个像素所属的类别,实现了从图像级别的分类延伸到像素级别的分类。最后逐个像素计算softmax分类的损失, 相当于每一个像素对应一个训练样本。下图是用于语义分割所采用的FCN结构示意图:
图1 将全连接层转化为卷积层使分类网能够输出热力图。添加层和空间损失生成一个高效的机器,用于端到端的密集学习*
*
FCN主要使用了三种技术:卷积化(Convolutional)不含全连接层(FC)的全卷积(fully conv)网络。可适应任意尺寸输入;上采样(Upsample)增大数据尺寸的反卷积(deconv)层,能够输出精细的结果;跳跃结构(Skip Layer)结合不同深度层结果的skip结构。FCN能够同时确保鲁棒性和精确性。
图2 全卷积网络可以有效地学习对每个像素进行密集预测,如语义分割
当前SOTA!平台收录FCN共12个模型实现。
项目 | SOTA!平台项目详情页 |
---|---|
FCN | 前往 SOTA!模型平台获取实现资源:sota.jiqizhixin.com/project/fcn |
2、 ReSeg
本文提出了用于语义分割的ReSeg结构,该结构是基于用于图像分类的基于RNN的ReNet所构建的。ReSeg网络的特征提取阶段(编码器阶段)采用的是预训练好的CNN网络结构,而在恢复图像尺寸的时候(解码器阶段,也就是上采样阶段)采用了RNN结构,RNN结构部分是基于ReNet的。ReSeg结构处理语义分割任务非常灵活、高效,其中的ReNet模块能够很好地整合上下文信息,获得很好的效果。
首先,输入图像经过第一阶段的VGG-16网络的层(在ImageNet上预训练,没有fine-tune,设定图像分辨率不会变得过小),得到的特征图随后送入一个或多个ReNet层,在图像上滑动。最后,一个或多个上采样层用于对最后的特征图进行分辨率恢复,使其与输入分辨率相同,再应用softmax非线性得到每个像素点对应的类别概率分布。循环层是这个结构的核心,由多个RNN(可以是初级的tanh RNN层)、一个Gated Recurrent Unit(GRU)层或一个LSTM层组成。根据ReNet不需要过多的回归单元的特性,这里选择用GRU模块,因为其能够很好地平衡计算力和内存之间的关系。ReSeg结构如图3所示。
图3 ReSeg网络。由于空间的原因未展示预训练的VGG-16卷积层,我们用它来预处理ReSeg的输入。前两个RNN(蓝色和绿色)被应用于图像的2x2x3 patches,它们的16x16x256特征图被串联起来,并作为输入送入下两个RNN(红色和黄色),它们读取1x1x512 patches并发出第一个ReNet层的输出。两个类似的ReNet层被堆叠起来,然后是一个上采样层和一个softmax非线性
ReSeg整体由两部分组成:特征提取阶段使用的是预训练好的VGG16结构,解码器阶段使用的是ReNet结构,通过ReNet的BRNN(双向RNN)联系上下文信息。ReSeg应用了3次串联的完整ReNet模块,空间分辨率在这个过程中逐渐减小。这么做的目的是将VGG-16提取的特征进行进一步的处理,从而得到对输入图像更复杂的特征描述。特征提取结束后,特征图对输入图像的空间分辨率下降为1/8,因此需要恢复空间分辨率以得到稠密的分割结果。在所有ReNet模块结束后,ReSeg应用了若干层由反卷积组成的上采样层,将特征图的空间分辨率恢复成原始输入图像的空间分辨率。最后,简单应用softmax实现分割。
当前SOTA!平台收录ReSeg共2个模型实现。
项目 | SOTA!平台项目详情页 |
---|---|
ReSeg | 前往 SOTA!模型平台获取实现资源:sota.jiqizhixin.com/project/res… |
3、U-Net
以往训练深度神经网络需要大量的标注好的样本数据,本篇论文提出了全新的U形网络和基于数据增强的训练策略以更加充分的利用标注数据。本文所提出的UNet网络利用下采样提取图像信息,原因是下采样后深层次的特征语义性更强;此外,利用对称结构以便更精确的定位,即将浅层特征融合到深层特征中。UNet可以直接端到端训练,效果优于以往方法。
UNet在FCN的基础上进行改进,目的是以很少的训练样本图像工作,产生更精确的分割。UNet的主要思想是用连续层来补充通常的收缩网络,其中,使用上采样算子取代池化操作,这些层提高了输出的分辨率。为了定位,将收缩路径中的高分辨率特征与上采样输出结合在一起。然后,利用连续卷积层学习根据这些信息组装的更精确的输出。具体来说,在上采样部分,UNet也有大量的特征通道,这使得网络能够将上下文信息传播到更高分辨率的层。其结果是,扩展路径与收缩路径或多或少对称,并产生U形结构。UNet网络没有任何全连接层,只使用每个卷积的有效部分,即分割映射只包含输入图像中可用的全部内容的像素。该策略允许通过重叠块策略对任意大的图像进行无缝分割。要预测图像边框区域中的像素,则需要通过镜像输入映像来推断丢失的内容。此外,可以通过对可用的训练图像施加弹性变形来进行数据增强,这允许网络学习这种变形的不变性,而不强制标注数据(图像)库中包含这些转换。这在生物医学图像分割中尤为重要。
UNet网络体系结构如图4所示,它由收缩路径(左侧)和扩展路径(右侧)组成。收缩路径遵循卷积网络的典型结构。它包括重复应用两个3×3卷积(非加量卷积),每个卷积后面是一个校正的线性单元(Relu)和一个2×2最大池化操作,以步长为2进行下采样。在每个下采样步骤中,将特征通道的数量增加一倍。扩展路径中的每一步都包括一个特征映射的上采样;然后是一个2×2卷积(上卷积),它将特征通道的数量减半,与收缩路径中相应裁剪的特征映射连接;以及两个3×3卷积,每个卷积后面跟着一个relu。
由于每个卷积中的边界像素的丢失,还需要裁剪处理。在UNet最后一层,使用1×1卷积来将每个64维分量特征向量映射到所需数量的类别。总UNet网络共计有23个卷积层。为了允许输出分段映射的无缝拼接,需要选择输入块的大小,以便将所有2×2池化操作应用到具有均匀x和y大小的层。
图4 UNet结构(最低分辨率下32×32像素的例子)。每个蓝框对应于一个多通道特征图。通道的数量表示在box顶部。X-Y尺寸在box左下角提供。白色方框代表复制的特征图。箭头表示不同的操作
当前SOTA!平台收录U-Net共16个模型实现。
项目 | SOTA!平台项目详情页 |
---|---|
U-Net | 前往 SOTA!模型平台获取实现资源:sota.jiqizhixin.com/project/une… |
4、 ParseNet
本文提出了一个将全局上下文信息加入到全卷积网络的图像分割(语义分割)方法ParseNet。这个方法很简单,用的是一个层的平均特征来扩张每个位置上的特征。此外,作者还研究了几种训练过程中的特质,极大地改进了对比算法的表现(比如FCN)。此外,作者加入全局特征后,引入了一个学习归一化参数的技巧,进一步改进了算法的表现。
如下图所示,ParseNet通过全局池化提取图像的全局特征,并将其与局部特征融合起来。用全局平均池化对最后一层上下文特征进行池化,或是对任意目标层池化。在局部特征图上增加全局特征后,分割的效果大幅提升。
图5 ParseNet使用额外的全局背景来clarify局部的混乱并平滑分割
直观上理解,全局特征与局部特征的融合可以发生在两个节点:训练分类器之前(early fusion)和训练分类器之后(late fusion)。其中,前者是将两个特征融合后,作为一个整体送入分类网络训练分类器;后者则是以两个特征为输入,分别训练其对应的分类器,最后再将分类的结果整合。如果忽略结合特征后的训练过程,这两种融合的效果是差不多的。但是,在某些情况下,只有全局特征辅助下的局部特征才能够判断出正确的分类结果;此时,如果两个特征分别训练再整合,那么这种情况下的分割损失是不可逆的,也就是说,这些情况下的分类将不正确。
ParseNet利用了L2范数来归一化特征的融合过程。具体而言,给定d维输入x,算法通过计算其L2范数并在整个维度内实现归一化。此外,如果只是单纯地对所有输入层进行归一化,不仅会减慢网络的训练速度,同时也会改变该层的尺度。因此,还需要对其增加一个尺度参数gamma,将归一化的结果进行尺度缩放(缩放结果为y)。这一过程增加的参数量等于所有的通道数之和,因此在反向传播过程中是可以忽略的。具体的反向传播公式如下:
当前SOTA!平台收录ParseNet共4个模型实现。
项目 | SOTA!平台项目详情页 |
---|---|
ParseNet | 前往 SOTA!模型平台获取实现资源:sota.jiqizhixin.com/project/par… |
5、 DeepMask
本文提出的DeepMask解决的是实例分割任务。DeepMask实现了三个任务:前背景分割、前景语义分割与前景实例分割。这三个任务是基于同一个网络结构进行的,只是各自有单独的分支。图6是DeepMask的网络结构概况。与大部分分割网络相同,DeepMask同样应用了VGG模型作为特征提取的主要模块,在训练中也用了ImageNet下训练得到的VGG参数初始化这一部分模型。随后,DeepMask用两条分支来分别实现分割任务和前景目标识别任务。
分割部分要实现的是对图像块内场景的类别的识别,由一个1×1卷积层后接分类层实现。这里的分类是密集的,也就是对每一个像素都有其对应的标注。网络的第二个分支要完成的任务是判断一个图像块是否满足下面两个要求:目标位于图像块的正中心附近、目标完整存在于图像块中(在某一尺度范围内)。这一部分由一个2×2的最大池化层后接两个全连接层组成。最终的输出是一个目标score,用来显示该目标是否满足上面的要求。
图6(顶部)DeepMask模型结构:网络在共享特征提取层之后被分成两个分支。上面的分支预测位于中心的物体的分割掩码,而下面的分支预测输入patch的物体得分。(底部)训练三要素示例:输入patch x、掩码m和标签y。绿色patch包含满足指定约束的对象,因此被分配到标签y=1。负样本的Mask(以红色显示)没有使用,只是为了说明问题
如图6DeepMask选择了VGG-A架构,该架构由8个3×3卷积层(之后是ReLU非线性)和5个2×2 max pooling组成。由于我们对推断分割掩码感兴趣,卷积特征图中提供的空间信息很重要。因此,删除了VGG-A模型的所有最终全连接层。此外,还舍弃了最后一个max pooling层。由于剩下的四个2×2 max pooling层共享层的输出有一个16的下采样系数,给定一个尺寸为3×h×w的输入图像,输出是一个尺寸为512×h/16×w/16的特征图。
DeepMask的训练过程对于分割任务是很有借鉴意义的。这里,网络的两个分支共同训练,损失函数如下:
除了基本的分割要求,DeepMask还做了一个限定,使得在测试推理阶段,网络会尝试对所有的图像块都进行分割,即使该图像块中不存在目标。为了实现这个目的,其采用的策略是对于不存在目标的图像块,只训练分割分支。网络与VGG-A相同,接收的RGB输入尺寸为3x224x224,生成的特征尺寸为512x14x14。由于网络结构导致输出尺寸小于原始尺寸(分割分支为1/16,目标分支为1/32),因此需要应用双线性插值将结果恢复成原始尺寸。在这个设定下,DeepMask约包含75M的参数。
当前SOTA!平台收录DeepMask共2个模型实现。
项目 | SOTA!平台项目详情页 |
---|---|
DeepMask | 前往 SOTA!模型平台获取实现资源:sota.jiqizhixin.com/project/dee… |
6、 SegNet
用于语义分割的网络通常是将用于分类的网络进行全卷积化而来的,这带来了空间分辨率下降(网络存在降采样)的问题,从而生成较为粗糙的分割结果。此外,还需要将低分辨率的结果上采样到原图大小,这个还原的过程即解码过程。大部分的用于分割的网络都有相同或相似的encoder network,之所以会产生不同精度的分割结果,关键在于decoder network的不同。作者分析一些网络的解码过程,提出了SegNet。SegNet的encoder network为VGG16(移除了全连接层),在decoder network里依靠encoder network的max pooling层所产生的最大值位置索引对输入进行upsample(无需学习),得到稀疏的feature maps,然后对稀疏的feature maps进行卷积致密。每个decoder对应一个encoder。最后接一个softmax分类器。
图7 SegNet结构图示。没有全连接层。解码器使用编码器传输的池化指数对其输入进行上采样,以产生一个或多个稀疏的特征图。然后,它与一个可训练的滤波器组进行卷积,使特征图密集化。最终的解码器输出的特征图送入一个softmax分类器进行像素级分类
图7是SegNet的网络结构,其中蓝色代表卷积+Batch Normalization+ReLU,绿色代表max-pooling,红色代表上采样,黄色是Softmax。SegNet与FCN的对应结构相比体量要小很多,这主要得益于SegNet中为了权衡计算量而采取的操作:用记录的池化过程的位置信息替代直接的反卷积操作。具体如图8所示。图8中左侧是SegNet使用的解码方式,右侧是FCN对应的解码方式。可以看到,SegNet的做法是先根据位置信息生成稀疏的特征图,再利用后续的卷积计算恢复密集特征图。而FCN则直接利用反卷积操作求得上采样后的特征图,再将其与编码器特征图相加。
图8 SegNet和FCN解码器说明。a、b、c、d对应于特征图中的数值。SegNet使用最大集合指数对特征图进行上采样(无需学习),并与可训练的解码器滤波器组进行融合。FCN通过学习对输入的特征图进行上采样,并添加相应的编码器特征图以产生解码器输出。这个特征图是相应编码器的max-pooling层(包括子采样)的输出
当前SOTA!平台收录SegNet共6个模型实现。
项目 | SOTA!平台项目详情页 |
---|---|
SegNet | 前往 SOTA!模型平台获取实现资源:sota.jiqizhixin.com/project/seg… |
7、 Instance-Aware Segmentation
本文的出发点是做Instance-aware Semantic Segmentation,具体的,作者将其分为三个子任务来做:1) Differentiating instances 实例区分;2) Estimating masks 掩码估计;3) Categorizing objects分类目标。通过这种分解,作者提出了如下的多任务学习框架,即:Multi-task Network Cascades (MNCs),示意流程如图9。
图9 用于实例感知的语义分割的多任务网络级联。右上角是一个简化的图示
Regressing Box-level Instances
第一阶段,回归出object的bbox(bounding box),这一阶段的网络结构和loss都参照Region Proposal Networks (RPNs),RPNs通过全卷积网络预测object的bbox和置信度,在feature map后紧跟两个1×1卷积用于回归bbox以及判定是否为前景。具体损失函数如下:
B是这个阶段的网络输出,代表一系列的bbox :
Regressing Mask-level Instances
第二阶段,将共享的features和第一阶段的bbox作为输入,为每个bbox输出像素级的mask。通过RoI pooling将每个bbox的特征提取成14×14的固定大小特征,再加两个全连接层,第一个全连接层将维度减小到256层,第二个全连接层回归出像素级的mask,其结果由一个m x m的二维向量表示。损失函数如下:
该阶段的输出M代表该阶段的网络输出,表示一系列mask,M={M_i},M_i是用sigmoid回归到[0,1]的m^2 维的逻辑回归输出。
Categorizing Instances
第三阶段,将共享的features和第一阶段的bbox、第二阶段的mask作为输入,为每个实例输出类别置信度。第一阶段给定预选框并用RoI pooling提取feature,第二阶段预测实例的mask,导致feature专注于预测mask的前景,像素级masked feature 计算公式如下:
M_i为本阶段输出的Mask。将mask-based和box-based的pathway连接之后用softmax对N个object类别和1个背景类进行分类。损失函数如下:
整个模型的级联的损失函数为:
最后,作者将级联模型扩展到MNC更多阶段。增加了一个4(N+1)-d fc层,用于回归class-wise bounding boxes,它与分类器层是同级关系。在推理过程中,首先运行完整3阶段的网络,并在第3阶段获得回归的box。然后,这些boxes被视为新的建议。第2和第3阶段在这些建议上第二次执行。这实际上包括了5个阶段的推理。五阶段过程如图10所示。第4和第5阶段与第2和第3阶段的结构相同,只是它们使用第3阶段的bounding box作为新的建议。
图10 5阶段的级联。在第三阶段,由box回归层更新的bounding box被用作第四阶段的输入
当前SOTA!平台收录Instance-Aware Segmentation共1个模型实现。
项目 | SOTA!平台项目详情页 |
---|---|
Instance-Aware Segmentation | 前往 SOTA!模型平台获取实现资源:sota.jiqizhixin.com/project/ins… |
前往 SOTA!模型资源站(sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及API等资源。