CVPR 2023 | 3D循环视频构建

2023-07-03 13:27 389 阅读 ID:1208
将门
将门

论文链接:https://arxiv.org/abs/2303.05312
项目主页:https://limacv.github.io/VideoLoop3D_web/

DEMO:https://limacv.github.io/VideoLoop3D_web/

注:

1、点开网页(Demo)后是一个实时渲染的动态的3D(严格意义上来说是2.5D)的视频,可以通过手指拖动或鼠标滑动来实时改变视角。

2、在宽屏下体验更加,在手机上可以将手机横屏然后刷新一下网页。

3、由于托管在github page上,所以加载起来会比较慢,加载时会闪烁,属于正常现象。

一、论文简介

在这片文章中,我们提出一个方法,它能从不同步的多目视频重建出一个3D的动态循环视频,并且提出了一种场景表示,它能较好的压缩3D视频,并且能在手机端实时渲染出来。目前代码和数据集均已开源,感兴趣的朋友们多多star!

深入具体方法之前有几个概念需要说明。

什么是3D视频:会动的三维场景 / 可以在任意视角下看的三维视频。注意不是指的那种3D电影,3D电影的视角其实只有两个(左眼和右眼)。

什么是3D循环视频:在3D视频基础上,是一个循环视频(looping video),循环的意思是从视频最后一帧切换到第一帧时,肉眼看不出明显的切换痕迹。这样有一个好处,就是对于本身就接近循环的场景而言,我只需要一段短视频,就可以源源不断的生成无穷无尽的视频。它的具体应用,比如用于一些网页的teaser,配图,或者当作一些虚拟背景,比如虚拟会议的背景,VR应用的背景,等等。

什么是不同步的多目视频:这是一个不严格的定义,对于这个方法的输入来说,我需要在不同视角下拍一段视频,每一段视频需要基本在同一视点(相机位姿不变),但是不同视角的视频可以不同步,即可以用一个相机分别在不

二、相关的工作

构建2D循环视频,是个比较小众的方向。之前的方法大致的做法是:

  1. 输入一个视角不变的视频,相当于我们有FxHxWx3的一个视频。
  2. 我们通过优化方法得到每个像素位置的最佳循环,即对于HxW个像素,每个位置在F帧中取出一个较好的循环片段,这个片段的结尾和开头的差别不能太大。
  3. 这样我们能重新组合出一个新的视频,利用一些blending的操作,我们可以吧一些不太连续的片段给变连续。

具体可以看这一篇:Fast computation of seamless video loopshttps://hhoppe.com/proj/fastloops/

3D视频表示,其实3D视频本身就是一个还在发展的方向,因为即使对于静态场景而言,比较好的重建出3D也是比较难的事情,对于动态视频而言,又增加了一个维度,所以问题更加困难。最近有几个用NeRF来重建3D视频的工作,都非常不错,之后有时间来系统整理一下这方面的工作。但是这篇文章没有用NeRF,或者TensorRF,Triplane,NGP等NeRF-like的3D场景表示,主要是因为NeRF的训练非常占用显存,特别是如果在训练过程中一次性训练一个大的video patch,对于NeRF-like的场景表示来说GPU memory占用是不可想像的(大致估计如果用NeRF来优化本文中的方法,需要大概6TB的显存)。

MPI场景表示,又叫Multiplane Image,多层图像。这篇文章的3D视频表示,是基于MPI的,就是看中它渲染和优化都比较快。它的原理其实十分简单,看下图就能一眼看懂,其实就是分布在视锥体下的一层一层图片,每一层图片带有一个透明度alpha通道。这样渲染的时候只要从远到近,开启alpha-blending就可以得到最终的结果。

                                                       Multiplane Image (MPI) 场景表示

三、具体方法1 - MTV场景表示

前文中提到我们基于MPI。但是如果非常直接的将MPI拓展到动态视频,它将会占用非常大的存储资源。对于32层的MPI,有60帧视频,图像分辨率为640x360,那么将会用60x32x640x360x4个float来存储这个表示。因此我们提出了Multi-tile Video,想法非常的好理解,就是我把这些plane给细分成一个个tile,对于静态的部分来说,我只需要存储一个tile,对于空的tile来说,我直接就扔掉就可以了,只有对于动态的场景来说,我才需要每帧存储一个tile。

                                              我们的MTV表示和直接将MPI扩展成MPV的对比

四、具体方法2 - 3D循环视频优化

有了场景表示,我们就可以通过输入的多目视频对其进行优化。我们采用了和NeRF类似的优化方法:Analysis-by-synthesis,即通过可微分渲染得到结果,与输入做loss之后将error梯度回传到表示本身。我们用了一个两阶段的训练:

                                                                             两阶段优化方法

第一阶段先优化一个静态的MPI。我们从输入计算得到长时间曝光的图片以及静态与否的一个Mask,经过刚刚所述的优化方法可以得到两个东西:静态的MPI,以及3D的静态与否的一个Mask。用这两个东西,我们就可以对我们的MPI进行tile的划分以及取舍了。具体的操作方法其实也很直观:首先将每个plane划分成规律的tile,然后对于每一个tile,找到它里面最大的透明度,最可能是动态的Mask,根据这两个值来判断我是否将这个tile丢弃,或者将它设为静态tile。这样我们就得到了一个MTV的表示。

第二阶段就开始优化动态的MTV。我们用了同样的优化方法,每一个iteration,渲染一个视频patch,然后与输入求loss。这次我们用了新提出的一个looping loss。这个loss是受这篇文章的启发得来的。具体来说这个loss的计算方法如下图Figure 4所示:

Looping loss

在提取patch的时候,我们要提取的应该是最终循环视频的patch,也就是说有无限多的patch需要提取,这显然是不现实的,但是根据Figure 5我们可以看到,其实只要对生成的短视频加上几帧pad,提取出来的patch就和原来无限多patch的分布是一样的。

五、结果

对比结果,ablation结果,以及更多的demo可以在项目主页访问到。

六、不足之处

  • 训练得到的结果其实还是有一些artifacts,并且这些artfiact在输入不满足假设的情况下会加剧,比如输入的场景不是循环的情况。
  • 它和NeRF相比,不能模拟高光等与视点有关的视觉效果,并且严格意义上是2.5D,并不是真正的3D
  • 目前优化阶段还是需要吃比较多的内存(20GB左右),所以这些结果都限制在640x360的分辨率

作者:马力

https://zhuanlan.zhihu.com/p/614619564

免责声明:作者保留权利,不代表本站立场。如想了解更多和作者有关的信息可以查看页面右侧作者信息卡片。
反馈
to-top--btn