前言

​ 最近在研究怎么把普通的2D视频转成3D立体视频,说白了就是从一个摄像头拍的画面里”脑补”出左右眼的视差,让你戴上3D眼镜就能看到立体效果。这个方向其实挺有意思的,不管是给老电影”翻新”成3D版本,还是给VR头显生产内容,都有实打实的应用场景。经过两个方案的模型训练与评估,目前我们有两条技术路线:一条是基于深度估计的传统流水线方案——先估计深度,计算视差,预测另一视角,再填补空洞修复扭曲;另一条是基于3D Gaussian Splatting的端到端方案,”一把梭”直接从单目视频重建3D场景。本篇先聊第一条路线:基于深度估计的方案设计,高斯泼溅方案后续再补。


正文

一、为什么要做2D转3D

​ 你可能会问,现在3D电影不是都用双目摄像机拍的吗,为啥还要费劲从2D转?原因很简单——世界上绝大多数的视频内容都是单目拍摄的。那些经典老片、海量的网络视频、监控录像,全都是”平面”的。如果能用算法把它们转成3D,那可玩的空间就太大了:

二、核心技术:单目深度估计

​ 2D转3D的核心问题,其实就是一个问题:从单张图像中估计每个像素的深度。人眼之所以能看到立体,是因为左右眼之间有大约6.5cm的间距,同一个物体在两只眼睛里的成像位置会有微小的偏移(视差),大脑通过这个偏移来感知深度。所以我们要做的,就是先搞清楚画面里每个点离摄像头有多远,然后根据这个深度信息”合成”出另一只眼睛看到的画面。

​ 单目深度估计(Monocular Depth Estimation)这几年发展得很快,从早期的传统方法到现在基于深度学习的方案,精度提升了好几个量级。目前比较主流的方案包括:

​ 打个比方,深度估计就像是给画面里的每个像素贴一个”距离标签”,近处的物体标签值小,远处的标签值大。有了这张”距离地图”(深度图),后面的事情就好办了。

三、双目视频生成流程

​ 拿到深度图之后,生成双目视频的流程大致是这样的:

第一步:深度图生成

​ 对视频的每一帧运行深度估计模型,得到对应的深度图。这里有个关键问题是时间一致性——相邻帧的深度图不能跳来跳去,否则看起来会很”抖”。我的做法是对深度图做时域滤波,用前后帧的深度信息做加权平均,平滑掉那些帧间的突变。

第二步:视差计算与图像变换

​ 根据深度图计算视差(disparity),然后对原始图像做像素级的水平位移。左眼图像就是原图,右眼图像通过将像素按视差值向左或向右偏移来生成。深度越近的物体,偏移量越大;深度越远的,偏移量越小。这个偏移量的大小直接决定了3D效果的”强烈程度”。

第三步:空洞填充

​ 像素偏移之后,必然会出现一些”空洞”——原来被前景物体遮挡的区域,在另一个视角下露出来了,但我们没有这部分的真实像素信息。这时候需要用图像修复(Inpainting)的方法把这些空洞填上。简单的做法是用周围像素插值,效果好一点的可以用深度学习的修复模型。

第四步:输出格式封装

​ 最终把左右眼的视频流封装成标准的3D格式。常见的有:

​ 在我的项目里,同时支持了这两种输出模式。红蓝模式主要用来快速验证效果,正式输出还是用左右格式。

输入
2D原始输入
输出
3D红蓝输出效果

四、效果展示与挑战

​ 从实际效果来看,对于大多数自然场景的视频,转换出来的3D效果还是挺像那么回事的。尤其是前景和背景层次分明的画面,立体感很强。但也有一些场景比较棘手:

​ 总的来说,基于深度估计的方案流程清晰、可控性强,每个环节都可以单独调优,适合对质量有精细要求的场景。但它也有明显的局限——深度估计本身就是个”猜”的过程,对复杂场景的泛化能力有限,而且多阶段流水线的误差会逐级累积。

​ 另一条路线——基于3D Gaussian Splatting的方案,思路完全不同:直接从单目视频重建出3D场景的高斯点云表示,然后从任意视角渲染出新视图,不需要显式的深度估计和视差计算。这个方案的优势是端到端、效果上限更高,但对数据质量和计算资源的要求也更高。关于高斯泼溅方案的具体设计和对比,后续再单独写一篇来聊。

最后

参考文章:

MiDaS - Towards Robust Monocular Depth Estimation

Depth Anything: Unleashing the Power of Large-Scale Unlabeled Data

Stereo Magnification: Learning View Synthesis using Multiplane Images


声明

本文仅作为个人学习记录,由AI辅助编写。