0
雷锋网 AI 科技评论按:最近微博上的全景照片很火呀,相比各位都已经在自己的iPhone或者iPad上品鉴了多家IT公司的办公室、游玩了多个旅游胜地、享受了被小猫小狗环绕的感觉了。太平洋那头的Facebook也没闲着,从去年上线类似的功能以后,全世界 Facebook 用户们已经上传了七千万张全景照片了。
Facebook 支持多种全景照片和全景视频的拍摄方式,可以让人们把自己的全方位感受分享给好朋友们。如果用户有一个专门的全景摄像机,比如理光Theta S或者Giroptic iO,还可以直接把相机里的照片发布到Facebook上去。如今,多数高端安卓和iOS智能手机的内置相机也都有了全景模式,可以用来拍全景照片。
Facebook 在过去的一年中开发并上线了多种技术给用户提供更好的全景照片创建和分享体验,包括全景拍照、全景视频防抖,以及重新设计如何存储高分辨率媒体。最近,Facebook 还用到了深度神经网络来自动矫正全景照片的方向,可以给手机拍摄的照片直接带来更真实的包围感。雷锋网 AI 科技评论对这篇介绍文章做了编译如下。
最近 Facebook 刚刚在 Facebook app中上线了一个新功能,用户可以在一个新的、能够无限滑动的界面里拍摄完整的360度全景照片。
由于全景照片会比一般的照片大很多,Facebook 首先需要解决的难题就是保证信息流里出现了一张全景照片的时候也能让用户流畅地在界面中拖拉滑动;同时,当用户停止滑动,移动手机或者转动手机看这张全景照片的时候,也能立即把全分辨率的照片加载出来。在屏幕立即上呈现全分辨率的照片或占用很多内存,所以当用户继续滑动页面往下看的时候,又会给加载新的内容带来延迟。
面对着这些挑战,Facebook 的工程师们重新设计了 Facebook 的底层照片处理机制,便于存储信息流中“拼贴”的照片以及呈现照片内容。
每张全景照片都会被转换为一张立方映射图,Facebook 之前也有类似的方法用在全景视频中。然后这些立方映射图会以多种不同的分辨率存储下来,而且每一个分辨率的版本都会分割为许多张小的 512x512 分辨率的图像。
当用户在信息流里刷到一张全景照片的时候,程序就会计算当前窗口渲染时需要哪种分辨率、以及用哪些小图像来拼贴成大图。如果当前需要的分辨率不可用,程序就会暂时渲染一个低分辨率的样子,同时等待网络把高分辨率的内容传过来。当用户进入全景照片移动手机和在屏幕上缩放观看的时候,程序会不停地做这样的全套计算。这样,原来的用户体验上不会有什么可感知的变化,却实现了千万甚至上亿像素的高分辨率全景图像显示。
用户公开上传到 Facebook 的上千万张全景照片形成了一个强有力的新数据集,Facebook 的研发人员们也就可以利用这个数据集改善自家的产品。这些数据可以和机器学习的方法联合起来,给用户带来更好的使用体验。
让人觉得全景照片不够真实的最常见的原因之一就是拍照的时候相机没有端平,然后最终的照片中也没有修复过来这些倾斜。比如下面就是照片倾斜的例子,拍照的时候相机拿歪了。呈现在照片里的地平线是倾斜的,完全破坏了照片的真实感。
对于传统的照片,用照片编辑软件修正这种倾斜是一件简单直接的事情,但是能够用于全景照片的这类工具并不多,而且修正球面上的倾斜旋转相当不直观。在拍摄全景照片的过程中,相机的旋转可以用 x 轴旋转(tilt)和 z 轴旋转(roll)两个参数来描述,如下方示意图所示。第三个方向的旋转,y 轴旋转(yaw),影响的是全景照片的起始点,但是这个方向上的旋转是不会造成照片内容的倾斜的。Facebook 的研发人员们就想开发出一种能够自动修正这些相机的旋转带来的照片倾斜旋转问题的方法。
为了解决这个问题,Facebook 的研究人员们使用了著名的深度神经网络架构 AlexNet,并对它做了一些相应的修改。用于网络训练的数据就是像前文中那样的照片,它包含了360x180度的完整球面环境,然后用等距离长方圆柱(equirectangular)投影转换为了一张矩形的照片。Facebook 的研究人员们首先假设这个问题的几何本质不需要颜色信息的参与,这样训练数据就可以简化为256x128分辨率的黑白照片。AlexNet 本来的设计是为了解决超过1000个类别的图像分类问题的,所以它最终的全连接层就有4096个输入和1000个输出。在 Facebook 的这个问题中,他们要解决的是一个回归问题,所以他们修改后的网络中,全连接层变成了4096个输入和 x 轴旋转、z 轴旋转两个值的连续值输出。
Facebook 的研究人员们用带有 x 轴和 z 轴旋转标签的图像训练了这个网络模型。训练数据集中包含了五十万张投影转换过的矩形照片,这些照片是研究人员们挑出来,总体没有旋转、倾斜的;换句话说,这些照片的 x 轴和 z 轴旋转全部都是0。在训练过程中,研究人员们人工地用随机生成的 x 轴和 z 轴旋转值对训练样本做旋转。如下的这个损失函数就会测量出这些随机生成的标签和网络模型预测结果之间的差值,并把减小这个差值作为网络的训练目标。
为了测试训练效果,研究人员们用一组给定的 x 轴和 z 轴旋转值对测试集中的图像做合成旋转。然后他们用训练过的网络模型分析这些旋转过的图像并记录模型给出的结果。这些已知的旋转值和模型给出的结果之间的差别可以归结为两个原因,1,模型没能完全解决这个旋转问题;2,所用的数据集还有一些问题,影响了模型的表现。这第二个原因也是真实存在的,Facebook 的研究人员们假定了选用的数据集总体是平直的,但是单独看其中的某个样本都还是有一些固有的旋转的。
所以,研究人员们用 [-4,-2,0,2,4] 度几种 x 轴和 z 轴旋转值中的所有组合在每一张照片都做了一遍,这就是用模型对每一张照片都过25遍。对于每一次所用的 x 轴和 z 轴旋转值,他们都会计算对应的旋转量。表示这种旋转量的最好的方法就是用3D图像中的一个常用工具:四元数(quaternion)。然后,模型会根据图像计算出另一个四元数旋转量。如果模型和数据中都不存在刚才提到的两个问题,那么这两个四元数就应当是相等的。实际中其实并不相等,所以在每一次计算中,他们都会把两个四元数相除,计算两者间的差值。最后,用以下公式算出每张图像在所有组合的下的差值的平均值。
以上公式中的计算都使用了四元数,因为它们用于计算差值和3D旋转的均值时非常好用。但是,这样就需要给每张图片计算新的 x 轴和 z 轴旋转值,因为数据集中的图像一开始的时候并不是完全平直的。这种平均差值就是对每张训练图像的真实方向的很好的预测。那么,研究人员们接下来简单地把四元数格式的平均差值转换为 x、y、z 轴旋转就可以更新图像的标签了。
在图像标签更新以后,就可以对模型做新一轮训练。模型一共经历了四轮训练和微调。在微调过程的最后,模型对全景照片算出的旋转值误差达到了0.1度的水平。每个阶段的训练都是从一个未经初始化的模型开始的,可以从下图明显地看到每个阶段中模型都收敛到了更小的训练损失。在另一项对抗测试中,模型也表现出了类似的收敛和误差值水平。模型的收敛表现足以让研究人员们得出结论:这样的“训练 - 微调”循环确实让模型学到了理想的旋转方程。
如下是一些经过旋转的全景照片结果,而且都是训练集之外的照片。从几组图片中可以看到,模型对于不同的内容类别都有出色的表现,不论有建筑这样的人造景观还是完全的自然风光。
结论
Facebook 的照片、视频、直播产品中都已经可以使用全景媒体。在这个过程中,具有沉浸感的内容也会带来一些特有的问题。这篇文章仅仅介绍了 Facebook 的研究人员们解决的问题里的几个。随着用户往 Facebook 上传这样的具有沉浸感的内容的速度越来越快,Facebook 也对研究的前景充满期待,他们相信类似这样的技术可以让用户用新的方式感受不同的地点和事件。
via Facebook Blog,雷锋网 AI 科技评论编译
雷峰网版权文章,未经授权禁止转载。详情见转载须知。