SegNet网络简析及caffe工程应用

最近在工作的业务中需要应用到图像分割,在这里总结一下在应用中遇到的一些问题。

一、SegNet简介

自2015年FCN的提出后,使用卷积层替代全连接层成为了解决像素级分类种where和what的一种有效办法。在最初的的FCN网络中,作者将最后用于分类的卷积层结果通过双线性差值扩大分辨率后,与前面pooling层之后的feature map进行结合,在提高分类准确率的同时,增加了更多的位置信息。

SegNet与FCN最大的区别在于,将低分辨率feature map转换为高分辨率feature map的上采样所使用的方法。FCN使用反卷积的方法通过卷积的方式来将分辨率翻倍(卷积核采用双线性差值初始化)。而SegNet采用的是使用下采样时的位置信息,上采样将值填入扩大分辨率后的feature map中。

SegNet论文地址为https://arxiv.org/abs/1511.00561

这里写图片描述

图1. SegNet结构图

模型细节:

  1. 每层保留64个特征
  2. 解码层不采用ReLU让优化变得简单
  3. 核大小为7x7

采用64个特征的好处:

  1. 防止参数过多爆炸增长
  2. 每增加一对编码解码层,都增加相同时间。小的特征图,使用时间短。(减少内存访问损耗MAC时间)

使用7x7固定核,可以把输出层的像素追溯到输入层中。

使用LCN预处理:

  1. 修改不均匀场景,提高阴影部分对比度。
  2. 强调轮廓,使网络更容易学习轮廓
  3. 更易收敛

 

二、caffe平台上的SegNet

原版的SegNet的caffe开源代码地址:https://github.com/alexgkendall/caffe-segnet

支持cudnn 2的caffe开源代码地址:https://github.com/TimoSaemann/caffe-segnet-cudnn5

与其他深度学习模型中的caffe代码类似,仅需要编译caffe后即可运行。

 

1. Batch Normalization

在使用SegNet模型时,遇到的最大的问题是BN层,这里回忆一下BN层的作用及使用方法。

推荐文章:https://www.cnblogs.com/guoyaohua/p/8724433.html

文章中对BN层进行了抽象和实例解析,非常清楚,下面我用自己的理解来说一下:

BN层的出现,主要是为了解决机器学习IID问题,即训练集和测试集保持独立同分布。如果输入的分布不能保持稳定,那么训练就会很难收敛,而在图像处理领域的白化处理,即将输入数据转换为以0为均值,1为方差的正态分布。这样能够让神经网络更快更好的收敛,而这就是BN层所要做的。

“深度神经网络之所以收敛慢,是由于输入的分布逐渐向非线性函数的两端靠拢”,而BN层的作用,就是将输入的分布,拉回到均值为0,方差为1的正态分布上,这样就使输入激活函数的值,在反向传播史能够产生更明显的梯度,更容易收敛,避免了梯度消失的问题。之所以能够在反向传播时产生更明显的变化,我们将输入分布变为标准正态分布后,输入的值靠近中心的概率会变大,若我们的激活函数为sigmoid函数,那么即使输入存在微小的变化,也能够在反向传播时产生很明显的变化。

图2. Sigmoid函数

2. Batch Normalization在训练中

每层神经网络在线性激活后,通过如下公式进行转换,这个转换就是BN层的操作。

公式中的x是经过该层线性变换后的值,即x = wu+b,u为上一层神经层的输出。

通过这个操作,将输入非线性激活函数的输入值,尽量拉伸到变化较大的区域,即激活函数中间区域。这样能够增大激活函数的导数值,使收敛更快速。而这样也会引入一个问题,强行变换分布后,会导致部分特征无法学习到,因此引入了另一种操作Scale,操作如下:

mean和variance是不会进行学习的,而gamma和beta两个参数是可以通过反向传播学习的,通过这两个参数对数据进行扩大和平移,恢复部分特征的分布。

这里之所以提一下BN层,是因为SegNet官方Caffe工程中,将BN操作和Scale操作进行了融合,将两层变为一层。这个操作导致了以前可以用于其他模型上,将BN层参数和scale参数(以下统称BN层参数)与conv层参数融合的脚本无法使用。

注:

添加BN层后,卷积中偏移量bias可以不添加,因为会被抵消。

3.BN层参数融合

为何需要将BN层参数与conv参数融合呢?在SegNet Caffe工程的github主页上,作者在QA中提到,融合参数后,模型的性能提高了30%,这对于将模型部署于应用中是非常大的提升。

在SegNet Caffe cudnn版本中,作者提供了一个脚本来帮助我们融合BN层参数和conv层参数,即BN-absorber.py。

此处需要注意,在使用BN-absorber.py脚本前,我们需要先运行另一个脚本,由于在训练过程中,我们采用的batch size会直接影响到mean和variance的计算,若每个batch之间的样本分布非常不均匀,可能会影响模型的收敛情况,因此,运行compute_bn_statistics.py脚本,会将整个测试集作为一个batch,计算整个测试集的mean和variance。

 

 

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值