拍全景照片,重要的是手要稳,手要稳,手要稳……或者支个三角架。
上面视频中这位小姐姐的水平,可以说是非常赞了,量子位就认识一些货真价实、经常手抖的人类,经常拍成这样:
心疼这张桌子一秒……
最近,Facebook为了拯救手残星人、让用户们愉快地发更多的全景照片,开始研究用深度学习来调整360度全景照。
Facebook官方博客今天详细介绍了这项技术,量子位编译如下:
自去年Facebook发布360度照片功能以来,用户已经上传了超过7000万张360度照片。
Facebook提供了多种方式去拍摄360度照片和视频,让用户可以与社区分享自己的沉浸式体验。如果你有专门的360度相机,例如理光Tehta S或Giroptic iO,那么可以将相机中的内容直接上传至Facebook。目前,高端Android手机和iPhone也提供了全景相机功能,可以用于拍摄360度照片。
过去一年,Facebook开发并部署了多种技术,用于优化用户制作并分享360度内容的方式,例如360度拍摄和360度视频防抖,并重新开发了保存高清媒体内容的方式。
最近,我们开始探索,利用深度神经网络自动调整360度照片的方向,给用户的手机带来更多真实的沉浸式体验。
制作高分辨率360度照片
近期我们宣布,在Facebook应用中直接加入一项新功能,通过无限制的创新用户界面,帮助用户拍摄完整的360度场景。文章开头的视频展示了Facebook应用的360度拍摄功能。
相对于传统的照片,360度照片的文件体积往往更大。
因此我们面临的挑战之一在于,在消息流加入360度照片之后,如何帮助人们更快地浏览这些内容,同时确保当用户停下来欣赏某张360度照片时,提供完整分辨率的版本,并支持旋转、拖动和缩放等功能。
如果直接提供完整分辨率的版本,那么会导致当用户滚动消息流时其他内容加载缓慢,并占用大量内存去处理照片。
面对这些挑战,我们重新设计了Facebook的照片基础设施,实现照片内容的“平铺”保存方式和展现方式。
每张360度照片都被转换为立方体图,这类似于我们早期对360度视频的做法。这些立方体图随后被保存为多种分辨率,而每种分辨率都被进一步分拆为独立的、更小的512x512图片。
当360度照片被查看时,我们判断在当前窗口中应当渲染什么样的分辨率和什么样的平铺效果。如果当前分辨率不可用,我们就会临时渲染较低分辨率的版本,同时等待网络传输高分辨率版本。
随着用户在360度照片中的拖动和缩放,我们会重新进行这样的计算。这种调整让我们可以展示包含数亿像素的照片,而不会对性能产生太大影响。
用于360度照片的深度神经网络
上传至Facebook平台的数千万公开360度照片提供了强大的新数据集,协助我们优化产品。360度数据本身可以与机器学习方法配合使用,给用户带来更好的体验。
导致360度照片偏离实景的最基本问题之一在于,在拍摄360度照片时,如果相机不够水平,那么所产生照片的旋转就会不正确。
可以看看下面的这个例子:
在拍摄这张照片时,手持相机的方式有问题。这导致了水平线的倾斜,照片的失真。
对于传统照片,用编辑软件可以很容易修正这种照片旋转的问题。然而,同样的工具并不适用于360度照片,在球面上修正旋转问题看起来也很不直观。
360度照片的旋转问题由两个参数来决定,分别为倾斜和滚动,如下图所示:
第三个轴,即相机旋角,主要通过改变最初的相机俯仰角来影响照片,但其本身并不会造成场景的旋转。我们希望开发一种技术,自动修复由这些运动引发的旋转问题。
我们尝试利用深度神经网络(DNN)架构AlexNet,并在此基础上进行一些改动,来解决这个问题。
前面那张拍残了的图是我们训练数据集中的一张范例照片,包含完整的球形环境(360度x180度),并使用了等矩柱状投影。
我们假定,问题的几何特性不需要用到颜色信息,因此训练数据集中都是黑白图片,分辨率为256x128。
AlexNet最初被用于解决包含1000多个类的分类问题,最终完全连接的层包含4096个输入和1000个输出。而我们将问题定义为回归问题,因此最终层有4096个输入,以及两个连续值输出,分别为倾斜和滚动。
我们用带有倾斜值和滚动值的带标签旋转图片去训练DNN。我们的训练数据集包含了50万张等矩柱状投影图片。
我们假定这些图片平均来看是没有旋转的,换句话说倾斜值和滚动值为0。在训练过程中,我们用随机生成的倾斜值和滚动值去人工旋转每个训练样图。
如下方公式所示,损失函数衡量了随机生成的标签值与DNN估计的结果值之间的差距:
为了测试训练结果,我们利用一组已知的倾斜值和滚动值来旋转数据集中的每张照片。随后,我们运行受过训练的DNN,并记录结果值。
已知值和计算结果之间的差异可以归结为两种因素;1)DNN并没有完全解决照片旋转问题,2)数据集照片一开始就不够竖直。
第二个问题的出现可能是由于,我们假定数据集中的照片平均来看是竖直的,但对于特定的某张照片,情况可能并非如此。
对于每张照片,我们扫描一组倾斜值和滚动值[–4deg, –2deg, 0deg, 2deg, 4deg]。
这意味着对于每张照片,DNN需要运行25次。利用每次运行中得到的倾斜值和滚动值,我们计算此前应用至照片的旋转。
表达这种旋转的最有效方式是使用3D图像中常用的一种工具:四元数。我们随后计算另一组四元数,以表达该网络计算出的旋转。如果网络和数据不存在上述的两种问题,那么四元数将会是一致的。
然而在实际情况下,情况并非如此,因此对于每次运行,我们都会通过相除来计算两者之间的不同。最后,用这里展示的技术去计算差异的平均值。
以上计算方法利用了四元数,因为这是计算3D旋转中差异和平均值的有效方法。
不过,我们现在需要给每张照片贴上新的倾斜值和滚动值,因为数据集照片最开始可能并不是准确竖直的。这种平均差异可以很好地估计每张训练照片的真实方向。
因此在四元数和相机旋角、倾斜和滚动之间我们可以采用简单的转换技术,从平均值得到更准确的标签值。
在数据集重新打标签之后,我们展开了新一轮训练。我们反复进行4轮的训练和优化。到优化过程的最后,我们的DNN对360度旋转的计算平均可以精确到0.1度。如下图所示:
每个训练阶段从未初始化的模型开始,我们看到每个阶段都收敛到较小的损失。利用留出测试集也可以得到类似的收敛和错误值。
这样的收敛行为令我们相信,训练/优化循环正在学习我们试图实现的旋转功能。
以下是对某些旋转后360度照片取得的结果。这些并不是训练集的一部分。
△ 修正前
△ 修正后
△ 修正前
△ 修正后
△ 修正前
△ 修正后
每一对照片中的前一张是原始照片,第二章是DNN修正过的照片。请注意,这个DNN对于不同类型的内容都有很好的效果。照片中的内容可以是人造物体,例如建筑物,也可以是自然风景。
结论
我们已经在Facebook的照片、视频和直播产品中部署了360度媒体技术。在这一过程中,挑战也越来越明显。
这篇文章介绍了我们过去一年解决的挑战之一。随着Facebook平台上沉浸式媒体内容上传量越来越大,我们将关注这些研究带来什么样的前景,以及这些技术如何帮助人们以全新方式体验活动和地点。
原文地址:https://code.facebook.com/posts/129055711052260/optimizing-360-photos-at-scale/
— 完 —