语义分割—学习笔记

基础知识

网络架构

基于卷积神经网络的语义分割为每个像素分配了一个初始类别标签。为了将单独的像素映射给标签,需要将标准CNN编码器扩展为编码器-解码器架构。在这个架构中编码器使用卷积层和池化层将图像尺寸缩小,将一张图像的内容编码为紧凑表征。解码器接收到这一表征,用通过转置卷积执行上采样而恢复空间维度,这样每一个转置卷积都能扩展特征图尺寸。

损失函数

使用交叉熵损失作为损失函数,该目标函数度量的是预测像素概率分布(在所有类上)和实际的概率分布的差异。对语义分割来说,交叉熵损失并不理想。因为对一张图像来说,交叉熵损失是每一个像素损失的和,它并不鼓励近邻像素保持一致。因为交叉熵损失无法在像素间采用更高级的结构,所以交叉熵最小化的标签预测一般都是不完整或者模糊的,他们都需要后续处理。

用条件随机场优化

来自CNN的原始标签一般都是缺失(patchy)图像,在图像中有一些小区域的标签可能不正确,因此无法匹配其周围的像素标签。为了解决这种不连续性,可以用一种平滑的形式,确保目标占据图片中的连续区域,这样给定的像素和其周围像素的标签就是一样的。条件随机场(CRF)就是根据原始图像中像素的相似性重新精炼CNN的标签。在这里插入图片描述
条件随机场是由随机变量组成的图,在这种情况下,每个顶点表示:

  • 确定像素的CNN标签(绿色顶点 X i X_{i} Xi
  • 确定像素的实际类别标签(黄色顶点 Y i Y_{i} Yi
    编码两类信息:
  • 蓝色:两个像素的实际类别,即它们之间的依赖关系
  • 红色:对于给定像素的CNN原始预测和实际标签之间的依赖关系
    每个依赖性关系都具有势能,这是一个关于两个相关随机变量值的函数。当相邻像素的实际目标标签相同时,第一类依存关系的势能较高。当目标标签是隐藏变量时,会根据概率分布产生可观察的CNN像素标签。
    为了用CRF精炼标签,首先通过交叉验证用训练数据学习图模型的参数。然后,为了使概率 P ( Y 1 , Y 2 , . . . Y n ∣ X 1 , X 2 , . . . X n ) P(Y_{1},Y_{2},...Y_{n}|X_{1},X_{2},...X_{n}) PY1,Y2,...YnX1,X2,...Xn最大化,对参数进行调整。CRF的输出是原始图像像素的最终的目标标签。

实际上,CRF图是完全连接的,即使从物理角度上讲相距很远的像素节点也可以共享边。这样的图有数十亿的边,从计算上讲难以进行精确处理。CRF架构倾向于使用高效的近似技术进行处理。

语义分割中的深度学习技术

全卷积网络FCN(2015)

论文 Fully Convolutional Networks for Semantic Segmentation
code fcn.berkeleyvision.org
FCN的核心观点是建立“全卷积”网络,输入任意尺寸的一张图片,经过有效的推理和学习产生相应尺寸的输出,改编分类网络AlexNet、VGG 和GoogLeNet到完全卷积网络,通过微调传递它们的学习表现到分割任务中。学习像素到像素的映射,端到端的映射。
在这里插入图片描述
全卷积神经网络主要使用的三种技术

  • 卷积化(Convolutional):识别网络表面上采用的是固定尺寸的输入产生了非空间的输出。这些网络的全连接层有确定的位数并丢弃空间坐标。然而,这写全连接层也被看作是覆盖全部输入域的核卷积。需要将它们加入到可以采用任何尺寸输入并输出分类图的全卷积网络中。
    在这里插入图片描述

  • 上采样(Upsample):普通的池化会缩小图片的尺寸,为了得到和原图等大的分割图,需要上采样/反卷积。反卷积和卷积类似,都是相乘相加的运算。

  • 跳跃结构(Skip Layer):主要作用是优化结果,因为如果将全卷积之后的结果直接上采样得到的结果是很粗糙的。所以将不同池化层的结果进行上采样之后来优化输出。
    在这里插入图片描述
    在这里插入图片描述

卷积化

CNN与FCN

  • 通常CNN网络在卷积层之后会接上若干个全连接层, 将卷积层产生的特征图(feature map)映射成一个固定长度的特征向量。以AlexNet为代表的经典CNN结构适合于图像级的分类和回归任务,因为它们最后都期望得到整个输入图像的一个数值描述(概率),比如AlexNet的ImageNet模型输出一个1000维的向量表示输入图像属于每一类的概率(softmax归一化)。

  • FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全联接层+softmax输出)不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类。最后逐个像素计算softmax分类的损失, 相当于每一个像素对应一个训练样本。

  • CNN的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:较浅的卷积层感知域较小,学习到一些局部区域的特征;较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征。这些抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高。这些抽象的特征对分类很有帮助,可以很好地判断出一幅图像中包含什么类别的物体,但是因为丢失了一些物体的细节,不能很好地给出物体的具体轮廓、指出每个像素具体属于哪个物体,因此做到精确的分割就很有难度。

  • 而全卷积网络(FCN)则是从抽象的特征中恢复出每个像素所属的类别。即从图像级别的分类进一步延伸到像素级别的分类。

CNN->FCN
在这里插入图片描述
在这里插入图片描述

  • 全连接层转化为全卷积层:在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个不同类别的概率。FCN将这3层表示为卷积层,卷积核的大小(通道数,宽,高)分别为(4096,1,1)、(4096,1,1)、(4096,1,1)。看上去数字上并没有什么差别,但是卷积跟全连接是不一样的概念和计算过程,使用的是之前CNN已经训练好的权值和偏置,但是不一样的在于权值和偏置是有自己的范围,属于自己的一个卷积核。
  • CNN中输入的图像大小是统一固定成227x227大小的图像,第一层pooling后为55x55,第二层pooling后图像大小为27x27,第五层pooling后的图像大小为13x13, 而FCN输入的图像是H*W大小,第一层pooling后变为原图大小的1/2,第二层变为原图大小的1/4,第五层变为原图大小的1/8,第八层变为原图大小的1/16。
  • 经过多次卷积和pooling以后,得到的图像越来越小,分辨率越来越低。其中图像到H/32∗W/32的时候图片是最小的一层时,所产生图叫做heatmap热图,热图就是我们最重要的高维特征图,得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行upsampling,把图像进行放大几次到原图像的大小。

上采样

Upsampling的操作可以看成是反卷积(deconvolutional),卷积运算的参数和CNN的参数一样是在训练FCN模型的过程中通过bp算法学习得到。反卷积层也是卷积层,不关心input大小,滑窗卷积后输出output。Deconv并不是真正的deconv(卷积的逆变换),最近比较公认的叫法应该是transposed convolution,deconv的前向传播就是conv的反向传播。

  • 反卷积参数:利用卷积过程filter的转置(实际上就是水平和垂直方向上翻转filter)作为计算卷积前的特征图。
  • 反卷积学习率为0。
    反卷积的运算如下所示:
    蓝色是反卷积层的input,绿色是反卷积层的output。
    在这里插入图片描述
    在这里插入图片描述
    怎么使反卷积的output大小和输入图片大小一致,从而得到pixel level prediction?
    FCN里面全部都是卷积层(pooling也看成卷积),卷积层不关心input的大小,inputsize和outputsize之间存在的线性关系。假设图片输入为[nxn]大小,第一个卷积层输出map为conv1out.size=(n-kernelsize)/stride+1,记做conv1out.size=f(n),依次类推,conv5out.size=f(conv5in.size)=f(…f(n)),反卷积是要使n=f’(conv5out.size)成立,要确定f’,就需要设置deconvolution层的kernelsize,stride,padding,计算方法如下:
    在这里插入图片描述
    Factor是指反卷积之前的所有卷积pooling层的累积采样步长,卷积层使feature map变小,是因为stride,卷积操作造成的影响一般通过padding来消除,因此,累积采样步长factor就等于反卷积之前所有层的stride的乘积。

跳级(Skip)结构

对CNN的结果做处理,得到了dense prediction,而作者在实验中发现,得到的分割结果比较粗糙,所以考虑加入更多前层的细节信息,也就是把倒数第几层的输出和最后的输出做一个fusion,实际上也就是加和
在这里插入图片描述
实验表明,这样的分割结果更细致更准确。在逐层fusion的过程中,做到第三行再往下,结果又会变差,所以作者做到这里就停了。
模型训练:

  • 用AlexNet、VGG16或者GoogleNet训练好的模型做初始化,在这个基础上做fine-tuning,全部都fine-tuning,只需在末尾加上upsampling,参数的学习还是利用CNN本身的反向传播原理。
  • 采用whole image做训练,不进行patchwise sampling。实验证明直接用全图已经很effective and efficient。
  • 对class score的卷积层做全零初始化。随机初始化在性能和收敛上没有优势。
    FCN例子:输入可为任意尺寸图像彩色图像;输出与输入尺寸相同,深度为:20类目标+背景=21,模型基于AlexNet。
  • 蓝色:卷积层
  • 绿色:Max Pooling层
  • 黄色:求和运算,使用逐数据相加,把三个不同深度的预测结果进行融合:较浅的结果更为精细,较深结果更为鲁棒
  • 灰色:裁剪,在融合之前,使用裁剪层统一两者大小,最后裁剪成和输入相同尺寸输出
  • 对于不同尺寸的输入图像,各层数据的尺寸(height,width)相应变化,深度(channel)不变
    在这里插入图片描述
  • 全卷积层部分及逆行特征提取,提取卷积层(3个蓝色层)的输出作为预测21个类别的特征
  • 图中虚线内是反卷积层的运算,反卷积层(3个橙色层)可以把输入数据尺寸放大。和卷积层一样,升采样的具体参数经过训练确定
    以经经典的AlexNet分类网络为初始化。最后两级是全连接(红色),参数弃去不用
    在这里插入图片描述
    从特征小图(16∗16∗4096)预测分割小图(16∗16∗21),之后直接升采样为大图。
    在这里插入图片描述
    反卷积(橙色)的步长为32,这个网络称为FCN-32s。
    升采样分为两次完成(橙色×2), 在第二次升采样前,把第4个pooling层(绿色)的预测结果(蓝色)融合进来。使用跳级结构提升精确性
    在这里插入图片描述
    第二次反卷积步长为16,这个网络称为FCN-16s。
    升采样分为三次完成(橙色×3), 进一步融合了第3个pooling层的预测结果
    在这里插入图片描述
    第三次反卷积步长为8,记为FCN-8s。
    缺点:
  • 得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。
  • 对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性。

参考资料

  1. 入门 | 一文了解什么是语义分割及常用的语义分割方法有哪些
  2. 计算机视觉 - 语义分割 (semantic segmentation)
  3. Fully Convolutional Networks for semantic Segmentation(深度学习经典论文翻译)
  4. 全卷积网络 Fully Convolutional Networks
  5. 全卷积网络 FCN 详解
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值