作者:嫩芽33
出处:http://www.cnblogs.com/nenya33/p/7122701.html
版权:本文版权归作者和博客园共有 
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任

学习了一篇用CNN做光流的paper,简称FlowNet。

1. 论文题目  FlowNet: Learning Optical Flow with Convolutional Networks

2.背景

  • 为什么想到用CNN做光流:最近提出的CNN架构可以做逐像素预测,比如,语义分割和从单图估计深度。所以本文提出end-to-end训练CNNs用于从图像对中预测光流场。
  • 光流和其他任务的区别:光流估计需要精确的逐像素定位,也需要找到两个输入图像的对应。这不仅涉及到学习图像特征表达,也要学习在两个图像的不同位置匹配这些特征表达。所以从这方面来看,光流估计和CNNs的以前应用基本上不一样。

3. 本文提出构建CNNs,以有监督的学习方式解决光流估计任务。提出两种架构,并做了对比实验:

  • 一种是通用的架构
  • 另外一种是包含一个不同图像位置的特征向量关联层。因为不确定用标准的CNN架构能否解决这个问题,就提出了一个有关联层的架构,用来显式地提供匹配功能。这个架构采用end-to-end训练。思想是利用卷积网络学习多级尺度和抽象化的强大特征的能力,然后帮助他基于这些特征找到实际的对应。关联层上面学习如何从这些匹配中来预测流。令人惊讶的是,用这种方式帮助网络并不是 必要的,甚至是原始的网络都能学会以具有竞争力的准确性来预测光流。

4. 已有光流数据集太小,很多没有标注真实值,本文创建了一个新的光流数据集Flying Chairs,用来充分训练CNN。

5. 网络架构

给定足够的有标签数据,CNN 擅长学习输入-输出关系。所以我们采用end-to-end的学习方法预测光流:给定一个包含图像对真实流的数据集,我们训练一个网络直接从图像中预测x-y流场。但是需要设计合适的架构来实现这个目的。

一个简单的选择是把输入图像堆叠起来,把他们通过一个相当普通网络,让网络自己决定怎样处理图像对从而抽取出运动信息,如图2(top)所示,这个只有卷积组成的架构称为“FlowNetSimple”

原则上,如果这个网络足够大,就能学习预测光流,然而,我们无法保证像SGD那样的局部梯度优化能让网络达到全局最优点,因此,手工设计一个不那么通用、但能用给定数据和优化技巧得到好的性能的架构是有好处的。

一个直接的想法就是:针对两个图像,创建两个独立但相同的处理流,然后在后续进程中把他们结合到一起,如图2(bottom)。在这个架构中,网络需要要先分别产生两个图像的有意义的表达,然后在更高级别把他们结合,这类似于标准的匹配方法中一个先从两个图像的patches抽取特征,然后结合这些特征向量。然而,得到两个图像的特征表达后,网络怎么找二者的对应呢?

在匹配进程,我们在网络中引入了一个“correlation layer”(关联层),在两个特征图中做乘法patch比较,包含这个层的网络结构在图2(bottom)中。给定两个多通道的特征图f1、f2,w、h和c是他们的宽度、高度和通道数,我们的关联层就是让网络比较f1中的每个patch和f2中的每个patch。

现在我们只考虑两个patch的单独比较。第一个图的以x1为中心的patch和第二个图的以x2位中心的patch之间的关联就定义为:

方形patch的尺寸为K=2k+1  (k=0)。公式1等同于神经网络中的一个卷积,但不是用滤波器卷积数据,而是用数据卷积数据,所以,没有可训练的权重。

计算c(x1,x2)涉及到cKK次乘法,比较所有的patch组合涉及到wwhh次计算,所以很难处理前向后向过程。为了计算,我们限制最大位移d用于比较,而且在两个特征图中也引入了步长stride。这样通过限制x2的范围,只在D=2d+1 (d=20)的邻域中计算关联c(x1,x2)。我们用步长s1(1)和s2(2),来全局quantize x1,在以x1为中心的邻域内quantize x2。

理论上,关联的结果是4D的:对两个2D位置的每个组合,我们得到一个关联值,即两个分别包含截取patches值的向量的内积。实际上,我们把相对位置用通道表示,这就意味着我们得到了w*h*D*D大小的输出。在反向过程中,我们求关于每个对应底层blob的导数。

6. Refinement

Pooling会导致分辨率减少,为了提供密集的像素预测,我们需要一种方法来refine  pool后的coarse表达。我们refine的方法如图3所示,主要的是upconvolutional 上卷积层,由unpooling(与pooling相反,扩展特征图)和卷积组成。为了做refinement,我们在特征图上用上卷积,然后把它和网络的收缩部分’contractive’ 得到的对应特征图、以及一个上采样的coarses流预测连接起来。这样就能既保留coarser特征图的高层信息,又能保留低层特征图的好的局部信息。每个步骤两次增加分辨率,我们重复这个过程4次,得到预测的流,此时的特征图还是原图的四分之一。

我们发现,与对全图像分辨率做计算量更少的双线性上采样相比,从这个分辨率上做更多的refinement并不能显著提升结果,这个双线性上采样的结果就是网络的最终流预测。

我们替换双线性上采样,采用没有匹配项的变分方法:我们在4次下采样分辨率后开始,迭代20次做coarse-to-fine,把流场变为全分辨率。最后,在全图像分辨率上又做了5次迭代。然后把平滑系数换为,用文献【26】的方法计算图像边界和对应的检测边界,b(x,y)是各自尺度和像素之间的重采样的thin边界的strength。这种放大方法比简单的双线性上采样计算量大,但是增加了变分方法的优点,得到平滑和亚像素准确的流场。在下文中,用变分法refine的结果加后缀+v。变分结果见图4

7. 训练的参数设置

  • k=0  d=20  s1=1  s2=2
  • loss: endpoint error (EPE) ,是光流估计中标准的error measure,是预测光流向量与真实光流向量的欧氏距离在所有像素上的均值。
  • 优化方法:Adam ,无需momentum就能比SGD快速收敛。固定了一些参数: 
  • mini-batches :8
  • learning rate:开始 λ = 1e-4,在第300k次迭代后,每100k次迭代除以2。在FlowNetCorr中λ = 1e-4 会出现梯度爆炸,从较小的学习率λ = 1e-6开始, 在10k次迭代后慢慢增加
    达到 λ = 1e-4 ,然后再按照刚刚说的减少。
  • 发现测试过程中扩大输入图像能提升性能,尽管最优尺度取决于数据集,我们在所有的任务的每个网络固定了尺度,FlowNetS 没做扩大,FlowNetC 选择1:25的参数

FlowNet: Learning Optical Flow with Convolutional Networks的更多相关文章

  1. Paper | SkipNet: Learning Dynamic Routing in Convolutional Networks

    目录 1. 概括 2. 相关工作 3. 方法细节 门限模块的结构 训练方法 4. 总结 作者对residual network进行了改进:加入了gating network,基于上一层的激活值,得到一 ...

  2. Optical Flow 发展历程 (1)

    Optical flow estimation Traditional Method Variational approach TVL-1 [1] Deep Method Supervised Flo ...

  3. 论文翻译——Character-level Convolutional Networks for Text Classification

    论文地址 Abstract Open-text semantic parsers are designed to interpret any statement in natural language ...

  4. Deep Learning 33:读论文“Densely Connected Convolutional Networks”-------DenseNet 简单理解

    一.读前说明 1.论文"Densely Connected Convolutional Networks"是现在为止效果最好的CNN架构,比Resnet还好,有必要学习一下它为什么 ...

  5. How to do Deep Learning on Graphs with Graph Convolutional Networks

    翻译: How to do Deep Learning on Graphs with Graph Convolutional Networks 什么是图卷积网络 图卷积网络是一个在图上进行操作的神经网 ...

  6. 模型压缩-Learning Efficient Convolutional Networks through Network Slimming

    Zhuang Liu主页:https://liuzhuang13.github.io/ Learning Efficient Convolutional Networks through Networ ...

  7. [论文理解] Learning Efficient Convolutional Networks through Network Slimming

    Learning Efficient Convolutional Networks through Network Slimming 简介 这是我看的第一篇模型压缩方面的论文,应该也算比较出名的一篇吧 ...

  8. 【ML】Two-Stream Convolutional Networks for Action Recognition in Videos

    Two-Stream Convolutional Networks for Action Recognition in Videos & Towards Good Practices for ...

  9. 论文笔记之:Optical Flow Estimation using a Spatial Pyramid Network

    Optical Flow Estimation using a Spatial Pyramid Network   spynet  本文将经典的 spatial-pyramid formulation ...

随机推荐

  1. cocos2dx笔记1:概述

    1.核心的类和功能 CCDirector gameLoop,实现场景绘制.多个场景之间切换控制.控制游戏的停止,暂停,等生命周期. CCScene 场景类,每一个场景能够理解为一个游戏镜头.状态 CC ...

  2. HAProxy+Keepalived构建高可用负载均衡

    http://www.linuxidc.com/Linux/2012-03/55880.htm web1 IP 192.168.0.47 web2 IP 192.168.0.48 haproxy_ma ...

  3. [Usaco2015 DEC] Counting Haybales

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4392 [算法] 线段树 时间复杂度 : O(MlogN) [代码] #include ...

  4. Linux IO多路复用之epoll网络编程(含源码)

    前言 本章节是用基本的Linux基本函数加上epoll调用编写一个完整的服务器和客户端例子,可在Linux上运行,客户端和服务端的功能如下: 客户端从标准输入读入一行,发送到服务端 服务端从网络读取一 ...

  5. Python基础第九天

    一.内容

  6. 【转】zip() 函数

    描述 zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表. 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符 ...

  7. bzoj1513

    二维线段树 听说二维线段树不能下传标记? 就是裸的二维线段树,由于每次高度只能增加,所以我们就可以标记永久化 每个线段树里有两个数组,mx和mark,每次修改路径上所有mx都要修改,mark是区间的精 ...

  8. UIBC 小註解(转载)

    转自:http://www.cash.idv.tw/wordpress/?p=7942 UIBC 是指 User Input Back Channel, 用在 WIFI Display 的情境之下. ...

  9. 使用Docker Compose编排微服务

    一般微服务架构会包含若干个微服务,而每个微服务可以有多个实例,如果每个微服务都有手动启停,那么效率就很低.维护量比较大. 所以我们可以使用Docker Compose来轻松.高效地管理容器. 一.安装 ...

  10. [CF997E] Good SubSegment

    Description Transmission Gate 给你一个长度为n的排列P,定义一段子区间是好的,当且仅当这个子区间内的值构成了连续的一段.例如对于排列\(\{1,3,2\}\),\([1, ...