https://github.com/lmb-freiburg/flownet2
https://v.qq.com/x/page/c0503q9j8hf.html
https://github.com/lmb-freiburg/flownet2
http://blog.csdn.net/hysteric314/article/details/50529804
http://blog.csdn.net/bea_tree/article/details/67049373
这周学习了一篇文章,文章的名字叫做FlowNet: Learning Optical Flow with Convolutional Networks。 这篇文章已经发布在IEEE International Conference on Computer Vision (ICCV), 2015。
一般的卷积神经网络都被用来进行分类,最近的一些神经网络结构可以用于对每个像素点进行预测。 这篇文章主要介绍的就是他们把一般的卷积神经网络去掉全连接层,改成两个网络,一种是比较一般普通的全是卷积层的神经网络,另一个除了卷积层之外还包括一个关联层。并且对这两种网络分别进行点对点的训练,使网络能从一对图片中预测光流场,每秒达到5到10帧率,并且准确率也达到了业界标准。
文章下载地址:http://lmb.informatik.uni-freiburg.de/Publications/2015/DFIB15/ 实现代码地址:http://lmb.informatik.uni-freiburg.de/resources/binaries/ 该作者的其他文章:http://lmb.informatik.uni-freiburg.de/research/convnets/ 相关视频资料:https://www.youtube.com/channel/UC351jap1wiOJvKXr3mhODlg
光流原理网上有很多,简单来说, 是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。
光流实现的假设前提:
1.相邻帧之间的亮度恒定。
2.相邻视频帧的取帧时间连续,或者,相邻帧之间物体的运动比较“微小”。
3.保持空间一致性;即,同一子图像的像素点具有相同的运动。
因为光流的预测涉及到每个像素点的精确的位置信息,这不仅涉及到图像的特征,还涉及到两个图片之间对应像素点的联系,所以用于光流预测的神经网络与之前的神经网络不同。
他们的两个神经网络大体的思路就是这样。 首先他们有一个收缩部分,主要由卷积层组成,用于深度的提取两个图片的一些特征。 但是pooling会使图片的分辨率降低,为了提供一个密集的光流预测,他们增加了一个扩大层,能智能的把光流恢复到高像素。 他们用back progation 对这整个网络进行训练。
一个简单的实现方法就是把输入的图片对叠加在一起,让他们通过一个比较普通的网络结构,让这个网络来决定如何从这一图片对中提取出光流信息, 这一只有卷积层组成的网络叫做flownetsimple。
这种卷积网络有九个卷积层,其中的六个stride为2, 每一层后面还有一个非线性的relu操作,这一网络没有全连接层,所以这个网络不能够把任意大小的图片作为输入,卷积filter随着卷积的深入递减,第一个7*7,接下来两个5*5,之后是3*3,featuremaps因为stride是2每层递增两倍。
另一个方式 网络先独立的提取俩图片的特征,再在高层次中把这两特征混合在一起。 这与正常的匹配的方法一致,先提取两个图片的特征,再对这些特征进行匹配,这个网络叫做flownetcorr。
如果展开来看他的关联层:
这一步的公式如下:
这一公式相当与神经网络的一步卷积层,但普通的卷积是与filter进行卷积,这个是两个数据进行卷积,所以它没有可以训练的权重。
这一公式有ck2的运算, 为了计算速度的原因,我们限制最大的比较位移值。
扩大部分主要是由上卷基层组成,上卷基层由unpooling(扩大featuremap,与pooling的步骤相反)和一个卷积组成,我们对featuremaps使用upconvolution,并且把它和收缩部分对应的feature map(灰色箭头)以及一个上采样的的光流预测(红色)联系起来。每一步提升两倍的分辨率,重复四次,预测出来的光流的分辨率依然比输入图片的分辨率要小四倍。
这一部的意义就是: This way we preserve both the high-level information passed from coarser feature maps and fine local information provided in lower layer feature maps.
文章中说在这个分辨率时再接着进行双线性上采样的refinement已经没有显著的提高。 所以采用优化方式:the variational approach 。 记为 +v,这一层需要更高的计算量,但是增加了流畅性,和subpixel-accurate flow filed。
使用了四种数据集,前三种是目前比较常见的训练光流所用的数据集,flying chairs是文章自己创建的数据集。 这些数据集的相关资料视频在google和youtube上都可以查到,其中:
Middlebury数据集:用于训练的图片对只有8对,从图片对中提取出的,用于训练光流的ground truth用四种不同的技术生成,位移很小,通常小于10个像素。
Kitti数据集:有194个用于训练的图片对,但只有一种特殊的动作类型(类似行车记录仪?),并且位移很大,视频使用一个摄像头和ground truth由3D激光扫描器得出,远距离的物体,如天空没法被捕捉,导致他的光溜ground truth比较稀疏。
Mpi sintel数据集:是从人工生成的动画sintel中提取训练需要的光流ground truth,是目前最大的数据集,每一个版本都包含1041个可一用来训练的图片对,提供的gt十分密集,大幅度,小幅度的运动都包含。 sintel数据集包括两种版本: sintel final:包括运动模糊和一些环境氛围特效,如雾等。 sintel clean:没有上述final的特效。
现在的这些数据集在物体和运动特征上都不相同,为了增加正确率,我们针不同的数据集对网络进行优化,相关的优化方法就是fine-tunning,记为+ft。
用于训练大规模的cnns,sintel的dataset依然不够大,所以作者他们自己弄出来一个flying chairs数据集。
这一数据集背景是来自flickr的标签为‘city’,‘landscape’,‘mountain’的1024*768像素的图片,剪切成四分之一,用512*384作为背景。 前景是可以得到的可以生成的3d椅子模型,从这些模型中去掉一些相似的椅子模型,留下809种椅子,每一种有62个视角。 为了产生运动信息,产生第一张图片的时候会随机产生一个位移变量,与背景图片与椅子位移相关, 再通过这种位移变量产生第二个图片和光流。 每一个图像对的这些变量,包括,椅子的类型,数量,大小,和产生的位置都是随机的,位移向量也是随机的产生的。
尽管flying-chair数据集已经很大,但是为了避免过拟合,而采用了data Augmentation的方法,让数据扩大,样式变多,不单调,防止分类变得严格。
数据增多的方法包括给原图像位移,反转,方法,加高斯噪音,改变亮度,对比对,gamma值和,颜色,这一操作都用gpu生成。 效果如下:
训练cnn使用是修改版的caffe 框架,用adam作为优化方式,每一个像素都是训练样本。
三种光流预测方法在飞椅子数据集上预测的表现
其中:EPE是一种对光流预测错误率的一种评估方式。 指所有像素点的gound truth和预测出来的光流之间差别距离(欧氏距离)的平均值。 可以看见Epicflow 这个很好的预测方法,但在一些大位移的情况下会找不到光流,而两种flownet好于它。
三种光流预测方法使用sinte数据集测试的光流预测效果
尽管flownet的正确率很烂,但是他能保存留下更多的细节信息(文章里说的)。
Sintel Clean数据集中: flownetc比flownets要好。 Sintel Final数据集中:相正好反,flownets比flownetc要好。可以看见在fls+ft+v时候的错误率甚至可与deepflow比肩。
Flyingchair数据集中: Flownet大获全胜,其中c要比s好很多: 也仅仅只有在这一个数据集中,一些改善网络的方法,会使整个准确率下降,显然这个网络已经要比这些改善方式好很多 预示着,在训练集上更真实一些,flownet会比其他数据集表现的更好。
Kitti数据集中:Flownet很一般,c在位移比较大的情况下比s差一点。
Timming数据:文章中写到,一些方法只有在cpu上的runtimes运行库,flownet只在gpu上执行,NVIDIA GTX Titan GPU。
仅仅看数据会感觉flownetcorr虽然加了关联层,但与s对比并没有太大的改善,因为flownetsimple的正确率也已经很不错了,flownetcorr并没有太大的优势。 但的是flownetcorr在flyingchair和sintel clean数据集的表现要好于flownetsimple,注意到sintel clean是没有运动blur和fog特效等的,和flyingchair数据集比较类似,这意味着flownetcorr网络能更好的学习训练数据集,更加过拟合over-fitting(文章原话)。 所以如果使用更好的训练数据集,flownetcorr网络会更有优势。
故事背景 那是15年的春天,本文的作者和其他几个人,使用CNN做光流估计,于是FlowNet成了第一个用CNN做光流的模型,当时的结果还不足以和传统结果相匹配。2016年冬天,作者和一群小伙伴又基于Flow Net的工作进行了改进,效果得到了提升,可以与传统方法相匹敌。 15年的思想主要是把两张用来估计光流信息的图片输入网络,经过训练使网络学到光流信息,后面会讲到当时用到的两个网络。 作者 Eddy Ilg, Nikolaus Mayer, Tonmoy Saikia, Margret Keuper, Alexey Dosovitskiy, Thomas Brox 项目地址 http://lmb.informatik.uni-freiburg.de/Publications/2016/IMKDB16/ FlowNet1.0 地址 http://lmb.informatik.uni-freiburg.de/resources/binaries/
本文依然是用CNN来做光流估计,提出了一种训练方法,引入了Stack的结构,对小位移单独处理,提高了网络的效果。好评!
到了大家最喜欢看网络结构的时候了 这一节主要介绍在第一版FlowNet中的两个网络结构及几个数据库
第一个模型:FlowNetS 主要特色: - 输入由原来的一张图片变为了两张,通道数由3变为6 - 多层feature引入最后的Refinement模块,Refinement的具体结构将在后面涉及
第二个模型:FlowNetC 主要特色: - 图片不再直接放到通道,而是先分别通过一个三层网络 然后进入一个名叫 correlation layer的层
该层的主要作用是比较来自两张图片的feature map的关系,文章用了卷积的形式,还是比较巧妙的,具体方程如下
C代表correlation,f1和f2分别代表两个feature map, k代表要比较的区域,x1,x2分别代表两个feature map上的点。具体的计算流程还是看原文本,这里只要知道这个层的主要作用是计算两个层的关系就可以了。
这里就是不断的上采然后 前面的feature map的reuse,这里还加入了预测得到的flow。具体细节同样请看第一版的FlowNet
总的来说,FlowNetS的效果不如FlowNetC的效果
一群在各种背景下会飞的椅子,确切的说是22872对椅子
一堆会飞的东西 但是更接近于现实,22k对
一共1041对
本文的三个训练策略
使用不同的训练策略和不同的数据集顺序得到的结果:
这里可以看出,先使用Chairs这样简单的样本然后再使用Things3D,可以得到比一起mixed训练更好的结果。
结构如下:
- 首先,第一个网络的输入是两幅图片 - 其次,在之后的网络含有warp layer时 - 输入经过warp layer及双线性差值之后的 img2及其I1的差值(brightness error)及img1,img2,flow(共5种) - 所谓warplayer 就是将原图根据得到的flow的值进行位置变化 - 再次,当没有warp layer时 输入 img1 img2 及flow(3种)
这部分只用FlowNetS一种网络,具体实验设计如下表:
实验观察: 1. 不加warp时,叠加网络,在Chairs数据集上错误率下降,Sintel上上升,文章认为,这是由于过拟合造成的(训练是在Chairs上训练的) 2. Warp的效果很明显 3. 在Net1上加辅助loss有利 4. 在Sintel数据集上的最优结果来自fixed net1+training net2+warp
文章在这里除了引入FlowNetS,FlowNetC,还引入了每层只有3/8个通道的FlowNetc和FlowNets以小写的s和c表示,3/8的来源:
这小节做的试验训练方法都是用Chairs->Things3D的方法,且网络按照one-by-one的设置训练 试验设置及结果:
CSS表示FlowNetC+2个FlowNetS,其他以此类推,由此可见,两个小网络虽然在一起参数更少但是效果好于一个大网络
上面使用的Chairs 及Things3D数据集相对真实场景的变动较大,所以训练的效果在实际应用时并不太好,所以作者就重新做了一个数据集,叫作ChairsSDHom, 使用FlowNet2-CSS在ChairsSDHom及Sintel上finetune 得到FlowNet-Css-ft-sd, finetune时对small displacement的loss权重加强,效果在微变物体上表现变好,变化大的物体的效果也还不错,但是仍然还有噪声。 于是作者就设计了网络结构图中右下角的FlowNet-SD。 主要改进: - 将FlowNetS的第一层的stride=2变为1 - 将7x7和5x5变为几个3x3 - 在上采样前加了卷积层用了平滑噪声
最后的Fusion用了融合前面FlowNetCSS-ft-sd及FlowNet-SD的结果,结构如下:
随便看看就可以了