微信号:infoqchina

介绍:有内容的技术社区媒体

Q新闻丨Google发布新的图像压缩技术,最高可节省75%带宽;Java 9引入了aot编译方式;人工智能将如何帮助软

2017-01-21 09:02 Q新闻
编辑|小智
本周要闻:Google发布新的图像压缩技术,最高可节省75%带宽;Java 9引入了aot编译方式,能够将class文件直接编译成可执行二进制文件;人工智能将如何帮助软件团队?
Google发布新的图像压缩技术,最高可节省75%带宽

在社交网络上,每天都有难以计数的图片被人们分享、存储。但有一个现实的问题是,大量的照片由于网络限制被人为压缩降低了画质。

而Apple在2010年的iPhone 4S推出了“视网膜”的概念后,各大手机商也推出了2K的手机,显示器也逐步走向了4K。但是高清显示一直缺乏内容,成了该行业发展的痛点。因为超分辨率技术受成本、硬件限制,未能广为普及。将低分辨率图片转化为高清版本,并可在多种设备上查看和分享,成了市场巨大的需求。

如今,Google为了解决这一痛点,发布了黑科技,让人们看到了希望。

Google发布RAISR技术

不久前,Google刚刚发布了一种名为RAISR(Rapid and Accurate Super Image Resolution,意为“快速、精确的超级图像分辨率技术”)的图像压缩技术,旨在保存宝贵的数据,而不牺牲照片质量;并在带宽受限的移动设备上提供清晰锐利的图像。

https://research.googleblog.com/2016/11/enhance-raisr-sharp-images-with-machine.html

Google声称,该技术可以降低高达75%的带宽,RAISR分析同一图像的低分辨率和高分辨率版本,了解到高分辨率版本出众的原因,然后在低分辨率版本模拟出来。实际上就是使用机器学习创建一个类似Instagram的过滤器,欺骗你的眼睛,让你相信低分辨率与高分辨率图像是一致的。

RAISR的现状与未来

登陆Google+

早在2016年11月,Google已经将RAISR技术研发完成,希望可以在带宽有限的移动端上展现高清图片。

上周,即2017年1月中,这项技术已经应用于大多数Google+ 的Android版。Google产品经理John Nack声称,RAISR在Google+上每周处理超过10亿张图片,将这些用户的总带宽节省了约三分之一。

John Nack表示,当使用Android移动设备的用户观看Google+的图片时,Google+会发送一张仅为原图片大小的四分之一的版本,再通过RAISR算法来修复细节。最高时,RAISR可以为用户节省了大约75%的带宽。

iOS端早有集成

早在2016年12月,Google在自家的iOS应用Motion Stills就已经集成了RAISR技术,这其实才是RAISR的首次亮相。彼时,RAISR来改善视频的分辨率,可以自动锐化用户导出的每段视频。

不过,目前尚不清楚具体何时会在iOS移动设备上为用户访问Google+时提供RAISR技术。Nack表示,Google将在未来几周内普及到iOS领域上。

下一个应用会是?

如果用户不想仅仅在Google+中使用RAISR,还得等一段时间。Google计划在未来几个月内将RAISR逐步部署到更多的应用,比如Google Photos。

RAISR实现原理:机器学习、无混叠效应

Google的这项黑技术利用了机器学习,它的效果能达到甚至超过现在的超分辨率解决方案,同时速度提升10~100倍,还能够在普通的移动设备上运行。Google还声称,他们的技术能够避免在重建低分辨率图像中产生混叠效应(aliasing artifacts)。

在“填充”图片时,传统的升采样技术是通过周围已有的像素值计算需要添加的新像素值。这些方法速度很快,但它们并不是在放大图像中显示生动的细节的最好方法。如下所示图片,左图是原始图片,右图是经升采样处理后的图片,看起来很模糊,远不能称之为画质提升。

RAISR与它们不同之处在于,它采用了机器学习,用一对低品质和高分辨率图片进行训练的系统,因此它知道如何重建应用于低分辨率图片中的每个像素的过滤器,生成媲美原始图片的细节。RAISR选择最佳方式来增强低分辨率照片中的每个“像素邻域”,以创建更多的分辨率。

换句话说,RAISR使用它从其他照片中学到的东西,以便有根据地猜测每个丢失像素区域中的高分辨率版本应该是什么样子。

Google表示:“当这些过滤器应用于较低分辨率的图像时,它们会重现出相当于原始分辨率的细节,这大幅优于现行、双三(Bicubic)、兰索斯(Lancos)的解析方式。”

上图是原始图片,下图是经RAISR放大后的图片。

左图是原始图片,右图是经RAISR放大后的效果。

以下是RAISR与Bicubic比较的一组示例:

左边为Bicubic处理的图片,右边为RAISR处理的图片。

此外,RAISR可以消除照片中的混叠效应,如莫尔条纹(Moire patterns)和锯齿,恢复照片的原始结构。

如下图,左边是低分辨率的原始图片,3和5都有很明显的莫尔条纹,这就是混叠效应;右图是用RAISR算法恢复的图像。

左图为原始图像,右图为RAISR消除莫尔条纹的图片

Google声称,这种技术在未来,除了放大手机上的图片,还可以在低分辨率和超高清捕捉、存储、传输图像,使用更少的移动网络数据和存储空间,而且不会产生肉眼能观察到的画质降低。

本文编译:刘志勇

Java 9 引入 AOT 编译方式

Java 9引入了aot编译方式,能够将class文件直接编译成可执行二进制文件。目前Java 9的early access版本已经提供了编译工具,让我们来看看它的功能吧。

注意:按照JEP 295描述,目前版本的AOT,仅支持64位Linux操作系统。

jaotc使用

首先需要下载最新的Java 9(JDK),本文编写时,最新版本是Build 152。下载好的JDK只需要解压即可使用,特别注意使用前设置好PATH和JAVA_HOME两个环境变量,避免和机器上已经安装的JDK混淆。笔者安装到了$HOME/bin/jdk-9,并设置了:

export PATH=~/bin/jdk-9/bin:$PATH
export JAVA_HOME=~/bin/jdk-9

需要使用jaotc,首先需要有个测试类,首先从Hello World开始:


代码非常简单,但是在执行jaotc之前,还需要将其编译成class文件,直接使用javac即可:

$ javac HelloWorld.java

执行成功之后,会生成HelloWorld.class文件。此时直接使用java命令,已经可以正常运行这个类:

$ java HelloWorld 
Hello World!

这时,就可以基于这个class文件,通过jaotc命令将其编译成二进制文件了。


如果一切正常,会生成libHelloWorld.so文件。

如果出现类似

Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/babydragon/bin/jdk-9/lib/libjelfshim.so: libelf.so.1: 无法打开共享对象文件: 没有那个文件或目录的错误,

是因为jaotc需要依赖libelf动态链接库来创建elf文件(最终生成的libHelloWorld.so文件是一个静态链接的elf文件)。笔者使用的是Gentoo系统,需要安装dev-libs/elfutils包,以提供libelf.so这个动态连接库。安装之后可以通过ldd命令进行确认:


前面通过jaotc命令成功生成了libHelloWorld.so。虽然命令里面参照JEP 295的示例将生成的文件后缀设置成了so,但如果使用ldd命令查看,会发现它其实是一个静态链接库:

$ ldd libHelloWorld.so 
    statically linked

通过nm命令,可以看见代码段中的函数入口:


最后,需要执行时需要通过参数-XX:AOTLibrary参数指定需要加载的经过aot预编译好的共享库文件:


注意:虽然已经将整个HelloWorld类都通过jaotc编译成共享库文件,运行时仍然需要依赖原有的HelloWorld.class文件。

此时执行的输出,和之前不使用AOT的输出完全相同。

来把大的——将java.base模块编译成AOT库

JEP 295中已经说明,在Java 9初始发布的时候,只保证java.base模块可以被编译成AOT库。

继续参照JEP 295,创建java.base-list.txt文件,内容主要是排除一些编译有问题的方法,具体内容参照原文。

然后执行命令:


在笔者的机器上(i7-6600U + 16G内存 + 256G NVMe SSD),排除上述方法之后,编译时间大约为9分多钟。


完成之后,就可以使用AOT版本的java.base模块:


同样,针对AOT,jvm也新增了参数打印哪些方法是通过加载AOT预编译库执行。


输出可以和不使用java.base的AOT进行比较,发现不使用java.base的AOT库,只能会加载libHelloWorld.so中对应的方法。



输出太长,节选部分输出,我们可以看见java基础类及其方法都通过AOT的方式进行加载。

实用吗?

目前AOT的局限有:

  • 仅支持64位Linux操作系统:这个问题不是很大,毕竟大部分线上服务器都能够满足;

  • 操作系统需要预装libelf库,以确保能够生成elf文件:这个问题也不大,仅生成时需要;

  • AOT编译和执行环境需要相同:毕竟是二进制文件,引入了平台相关性;

  • Java 9最初发布时,只支持java.base模块可以编译成AOT库;

  • 目前只支持G1和Parallel GC两种GC方式:前面没有提到,AOT编译时的JVM参数和运行时需要相同,也包括GC方式,也就是说如果用了AOT,JVM实际运行时也只能使用这两种GC方式之一;

  • 可能会无法编译通过动态生成class文件或者修改字节码的java代码(如lambda表达式、反射调用等):这个可能会比较坑,后面会讲到;

  • JVM运行时参数设置必须和AOT库编译时相同;

AOT可能带来的好处,是JVM加载这些已经预编译成二进制库之后,可以直接调用,而无需再将其运行时编译成二进制码。理论上,AOT的方式,可以减少JIT带来的预热时间,减少Java应用长期给人带来的“第一次运行慢”感觉。

不过,本文使用的HelloWorld过于简单,无法通过对比得出AOT是否可以减少JVM初始化时间。笔者尝试对一个小型springboot应用进行AOT化,但是springboot框架本身无法在Java 9中运行。同时直接对spring-core的jar包执行jaotc也因为各种依赖问题而失败。

经过各种尝试,目前Java 9的AOT功能还处于很初步的阶段:

  • 缺少maven等管理工具集成,无法方便的对项目指定jar或者class文件比构建AOT库;

  • 大型框架还没有官方支持,构建AOT库难度比较高;

  • 大型框架如果直接提供AOT库,可能会因为由特定平台构建,而在本地无法使用;

期待Java 9正式发布的时候,能够对AOT有更好的支持。

本文作者:金灵杰

人工智能将如何帮助软件团队

在未来 5-10 年内你的工作仍然是你自己在做,还是一个机器人在帮你做?

随着人工智能(以下简称 AI )能力越来越大并被广泛利用,知识工作者开始问自己这个问题。Atlassian 的创始人和首席执行官 Mike Cannon Brookes 说过,AI 将对团队生产力的未来发挥重大作用。现在,让我们来看看是为什么。

AI的突飞猛进

美国美林(Merrill Lynch)银行预测,在未来的十年里将会有 9 万亿美元的 AI 业务会影响知识性工作。麦肯锡(McKinsey)全球研究所说,AI 正以“3000次工业革命影响”的速度在推动着社会的转型。CB Insights 分析显示 AI 公司的投入资金正在逐年增长。总体趋势和现实结果表明,AI 和机器人不能再被当成空谈而忽略。

我们不应该惧怕 AI,它带给我们的机会是去拥抱它的潜力,让我们的组织拥有全新的运作方式,使我们能够在更高价值的活动中应用自己的知识。

了解AI业务

我们有两个基本的途径来了解 AI 的世界:通用人工智能(General AI 或 AGI)和狭义人工智能(Narrow AI)。狭义 AI 指的是利用机器来智能地解决具体问题,而通用 AI 是指一台或一组机器拥有人类完整的认知能力。与科幻电影描绘不同的是,通用 AI 还有很长的路要走。

通用 AI 面临的挑战

通用 AI 的主要挑战是,我们并不完全了解什么是意识。当代哲学家们的思想已经超越了笛卡尔的身心观,认识到意识是由我们的大脑所产生。但是,像神经科学家或其他一些人一样,我们仍然不理解它是什么,更不用说如何创造它了。

我们没有硬件,但是:未来学家 Ray Kurtzweil 预测说模拟人类智慧所需要的硬件在2020年就能以合适的价格出现。

我们没有软件,但是:AlphaGo 在复杂的游戏中获得胜利,这件事令人印象深刻,还有的计算机对语言的理解比人类还准确,听起来都棒极了,而这些只是在复杂难题里需要解决的一些小碎片而已。

举个例子,OpenWorm项目已经开始模拟像蠕虫一样简单的生物。尽管对蠕虫的了解(蠕虫模拟)逐渐深入,但还是存在很多问题,比如怎样创造它,而造出来的蠕虫智力很有限。所以还需要很多研究时间,直到最后不得不考虑 AI 的奇点是否出现,或者像终结者(Terminator )粉丝一样担心天网(Skynet)问题。

狭义 AI

另一方面,狭义 AI 已经对我们带来了冲击,并且迅速蔓延到很多领域。多年来它一直在影响我们的日常生活,比如股票购买得到一些建议,或者亚马逊上被推荐一本书。狭义 AI 一直给我们提供有价值的东西,它通过大而结构化的数据集来解决那些有明确的结果或规则的问题,现在 AI 的发展已经超越了这些领域。

AI、机器人、团队和管理

机器人和 AI 辅助并参与团队活动的可能性越来越大,背后的关键驱动力是:

数据是可访问的

软件的构造过程中,会产生开发任务、程序问题、日志、源代码、测试结果等等很多信息,所有数据会存放在系统的某些地方。利用 API 、插件、基于云的方式,可以让系统间的这些数据访问越来越方便。

数据杂乱

团队使用的数据是杂乱的,这不是任何人的错,这是由工作的性质所决定。当一个团队在运转时(总是这样的),由于时间限制和发布压力,很难找到时间来清理数据。但是因为非结构化数据处理能力的进步,如今这些不一定是个问题了。

数据足够大

相对于亚马逊、脸谱、Google庞大的数据集,大多数团队的数据量是非常小的。一个团队通常只有几十或几百个任务,较大一点的甚至有几千个任务,但从统计意义上来说,还是很小。而小规模数据集上的算法优化,使得狭义 AI 能为团队带来有意义的结果。

团队过程标准化

世界各地的、不同组织的大多数团队,它们的工作过程和方法在本质上是相似的。普遍存在的敏捷软件开发团队就是这方面的一个例子。狭义 AI 的含义是,对很多人而言它容易使用并且更有价值。通过标准化,意味着有机会将跨组织的数据合并成更大的数据集。

生产力提高降低误差

算法不断在发展,虽然仍然存在误差。但是通过成本的降低、速度的提高、或者理解的深入,发展所带来的好处都要大于那些缺陷、误差以及一些聊天机器人目前在狭义 AI 上的烦恼。

结论

AI 能有助于团队发展,这样团队效率会更高,他们会做出更好的决策,能够专注于更高价值的活动。所以不要害怕机器人,让它们成为你日常工作的一部分,来完成更多的事情。

本文翻译已获授权,原文链接:

http://blogs.atlassian.com/2016/11/ai-transforming-work-software-teams/

本文译者:杨雷

今日荐文

点击下方图片即可阅读

阿里9年,我总结的前端架构演进3大阶段及团队管理心法


 
InfoQ 更多文章 Q新闻丨Google发布新的图像压缩技术,最高可节省75%带宽;Java 9引入了aot编译方式;人工智能将如何帮助软 阿里9年,我总结的前端架构演进3大阶段及团队管理心法 实战案例解析:去哪儿网支付系统架构演进全历程 Go语言的垃圾回收算法被吹过头了?与Java相比如何? 腾讯集团副总裁姚星谈AI:真实的希望与隐忧
猜您喜欢 一斤毛豆 认真生活的人值得被认真对待 从函数式的角度重看GOF设计模式(二) 远程会话管理神器screen 【CVPR2016论文快讯】细粒度视觉分类的最新进展