简评:如果照片能自动进行 2D 到 3D 的转换,也就是说用一台普通手机就可以照一张 3D 立体自拍,这难道不是一件很酷的事情吗? 如何运行?
运行之前,首先要安装 MXNet。MXNet 的配置环境为 Cuda7.0 和 Cudnn 4 版本及以上。
打开 mxnet/config.mk,并将 USE_CUDA 和 USE_CUDNN 的值设置为 1。再将EXTRA_OPERATORS=path/to/deep3d/operators 添加到 path/to/mxnet/ config .mk 后面,并重新编译 MXNet。
研究动机
2008 年「阿凡达」上映,3D 影片技术便迅速发展成为主流科技。每年 3D 影片的发行量大约为 10 到 20 部,并且伴随 OculusRift 和其他 VR 头盔的推出,3D 影片技术的需求只会有增无减。
然而,3D 影片的制作难度依然很大。目前制作 3D 影片主要有两种方法,并且这两种方法在实际制作中的应用程度基本相同:
- 其一是用特殊的 3D 立体摄像机直接拍摄成 3D 影片
- 其二是先拍摄成 2D 影片,然后人工转制 3D
但是这两种方法都不完美,对于第一种方法来说,3D 摄像机昂贵而不省事。而第二种人工转制则需要画家为每一帧画面绘制深度图。
效果预览
说了这么多,不如直接看看通过 Deep3D 将 2D 图片转制成 3D 影片的效果图吧 ~
一般来说应该使用 3D 眼镜或 VR 设备来观看这些 3D 图像,但是大部分人通常不会随身携带这些,所以我们用 GIF 的形式来展示这些 3D 图像的立体效果:
实现方法
3D 图像有两个视角,分别对应人类的左右眼。要把一张 2D 图像转换成 3D 立体图,首先需要估测每个像素点相对于相机的距离(即深度图),然后基于深度图来创建两个视角。
该算法中最困难的步骤是估测深度图。为了实现自动转换,我们可以让它通过学习得到一台算法模型。目前已经有一些工作是基于 DNN 实现的单张 2D 图像的深度估测。然而还需要用图像和深度图数据对来进行训练。由于这种数据对收集起来很困难,所以使用的数据库都比较小,比如 NYU 深度数据库和 KITTI,这类数据库中只包含几百张样例。此外,这些数据集只有静态场景,很难想像如何将这项技术应用到人物照片里。
相比之下,Deep3D 可以直接在具有数千万帧的 3D 影片的基础上进行训练。我们在进行训练时,把深度图作为一台网络内部的表示,而不是作为末端的预测输出。所以我们的方法并不是先预测一张深度图,然后用这张深度图通过一台单独的算法去重建缺失的视角,而是在同一神经网络中重新创建端到端的方法来训练它。
这里展示了一些可视化的网络内部深度结构,可以帮助大家理解:
每张图像后面都是 4*3 的不同深度层的图示,按从近到远的顺序排列。离观众近的物体会出目前靠前的几张深度图中,而离观众远的物体则出目前最后几张。这表明内部深度表示法正在学习从 2D 图像推断深度,而不需要直接在图像上进行训练。
这个项目是通过 MXNet 实现的,MXNet 是一台灵活高效的深度学习库。训练模型和预测脚本都包含在 deep3d.ipynb 中,训练代码随后也会公开。
<hr/>Github: piiswrong/deep3d
分类收藏: 产品 | 设计 | 技术 | HackLife | Photography
推荐阅读: |