当前位置: 首页 > 编程日记 > 正文

胜过iPhone XS?Google Pixel的“夜视功能”是怎样炼成的

640?wx_fmt=jpeg


作者 |  Marc Levoy、Yael Pritch

译者 | 刘旭坤

整理 | Jane

出品 | AI科技大本营


【导读】随着智能手机的不断发展成熟,为了寻找差异化的厂商不断增加摄像头的数量。然而,摄像头的数量越多,就代表拍照的质量越好吗?


Google Pixel 手机一直坚持单摄,虽然硬件不算顶尖,但是凭借着强大的算法,Pixel 手机的照相水平非常突出。上个月,Pixel 3 发布会的 Keynote 显示其暗光拍照的成像效果甚至完虐 iPhone XS,让人惊叹不已。


近日,Google 又为自己的相机应用增加了“Night Sight”功能(夜视功能),用户无需三脚架和闪光灯就能在夜间拍出锐利干净的照片,并获得了众多评测博主的好评。本文就将为读者介绍弱光条件下拍照的难点以及机器学习在这一问题中的应用。



弱光拍摄的难点


大家如果在夜晚拍过照片的话,肯定会发现拍出的照片上有很多噪点,使得照片看起来颜色和亮度都很不均匀。噪点或者叫噪声的来源有两个:散粒噪声和读取噪声。散粒噪声指进入感光元件的光子数量太少造成可观测的光子数量不均。散粒噪声的出现与我们所使用感光元件的质量没有关系,不过智能手机的感光元件太小,所以受散粒噪声影响比普通相机更大。读取噪声则是由将电信号转换成读数时的随机错误造成的。感光元件的质量越好那么读取噪声也就越小。


把所有噪声的来源都考虑进去我们可以得出一个信噪比,信噪比越高则意味着我们拍出的照片质量越好。感光元件大小不变的情况下信噪比和曝光时间成正比,所以看来只要练成铁手就能完美地解决这个问题。然而还是想简单了,就算拍摄者能长时间稳稳地举着手机被拍的对象也没法保持长时间不动。


2014 年发布的 HDR+ 功能改善了散粒噪声和读取噪声的问题,不过 HDR+ 的本意如它的名字一样是为了提高照片的动态范围。HDR+ 的原理是连拍很多张照片,然后通过图像识别把多张照片进行叠加成一张照片。每张照片的曝光时间能根据用户手抖的程度和拍摄目标的移动自动调节来保证照片的锐度,这样就在保证锐度的前提下增加了曝光时间,所以照片的信噪比也能提高了。


看起来弱光拍照的问题已经完美解决了,就连拍几十张后合并成一张就行了。然而实际的情况是就算用多张照片合并的方法还是对光照有要求,光照低于一定的标准就算再多拍效果也不好。标示光源亮度的物理量是光通量,它的单位是流明。单位面积接收到的光通量叫做照度,单位是勒克斯。他们之间的关系大家可以参照压力与压强的关系来理解。为了让大家能直观地了解不同勒克斯的概念,下面表中用生活中的场景与勒克斯数值做了对比:


640?wx_fmt=png


普通的手机相机从 30 勒克斯开始就不太行了,如果使用 HDR+ 或者类似合成多张照片的技术大概能降到 3 勒克斯但再低也就不行了。我们开发夜视功能的目标是让手机在 0.3 到 3 勒克斯之间不补光只按一次快门也能拍出好照片,而要实现这一目标最重要的手段就是尽可能多地捕获光子。


曝光时间限制和模糊问题


延长曝光时间虽然能提高信噪比拍出更干净的照片,但也同时带来了两个问题。Pixel 手机默认的拍摄模式是零快门延迟,意思是说用户一打开相机应用其实相机就开始拍照存储在缓存里了。当用户按下快门的时候手机会提取最新拍摄的 9 至 15 张相片来进行合成,这样就能保证拍到的是用户按快门的那一刻。


用户在拍照时手机会显示预览,为了维持最低 15 帧的显示刷新,HDR+ 能实现的最慢快门速度也只有 66 毫秒。所以为了进一步延长曝光时间,夜视功能改变了拍摄模式。用户使用夜视功能拍照时按下快门后相机才会开始拍摄,所以用户必须维持一小段时间尽量不动。


延长曝光带来的第二个问题是画面模糊。虽然 Pixel 2 和 Pixel 3 配备了光学防抖镜头但最多只能支持到 1/8 秒快门。Pixel 3 为了解决这一问题应用了所谓的动作测量技术,也就是使用光流法来判断画面的移动,然后再动态调整快门速度来让画面尽量清楚。Pixel 1  和 Pixel 2 虽然不会默认使用动作测量,不过用户开启夜视模式时它们也会使用动作测量。这样如果用户画面晃动不大的话每张照片的曝光时间最多能到 333 毫秒。这项技术也针对 Pixel 1 和使用了脚架的情况进行了优化。Pixel 1 没有光学防抖,所以快门的时间就稍微短一些而如果手机完全没有移动的话快门时间最高可达一秒。


除了快门时间,应用也会根据情况调整所拍的照片张数来减少用户等待的时间。如果使用三脚架只拍 6 张就可以合成了,若为手持则最多会拍 15 张。所以使用 Pixel 手机拍照,根据相机是前置还是后置、手持稳定性、画面稳定性和亮度的不同,合成前所拍摄的照片在 15 张 1/15 秒快门照片和 6 张 1 秒快门的照片之间。下面的图中我们可以看到一点区别:


640?wx_fmt=gif

左图我们可以看到狗头部的动作。中间图为动作测量关闭状态下拍摄,快门为 73 毫秒,能明显看到模糊。右图为动作测量开启状态下拍摄,快门为 48 毫秒,比关闭动作测量清楚一些。


下面的图是手持和三脚架拍摄的不同效果:


640?wx_fmt=jpeg

左图为手持拍摄,略微有抖动。拍摄了 15 张快门 333 毫秒的照片进行合成。右图为手机判断无抖动所以拍摄了 6 张快门 1 秒的照片进行合成。


对齐与合成


拍摄多张照片进行合成不是什么新鲜的方法,在天文和微距摄影上都有很广泛的应用。虽然原理听起来很容易,但将手持拍摄的照片对齐就很困难。我们从 2010 年就开始进行对齐与合成相关的研究,最早的成果是 iOS 平台一个叫做 Synthcam 的应用。


夜视功能的原理其实和 Synthcam 差不多,但提高了照片的分辨率。Pixel 1 和 2 中使用的 HDR+ 融合算法提高了剔除无效照片的能力,Pixel 3 中使用的超高分辨率变焦技术虽说并不是为减少噪点所开发但客观上也实现了除噪点的效果。这项技术某些条件下效果优于 HDR+ 但对计算能力要求更高,所以没有应用在 Pixel 1 和 Pixel 2 上。


其他难题


原理听起来挺简单,但开发夜视功能的过程中还是碰到了不少难题。


▌1.弱光条件下自动白平衡失效


自动白平衡的目的是将不同色温条件下拍摄的照片都调整为白光下拍摄的颜色,否则人眼在回看照片时会发现明显的色差。


白平衡在数学上属于不适定问题。比如感光元件判断拍到的雪花是蓝色的,但无法判断雪花到底是真的蓝还是天的蓝色映在雪花上。现在的自动白平衡算法在强光条件下效果不错,但在弱光拍摄时就非常不准了。


为此我们训练了一个模型来判断照片的白平衡是否正常并作出矫正。为了训练这个模型我们使用 Pixel 手机在各种光照条件了拍了很多照片并手工对白平衡进行调整。下图中我们能看到应用模型前后的明显区别。


640?wx_fmt=jpeg


2.色调映射


人眼在弱光下是分不清楚颜色的,因为只有不能判断颜色的视杆细胞才能在晚上工作。但人眼看不到并不表示到晚上颜色就没有了,所以夜视功能想超越人眼的极限必须在夜间也能拍出清晰的颜色。


下面这张图就是在夜间通过长时间曝光所拍摄的(注意天空中可以看到星星)。虽然偶尔拍拍这种把晚上拍成白天的效果也不错,但恐怕大家还是想能把晚上拍成晚上。


640?wx_fmt=png


其实艺术家们很早就发现了让观众感觉所画的是夜间的方法,如下图所示:


640?wx_fmt=png


画家提高画面的对比度并把阴影部分直接涂黑来营造出夜间的效果。我们也使用了类似的方法,比如使用 S 形色调映射。不过怎么把握其中的度还是挺值得思考的,下面这张用 Pixel 3 拍的照片就非常成功:


640?wx_fmt=jpeg


夜视模式的极限


当照度低于 0.3 勒克斯时手机的自动对焦功能会失效,所以我们在 Pixel 3 的夜视模式增加了两个手动对焦按钮:近和远。近模式的对焦距离约为 1.2 米,远模式则在约 3.6 米处对焦。在远模式下景深是从 1.8 米到无穷远。虽然照度低于 0.3 勒克斯也能拍出好照片,但就必须借助三脚架和第三方应用了。


那么理论上对摄影来说照度能低到什么程度呢?我想当捕捉到的光子会受到读取噪音影响时就差不多了。另外还有其他的噪声来源,比如受温度影响的暗电流,不过我可不建议大家为了降噪点把手机泡到液氮里。就算这些问题全都解决了也会有风吹树摇,超长曝光摄影还是很困难。


注意事项


用夜视功能拍照很有趣,如果使用得当的话能够拍出效果非常好的照片。夜视功能在 Pixel 3 上面的效果是最好的,一方面是因为它芯片速度最快,另外自动白平衡算法也是以 Pixel 3 为基础训练的。不过就算用的不是 Pixel 3 夜视功能也能让你在弱光下拍出好照片(预览里的噪点并不会出现在完成的照片上)。文章最后就给大家一些更好地使用夜视功能的注意事项吧:


  • 完全黑暗的地方夜视功能也拍不到什么东西

  • 柔和均匀的光照条件下拍摄效果更好

  • 不要对着光源拍,否则会有炫光

  • 可以点预览屏幕来调整曝光

  • 如果是单纯地想降低曝光是可以通过软件后期实现的,而且没那么多噪点

  • 对着画面上有颜色或者亮度对比的地方比较容易自动对上焦

  • 还是对不上焦就试试手动对焦(如下图)

  • 靠着墙可以增加手持的稳定性有助于提升照片锐度

  • 用前置镜头自拍也可以用夜视功能,而且手机屏幕还能补光


640?wx_fmt=png



——【完】——



精彩推荐

BDTC 2018


2018 中国大数据技术大会将于 12 月 6 - 8 日在新云南皇冠假日酒店举行。汇聚超百位国内外实力讲师从学界翘楚到行业一线大拿:

管晓宏:中国科学院院士;

张宏江:源码资本投资合伙人;

张晓东:美国俄亥俄州立大学 Robert M. Critchfield 讲席教授;

陈性元:北京信息科学技术研究院副院长;

周靖人:阿里巴巴集团副总裁;

李浩源:Alluxio 公司创始人&CEO

......

全方位立体解读大数据时代的技术进程,为众技术爱好者奉上一场优质干货盛宴。


640?wx_fmt=jpeg


推荐阅读


Uber的机器学习平台Michelangelo

大家近期都在学习的Python学习项目!

GitHub上25个最受欢迎的开源机器学习库

人工智能进行时:人类的未来与未来的人类

大咖指路:机器学习人才这些方向最紧缺!

罗永浩冲冠一怒

程序员买房指南——LZ的三次买房和一次卖房经历

实战必读! 发现百万级用户公链漏洞,我们靠的是这套方法

相关文章:

npm导入bootstrap_vue cli3.0如何通过npm引入jquery和bootstrap?

不建议通过npm的方式引入这两个东西,因为这两个东西本身就是打包好的,通过npm的方式过去,还得在webpack中排除掉,迂回。要用就直接在html中通过script和link标签引入。jQuery是时代的产物,如果要用到vue,那…

ABAP 一个隐藏 selection-screen block的实例

以下是一个演示如何通过 selection-screen 中的pushbutton来动态改变屏幕上的字段的显示状态的(即显示或者隐藏)。注意:显示 通过本示例可知selection-screen 中的 field 的显示状态都是 的,在程序中修改其属性 active 的值为 0 时…

python计算文件中字母出现次数_python – 计算文本文件中字母的频率

使用collections.Counter():from collections import Counterwith open(file) as f:c Counter()for x in f:c Counter(x.strip())正如mgilson指出的那样,如果文件不是那么大,你可以简单地做:c Counter(f.read().strip())例:>>> c…

公开课报名 | 详解CNN-pFSMN模型以及在语音识别中的应用

近年来,在深度学习技术的帮助下,语音识别取得了极大的进展,从实验室开始走向市场,走向实用化。基于语音识别技术的输入法、搜索和翻译等人机交互场景都有了广泛的应用。Librispeech是当前衡量语音识别技术的最权威主流的开源数据集…

Ruby开发环境配置

一、 RoR IDE http://deadlock.netbeans.org/hudson/job/ruby/ 你可以从这个地方下载Ruby IDE专用版本的netbeans,只有30MB大小,速度比RadRails还快!netbeans的RoR支持很强大,但也要注意两点: 1) 一定要用JDK6.0&am…

net localgroup 命令详解

http://www.jb51.net/article/24733.htm windows 核心安装中,关闭防火墙的命令 netsh advfirewall set allprofiles state off Hyper-v使用远程管理工具的相关设置: http://technet.microsoft.com/zh-cn/library/cc794756(vws.10).aspx 在SCVMM中添加Hyp…

ii 第七单元 访问网络共享文件系统

挂载网络文件系统 网络文件系统是由网络附加存储服务器通过网络向多个主机提供的一种文件系统 , 而不是由块设备 ( 例如硬盘驱动器 ) 提供的。客户端通过特殊的文件系统协议和格式访问远程存储 Linux 中有两种主要协议可用访问网络文件系统 : NFS 和CIFS 。 访问网络共享的三个…

最新机器学习开源项目Top10

作者 | Mybridge译者 | Linstancy整理 | Jane出品 | AI科技大本营【导读】过去一个月里,我们对近 1400 个机器学习项目进行了排名,并挑选出热度前 10 的项目。这份清单涵盖了包括 OpenAI 最新开发的 RND 算法、Uber 构建的第一个自然语言处理平台、由 Be…

linux批处理mysql数据库_使用批处理对MySQL进行数据批量操作

批处理是一种非交互式运行MySQL程序的方法,如同您在MySQL中使用的命令一样,你仍然将使用这些命令。为了实现批处理,您重定向一个文件到MySQL程序中,首先我们需要一个文本文件,这个文本文件包含有与我们在MySQL中输入的…

JDBC Driver常用连接方法列表

Microsoft SQL Server series (6.5, 7.x and 2000) and Sybase 10JDBC Name: jTDSURL: [url]http://jtds.sourceforge.net/[/url]Version: 0.5.1Download URL: [url]http://sourceforge.net/project/show...?group_id33291[/url]语法: Class.forName("net.sourceforge.jt…

C#强化系列文章四:匿名方法的使用

匿名方法相信很多人都听过,它是C#2.0的一个新特性,顾名思义,匿名方法就是没有名称的方法。那么在C#中的匿名方法有哪些好处,在C#中如何使用呢?匿名方法最明显的好处就是可以降低另写一个方法的工作量,另外一…

AI人才抢夺“生猛”: 应届博士年薪涨到80万元

作者 | 王玉凤来源 | 本文授权转自第一财经人工智能(AI)人才薪水之高、涨幅之大,颇有令人瞠目结舌之感。一年前,针对AI领域的应届毕业生,硕士生约莫能拿到30万元的年薪,博士生则高达50万元。今年&#xff0…

mysql的表空间是否自动扩展_Oracle修改指定表空间为自动扩展

1.数据文件自动扩展的好处1)不会出现因为没有剩余空间可以利用到数据无法写入2)尽量减少人为的维护3)可以用于重要级别不是很大的数据库中,如测试数据库等2.数据文件自动扩展的弊端1)如果任其扩大,在数据量不断变大的过程中会导致某个数据文件异常的大2)…

3.15好水指数N1能否让饮水健康不失控?

题记:3.15晚会曾曝光碱性水无益健康,过度饮用对人体有害。但现在市场上仍然有企业打着“碱性水有益健康”的招牌做营销,其居心何在呢?饮用水指数N1和中国优水地图在3.15这天正式发布,它们能对我们的饮水健康产生多大的影响? 凯文…

【iOS-cocos2d-X 游戏开发之十四】cocos2dx(c++)中访问object函数

Cocos2dx系列博文的上一篇详细介绍了如何在Xcode中利用jni调用Android的Java层代码,还没有看过的童鞋,请移步到如下博文: 【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译并通过Jni调用Android的Java层代码(cocos2dx里访问调用…

mysql实验报告四_实验报告四

实 实 验 报 告 课程名称 数据库实验及课程设计 实验项目 数据查询 实验 仪器 ___________________________ 系 别______信息管理学院______ 专 业________ ____________ 班级/ / 学号_ _ 学生姓名 _____ _____________ 实验日期 成 绩 _______________________ 指导教师 施永香…

京东数科业务架构全披露,陈生强发布城市操作系统和京东钼媒

11 月 20 日,在 JDD-2018 京东数字全球探索者大会上,陈生强宣布,京东数字科技(JD Digits)正式成为京东金融的母品牌,这也意味着它的业务架构逐渐明晰,主要下设了京东金融、京东城市、京东农牧、…

自动化测试十大要点

当一款自动化测试工具引入到一个项目中,我们通常对它给予很高的期望;项目成员希望工具能够尽可能的缩小测试范围、节约成本并缩短项目进度,然而可悲的是,很多采用自动化测试的项目依然失败了。 以下几个方面严重影响着自动化测试的…

DataGridView取得或者修改当前单元格的内容

当前单元格指的是DataGridView 焦点所在的单元格,它可以通过DataGridView 对象的CurrentCell 属性取得。如果当前单元格不存在的时候,返回Nothing(C#是null) [VB.NET] 取得当前单元格内容Console.WriteLine(DataGridView1.CurrentCell.Value) 取得当前单…

名图怎么弄云服务器_云服务器购买了宽带的速度怎么测试?

西昆云详细说一下企业租用云服务器搭建网站,很多新手站长会把带宽当成宽带来测试,比如在自己的云服务器上下载东西测试速度,一旦下载的东西慢了就觉得有问题,其实这是不准确的,那么如何查看云服务器的带宽速度呢&#…

ERP实施注意方面

一 厂商方面 1.信息化产品本身的功能需要强大而且灵活,应当能够指导企业管理水平的提升并适应企业的不同管理需要 2.厂商实力雄厚,人员稳定,服务周到,EPR 是个长期合作的过程 二 企业自身方面 1.企业自身管理意识,对ER…

一文回顾2018英特尔人工智能大会

近几日,整个 AI 行业的目光都聚焦在了北京。因为,一场人工智能盛会来了——2018 英特尔人工智能大会。逾千名国内外人工智能领域有影响力的专家、开发者、研究人员以及英特尔的客户和合作伙伴相聚在这里,共同探讨和分享人工智能领域的前沿技术…

用python写希尔排序_python希尔排序介绍(实例)

希尔排序介绍希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本,该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依…

【No.5 类型转换导致的错误】

【注意】 程序语言只是我们与计算机交流并让计算机实现我们创造性思想的工具,可以并鼓励深入掌握一门语言,但千万别沉迷于钻某种语言的牛角尖,一定要把握好二者间的度本帖属不定时连载贴,以试卷的形式提出一个比较基础的问题供大家…

小学AI教材终于来了,下一步是AI胎教吗?

小学生终于也要学 AI 了!据澎湃新闻报道,全国首套涵盖了从小学到高中的人工智能教材近日在上海正式发布,这套“AI上未来智造者”丛书计划出版 10 册,目前已出版 6 册,分别为《AI上神奇动物》、《AI上智慧生活》《AI在变…

快过年了,博客园里的文章也变少了

快过年了,博客园里的文章也变少了,大家都开始休息了吗?转载于:https://www.cnblogs.com/RobotTech/archive/2008/02/03/1063461.html

字符串多模式精确匹配(脏字/敏感词汇/关键字过滤算法)——TTMP算法 之实战F模式...

前面那么多篇文章都太抽象,这次来一个稍微实际一点的。F模式是我实际上选用的模式,对该模式我做了不少实际的测试,因此代码也算是比较稳定的。不过由于实际上为了得到该算法的效率,算法本身做了一些优化,对于初学者&am…

深入java_深入Java Final

JAVA关键字final用于修饰数据、方法或类,通常意味着“无法改变的”,既数据不能改变,方法不能覆盖,类不能继承。一般采用final有两种原因:设计和效率。而随着JAVA版本的更新,一些效率上的问题可以交由编译器…

盛会再临,2018中国大数据技术大会(BDTC)首曝日程及议题

满目皆干货,俯仰尽拾珠。作为年度技术趋势与行业应用的风向标,连续成功举办十一年的中国大数据技术大会(BDTC)携主题“大数据新应用”再度强势来袭,稳踏技术时代浪潮,势将引爆今冬技术圈。 数据&#xff0c…

Linux下修改MAC地址总结

偶尔会用到这个知识点,久了不用又会记不住,所以记之,方便以后查询。 Linux下修改MAC地址 方法一: 1.关闭网卡设备 ifconfig eth0 down 2.修改MAC地址 ifconfig eth0 hw ether MAC地址 3.重启网卡 ifconfig eth0 up 或者将以上内容…