真 · 深度学习↓↓↓
Jeff Dean说的。
因为,谷歌又给Pixel的相机注入了机器学习的灵魂:在背景虚化的任务上,学习了一下深度 (Depth) 。
学习前 (Stereo) 与学习后 (Learned) ,对比在动图右半边。表面看去,该虚的地方确实更虚了一些。
史称深度学习。
不过,神经网络的学习效果,不止表面看去这么简单。
以前的人像模式,只是简单地用了立体视觉原理:
在同一个场景下,给同一个人物,拍下两张角度略微不同的照片。
循环播放两张照片,发现人物是不动的,背景却平移了。这个现象就叫做视差 (Parallax) 。
用视差来预测物体所在的深度,这样的方法叫做相位对焦 (PDAF) 。
但PDAF有自己的局限,一是平移量通常很微小,找到函数关系比较困难;
△ 平行线的移动方向是个谜
二是,立体视觉技术都会有孔径问题 (Aperture Problem) :遇到直线,直线的平移方向、平移了多少,可能都无法判断。
再仔细观察一次这个栗子 (这次不是动图) :
比如,图中有水平线的时候,深度预测就常常出错。如上图左,几块平行板的深度应当相似,可虚化程度却很不一致。
所以,谷歌AI团队决定,不能只用PDAF,也要有其他预测依据来支撑。
团队开发的新方法里,增加了许多其他的预测工具:
比如,远离焦平面 (In-Focus Plane) 的点,就没有近处的那么尖锐。这提供了一个散焦 (Defocus) 深度判断依据。 比如,生活里的常见物体,我们本就粗略知道它们的尺寸。用这些物体在图像里的大小,来判断深度,是语义上的依据。
用一个CNN把这些辅助的依据,跟原本的PDAF结合起来。
训练这只CNN,需要喂食大量的PDAF图像,就是角度略有不同的组图。
还需要与图像相对应的,高质量的深度图 (Depth Maps) 。
除此之外,想改善手机的人像模式,训练数据就要和手机拍照的效果差不多。
△ 看上去草率,实则有点厉害
于是,团队DIY了一件很鬼畜的装备。把五台Pixel 3绑在一起,让它们同时拍摄 (误差2毫秒以内) 。
这五台手机的位置排布是有说法的:
五个视角确保了多个方向存在视差,避免孔径问题; 基本上保证,一张照片中的某个点,至少在另一张 (同时拍摄的) 照片上也出现过。少有缺乏参照的点; 各个摄像头之间的距离,要远远大于PDAF基线,这样预测会更准确; 同步拍照,确保了在动态场景里也能计算深度。
△ 动态场景:宝宝时刻在动,但拍到的是同一时间的形态
(另外,这个装备是便携的,户外拍摄的样本也可以采集。)
不过,就算数据很理想,真要准确预测图中的物体深度,也并不容易。
用一对PDAF图像,可以得出很多种不同的深度图:
(镜头的不同,焦距的不同,都会对深度判断产生影响。)
要把这一点考虑进入,就直接预测各个物体之间的相对深度,秒掉镜头的影像因素。
团队说,这样就能生成满意的结果了。
(虽然,国内可能没有多少Pixel用户......)
团队在博客里写到,拍照的时候需要快速预测,不能让~~相机~~举着手机的人类等太久。
所以,用TensorFlow Lite把CNN放进手机,用Pixel 3的GPU来完成快速计算。
到谷歌相机的6.1版本,就能用上了。
用户可以用Google Photos自己修改深度,来改变模糊值,以及焦点。
也可以用三方深度提取器,提取一张jpg的深度图,自己欣赏。
— 完 —