宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

原文地址: SegNet

再现详见http://mi.eng.cam.AC.uk/projects/seg net/tutorial.html

实现代码:github

TensorFlow

简介:SegNet提出了Cambridge解决自动驾驶或智能机器人的图像语义分割深度网络,是开源的,基于caffe框架。 SegNet基于FCN,修改了从VGG-16网络得到的语义分割网络,有两种版本的SegNet,分别是SegNet和Bayesian SegNet,同时SegNet的作者是网络深度

网络框架:

SegNet和FCN的想法非常相似,但编码器、解码器upsampling )使用的技术不一致。 另外,SegNet的编码器部分使用VGG16的前13层卷积网络,每个编码器层与一个解码器层相对应,最终解码器的输出被发送到soft-max识别器,对于每个像素独立地产生类概率。

左侧通过卷积提取特征,轮询增大感受区,同时缩小图像。 这个过程称为编码器,右边是去卷积这里不区别于去卷积)和upsampling。 通过解卷积对图像进行分类后,再现特征,upsampling恢复图像的原始大小。 这个过程称为解码器,最后称为Softmax

Encoder:Encoder过程中,通过卷积提取特征,SegNet使用的卷积是same卷积,即卷积后保持图像的原始大小; 在解码器的过程中也使用了same卷积,但卷积的作用是在由于upsampling而变大的图像中丰富信息,在轮询过程中丢失的信息通过学习在解码器中得到。 SegNet的卷积与传统的CNN的卷积没有区别。

轮询更新解码器) :轮询是一种在CNN中将图像减半的手段,通常有max和mean两种轮询方式。 下图显示最大轮询。 最大轮询使用一个2×2过滤器,取出这四个权重最大的过滤器。 原图大小为4×4,轮询后的大小为2×2,原图左上角的四个粉红色数,最后只剩下最大的6。 这就是max的意思。 SegNet上的轮询添加了其他轮询和索引功能本文的亮点之一)。 也就是说,每次轮询时,max都会存储选定权重在2 x2过滤器中的相对位置。 对于上图中的6,粉红色在2 x2过滤器中的6位置为1,1 )。 另外,从网络框架图中可以看出,绿色的轮询和红色的upsampling通过轮询索引相连,实际上轮询后的索引被输出到对应的upsampling 图2 )

Upsamping是轮询的逆过程,索引在Upsampling的过程中起作用。 Upsamping将图像放大两倍。 在轮询后,每个滤波器失去三个权重,这些权重不能恢复,但表明在Upsamping层可以得到轮询中相对的轮询滤波器位置。 因此,在Upsampling中,首先将输入的特征图放大两倍,然后基于轮询索引放入输入的特征图的数据。 如下图所示,Unpooling对应于上述的Upsampling,switch variables对应于轮询索引。

与FCN相比,可以看到SegNet在未轮询时使用索引信息将数据直接返回到相应的位置,然后通过Conv培训进行学习。 这个上采样不需要训练学习。 只是占用了存储区域。 相应地,FCN利用传递卷积策略,在卷积特征之前获得置换。 该过程在需要学习的同时,可以将对应于编码器阶段的特征降低为通道维度,使通道维度和上采样相同,进行像素相加得到最终的解码器

‘-apple-system’, ‘SF UI Text’, Arial, ‘PingFang SC’, ‘Hiragino Sans GB’, ‘Microsoft YaHei’, ‘WenQuanYi Micro Hei’, sans-serif, SimHei, SimSun;”>

Deconvolution:

        pooling&Upsampling示意图中右边的Upsampling可以知道,2×2的输入,变成4×4的图,但是除了被记住位置的Pooling indices,其他位置的权值为0,因为数据已经被pooling走了。因此,SegNet使用的反卷积在这里用于填充缺失的内容,因此这里的反卷积与卷积是一模一样,在网络框架图中跟随Upsampling层后面的是也是卷积层。

Output:

        在网络框架中,SegNet,最后一个卷积层会输出所有的类别(包括other类),网络最后加上一个softmax层,由于是end to end, 所以softmax需要求出所有每一个像素在所有类别最大的概率,最为该像素的label,最终完成图像像素级别的分类。

Bayesian SegNet

        可以知道,在SeNet中最后每个像素都会对每一类的概率进行计算,再通过Softmat输出概率最大的一个,然后这个像素点就认为是这一类别,对应的概率就是这一像素属于该类的概率。这种由原因到结果的推导,可以称为先验概率,任何先验概率使用都会出现一个问题,不能知道这一结果的可靠性,即便先验概率非常大,但是对于不同的样本,先验概率无法保证一定正确。正是如此,才需要有从结果寻找原因的贝叶斯概率,即后验概率,它能给出结果的可信程度,即置信度。Bayesian SegNet正是通过后验概率,告诉我们图像语义分割结果的置信度是多少。Bayesian SegNet如下图所示。 

        对比两框架图,并没有发现Bayesian SegNet与SegNet的差别,事实上,从网络变化的角度看,Bayesian SegNet只是在卷积层中多加了一个DropOut层,其作用后面解释。最右边的两个图Segmentation与Model Uncertainty,就是像素点语义分割输出与其不确定度(颜色越深代表不确定性越大,即置信度越低)。

DropOut

        在传统神经网络中DropOut层的主要作用是防止权值过度拟合,增强学习能力。DropOut层的原理是,输入经过DropOut层之后,随机使部分神经元不工作(权值为0),即只激活部分神经元,结果是这次迭代的向前和向后传播只有部分权值得到学习,即改变权值。 

因此,DropOut层服从二项分布,结果不是0,就是1,在CNN中可以设定其为0或1的概率来到达每次只让百分之几的神经元参与训练或者测试。在Bayesian SegNet中,SegNet作者把概率设置为0.5,即每次只有一半的神经元在工作。因为每次只训练部分权值,可以很清楚地知道,DropOut层会导致学习速度减慢。

Gaussian process & Monte nrdlq Dropout Sampling

        参考论文:Dropout as a Bayesian approximation: Representing model uncertainty in deep learning 
这里只说明pldsj过程与蒙特卡罗抽样的作用,不详细解释原理。 pldsj过程是指任意有限个随机变量都服从联合pldsj分布,同时只需要知道均值与协防差就能够确定一个pldsj过程,所以pldsj过程可以用于从有限维到无限维的回归问题,从已知pldsj分布,增加新的随机变量分布可以求出新的pldsj分布,根据新的分布可以求出其均值与方差。 

        如何确定一个pldsj分布?需要多次采样才能确定一个分布。蒙特卡罗抽样告诉我们可以通过设计一个试验方法将一个事件的频率转化为概率,因为在足够大的样本中,事件发生的频率会趋向事件发生的概率,因此可以很方便地求出一个未知分布。通过蒙特卡罗抽样,就可以求出一个新分布的均值与方差,这样使用方差大小就可以知道一个分布对于样本的差异性,我们知道方差越大差异越大。

Use Bayesian SegNet

        在Bayesian SegNet中通过DropOut层实现多次采样,多次采样的样本值为最后输出,方差最为其不确定度,方差越大不确定度越大,如图6所示,mean为图像语义分割结果,var为不确定大小。所以在使用Bayesian SegNet预测时,需要多次向前传播采样才能够得到关于分类不确定度的灰度图,Bayesian SegNet预测如下图所示。 

第一行为输入图像,第二行为ground truth,第三行为Bayesian SegNet语义分割输出,第四行为不确定灰度图。可以看到, 
1.对于分类的边界位置,不确定性较大,即其置信度较低。 
2.对于图像语义分割错误的地方,置信度也较低。 
3.对于难以区分的类别,例如人与自行车,road与pavement,两者如果有相互重叠,不确定度会增加。