【语义分割】--SegNet理解

2023-11-19

原文地址:SegNet

复现详解:http://mi.eng.cam.ac.uk/projects/segnet/tutorial.html 

实现代码:    github    

                   TensorFlow

简介:

        SegNet是Cambridge提出旨在解决自动驾驶或者智能机器人的图像语义分割深度网络,开放源码,基于caffe框架。SegNet基于FCN,修改VGG-16网络得到的语义分割网络,有两种版本的SegNet,分别为SegNetBayesian SegNet,同时SegNet作者根据网络的深度提供了一个basic版(浅网络)。


网络框架:


        SegNet和FCN思路十分相似,只是Encoder,Decoder(Upsampling)使用的技术不一致。此外SegNet的编码器部分使用的是VGG16的前13层卷积网络,每个编码器层都对应一个解码器层,最终解码器的输出被送入soft-max分类器以独立的为每个像素产生类概率。

        左边是卷积提取特征,通过pooling增大感受野,同时图片变小,该过程称为Encoder,右边是反卷积(在这里反卷积与卷积没有区别)与upsampling,通过反卷积使得图像分类后特征得以重现,upsampling还原到图像原始尺寸,该过程称为Decoder,最后通过Softmax,输出不同分类的最大值,得到最终分割图。


Encoder

        Encoder过程中,通过卷积提取特征,SegNet使用的卷积为same卷积,即卷积后保持图像原始尺寸;在Decoder过程中,同样使用same卷积,不过卷积的作用是为upsampling变大的图像丰富信息,使得在Pooling过程丢失的信息可以通过学习在Decoder得到。SegNet中的卷积与传统CNN的卷积并没有区别。


Pooling&Upsampling(decoder):

        Pooling在CNN中是使得图片缩小一半的手段,通常有max与mean两种Pooling方式,下图所示的是max Pooling。max Pooling是使用一个2x2的filter,取出这4个权重最大的一个,原图大小为4x4,Pooling之后大小为2x2,原图左上角粉色的四个数,最后只剩最大的6,这就是max的意思。 

        在SegNet中的Pooling与其他Pooling多了一个index功能(该文章亮点之一),也就是每次Pooling,都会保存通过max选出的权值在2x2 filter中的相对位置,对于上图的6来说,6在粉色2x2 filter中的位置为(1,1)(index从0开始),黄色的3的index为(0,0)。同时,从网络框架图可以看到绿色的pooling与红色的upsampling通过pool indices相连,实际上是pooling后的indices输出到对应的upsampling(因为网络是对称的,所以第1次的pooling对应最后1次的upsamping,如此类推)。 
        Upsamping就是Pooling的逆过程(index在Upsampling过程中发挥作用),Upsamping使得图片变大2倍。我们清楚的知道Pooling之后,每个filter会丢失了3个权重,这些权重是无法复原的,但是在Upsamping层中可以得到在Pooling中相对Pooling filter的位置。所以Upsampling中先对输入的特征图放大两倍,然后把输入特征图的数据根据Pooling indices放入,下图所示,Unpooling对应上述的Upsampling,switch variables对应Pooling indices。 

        对比FCN可以发现SegNet在Unpooling时用index信息,直接将数据放回对应位置,后面再接Conv训练学习。这个上采样不需要训练学习(只是占用了一些存储空间)。反观FCN则是用transposed convolution策略,即将feature 反卷积后得到upsampling,这一过程需要学习,同时将encoder阶段对应的feature做通道降维,使得通道维度和upsampling相同,这样就能做像素相加得到最终的decoder输出. 


Deconvolution:

        pooling&Upsampling示意图中右边的Upsampling可以知道,2x2的输入,变成4x4的图,但是除了被记住位置的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 Carlo Dropout Sampling

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

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

Use Bayesian SegNet

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【语义分割】--SegNet理解 的相关文章

  • Linux 下使用 C++ 实现的 Web 文件服务器

    项目地址 Github https github com shangguanyongshi WebFileServer 在学习完成 TCP IP 网络编程 和 Linux高性能服务器编程 后 阅读了一些Web服务器的相关代码 自动动手使用
  • code style

    最近一直在看java convention和google c style 因为老板要提高代码质量 我们小公司一个 因为客户说我们的代码质量太烂了 于是开始搞代码质量 先从静态 代码质量开始 于是就研究起来code style 但是 我发现
  • Pthread 并发编程(三)——深入理解线程取消机制

    基本介绍 线程取消机制是 pthread 给我们提供的一种用于取消线程执行的一种机制 这种机制是在线程内部实现的 仅仅能够在共享内存的多线程程序当中使用 基本使用 include
  • 【ARM】程序快速定位segmentation fault core dumped错误

    1 应用场景 ARM开发过程中经常进程运行着出现段错误 这时候单纯靠加日志打log效率太低 使用gdb的话 由于APP进程太多 生成的core的文件特别大 而且gdb在arm板子也不好单步调试 不太友好还是pass掉 目前使用段错误捕捉SI
  • Python3爬虫——用Xpath提取网页信息

    Python3爬虫 用Xpath提取网页信息 前言 本笔记用于记录整理requests库的一些基本知识 内容会根据博主自己的认知作增添或压缩 水平有限 如有错误请不吝赐教 本文需要读者初步了解HTML有关节点的相关知识 文章目录 Pytho
  • Python技能练习!值得你看的28道常见题型汇总!(附答案解析)

    今天给大家分享30道Python练习题 建议大家先独立思考一下解题思路 再查看答案 文末有惊喜 1 已知一个字符串为 hello world yoyo 如何得到一个队列 hello world yoyo 使用 split 函数 分割字符串

随机推荐

  • C#多线程Lock锁定的使用例子(多线程线程同步)

    这个例子是一个模拟多个人在多台提款机上同时提取一个账户的款的情况 在存取的过程中 可能 A线程取了100 而B线程那边还看见账户上没少掉那100快 所以导致数据不统一 赋值出现问题 下面代码则可以测试出加上Lock锁定 与 不加的区别 先上
  • 学会这几个简单的bat代码,轻松在朋友面前装一波13

    这个标题是干什么用的 最近看晚上某些人耍cmd耍的十分开心 还自称为 黑客 着实比较搞笑 他们那些花里胡哨的东西在外行看来十分nb 但只要略懂一些 就会发现他们的那些十分搞笑和滑稽 今天这里分享几个类似的方法 让你在不懂行的朋友面前秀一波
  • xuexila作文 lxml etree xpath如何同时选择多种标签tag

    以学习啦为例 说明如何选择一个大范围标签下面的两个及以上种类标签tag 例如 div p 1 p h2 2 h2 p 3 p div 只有同时可以选择p h2 内容1 2 3的顺序才不会乱 from lxml import etree im
  • 数据库表结构设计

    做一个项目 必然是少不了数据库设计的 在学习阶段 基本都是单表 然而在实际开发过程中 一对多 多对多的表处处都是 简单整理一下 一对多 多对多表如何设计整理一下思路 数据库实体间有三种对应关系 一对一 一对多 多对多 一对多 一的主键放在多
  • Sublime中自动代码提示插件Anaconda插件下载及设置

    Sublime中自动代码提示插件Anaconda插件下载及设置 一 代码提示功能插件 Anaconda 通过package Control 进行插件下载 按住ctr shift p会弹出对话框 没果没有的话 需要进行package Cont
  • Python可迭代类

    Python可迭代类 iter 和 next python中我们常常会用到for循环结构 for 元素 in 元素来源 for循环后面的元素来源实际上就是一个可以迭代的对象 for in 语句其实做了两件事 第一件事是获取一个可迭代对象 即
  • QT5.14解决控制台打印中文乱码的问题

    如上图 在控制台打印的中文显示乱码 解决方法如下 第一 在main函数中加入 pragma execution character set utf 8 第二 将所有字符串包含中文 用QStringLiteral修饰 综上解决中文乱码问题
  • 彻底理解js中的闭包

    闭包是js的一个难点也是它的一个特色 是我们必须掌握的js高级特性 那么什么是闭包呢 它又有什么用呢 我们都知道 js的作用域分两种 全局和局部 基于我们所熟悉的作用域链相关知识 我们知道在js作用域环境中访问变量的权利是由内向外的 内部作
  • protobuf (Protocol Buffers)

    Protobuf Protocol Buffers 是一种语言无关 平台无关的序列化数据结构的协议 由Google开发 它可以用于将结构化数据序列化为二进制格式 并在不同的系统之间进行高效的数据传输或存储 Protobuf使用 proto文
  • 提示msvcr120.dll丢失怎么办?由于找不到msvcr120.dll如何修复?

    msvcr120 dll 是 Microsoft Visual C 文件中的一个重要组件 它是一种动态链接库 包含了很多函数 提供了许多基础的 C 运行时支持 这个库文件的主要功能是提供 C 应用程序的运行时环境 它是一些常用的 C 运行时
  • Netty从零开始(一)

    需要用到netty 之前就当年实习的时候用过Mina netty没用过 所以加急学习了一下 感觉还不错 不多说 从官网入手 官网地址 http netty io wiki user guide for 4 x html 有兴趣的朋友可以自己
  • 2.4G信号干扰原因

    转自 http wenku baidu com link url iw 8wLsNphcELx J7artsLTdIKtCLGO7X PAgQG6BYXuG GPHzYh8xrhkRVzJo2HL1LvI2p4RlgfxCuVBSwt9VG
  • 方框滤波,均值滤波,高斯滤波

    邻域算子 局部算子 是利用给定像素周围的像素值的决定此像素的最终输出值的一种算子 对于邻域算子 除了用于局部色调调整以外 还可以用于图像滤波 实现图像的平滑和锐化 图像边缘增强或者图像噪声的去除 而线性邻域滤波是一种常用的邻域算子 像素的输
  • Android Studio Unsupported Java

    问题 升级 Android Studio Flamingo 出现如下报错信息 Unsupported Java Your build is currently configured to use Java 17 0 2 and Gradle
  • 费马小定理【模板例题】

    费马小定理 如果p是一个质数 而整数a不是p的倍数 则有a p 1 1 mod p 即 假如a是整数 p是质数 且a p互质 即两者只有一个公约数1 那么a的 p 1 次方除以p的余数恒等于1 变式延伸 在对质数 p 求余的条件下 n ap
  • 零基础如何入门数学建模?

    小羊简介 博客主页 小羊不会飞 年龄 20 大二在读 爱好 干饭 运动 码代码 看书 旅游 即将更新 1 手把手带你搭建个人博客网站 2 后台管理系统模块更新 感兴趣的朋友 赶紧上车吧 欢迎关注 点赞 收藏 留言 有任何疑问 欢迎留言讨论
  • arduino/Mixly HX711称重传感器

    比例系数 假设现在放上去的物体实际重量为175 测出的是43 85 那么实际的比例系数X应该等于 175 X 43 85 1992 现在放上去一个面包板 实际重量为70克 串口显示14 24 那么比例系数 1992 14 24 70 405
  • “fixture ‘xxx‘ not found / 参数传入无效”的解决方案

    问题描述 今天在对强化学习的Gradient Bandit进行编码测试的时候 在主函数中多次执行测试函数 出现以下两个问题 在主函数运行test 6测试函数时 传入的参数是3000 但是绘图结果只显示1000 也就是test 6默认参数值
  • 一篇带你MySQL运维

    1 日志 1 1 错误日志 错误日志是 MySQL 中 重要的日志之一 它记录了当 mysqld启动和停止时 以及服务器在运行过程中发生任何严重错误时的相关信息 当数据库出现任何故障导致无法正常使用时 建议首先查看此日志 该日志是默认开启的
  • 【语义分割】--SegNet理解

    原文地址 SegNet 复现详解 http mi eng cam ac uk projects segnet tutorial html 实现代码 github TensorFlow 简介 SegNet是Cambridge提出旨在解决自动驾