图片格式的进化
一图抵千文,因此很多的应用都会用图片来表现丰富的内容。提起图片格式,大家耳熟能详的有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)即可,如下示例,
如果用户已经在阿里云上面开通了OSS,可以按照上面的说明使用OSS的图片处理。否则,也可以参考阿里云官方网站云起实验室实验《搭建基于OSS的图片分享网站》 搭建图片分享网站,体验OSS的图片处理服务。
移动端解码SDK优化
为了降低用户的使用门槛,进一步提升用户的体验,阿里云还提供了对应的客户端侧的解码SDK。它提供了用户友好的接口,在解码库上做了大量解码计算逻辑以及汇编的优化提升了解码性能,使得用户在占用更小的系统资源前提下进行解码。端侧SDK可以参考官网文档。
未来展望
目前图片压缩领域在三个方向上持续提升现有的压缩性能和用户体验,第一个方向是在传统的混合架构的图片压缩领域,比如VVC,其I帧的压缩性能较HEIC(HEVC)有25%的性能提升;第二个方向是AI图片编码领域,CLIC 每年都会举办挑战赛,运用先进的技术挑战传统的图片压缩的性能,令人振奋的是目前的基于AI的图片压缩技术接近甚至是超过传统的压缩技术,提供更好的压缩性能;第三个方向就是图片增强与主观编码领域,基于内容分析的图像增强技术配合基于人眼敏感度的主观压缩技术不仅能增强用户体验,而且还能提供更好的压缩性能。阿里云智能存储图片服务团队致力于为用户提供更好的观看体验以及更低的带宽消耗,紧跟先进技术发展,不断挑战自我,持续为用户输出业内领先的、低成本高压缩、稳定可靠的图片处理压缩解决方案。近期还会推出极致主观图片压缩服务,敬请期待!