文档章节

Guetzli:谷歌家的东西可能也没有想像的辣么美

腾讯云开发者社区
 腾讯云开发者社区
发布于 2017/03/29 12:17
字数 1866
阅读 368
收藏 0

望昕宇,腾讯后台工程师,专注图片压缩及存储系统一百年不动摇,并致力于做一名相关前沿技术的人话翻译家。

这两天笔者的朋友圈被Google开源JPEG编码器Guetzli刷屏,“图片大小减小35%”、“质量不变”这样的字眼刺激了我们的肾上腺,OMG的yajunwang同学也为我们带来了第一手的测试资料——谷歌开源图片压缩算法Guetzli实测体验报告

如果这样的神器真的如此神,那还有WebP啥事儿呢。于是我们抱着强烈的好奇心实地考察了这个连名字都不知道怎么念的新鲜事物。

结论是:

  1. 在基于相同客观质量(以ssim为评价标准)的条件下观察主观视觉效果,Guetzli的优势是有效改善了传统JPEG在低质量条件下“振铃效应”产生的伪影;劣势是Guetzli编码出的图片在质量较低时(quality=70)有一定的“钝化效应”,对于图片中细节精细的部分,Guetzli丢掉了较多的信息。

  2. 同样基于相同客观质量条件下(并不以填的quality参数为标准,为什么不以它为标准参见“原理解析”小节)图片大小与传统jpg相比并无明显优势。400300组Guetzli大概比传统jpg的编码结果减小了19%,800600组Guetzli和传统jpg基本持平,1920*1080组Guetzli反而大出了10%。

  3. 延时方面,Guetzli编码器对于主流的非高清图规格(如400300, 800600)的处理延时在秒级或10+秒级,业务主流jpg压缩工具对于相同规格的处理延时均在50ms以内

原理解析:

Guetzli基于同样来源于google的图片视觉差异评价工具Butteraugli。Butteraugli的评价体系基于三个传统方法没有考虑的原则:

  • 人眼对强黄色光附近蓝光变化是不敏感的,因此黄光区域附近的蓝光可以用更少的bit来编码

  • 人眼对蓝光有着较低的空间分辨率,视网膜中用于分辨高清细节的区域没有蓝色光的受体,故高频区域的蓝色光部分可以用更粗的粒度编码。

  • 将图像中的噪声区域分辨出来进行粗粒度的编码。

基于这三点,Guetzli主要从两方面下手来进行:

  1. 对全局量化表进行微调,这一步和我们调整质量参数本质上是一样的

  2. 对DCT系数的高频部分进行有选择的丢弃。

第二步就比较tricky了。通常在我们使用例如libjpeg等工具压缩jpg图片时降低质量参数本质上就是在量化步骤按照一定规则丢弃高频信息,最终反映在jpg的quality中。Guetzli相当于绕开了制定好的量化规则降低了质量而且不告诉用户,让用户以为仍然保持了质量(怎么感觉google也有了一点流氓气质呢,2333)。所以在后续测试中我们发现,**在相同ssim条件下,传统jpg的质量参数可以比Guetzli编码出来的jpg低大约20个点。**原因主要就在这里。

Guetzli总的处理流程是尝试多种量化表及DCT系数两个方面的可能性,然后分别将尝试的结果放到Butteraugli评测工具中评分,最后选择一张它认为最好的结果返回给用户。所以它的处理时延特别长。用verbose参数打开Guetzli的log可以发现,平均一张图大概它将尝试接近30次的迭代。

测试样本:

分别选取400300, 800600, 19201080三种分辨率的jpg格式图片各10张(本来还选取了40323024的iPhone照片分辨率图片做测试,但是由于时间有限,这部分待后续进行)。三种分辨率的图片在选取的过程中综合考虑主色调的不同、明暗灰度的不同、场景的不同(人工合成的图片还是自然风景照)以考察该编码是否尽可能多的适用于不同场景。

测试场景及指标:

该编码器有quality参数可以指定,注释掉对于quality必须大于84部分的代码之后可以设置0-100任意值,经过第一轮初步测试发现,quality<70 以下的时候其实编码出的图片已经没有变化(为什么还需要进一步研究),故实际选取 quality 70, 75, 80, 85, 90为测试对象。从编码时延、同psnr(ssim)指标下图片size的对比以及视觉效果还有内存消耗四个方面进行评估。

测试环境及工具:

C1机型:Intel Xeon CPU E3-1230 V2 3.30GHz

测试工具:ImageMagick、Guetzli编码器、evalvid视频质量评价工具集

测试结果:

时延、内存消耗、带宽节省

SSIM检测

检测方法是首先分别用ImageMagick和Guetzli分别用40-90的quality参数进行重新解码和编码,然后对每个质量的结果图与原图分别解码成yuv源数据格式,最后用evalvid视频质量评测工具集中的psnr工具进行ssim评测,框架图可表示为:

当我们设定了以ssim1=ssim2为标准时候反过来再观察两种编码工具各自设定的quality值。经过统计发现,传统jpg的质量比Guetzli的质量平均大约小21。举个例子也就是说,传统jpg的50质量和Guetzli编码器的70质量在客观质量评价体系当中是等价的。

同ssim下图片大小对比:

应用场景的思考

Guetzli编码器本质上弱化了quality参数在编码流程中的作用,可以比喻为jpg编码界的“小米”,其效果类似于加强版的七牛图片“瘦身”功能。

因此对于图片细节要求不高且对图片质量不甚了解的用户或者当面对一个业务因为需要节省流量同时又不希望图片质量受太大影响而对质量参数选择困难时,Guetzli是一个不错的入门选择。从流程方面看,多次的迭代以及新的评价工具的加入是延时过长的主要原因,也许利用GPU并行化会是一个不错的优化方向。


相关推荐:

谷歌开源图片压缩算法Guetzli实测体验报告 图片流量节省大杀器:基于CDN的sharpP自适应图片技术实践 【腾讯云的1001种玩法】 Laravel 整合万向优图图片管理能力,打造高效图片处理服务


阅读原文,本文由腾云阁授权发布,经社区允许后方可转载。更多技术文章,请访问腾云阁

© 著作权归作者所有

腾讯云开发者社区
粉丝 180
博文 246
码字总数 661360
作品 0
深圳
私信 提问
谷歌开源图片压缩算法Guetzli实测体验报告

作者 | 王亚军 编辑 宋秉金 王亚军,腾讯工程师,负责OMG无线新闻、腾讯视频图片服务等的业务运维工作。 阅读原文,更多技术干货,请访问腾云阁。 ----- 谷歌大神又出开源新技术啦,这次是对...

腾讯云开发者社区
2017/03/21
0
0
[翻译]图像技术新闻: Xamarin Kimono, Google Guetzli和Draco

原文链接:https://www.infoq.com/news/2017/03/kimono-guetzli-draco?utmsource=infoq&utmcampaign=userpage&utm_medium=link InfoQ中文翻译:http://www.infoq.com/cn/news/2017/03/kimono......

EchoZhou
2017/04/05
0
0
ubuntu 安装 guetzli

1.从github上下载guetzli下载源码, 下载后改名为guetzli 2.Ubuntu 命令行 执行 apt-get install libpng-dev(libpng12-dev) 3.进入到source code 目录 , cd guetzli, 执行make 命令 4.执行成...

Alex142857
2018/04/04
0
0
Google 开源图像算法工具 Guetzli,高质量压缩图片

Google 又开源了,这次开源了一款图像算法工具 Guetzli。Guetzli,在瑞士德语中是“cookie(曲奇)”的意思,是一个针对数码图像和网页图像的 JPEG 编码器,能够通过产生更小的 JPEG 文件来达...

王练
2017/03/17
18.1K
37
高质量压缩图片算法工具--Guetzli

Guetzli,在瑞士德语中是“cookie(曲奇)”的意思,是一个针对数码图像和网页图像的 JPEG 编码器,能够通过产生更小的 JPEG 文件来达到更快的在线体验,并且同时保持与当前浏览器,图像处理...

匿名
2017/03/17
4.9K
4

没有更多内容

加载失败,请刷新页面

加载更多

搭建tftp服务

前言: 最近整理一些以前的学习笔记。 过去都是存储在本地,此次传到网络留待备用。 TFTP服务: TFTP:Trivial File Transfer Protocol 不重要文件传输协议 主要用来传送小文件,不支持认证和...

迷失De挣扎
今天
3
0
rest 的理解

rest:表现层状态转移。 什么是restful协议?https://en.wikipedia.org/wiki/Representational_state_transfer 使用restful的好处。 Rest是一种体系结构样式,他定义了一组用于创建web服务的...

xiaoxiao_go
今天
5
0
聊聊spring cloud的CachingSpringLoadBalancerFactory

序 本文主要研究一下spring cloud的CachingSpringLoadBalancerFactory CachingSpringLoadBalancerFactory spring-cloud-openfeign-core-2.2.0.M1-sources.jar!/org/springframework/cloud/o......

go4it
昨天
4
0
一篇文章搞定——JDK8中新增的StampedLock

一、StampedLock类简介 StampedLock类,在JDK1.8时引入,是对读写锁ReentrantReadWriteLock的增强,该类提供了一些功能,优化了读锁、写锁的访问,同时使读写锁之间可以互相转换,更细粒度控...

须臾之余
昨天
5
0
Android Camera原理之CameraDeviceCallbacks回调模块

在讲解《Android Camera原理之openCamera模块(二)》一文的时候提到了CameraDeviceCallbacks回调,当时没有详细展开,本文我们详细展开讲解一下。 CameraDeviceCallbacks生成过程: 《Android...

天王盖地虎626
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部