76. 三维重建11-立体匹配7,解析合成数据集和工具

2022-11-30 16:00:18 浏览数 (1)

一. 背景

随着越来越多的领域引入了深度学习作为解决工具,大量的数据显然也就变得非常关键了。然而在相当长的时间里,立体匹配这个领域都缺乏大量的数据可以使用。我在文章74. 三维重建9-立体匹配5,解析MiddleBurry立体匹配数据集和75. 三维重建10-立体匹配6,解析KITTI立体匹配数据集介绍的两个著名的数据集MiddleBurry和KITTI都不是为了训练神经网络而制作——它们本身仅用于客观的衡量比较算法的质量。所以它们所包含的图像组数量都很有限。比如,MiddleBurry 2014年数据集就只有20组数据可用于训练算法。KITTI 2012, 194组训练图像, KITTI 2015, 200组训练图像。同时,这些数据集的场景都很有限,MiddleBurry的场景是在受控光照下实验场景。KITTI则主要集中在自动驾驶的公路场景,且其Ground Truth深度只占图像的50%左右。很显然,这样的数据集是不足以用于训练深度学习的网络模型的。

实际上,在很早期人们就在探索一个问题:可否通过数据合成,来生成大量双目数据呢?有了CG技术后,这似乎成了一件简单的事情。只要我们已知物体的3D模型,就可以在两个虚拟相机平面上投影模型,生成左图和右图。再由于可以知道3D模型和相机光心间的距离(深度),所以比较容易根据深度和视差的关系,得到视差图。

然而,早期因为数据合成的技术还不成熟,3D模型构建也很不容易,所以合成的数据非常简单、数据量很少。而且其中还包含很多和真实物理成像不一致的错误,这就导致无法将这些数据实际用于算法的进一步研究中。那么,有没有办法采用数据合成方式得到我们想要的有用的数据集呢?我今天就来介绍这方面的研究成果。

本文同步发表在我的微信公众号和知乎专栏“计算摄影学”,欢迎扫码关注,转载请注明作者和来源,感兴趣就顺手三连吧

二. 由开源电影到科研数据集

技术永远是在不断前进的,早在2006年之前Blender基金会(Blender是著名的开源、免费3D制作工具)开启了一项开源电影项目,叫做Durian Open Source Movie Project(榴莲开源电影项目)。2006年该项目推出了第一部开源电影Elephants Dream,其中所有的内容都由Blender渲染而来。2008年则是第二部开源电影Big Buck Bunny,据说观看人次达到了百万,成为了开源电影史上的传奇。而今天我们要讲述的主角Sintel则是Blender基金会推出的第三部开源电影,它讲述了一个叫做Sintel的姑娘和她的幼龙朋友之间的故事。

Sintel制作过程中有很多有趣的故事,你可以从Blender Studio中查阅得到,你还可以在这里看到完整的电影:

https://studio.blender.org/films/sintel/?asset=1191studio.blender.org/films/sintel/?asset=1191

而对科学界而言最有意义的是,制作团队把电影制作所用的所有原始资料都开源了,这包括很重要的3D图形资源——这意味着研究者可以使用这些信息来重新渲染生成自己的数据集。而在艺术家的努力下,这部电影的场景非常自然、逼真,使得它的场景图像非常适合来做包括光流、立体匹配等在内的研究。

于是,2012年左右,美国华盛顿大学、佐治亚理工学院以及德国马克斯·普朗克智能系统研究所的一群学者利用Sintel的这些资源,制作了MPI Sintel数据集。由于原始电影资源特别丰富,有18000帧,所以作者们选择了其中很小一部分,包括35个场景中的1628帧——你看,尽管只是筛选了很小一部分,光从数量上讲就已经远远超过了KITTI和MiddleBurry数据集了。

一开始,数据集中只包含了光流信息,如下图所示。这里,图像帧是通过光线追踪方式得到的。由于任何一个场景点P在不同时刻的位置都是已知的,所以很容易跟踪它的投影点p在相邻帧的位置。将相邻帧的位置做差,就可以得到光流场。

后来,他们利用同样的资源构建了用于立体匹配研究的视差数据集,每组图像都包括了左图、右图、视差图、以及遮挡掩模。下面是几个例图:

正如前所说,整个MPI Sintel数据集包含了35个场景的1628帧。其中每个场景包含的帧数在20帧到50帧之间,帧率为24fps, 分辨率高达1024x436。包含时域连续的图像帧,这也是这个数据集非常好的一点:这意味着我们可以研究立体匹配算法在时域上的连续性。事实上,大多数立体匹配算法都缺乏时域平滑性,因为它们都是在离散的数据集上构建和验证的(包括MiddleBurry、KITTI),这意味着在连续帧上验证时经常会出现同一个场景的结果在时域上不连续,闪烁或抖动的现象。而MPI Sintel数据集使得验证算法的时域平滑性成为了可能。而且,这个数据集还包含了很多之前的数据集没有包含的视效,例如大气效果、目标运动和散焦模糊。场景跨越了各种各样的环境、角色和动作类型。可以在下面这个链接下载MPI Sintel 双目数据集: http://sintel.is.tue.mpg.de/stereo

三. MPI Sintel 数据集的制作经验

作者们在两篇文章中描述了MPI Sintel数据集的细节,以及制作过程中的经验总结:

这里面,作者提到,产生高质量的数据集有赖于两方面的信息,首先是Sintel的原始产品数据,它们描述了场景的3D几何信息、外观、以及场景的运动。然后是渲染的技术,它将产品数据转换为实际的视频帧。这两部分都需要根据数据生成的需要做相应的修改和适配。我挑重点的信息介绍一下。

3.1 对Sintel产品数据做的修改

原始的Sintel电影是为了艺术所诞生,因此它的最终渲染结果是为了艺术审美,而不是为了科学研究。这使得原始的结果不一定适应光流或立体匹配的研究,其中主要有两方面的问题:因光流场或视差图本身的限制而导致的问题, 以及因原始数据中包含的错误导致的问题。

因光流场或视差图本身的限制而导致的问题,是指光流或视差图无法表示半透明物体的光流场或视差。因为在光流场和视差图上,一个像素只能表示1个方向的运动或视差。但如果场景中有半透明的遮挡关系、或是1个像素包含了多个微小物体(例如头发)的投影、甚至因为要实现抗锯齿而使得1个像素包含了多个原始场景点的信息时,映射到同一个像素点的视差值或光流场都不再准确,它们只能表示某种加权平均结果。

比如下面这个原始场景,头发有大量的区域是前景背景融合而成的。从视效上讲当然很不错,但右边的光流场却可以看出大量头发的区域的光流场无法准确表达了。

作者们的解决方案也很粗暴直接,取消所有半透明的场景区域(比如边缘羽化或是玻璃),同时也禁用反锯齿特效。同时每根头发至少渲染为2个像素尺寸,避免单一光流场或视差像素需要表示多根头发丝的光流场或视差。如下图所示,从视效上看来不如原始渲染结果,但光流图中我们看到更多的头发部分表示了前景的运动。

因原始数据中包含的错误导致的问题

Sintel原始资源中还包含很多因为Blender软件或是艺术创作带来的问题,这些问题在观看电影是很难感知到,但却使得视频帧不符合物理规律,导致对应的光流场或视差图有错误。导致这些问题的因素有运动模糊、位移贴图导致的纹理错误、动画错误、多线程导致的图像内部各区域不一致现象、光晕特效等等。各种问题作者都做了针对性的处理。

3.2 对渲染系统所做的修改

与原始Sintel渲染过程一样,作者也是采用Blender来渲染场景和光流/视差图。这个过程使用了Blender的光线追踪引擎,以及一系列高级的计算机图形学技术,比如亚表面散射、全局光照、镜面反射着色器等等。我们需要记住的是尽管这些技术提供了很逼真的感知质量,但依然只是对真实世界的模拟。

这个过程中需要处理一些典型的问题。作者专门举了一个例子,如图所示。Blender在渲染管线中会计算光流,并且利用这个光流信息来制作运动模糊的效果。那么这个光流信息是否就可以作为我们数据集的一部分呢?

作者给出了否定的回答。这是因为, 当三维空间中的三角形投影到2D图像时,顶点由于有真实的3D/2D坐标,所以顶点的光流场肯定是没问题的。但是对于三角形内部的像素点,Blender却只是在2D图像上插值计算光流场,这就导致了误差。作者对Blender的渲染管线略作修改,在3D空间中进行插值来解决这个问题,使得最终的光流场更加的准确。

例图如下,左边是原始的2D插值得到的光流图,右边则是在3D空间插值后再投影得到的光流图,我们仔细看就会观察到两者的不同,右边要更加平滑一些。

作者还修改Blender,从而输出了3个不同阶段的渲染图像。首先是所谓的Albedo级,此时采用了平面平坦、无阴影的表面,且它具有时域恒定的反照率。然后是所谓的Clean级,包括平滑着色和镜面反射的照明来增加真实感。最后则是Final级,具有所有效果的完全渲染,包括运动模糊、景深模糊以及大气效果。

这有什么用处?不同阶段的图像给予算法不同的挑战难度,比如Albedo阶段我们可以用于测试算法的基础匹配性能,而Final级则验证了算法是否可以在极端苛刻的条件下也稳定的输出结果。

总而言之,MPI Sintel数据集的作者记录的经验对于之后很多用Blender自制数据集的团队来说都是非常宝贵的,当然其中Sintel项目留下来的开源产品资料则是重中之重。如果你也想自己试试渲染过程,现在可以登录Blender Studio,在这个链接下载到所有资料。注意Blender Studio现在登录是收费的,如果只是下载资料,你可以只付一个月的费用14.9欧元,其实也就一百多块钱,如果是连续包月就只需要9.9欧元。

这里登录Blender Studio后即可解锁下载资料

四. 更多合成数据集

MPI Sintel数据集的成功制作,加上资料的开放,引发了更多团队开始用Blender制作光流或视差数据集。其中使用比较多的有德国弗莱堡大学、慕尼黑工业大学的几位学者为了研究立体匹配、光流、场景流而制作的大型数据集。相关信息发布在下面这篇文章中

数据集可以从下面这个链接下载:

https://lmb.informatik.uni-freiburg.de/resources/datasets/SceneFlowDatasets.en.htmllmb.informatik.uni-freiburg.de/resources/datasets/SceneFlowDatasets.en.html

这个数据集量非常大,包括了35000对立体帧,而其Ground Truth信息包括了光流场、视差图,以及视差变换图,还有其他如目标分割等信息。要知道我们刚刚说的MPI Sintel总共只有1628帧数据哦

这个数据集也是用Blender渲染得到的,除了每一时刻左右视图的图像,还提供了光流图、视差图、以及相邻时刻之间光流/视差变化。另外由于每个场景由多个物体模型组成,因此很容易将不同场景物体渲染为不同的索引,从而得到场景的分割掩码图。使得这个数据集还可以用于研究目标分割算法。另外,作者还提供了虚拟相机的内外参数,用于SfM等研究。与MPI Sintel一样,也提供了clean级和final级两个阶段的图像,为算法提供不同难度的挑战。

这个数据集主要由三部分组成。第一部分叫做FlyingThings3D,包含了25000对图像帧。作者从斯坦福大学的ShapeNet数据集中获得了35927个3D模型,然后从里面随机抽取一小部分,贴上随机的纹理,然后让相机和这些模型在场景中沿着设定好的路径移动。这样就形成了下面图中看起来比较杂乱的场景——虽然杂乱,但对算法来说却是有意义、可用于研究的。

第二部分很像MPI Sintel数据集,是从一个Blender渲染的开源电影Monkaa中获取原始产品数据,然后重新渲染而成。Monkaa是一个大约6分钟的短片,讲的是一只蓝色皮毛、粉红色脸的猴子的故事,画风很儿童。这里选择了8个场景共8591帧,在原始场景基础上稍加修改渲染而成。

第三部分驾驶数据集则是为了模仿KITTI数据集,所以构建的是驾驶场景。从前面所说的3D模型集中选择了汽车模型,同时又从一些3D模型库中获取了树的模型,并合成渲染而成。下面是渲染场景和KITTI数据集的对比。这里共选用了4392帧进入数据集。

总之,我们看到作者创建了一个35000帧的大型数据集。它可以用于研究立体匹配、单目深度,以及光流、场景流的生成问题,尤其特别适用于训练大型神经网络模型。在同一篇文章中,作者还专门训练了一个模型DispNetCorr1D,来验证效果。从下图中我们看到,这个模型的效果确实超越了当时的SOTA算法MC-CNN,并且比传统算法SGM要好太多。可见有了大型数据集后,我们马上就可以将某些问题的研究推进到以前难以企及的地步。

五. 更高级的数据集生成工具

我们现在看到,计算机图形学的发展可以和计算机视觉的发展相辅相成。前者可以为后者提供高质量的数据集。

当然后者也在促进前者的发展,比较典型的例子就是计算机视觉中的超分辨率算法和去噪算法现在已经应用到了计算机图形学的渲染过程中,这个话题我们以后再聊。总之,你现在可能会疑惑:难道我就想搞点数据,还得去把Blender学一遍吗?

现在我简单提一下两个更加强大的工具,它们是构建在Unreal Engine上的,能够自动的渲染场景,生成场景的深度图、分割图、以及左右视图。你根本不需要太多Unreal Engine的应用开发经验,就把这两个工具当普通软件使用即可。

第一个工具叫做AirSim,由微软推出,链接在这里:https://microsoft.github.io/AirSim/#code-of-conduct。它能够生成无人机视角和公路驾驶视角的两类数据。下面是它的介绍视频:

http://mpvideo.qpic.cn/0bc32uaakaaad4abjovkzbrfbvodaxkqabia.f10002.mp4?dis_k=fac93507d71a9354acf334baa2878dcd&dis_t=1669794613&vid=wxv_2444785500394700802&format_id=10002&support_redirect=0&mmversion=false

无人机视角

http://mpvideo.qpic.cn/0bc33eaakaaaeiabjlnk3rrfbwodaxmqabia.f10002.mp4?dis_k=9ef191991540b444dc36e65f84b33e89&dis_t=1669794613&vid=wxv_2444786323753353216&format_id=10002&support_redirect=0&mmversion=false

公路驾驶视角

最有趣的是,你可以在AirSim的世界里面自己开车或者开无人机游荡,渲染出自己想要的场景。而控制方式可以像玩游戏一样,用RC遥控器或游戏方向盘:

你还可以通过编程去控制,AirSim专门提供了一个"计算机视觉模式",在这个模式下可以通过API控制渲染,生成特殊的数据集。

甚至还可以调整天气参数,生成不同的天气特效

如果你觉得第一个工具已经很惊艳了,那么我现在说的第二个工具就简直让人叹为观止!这个工具叫做Carla(https://carla.org/),是用于自动驾驶研究的开源工具。它也是基于Unreal Engine 4渲染的,但能够提供非常非常逼真的场景:

它很容易用于渲染场景的彩色视图、深度图以及分割图,我们可以通过下图看到效果非常自然逼真:

我再截取一点宣传片的片段给你看看,你就能感受到这个数据集生成工具的强大之处了。

先看看高仿真的自动驾驶场景:http://mpvideo.qpic.cn/0bc36qaakaaayyabpevk4brfb5gdax2aabia.f10002.mp4?dis_k=321b98069fa3672f5b33b00f32ec528a&dis_t=1669794613&vid=wxv_2444787255174053888&format_id=10002&support_redirect=0&mmversion=false

再来看看单个或多个行人:http://mpvideo.qpic.cn/0bc3tuaamaaa7eabibvkwnrfbhoda2oqabqa.f10002.mp4?dis_k=33e0101f03f5b863995d1f925a40cd64&dis_t=1669794613&vid=wxv_2444788091249836033&format_id=10002&support_redirect=0&mmversion=false

还有各种复杂的天气效果http://mpvideo.qpic.cn/0bc3zaaakaaaieabodnkzbrfbsgdaxeaabia.f10002.mp4?dis_k=40e1cbfd3dd8370de26bfed3551ae6b9&dis_t=1669794613&vid=wxv_2444788715597152256&format_id=10002&support_redirect=0&mmversion=false

看到这里,有没有心动啊,这两个工具不需要你学太多Blender/Unreal Engine的知识,只需要当成普通的软件使用,就可以很容易生成你自己的数据集了。当然,生成数据后进行必要的清洗是免不了的。

六. 总结

对于现代的立体匹配的研究来说,大量高质量的数据非常关键。以前大家经常采用的MiddleBurry、KITTI数据集,已经不足以用于训练高质量的立体匹配模型了。所以现在大家通常用这些经典数据集来验证算法的优劣,但训练算法却依赖于高质量的私有或公有的数据集。

今天我从MPI Sintel开始,给各位介绍了利用计算机图形学的工具渲染的高质量数据集。然后又介绍了两个让我深受震撼的工具AirSim及Carla。 我越来越感到,计算机图形学、计算机视觉、计算摄影学几个学科在相互影响,相互促进。

对于我目前撰写的一系列跟立体匹配相关的文章而言,我觉得关于数据集和评价方法相关的信息已经介绍的足够了。接下来,我会介绍几个我认为非常值得学习的立体匹配算法。虽然立体匹配算法有很多,但学习了我说的几个算法后,已经足以让你了解全貌,并能自己进行进一步的研究和魔改出适合自己感兴趣的应用场景的最佳算法了。希望这一系列的文章能对你有所启发,感兴趣就顺手三连哦

本文同步发表在我的微信公众号和知乎专栏“计算摄影学”,欢迎扫码关注,转载请注明作者和来源。

七. 参考资料

  1. 开源电影Sintel的相关信息:studio.blender.org/film
  2. MPI Sintel数据集官网:sintel.is.tue.mpg.de/,这里有数据集的介绍,也有论文的信息
  3. SceneFlow数据集官网:lmb.informatik.uni-freiburg.de, 同样,这里有数据集的介绍,也有论文的信息
  4. AirSim模拟器的官网:microsoft.github.io/Air
  5. Carla模拟器的官网:carla.org/

0 人点赞