图像目标分割_4 DeepLab-V1

6.4.1 DeepLab 背景

相比于传统的视觉算法(SIFT或HOG),Deep-CNN以其end-to-end方式获得了很好的效果。这样的成功部分可以归功于Deep-CNN对图像转换的平移不变性(invariance),这根本是源于重复的池化和下采样组合层。平移不变性增强了对数据分层抽象的能力,但同时可能会阻碍低级(low-level)视觉任务,例如姿态估计、语义分割等,在这些任务中我们倾向于精确的定位而不是抽象的空间关系。

Deep-CNN在图像标记任务中存在两个技术障碍:

  • 信号下采样:在Deep-CNN中重复最大池化和下采样带来的分辨率下降问题,分辨率的下降会丢失细节。

    • 理解:也就是小物体信息无法重建 (假设有四个pooling layer 则 任何小于 2^4 = 16 pixel 的物体信息将理论上无法重建。)
  • 空间不敏感(invariance):分类器获取以对象中心的决策是需要空间变换的不变性,这就限制了Deep-CNN的定位精度

    • 比如对于同一张图片进行空间变换(如平移、旋转),其图片分类结果是不变的。对于图像分割等Low-Level Vision Task,对于一张图片进行空间变换后,其结果是改变的。

High-Level & Low-level vision task

CNN适合于Hight-Level Vision Task(如图像分类),不太适合于Low-Level Vision Task(如图像分割、姿态估计)。

  • lower level feature :也叫高级的语义信息,包括边缘检测,角点检测,颜色之类的对细节敏感、抽象度比较低的任务。

  • high level feature:一些表面,表观的信息,比如纹理、边缘。目标检测、图像分类等对细节信息不敏感、抽象度比较高的任务。

6.4.2 Deeplab V1介绍

在实验中发现DCNNs做语义分割时精准度不够的问题,根本原因是DCNNs的高级特征的平移不变性(即高层次特征映射)。

  • DeepLab是结合了深度卷积神经网络(DCNNs)和概率图模型(DenseCRFs)的方法
    • 系统与其他先进模型的主要区别在于DenseCRFs和DCNN的结合。是将每个像素视为CRF节点,利用远程依赖关系,并使用CRF推理直接优化DCNN的损失函数。拓展:Koltun(2011)的工作表明完全连接的CRF在语义分割下非常有效。

6.4.2.1 密集分类下的卷积神经网络

1、结构
 

  • 1、把最后的全连接层FC6、7、8改造成卷积层
  • 2、pool4的stride由2变为1,则紧接着的conv5_1, conv5_2和conv5_3中hole size为2。接着pool5由2变为1, 则后面的fc6中hole size为4。
  • 3、fc7,8为标准卷积

注:由于Hole(Atrous convolution)算法让feature map更加dense,所以网络直接用差值升采样就能获得很好的结果,而不用去学习升采样的参数了(FCN中采用了de-convolution)

问题:FCN中有两个关键,一个是pooling减小图像尺寸增大感受野,另一个是upsampling扩大图像尺寸。在先减小再增大尺寸的过程中,肯定有一些信息损失掉了,那么能不能设计一种新的操作,不通过pooling也能有较大的感受野看到更多的信息呢?答案就是dilated conv/atrous conv

2、空洞卷积的使用

DeepLab是采用的atrous(带孔)算法扩展感受野,获取更多的上下文信息

从两个角度考虑空洞卷积:

  • 相当于在标准概念的kernel(卷积核)中,相邻点之间添加(rate - 1)个0,然后使用扩张后的kernel(卷积核)与原图进行卷积。下面的图rate=2,相当于标准的3x3卷积核变为5x5卷积核,每一行中间添加(2-1)个0

    • 也就是说3x3的kernel在rate为2的情况下得到相当于5x5的空洞kernel,但是只有图中的9个点的权重不为0,其余都为0。 可以看到虽然kernel size只有3x3,但是这个卷积的感受野已经增大到了7x7。

  • 1、dilated的好处是不做pooling损失信息的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息。采样率为r的空洞卷积插入r−1个零,将k×k的卷积核变为ke=k+(k−1)(r−1)而不增加计算量。下图表示含有空洞卷积和不用空洞卷积的效果。结果就是使用采样率计算更加密集的特征映射。

  • 2、增大感受野的同时,不增加参数数量

3、问题:

  • signal down-sampling
    • 问题:DCNNs每一层重复执行下采样 (如max-pooling和downsampling),导致signal分辨率降低。
    • 将stride改小,能得到更加dense的feature map,可是却也带来了另外一个问题即receptive field(RF)变小的问题。
    • 将Hole(Atrous convolution)算法应用到DCNNs模型上来扩展感受野,获取更多的上下文信息。
  • spatial “insensitivity”(invariance)
    • 问题:以获取图像中物体为核心的决策(High Level Vision Task,如图片分类、目标检测任务)需要空间不变性,即DCNNs的high-level的平移不变性(invariance),导致DCNNs做语义分割时定位精准度不够。
    • 将DCNNs层的响应和 完全连接条件随机场(Fully Connected CRFs)结合(DeepLab是由两个非常成熟的模块(DCNN和CRFs)级联而成)

5、API实现

tf.nn.atrous_conv2d(value, filters, rate, padding, name=None)

value: 指需要做卷积的输入图像,要求是一个4维Tensor,具有[batch, height, width, channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数]

filters: 相当于CNN中的卷积核,要求是一个4维Tensor,具有[filter_height, filter_width, channels, out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],同理这里第三维channels,就是参数value的第四维

rate: 要求是一个int型的正数,正常的卷积操作应该会有stride(即卷积核的滑动步长),但是空洞卷积是没有stride参数的,这一点尤其要注意。取而代之,它使用了新的rate参数,那么rate参数有什么用呢?它定义为我们在输入图像上卷积时的采样间隔,你可以理解为卷积核当中穿插了(rate-1)数量的“0”,把原来的卷积核插出了很多“洞洞”,这样做卷积时就相当于对原图像的采样间隔变大了。具体怎么插得,可以看后面更加详细的描述。此时我们很容易得出rate=1时,就没有0插入,此时这个函数就变成了普通卷积。

padding: string类型的量,只能是”SAME”,”VALID”其中之一,这个值决定了不同边缘填充方式。

img =tf.constant(value=[[[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[1],[2],[3],[4]]]],dtype=tf.float32)
img =tf.concat(values=[img,img],axis=3)
filter =tf.constant(value=1, shape=[3,3,2,5], dtype=tf.float32)
out_img1 =tf.nn.atrous_conv2d(value=img, filters=filter, rate=1, padding='SAME')
out_img2 =tf.nn.atrous_conv2d(value=img, filters=filter, rate=1, padding='VALID')
out_img3 =tf.nn.atrous_conv2d(value=img, filters=filter, rate=2, padding='SAME')
#error
#out_img4 = tf.nn.atrous_conv2d(value=img, filters=filter, rate=2, padding='VALID')
print('rate=1, SAME mode result:')
print(sess.run(out_img1.numpy()))
print('rate=1, VALID mode result:')
print(sess.run(out_img2.numpy()))
print('rate=2, SAME mode result:')
print(sess.run(out_img3.numpy())) # error #print 'rate=2, VALID mode result:' #print(sess.run(out_img4))

6.4.2.2 CRF的应用

1、背景

  • DCNN的预测物体的位置是粗略的,没有确切的轮廓。图像输入CNN是一个被逐步抽象的过程,原来的位置信息会随着深度而减少甚至消失

2、CRFs for accurate localization

  • CRF:简单来讲就是每个像素点作为节点,像素与像素间的关系作为边,即构成了一个条件随机场。通过二元势函数描述像素点与像素点之间的关系,鼓励相似像素分配相同的标签,而相差较大的像素分配不同标签。
    • CRF在传统图像处理上主要做平滑处理。就是在决定一个位置的像素值时,会考虑周围邻居的像素值,这样能抹除一些噪音。
  • 但对于CNN来说,short-range CRFs可能会起到反作用,因为我们的目标是恢复局部信息,而不是进一步平滑图像。引入fully connected CRF来考虑全局的信息。

效果:

3、论文CRF设置

全连接CRF模型使用的能量函数E(x)E(x) E(x)=\sum_i\theta_i(x_i)+\sum_{ij}\theta_{ij}(x_i,y_j)E(x)=​i​∑​​θ​i​​(x​i​​)+​ij​∑​​θ​ij​​(x​i​​,y​j​​)

  • x:对全局pixels的概率预测分布

  • xi:其中一个pixel的概率预测分布

  • θi:一元势函数 unary potential function,定义在观测序列位置i的状态特征函数,用于刻画观测序列对标记变量的影响

    • 则:

    \theta_i(x_i)=-\log P(x_i)θ​i​​(x​i​​)=−logP(x​i​​)

  • θi:二元势函数 unary potential function,定义在不同观测位置上的转移特征函数,用于刻画变量之间的相关关系以及观测序列对其影响(实质是像素之间的关系)

    • 则:

    • 其中k^m(f_i,f_j)k​m​​(f​i​​,f​j​​)为(f_i,f_j)(f​i​​,f​j​​)之间的高斯核,fi是像素i的特征向量,例如像素点i的特征向量fi用(x,y,r,g,b)表示。对应的权重为w_{m}w​m​​

    • \theta_{ij} (x_i,y_j)=u(x_i,x_j)\sum^K_{m=1}\omega_m\cdot k^m(f_i,f_j)θ​ij​​(x​i​​,y​j​​)=u(x​i​​,x​j​​)​m=1​∑​K​​ω​m​​⋅k​m​​(f​i​​,f​j​​)

    • 在DeepLab中高斯核采用双边位置和颜色组合,式为:第一核取决于像素位置(p)和像素颜色强度(I),第二个核取决于像素位置(p).

      • \omega_1\exp-\frac{||p_i-p_j||^2}{2\sigma_{\alpha}^2}-\frac{||I_i-I_j||^2}{2\sigma_{\beta}^2})+\omega_2\exp(-\frac{||p_i-p_j||^2}{2\sigma_{\gamma}^2})ω​1​​exp−​2σ​α​2​​​​∣∣p​i​​−p​j​​∣∣​2​​​​−​2σ​β​2​​​​∣∣I​i​​−I​j​​∣∣​2​​​​)+ω​2​​exp(−​2σ​γ​2​​​​∣∣p​i​​−p​j​​∣∣​2​​​​)

总结:二元势函数是描述像素和像素之间的关系,如果比较相似,那可能是一类,否则就裂开,这可以细化边缘。一般的二元势函数只取像素点与周围像素之间的边,这里使用的是全连接,即像素点与其他所有像素之间的关系。

6.4.2.3 主要贡献

  • 速度:带atrous算法的DCNN可以保持8FPS的速度,全连接CRF平均推断需要0.5s
  • 准确:在PASCAL语义分割挑战中获得了第二的成绩
  • 简单:DeepLab是由两个非常成熟的模块(DCNN和CRFs)级联而成

6.4.3 DeepLab V1 实验

  • 损失函数:输出的特征图与ground truth下采样8倍做交叉熵和。
  • 训练数据label:对原始Ground Truth进行下采样8倍,得到训练label。
  • 预测数据label:对预测结果进行双线性上采样8倍,得到预测结果。

测试细节:

itemset
数据集PASCAL VOC 2012 segmentation benchmark
DCNN模型权重采用预训练的VGG16
DCNN损失函数交叉熵
训练器SGD,batch=20
学习率初始为0.001,最后的分类层是0.01。每2000次迭代乘0.1
权重0.9的动量, 0.0005的衰减
  • DeepLab由DCNN和CRF组成,训练策略是分段训练,即DCNN的输出是CRF的一元势函数,在训练CRF时是固定的。
  • DeepLab由DCNN和CRF组成,训练策略是分段训练,即DCNN的输出是CRF的一元势函数,在训练CRF时是固定的。在对DCNN做了fine-tune后,对CRF做交叉验证。这里使用ω2=3和σγ=3在小的交叉验证集上寻找最佳的\omega_1,\sigma_{\alpha},\sigma_{\beta}ω​1​​,σ​α​​,σ​β​​,采用从粗到细的寻找策略。

CRF和多尺度的表现

经过DeepLap之后的效果和之前的效果对比:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像目标分割_5 DeepLab V2 V3 V3+

6.5.1 DeepLab V2 6.5.1.1 改变特点 atrous convolution采用ASPP ( atrous spatial pyramid pooling) 多尺度获得更好的分割效果合并深度卷积网络和概率图模型方法,增强对物体边界的定位。基础层由VGG16转为ResNet 和v1不同: 通过多尺度输入处理或者多…

Python导包、模块报错的问题

import报错No module named "xxx"的问题 如何将指定目录作为项目根目录,让项目根目录下的包/模块都可以直接导入?(linux下) Python导入模块时,解释器如何定位模块: 1.当前目录 2.内置模块列表 3…

CC2540 串口0 通道2配置

从图里面可以看出来,串口0有两个通道,一个通道是P02 P03两个GPIO口。 还有一个通道是P14 P15两个GPIO口。 在软件配置的时候,主要是配置的是一个通道相关的寄存器。 7.6.4 USART 0 The SFR register bit PERCFG.U0CFG selects whether to u…

图像目标分割_6 Mask RCNN

6.6.0 背景 目标检测和语义分割的效果在短时间内得到了很大的改善。在很大程度上,这些进步是由强大的基线系统驱动的,例如,分别用于目标检测和语义分割的Fast/Faster R-CNN和全卷积网络(FCN)框架。这些方法在概念上是直观的,提供…

SCI论文写作训练营笔记汇总01_概述+文献检索与管理

1 概述 1.1 适用人群 ①初涉科研, 目前或将来有英文科技论文发表需求的科研工作者 ②正在撰写或准备撰写英文科技论文的科研工作者 1.2 科技论文的基本结构 1.3 科技论文组成部分的写作方法 1.4 阅读文献的重要性 2、文献检索与管理 2.1 如何查找文献参考 2.2 文…

天猫11.11:搜索引擎实时秒级更新(转载)

搜索是很多用户在天猫购物时的第一入口,搜索结果会根据销量、库存、人气对商品进行排序,而商品的显示顺序往往会决定用户的选择,所以保证搜索结果的实时性和准确性非常重要。在电商系统中,特别是在“双十一”这样的高并发场景下&a…

OAD 空中升级

http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/p/69222/172351.aspx#172351第二十三节 OAD空中升级 通过仿真器更新程序或者通过USB更新固件那都是一般人都可以实现的操作,但是要想实现OAD空中升级…

SCI论文写作训练营笔记汇总02_英文科技论文阅读与解析

3、英文科技论文阅读与解析的方法 3.1 科技论文介绍 3.1.1 科技论文的类型 • Research • Review • Theoretical • Methodological • Case study 3.1.2 研究型论文的结构 3.1.3 科技论文的基本结构 3.2 文献阅读 3.2.1 文献选择的原则 3.2.2 文献阅读顺序 3.2.2 文献阅读…

报错curl: (7) Failed to connect to 127.0.0.1 port xxxx: Connection refused

(pyenv install xxx) 报错curl: (7) Failed to connect to 127.0.0.1 port xxxx: Connection refused的解决方法 问题重现截图: 在查看下面的原因和使用解决方法之前,确保自己的pyenv已经安装好了最新的python-build&#xff0c…

SCI论文写作训练营笔记汇总03_科技论文写作(方法篇)

4、科技论文写作——方法篇 4.1 准备工作与概述 4.1.2 杂志编辑评估文章的标准 4.2 图表部分的写作方法 4.2.1 为什么使用图表 4.2.2 如何使用图表 4.2.3 如何选择图or表or文字 4.2.4 图片/表格制作软件 4.2.5 图片的各种指标 4.2.6 图片的分类 4.2.6 图注的使用 4.2.7 表格 …

SCI论文写作训练营笔记汇总04_科技论文写作(技巧篇)

1、语言点 1.1 时态 1.1.1 时态使用的基本原则 1.1.2 在引言部分的时态使用 1.1.3 在“材料与方法”部分的时态使用 1.1.4 在“结果”部分的时态使用 1.1.5 在“讨论”部分的时态使用 1.1.6 总结 1.2 语态 1.2.1 语态-主动/被动 1.2.2 语态-主动/被动的不同点 1.2.2 语态-主…

SCI论文写作训练营笔记汇总05_英文论文投稿流程与常见问题(完)

1 目标期刊的选择 1.1 文章未送审直接被拒稿的常见理由 1.2 目标期刊的选择 1.2.1 学科与影响力 1.2.2 影响因子 1.2.3 审稿平均周期 1.2.4 主编水平 1.2.5 版面费 2 根据期刊要求调整文章 2.1 具体 2.2 期刊的审查重点 2.3 期刊的审查列表 3 其他材料 3.1 稿件作者信息 3.…

动态规划思路和Python解决零钱兑换问题和最大乘积子序列的乘积的问题

动态规划(Dynamic Programming)思路和Python解题示例 动态规划是一种主要用来优化朴素递归的方法,每当输入不同值调用递归函数出现大量重复的(子)输入和调用(返回结果)时,就可以考虑…

【Pytorch神经网络实战案例】06 逻辑回归拟合二维数据

1 逻辑回归与拟合过程 1.1 准备数据-code_01_moons.py(第1部分) import sklearn.datasets import torch import numpy as np import matplotlib.pyplot as plt from LogicNet_fun import LogicNet,plot_losses,predict,plot_decision_boundary# 1.1 准…

将Win10包含中文的用户名改为英文的,同时解决Anaconda navigator无法运行jupyter的问题

Win10用户名包含中文字符导致无法在Anaconda navigator直接运行jupyter的问题 本篇文章内容包含: WIN10如何修改"C:\Users\用户名"中的用户名执行1后,也就是用户名修改为英文名后,在Anaconda navigator启动之前无法启动的jupyter…

linux dd使用记录

dd if/dev/sda of/dev/sdb bs10M Linux下显示dd命令的进度:dd if/dev/zero of/tmp/zero.img bs10M count100000想要查看上面的dd命令的执行进度,可以使用下面几种方法: 比如:每5秒输出dd的进度 方法一:watch -n 5 pkil…

【Pytorch神经网络理论篇】 01 Pytorch快速上手(一)概述+张量

同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深度学习理论篇(2023版)目录地址…

【Pytorch神经网络理论篇】 02 Pytorch快速上手(二)GPU与CPU张量切换+具有随机值的张量+张量的数学运算

同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深度学习理论篇(2023版)目录地址…

解读Android 4.0 Camera原生应用程序的设计思路

解读Android 4.0 Camera原生应用程序的设计思路 一篇很不错的文章: http://my.oschina.net/jerikc/blog/907911. 设置摄像头方向 2. 打开线程与预览线程 3. 设置参数 4. Camera外设按键 5. 自动对焦与触摸对焦 6. 拍照 7. 人脸检测 8. 位置管理 9. 旋转管理 10. 变…

【Pytorch神经网络理论篇】 03 Pytorch快速上手(三)张量的数据操作

1 张量的数据操作 1.1 torch.reshape()实现数据维度变化 import torch a torch.tensor([[1,2],[3,4]]) print(torch.reshape(a,(1,-1))) # 将其转化为只有1行数据的张量,参数-1表示自动计算 # tensor([[1, 2, 3, 4]]) print(a.reshape((1,-1))) # # 将其转化为只有1行数据的…