在此,要区别一下实例分割(具体可参考著名的MaskRCNN模型),实例分割常常与目标检测系统相互结合,用于检测和分割场景中同一对象的多个实例。
基于深度学习的语义分割方法:
用卷积神经网络分类(全卷积网络),与普通网络不同的是,分类层是卷积层,普通网络为全连接层。
最近的语义分割架构一般都用卷积神经网络(CNN)为每个像素分配一个初始类别标签。卷积层可以有效地捕捉图像中的局部特征,并以层级的方式将许多这样的模块嵌套在一起,这样 CNN 就可以试着提取更大的结构了。通过一系列卷积捕捉图像的复杂特征,CNN 可以将一张图的内容编码为紧凑表征。
但为了将单独的像素映射给标签,我们需要将标准 CNN 编码器扩展为编码器-解码器架构。在这个架构中,编码器使用卷积层和池化层将特征图尺寸缩小,使其成为更低维的表征。解码器接收到这一表征,用通过转置卷积执行上采样而「恢复」空间维度,这样每一个转置卷积都能扩展特征图尺寸。在某些情况下,编码器的中间步骤可用于调优解码器。最终,解码器生成一个表示原始图像标签的数组。
常见模型:
1.FCN系列
三种模型FCN-32S, FCN-16S, FCN-8S
主要贡献:
不含全连接层(fc)的全卷积(fully conv)网络。可适应任意尺寸输入。 增大数据尺寸的反卷积(deconv)层。能够输出精细的结果。 结合不同深度层结果的跳级(skip)结构。同时确保鲁棒性和精确性。
2.SegNet
SegNet和FCN思路十分相似,只是Encoder,Decoder(Upsampling)使用的技术不一致。此外SegNet的编码器部分使用的是VGG16的前13层卷积网络,每个编码器层都对应一个解码器层,最终解码器的输出被送入soft-max分类器以独立的为每个像素产生类概率。
3.Unet及各种变体
在生物医学图像处理中,得到图像中的每一个细胞的类别标签是非常关键的。生物医学中最大的挑战就是用于训练的图像是不容易获取的,数据量也不会很大。U-Net 是非常著名的解决方案,它在全连接卷积层上构建模型,对其做了修改使得它能够在少量的训练图像数据上运行,得到了更加精确的分割。
4.Deeplab系列
主要有模型Deeplabv1,Deeplabv2,Deeplabv3,Deeplabv3 。
将 CNN 编码器-解码器和 CRF 精炼过程相结合以产生目标标签(作者强调了解码器的上采样)。空洞卷积(也称扩张卷积)在每一层都使用大小不同的卷积核,使每一层都能捕获各种比例的特征。
V3 使用深度分离卷积替代了pooling,并且使用了Xception,Xception的核心是使用了Depthwise separable convolution。Depthwise separable convolution的思想来自inception结构,是inception结构的一种极限情况。Inception 首先给出了一种假设:卷积层通道间的相关性和空间相关性是可以退耦合的,将它们分开映射,能达到更好的效果。在inception结构中,先对输入进行1*1的卷积,之后将通道分组,分别使用不同的3*3卷积提取特征,最后将各组结果串联在一起作为输出。
主要贡献:
- 为密集预测任务使用具有上采样的卷积
- 在多尺度上为分割对象进行带洞空间金字塔池化(ASPP)
- 通过使用 DCNNs 提升了目标边界的定位
解决了语义分割的主要挑战,包括:
- 由重复的最大池化和下采样导致的特征分辨率降低
- 检测多尺度目标
- 因为以目标为中心的分类器需要对空间变换具有不变性,因而降低了由 DCNN 的不变性导致的定位准确率。
5.Unet
UNet (嵌套U-Net架构)用于更精确的分割。我们引入中间层来跳过U-Net的连接,这自然形成了来自不同深度的多个新的上采样路径,集合了各种感受域的U-Nets。
6.PSPNet
金字塔场景解析网络是建立在FCN之上的基于像素级分类网络。特性映射来自网络被转换成不同分辨率的激活,并经过多尺度处理池层,稍后向上采样并与原始层连接进行分割的feature map(见图)。学习的过程利用辅助分类器进一步优化了像ResNet这样的深度网络。不同类型的池模块侧重于激活的不同区域地图。将大小不同的内核集中在一起激活地图的不同区域创建空间池金字塔。
7.RefineNet
使用CNN最后一层的特性可以生成soft对象段的边界。在DeepLab算法中避免了这个问题深黑色的卷曲。RefineNet采用了另一种方法通过细化中间激活映射并分层地将其连接到结合多尺度激活,同时防止锐度损失。网络由独立的RefineNet模块组成,每个模块对应于ResNet。每个RefineNet模块由三个主要模块组成,即:剩余卷积单元(RCU),多分辨率融合(MRF)和链剩余池(CRP)。RCU块由一个自适应块组成卷积集,微调预训练的ResNet权重对于分割问题。MRF层融合不同的激活物使用卷积和上采样层来创建更高的分辨率地图。最后,在CRP层池中使用多种大小的内核用于从较大的图像区域捕获背景上下文。RefineNet在Person-Part数据集上进行了测试68.6,与DeepLab-v2的64.9相比,两者都使用了ResNet-101作为特征提取器。
8.FastFCN
此模型提出了一种被称作联合金字塔上采样(Joint Pyramid Upsampling/JPU)的联合上采样模块来代替消耗大量时间和内存的带洞卷积。它通过把抽取高分辨率图的方法形式化,并构建成一个上采样问题来取得很好的效果。
此模型在 Pascal Context 数据集上实现了 53.13% 的 mIoU,并且具有三倍的运行速度。
该模型以全卷积网络(FCN)作为主体架构,同时应用 JPU 对低分辨率的最终特征图进行上采样,得到了高分辨率的特征图。使用 JPU 代替带洞卷积并不会造成任何性能损失。
9.CNN RNN方案及其他一系列模型
语义分割常见指标:
FN:False Negative,被判定为负样本,但事实上是正样本。 FP:False Positive,被判定为正样本,但事实上是负样本。 TN:True Negative,被判定为负样本,事实上也是负样本。 TP:True Positive,被判定为正样本,事实上也是正样本。
像素准确率(pixel-accuracy),有的时候还有平均准确率(mean-accuracy)以及加权准确率。
查准率(precision),指的是预测值为1且真实值也为1的样本在预测值为1的所有样本中所占的比例。以黄瓜问题为例,算法挑出来的黄瓜中有多少比例是好黄瓜。
P=frac{T P}{T P F P}
召回率(recall),也叫查全率,指的是预测值为1且真实值也为1的样本在真实值为1的所有样本中所占的比例。所有的好西瓜中有多少比例被算法挑了出来。
r=frac{T P}{T P F N}
F1分数(F1-Score),又称为平衡F分数(BalancedScore),它被定义为精确率和召回率的调和平均数。
mathrm{F} 1=2^{*} frac{text { precision } * text { recall }}{text { precision } text { recall }}
IOU(Intersection over Union)交并比。计算真实值和预测值集合的交集与并集之比。
mathrm{IOU}=frac{T P}{T P F P F N}
常用MeanIOU,即每类上求IOU再平均,以及FWIOU,根据每类的频率或数量来加权。
语义分割的传统方法:
- 直方图阈值化方法
- 混合化特征空间聚类方法
- 基于区域的方法
- SVM等算法
- 等等
基于深度学习方法与传统方法的一个重要区别:
传统算法依赖于领域专家提取的特征的质量,而CNN通常解决自动特性学习问题。
语义分割的应用:
- 医学图形处理,定位各种异常,如肿瘤或特定的器官。
- 行人检测,交通监控。
- 卫星图像,指纹识别等取证技术。(我主要也是做遥感影像的语义分割)
- 自动驾驶等等。
如果自己在做科研或解决一些问题,可以采用以下语义分割技术来提升分割效果、改善效率:
1.Astrous Convolutions(扩张卷积)
空洞卷积(dilated convolution)是针对图像语义分割问题中下采样会降低图像分辨率、丢失信息而提出的一种卷积思路。利用添加空洞扩大感受野,让原本3x3的卷积核,在相同参数量和计算量下拥有5x5(dilated rate =2)或者更大的感受野,从而无需下采样。扩张卷积又名空洞卷积(atrous convolutions),向卷积层引入了一个称为 “扩张率(dilation rate)”的新参数,该参数定义了卷积核处理数据时各值的间距。换句话说,相比原来的标准卷积,扩张卷积多了一个hyper-parameter(超参数)称之为dilation rate(扩张率),指的是kernel各点之前的间隔数量,【正常的convolution 的 dilatation rate为 1】。
2.空间金字塔池化等下采样技术。
如上述模型中的ASPP模块及JPU模块,并且可以以此技术来相互组合达到更好的效果。
3.CRF(条件随机场)
在基于深度学习的语义图像分割体系结构,CRF是一个有用的后处理模块,但是主要缺点是不能将其用作端到端体系结构的一部分。在标准CRF模型中,可以表示成对电位用加权高斯函数的和。但是由于精确的极小化是否考虑了CRF分布的平均场近似用一个简单的产品版本来表示发行版独立的边际分布。它的平均场近似原生形式不适合反向传播。
4.Loss函数的更改
(1)二分类
大名鼎鼎的focal loss,focal loss的提出是在目标检测领域,为了解决正负样本比例严重失衡的问题。是由log loss改进而来的,公式如下:
-frac{1}{N} sum_{i=1}^{N}left(alpha y_{i}left(1-p_{i}right)^{gamma} log p_{i} (1-alpha)left(1-y_{i}right) p_{i}^{gamma} log left(1-p_{i}right)right)
其中gamma>0
在Focal Loss中,它更关心难分类样本,不太关心易分类样本,比如:
若 gamma = 2,
对于正类样本来说,如果预测结果为0.97那么肯定是易分类的样本,所以就会很小;
对于正类样本来说,如果预测结果为0.3的肯定是难分类的样本,所以就会很大;
对于负类样本来说,如果预测结果为0.8那么肯定是难分类的样本,就会很大;
对于负类样本来说,如果预测结果为0.1那么肯定是易分类的样本,就会很小。
另外,Focal Loss还引入了平衡因子alpha,用来平衡正负样本本身的比例不均。
alpha取值范围0~1,当alpha>0.5时,可以相对增加y=1所占的比例。实现正负样本的平衡。
虽然何凯明的试验中,lambda为2是最优的,但是不代表这个参数适合其他样本,在应用中还需要根据实际情况调整这两个参数。
(2)多分类
多分类常见的是交叉熵,其他的损失函数也比较多,也可以对交叉熵加权。
如Dice:
代码语言:javascript复制##Keras
def dice_coef(y_true, y_pred, smooth=1):
mean_loss = 0;
for i in range(y_pred.shape(-1)):
intersection = K.sum(y_true[:,:,:,i] * y_pred[:,:,:,i], axis=[1,2,3])
union = K.sum(y_true[:,:,:,i], axis=[1,2,3]) K.sum(y_pred[:,:,:,i], axis=[1,2,3])
mean_loss = (2. * intersection smooth) / (union smooth)
return K.mean(mean_loss, axis=0)
5.标签平滑
简单理解就是对预测结果进行惩罚。
代码语言:javascript复制def label_smoothing(inputs, epsilon=0.1):
K = inputs.get_shape().as_list()[-1] # number of channels
return ((1-epsilon) * inputs) (epsilon / K)
6.可利用的训练策略,主要是学习率策略
每隔一段时间warm restart学习率,这样在单位时间内能得到多个而不是一个converged local minina,做融合的话手上的模型会多很多。
7.更高级的优化器
LookAhead等优化器。
Lookahead 算法与已有的方法完全不同,它迭代地更新两组权重。直观来说,Lookahead 算法通过提前观察另一个优化器生成的fast weights序列,来选择搜索方向。该研究发现,Lookahead 算法能够提升学习稳定性,不仅降低了调参需要的功夫,同时还能提升收敛速度与效果。
8.数据增强技术
无论对于什么样的数据集,规模多大的数据集,在语义分割任务中,数据随机缩放给模型带来的收益永远是最大的。我们在训练网络时,如果将padding给的过大,而卷积核大小不变你会发现我们的卷积核能力被弱化,过大的padding增加了数据集的单一性,假设你对一张大小为16x16的图像增加了64x64的padding,甚至更大,大到我们本来的图像在在增加padding之后显的很渺小,那这新的图像对于卷积核来看,基本上就是一张呼呼的图像,如果整个数据集都是这种图像,那对于卷积核来讲,太单一了,当然也没有人会这样做。数据集的多样性,包括尺度多样性,光照多样性,目标姿态多样性。尺度多样性不仅在深度学习中使用,在传统计算机视觉中也是很重要的方法。
对于随机翻转,镜像翻转,色彩偏移等数据增强技术手段为模型所带来的收益加一起也不一定有尺度的随机缩放所带来的效果好。
9.更高明的数据预处理
最常见的就是标准化与归一化
数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。目前数据标准化方法有多种,归结起来可以分为直线型方法(如极值法、标准差法)、折线型方法(如三折线法)、曲线型方法(如半正态性分布)。不同的标准化方法,对系统的评价结果会产生不同的影响,然而不幸的是,在数据标准化方法的选择上,还没有通用的法则可以遵循。
数据的归一化处理,即将数据统一映射到[0,1]区间上。
1. 把数变为(0,1)之间的小数 主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速,应该归到数字信号处理范畴之内。 2. 把有量纲表达式变为无量纲表达式 归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。
10.模型的集成
已知神经网络的集合比单个网络更健壮和准确。然而,为模型平均训练多个深度网络在计算上是昂贵的。前面有讲,通过循环调整网络的学习率可使网络依次收敛到不同的局部最优解也可达到模型集成的作用,此处所讲的主要是多模型集成。
(1)直接平均法
直接平均法是最简单有效的多模型集成方法,通过直接平均不同模型产生的类别置信度得到最后额预测结果
(2)加权平均法
加权平均法是直接平均的基础上加入权重来调节不同模型输出间的重要程度。
(3)投票法(voting)
投票法中最常用的是多数表决法。表决前需先将各自模型返回的预测置信度sisi转化为预测类别,即最高置信度对应的类别标记 cici ∈ {1, 2, … , C} 作为该模型的预测结果。多数表决法中在得到样本 x 的最终预测时,若某预测类别获得一半以上模型投票,则该样本预测结果为该类别; 若对该样本无任何类别获得一半以上投票,则拒绝作出预测。投票法中另一种常用方法是相对多数表决法 , 与多数表决法会输出“拒绝预测”不同的是,相对多数表决法一定会返回某个类别作为预测结果, 因为相对多数表决是选取投票数最高的类别作为最后预测结果。
(4)堆叠法
堆叠法又称“二次集成法”是一种高阶的集成学习算法。在刚才的例子中,样本 x 作为学习算法或网络模型的输入, sisi 作为第 i 个模型的类别置信度输出,整个学习过程可记作一阶学习过程。堆叠法则是以一阶学习过程的输出作为输入开展二阶学习过程, 有时也称作“元学习”。拿刚才的例子来说,对于样本 x, 堆叠法的输入是 N 个模型的预测置信度,这些置信度可以级联作为新的特征表示。之后基于这样的”特征表示”训练学习器将其映射到样本原本的标记空间。此时学习器可为任何学习算法习得的模型,如支持向量机,随机森林 ,当然也可以是神经网络模型。不过在此需要指出的是,堆叠法有较大过拟合风险。
11.Dropout等技术。
在神经网络中DropOut层的主要作用是防止权值过度拟合,增强学习能力。DropOut层的原理是,输入经过DropOut层之后,随机使部分神经元不工作(权值为0),即只激活部分神经元,结果是这次迭代的向前和向后传播只有部分权值得到学习,即改变权值。
因此,DropOut层服从二项分布,结果不是0,就是1,在CNN中可以设定其为0或1的概率来到达每次只让百分之几的神经元参与训练或者测试。在Bayesian SegNet中,SegNet作者把概率设置为0.5,即每次只有一半的神经元在工作。因为每次只训练部分权值,可以很清楚地知道,DropOut层会导致学习速度减慢。
提示:在做的过程中,过拟合现象是非常常见的。
过拟合的根本原因是特征维度过多,模型假设过于复杂,参数过多,训练数据过少,噪声过多,导致拟合的函数完美的预测训练集,但对新数据的测试集预测结果差。过度的拟合了训练数据,而没有考虑到泛化能力。