云布道师
一图抵千文,因此很多的应用都会用图片来表现丰富的内容。提起图片格式,大家耳熟能详的有 JPEG,PNG,WEBP 等等,这也是当前互联网上主流的图片格式,然而在过去的十年,随着技术的发展,图片的压缩技术又取得了长足的进步,新的图片格式已经涌现,使用这些传统的图片格式已经不再是最优的选择。
图片格式的进化
在过去的 10 年移动互联网快速发展,使网络速度越来越快,但是手机的摄像头分辨率也越来越高,用户手机的 UGC 图片都在 10MB 左右。不管是在 PC 还是移动端,图片(及视频)占据了流量的比例比重越来越大,应用提供商为图片传输的流量的成本也越来越高。如何让图片在保证质量的前提下缩小图片体积,是一件值得探索的事,如下图所示,随着图像压缩算法的不断升级迭代,图像的压缩率也不断提高。
主流图片格式中目前最为先进的是苹果主推的 HEIC 格式和谷歌领衔的 AVIF 格式,相对于 JPEG 格式在保持图片质量不变的情况下,有 60%~80% 的体积节省,能够大大节省各级网络的流量成本,同时在弱网环境下也能够极大提高用户体验。HEIC 图片格式采用的是 HEVC 编码标准的帧内编码技术。它是在 2015 年制定的图片格式标准,相比于 JPEG 图片格式压缩率提高了 60% 以上。目前在业界已经得到了比较广泛的应用,生态比较完善,苹果手机相机的默认保存格式是 HEIC 格式,且提供了 HEIC 的硬件解码,Android 9 系统也已经原生支持了 HEIC 的解码,另外还有丰富的成熟开源软件 HEVC 解码器比如 libhevc,libde265 等等,现在美中不足的是主流浏览器的 HEIC 解码支持还比较欠缺。AVIF 图片格式采用的是 AV1 编码标准的帧内编码技术,在 HEIC 格式的基础上进一步提高了 10% 左右的压缩率。2015 年 Google 联合亚马逊、微软、Intel 等成立了 Alliance for Open Media(开放媒体联盟 AOM),旨在制定全新、开放、免版权费的视频编码标准和视频格式,AV1 是开放媒体联盟推出的第一代视频标准。2019 年基于 AV1 技术的图片格式 AVIF 也正式推出,具有高压缩比,免授权费,生态完善等特点。AVIF 标准得到了 Google 的强力推广和支持,虽然它诞生的时间不久,但 Chrome 和 Android 平台上都已经原生支持。在软件解码器上,Google 开源了 libgav1,支持 ARM 平台和 x86 平台,解码效率上已经接近 HEIC 甚至 WEBP,未来移动端上会有更好的体验。鉴于 Chrome 浏览器的原生支持,其他的浏览器也不断的跟随支持 AVIF 标准。以下是 AVIF 目前在主流浏览器的原生支持情况,相信在不久的将来,绝大多数浏览器也会原生支持 AVIF 了。
图片来源:https://caniuse.com/?search=avif
HEIC & AVIF 应用难点
HEIC 和 AVIF 格式具有很出色的压缩能力,但是目前图片分发应用在使用这两种新格式的时候,会面临一些挑战。首先是算力上的挑战,根据算法两者的算法复杂度我们做简单的测算,同样的一张图片,HEIC、AVIF 压缩算法的计算量分别是 JPEG 压缩算法的 300 倍和 1500 倍,如下图所示:从计算成本的角度上考虑,一台普通的 CPU 服务器,满载运行 HEIC 或者 AVIF 编码,只能够达到数百 QPS,计算成本非常高,如果图片编码后被分发的次数不够多,计算成本的上升甚至可能超过流量节省带来的成本下降。从编码延迟的角度来看,由于计算量非常庞大,所以对于大尺寸的图片,进行 HEIC 或者 AVIF 编码一张图片可能需要数秒的时间,在某些场景下,这样的延迟会导致用户体验下降。其次还有解码上的挑战,由于目前 HEIC 和 AVIF 属于比较新的格式,在生态上还没有做到能够原生百分百支持,在客户端使用老版本系统的环境下,没有好的解码工具能够方便的进行集成到应用中实现对 HEIC 或 AVIF 的解码显示,使用开源的工具去解码又会有一定的开发和维护成本。需要有一个高性能的解码库来满足这个需求。阿里云智能存储图片服务团队针对算力和解码上的挑战,设计研发了 HEIC & AVIF 高级压缩解决方案,通过一系列软硬件结合的优化,优化了计算效率,使得编码性能大幅度提高,编解码延迟下降显著,效率提升了近百倍,并在图片解码上进行了计算逻辑与汇编的优化,提供了高性能解码 SDK 来方便客户在端侧接入。我们把这套方案集成到了 OSS 服务上,在最靠近数据的地方做了数据压缩,以 Serverless 化的能力提供端到端的解决方案。图片服务介绍
OSS 图片服务是提供的 Serverless 化的图片处理能力,是对存储在 OSS 上的各种格式的图片,提供实时压缩转化(低压缩编码转化成高压缩编码互转,如 JPEG 和 AVIF 格式互转)、缩放裁剪、打水印、质量变换、模糊等图片变换操作,变换后结果从 OSS 请求链接实时返回结果。如下图所示,用户请求只要在原图 url 后添加 x-oss-process 相关不同图片变换参数,直接返回处理后的结果。这种在存储数据源头进行处理的架构有很大的成本优势,相比传统的从 OSS 读取原图在客户自建图片后端进行处理,首先客户不需要进行自建图片服务后端,节省了大量的服务器和运维费用,其次处理后的图片在多数场景下也会比原图体积小,这样各级网络的带宽成本也能够得到较大的降低。这个天然的优势也使得图片服务在电商,IM,社区等客户场景得到了广泛的应用,日调用量达到数百亿次。
FPGA 异构计算方案
前文提到 HEIC 或 AVIF 编码时计算量过高,如果使用纯 CPU 的方案来处理这种计算密集型任务,成本过高且延迟很不理想,在经过了仔细的评估和规划之后,智能存储图片处理团队推出了一种更为先进的 FPGA 异构计算方案,使用 FPGA 加速板卡和 CPU 进行协作,如下图所示,把一些计算密集的负载较大的任务使用 FPGA 做了加速,其他轻量级的处理、调度控制和业务逻辑放在 host CPU 上的软件进行处理。典型的图片处理的流程是先对原图进行解码,对解码后的原始图像按需进行缩放,水印,裁剪等按需处理,之后再将处理好的图像进行目标格式编码压缩,对线上场景的分析我们发现除了编码过程会耗费较高算力之外,缩放和解码也会成为制约单机性能的瓶颈,我们将编码、解码、缩放都 offload 到了 FPGA 上进行处理,获得了非常好的加速效果,下面我们分别简单介绍一下 FPGA 上的主要模块。 JPEG Decoder 模块
图片处理 Pipeline 的第一步是对原图进行解码,在目前的业务场景里,绝大部分的原图格式是 JPEG 格式,所以 JPEG 解码也占用了可观的 CPU 使用比例,是整体服务的速度瓶颈之一。另外考虑到解码过后的 YUV 原始数据体积较大,在 CPU 和 FPGA 进行传输会对 PCIE 带宽造成较大压力,把解码过程放在 FPGA 上可以有效减少 PCIE 的带宽占用。我们实现了一个 JPEG Decoder 的 IP,采用硬件 JPEG Decoder 之后,我们整体的处理能力较软件版本 JPEG 上升了一倍。以下是 JPEG Decoder 模块的架构图:
JPEG Decoder 设计的一大重点在于解码兼容性和硬件面积的考量,JPEG 标准中的 feature 如果全部实现会导致硬件面积占用高且影响整体系统工作频率,我们实现了 JPEG 标准中比较主流的 feature,对于比较冷门的 feature 去做 CPU 软件降级处理。另一个设计重点是 JPEG Decoder 的容错机制,原图损坏可能会导致 HuffmanDecoder 模块进入挂死状态,甚至影响整个系统,我们通过 timeout 机制和错误识别机制对这种情况进行了规避,自项目上线以来服务了海量的图片处理,完美规避了线上的所有 bad case。 RESIZE 模块
在图片转码处理中,对图像进行缩放是业务上的一个很强的需求。高质量的缩放算法,需要比较大的滤波器抽头数,从而对 CPU 算力是一个很大的挑战,如果不进行加速处理,要么整体系统就达不到较理想的 QPS 目标,要么就采用比较低的抽头数进行处理,但缩放后的图像的主观质量会受到很大影响。经过实测,有了硬件 RESIZE 加持,整体 QPS 较软件版本 RESIZE 提高了一倍。该模块采用软硬件协同设计,image_service 端也即 CPU Host 发送原图 YUV 信息,以及 Controls 控制信息至 FPGA 板卡。FPGA 板卡触对应 kernel 进行处理,输出降采后的 YUV 信息并发送至 host 端。以下是 RESIZE 的实现架构图。
RESIZE 的计算逻辑是由纵向和横向的两组多抽头滤波器组成,该滤波器具有较高的抽头数。能够有效克服较高倍数缩小下的图像频域混叠问题。 Image Encoder 模块
Image Encoder 负责图片服务的编码压缩部分,是整个图片处理 pipeline 的最大计算热点。经测试对比,较纯软件的方法,集成硬件 Image Encoder 使得单机处理能力提高了 15 倍。我们以 AVIF Encoder 为例进行介绍。以下是 AVIF 编码核的硬件架构图:
AVIF 编码模块是实现压缩质量和压缩速度核心的关键,因为需要极高的算力,也就意味着需要极高的频率和硬件资源。为了达到极致的压缩质量和处理速度,我们的 AVIF 编码 IP 做了算法和工程上的多处优化,并且采用了手写 RTL 的设计流程,仅 RTL 代码有十几万行。我们在硬件实现的每个细节上都做到了极致的性能和面积优化,核心的逻辑工作在 FPGA 的工作频率物理极限。在每处关键路径设计时不仅要考虑自身时序收敛问题,而且还要把控对整体布局布线的影响,也要兼顾对 RESIZE 和 JPEG 等模块的时序影响,充分利用硬件资源、工作频率和标准中带来较多增益的工具。整体上 AVIF 硬件版上的压缩率在当前主流的图片格式中最高,联合 WEBP、HEIC 和 x265 平行对比,结果如图。下表给出了 HEIC_FPGA,AVIF_FPGA 在 HEVC 标准测试下的压缩性能的比较,anchor为 x265 placebo (tune psnr)档次,码率的节省采用 BDBR 计算得到;从上表可以看出,我们研发的 HEIC_FPGA 和 AVIF_FPGA 编码服务在平均压缩性能上都超过 x265 placebo (tune psnr)的压缩性能,其中 AVIF_FPGA 编码较 x265 placebo (tune psnr)的码率节省平均在 15% 以上。
云侧
AVIF 压缩功能使用起来简单方便,可以通过文件 URL 请求 OSS 图片时同步完成图片处理和转换格式,以 AVIF 为例只需只需在 GetObject 请求中带上 AVIF 的处理参数(x-oss-process=image/format,avif)即可,如下示例:原图 | http://image-compress-demo.oss-cn-zhangjiakou.aliyuncs.com/demo.jpg |
转换为AVIF | http://image-compress-demo.oss-cn-zhangjiakou.aliyuncs.com/demo.jpg?x-oss-process=image/format,avif |
转换为WEBP | http://image-compress-demo.oss-cn-zhangjiakou.aliyuncs.com/demo.jpg?x-oss-process=image/format,webp |
转换为HEIC | http://image-compress-demo.oss-cn-zhangjiakou.aliyuncs.com/demo.jpg?x-oss-process=image/format,heic |
如果用户已经在阿里云上面开通了 OSS,可以按照上面的说明使用 OSS 的图片处理。或者,也可以参考阿里云官方网站云起实验室实验《搭建基于 OSS 的图片分享网站》(地址:https://developer.aliyun.com/adc/scenario/90b2bceaf9954d6f8780f26a1c913385) 搭建图片分享网站,体验 OSS 的图片处理服务,欢迎大家点击文末“阅读原文”访问。 移动端解码 SDK 优化
为了降低用户的使用门槛,进一步提升用户的体验,阿里云还提供了对应的客户端侧的解码 SDK。它提供了用户友好的接口,在解码库上做了大量解码计算逻辑以及汇编的优化提升了解码性能,使得用户在占用更小的系统资源前提下进行解码。端侧 SDK 可以参考官网文档。目前图片压缩领域在三个方向上持续提升现有的压缩性能和用户体验:- 第一个方向是在传统的混合架构的图片压缩领域,比如 VVC,其I帧的压缩性能较 HEIC(HEVC)有 25% 的性能提升;
- 第二个方向是 AI 图片编码领域,CLIC 每年都会举办挑战赛,运用先进的技术挑战传统的图片压缩的性能,令人振奋的是目前的基于AI的图片压缩技术接近甚至是超过传统的压缩技术,提供更好的压缩性能;
- 第三个方向就是图片增强与主观编码领域,基于内容分析的图像增强技术配合基于人眼敏感度的主观压缩技术不仅能增强用户体验,而且还能提供更好的压缩性能。
阿里云智能存储图片服务团队致力于为用户提供更好的观看体验以及更低的带宽消耗,紧跟先进技术发展,不断挑战自我,持续为用户输出业内领先的、低成本高压缩、稳定可靠的图片处理压缩解决方案。近期还会推出极致主观图片压缩服务,敬请期待!欢迎关注加星标✨ 回复关键词可领取相关技术白皮书
随机抽取送技术图书 · 重大节日发放文创纪念品