作者|vivoInternetDatabaseTeam-李世海本文主要介绍无损图像压缩的一般流程和原理,以及前期研究Lepton无损压缩发现的问题和解决方案。1.从一场比赛开始1.1找出比赛中的不同点请拿出你的秒表和时间,在15秒内找出下图中的不同点。时间到了,你发现两张图的区别了吗?2、智者的成长在上面的游戏中,你可能看不出两张图有什么区别,其实一张是原图,jpg格式,3.7MB,一张是jpg,大小485KB格式压缩图片,只是大小不同。你可能有点生气,怨恨这是作弊,但你很聪明,很快脑子里就会冒出一连串的疑问。这些问号让你一层层揭开游戏的面纱。得到快乐。2.1为什么苏格拉底助产士的画比较小?丢失的信息去了哪里?为什么画质变差了,看不到了?我可以把它变小吗?我可以将它恢复到原来的大小吗?为什么要压缩我的图像?为什么上图变小了?图片从3.7MB变成了485KB,因为我用图片查看工具将原图另存为新图。在保存的过程中,有一个画质选择的参数。我选择了最低的质量,保存后生成。较小的图片。但是画质下降了,为什么看不到?这就需要了解图像压缩的原理。2.2探索表象背后的故事,利用人眼的弱点。人类视网膜中有两种类型的细胞,视锥细胞和视杆细胞。视锥细胞用于感知颜色,而视杆细胞用于感知亮度。与颜色相比,我们对明暗的感知更为明显。因此,可以压缩颜色信息以减小图片的尺寸。因此,我们将在图像压缩之前变换颜色空间。JPEG图像通常被转换到YCbCr颜色空间,其中Y代表亮度,Cb蓝色色调和Cr红色色调。改造后,我们处理颜色部分就容易多了。然后我们把一张图片切割成8*8的像素块,然后用离散余弦变换算法(DCT)计算高频区域和低频区域。由于人眼对高频区的复杂信息不敏感,所以这部分可以压缩。这个过程称为量化。最后,打包新文件。这个过程完成了图像压缩。基本流程如下:JPEG压缩是有损的。在上述过程中,预测模块进行颜色空间转换后,通过丢弃部分颜色密度信息来提高压缩率。常见的选项是4:2:0。经过这一步,原本需要8个数字代表的信息,现在只需要2个,直接丢弃了75%的CbCr信息。但是,这一步是不可逆的,这就造成了图像压缩是有损的。此外,在熵编码模块中,图像信息将使用游程编码或霍夫曼编码进一步压缩,这部分压缩是无损和可逆的。(YCbCr空间转换)哈夫曼编码原理如下:如果待编码的字符一共有38个符号数据,对它们进行计数,得到的符号和对应的频率如下:符号01234567频率1011111185首先,所有符号都是计算出来的按照频率大小排序,排序后如下图:symbol01237603frequency1111581011然后,选择频率最小的两个叶子节点作为叶子节点,频率最小的作为左子节点,other为右子节点,根节点为两个叶节点的频率之和。(哈夫曼树)经过以上步骤,就形成了一棵哈夫曼树。霍夫曼编码常用于无损压缩。其基本思想是用短码表示出现频率高的字符,用长码表示出现频率低的字符,从而减少编码字符串的平均长度和期望长度,从而达到压缩的目的.3.故事的主人公轻子并不完美。上面的JPEG压缩虽然缩小了图片的体积,画质也很好,人眼很难分辨出差异,但是由于有损压缩,图片质量无法恢复到原来的质量,事实上此时的jpg图片还有压缩空间。Lepton可以在JPEG的基础上进一步对图片进行无损压缩。3.1为什么选择轻子?类似于lepton的压缩工具有jpegcan、MozJPEG、PackJPG和PAQ8PX。但是,这些工具或多或少存在缺陷,使得它们不像轻子那样适合工业化生产。比如PackJPG需要按照全局排序的顺序重新排列文件中所有压缩过的像素值。这意味着解压缩是单线程的,并且需要整个图像都在内存中,从而导致处理图像的延迟更高和吞吐量更低。下图是lepton论文中几个工具的对比:3.2Lepton做了哪些优化。首先,在算法上,Lepton将图片分为两部分:header和图片数据本身。header使用DEFLATE进行无损压缩,图像本身使用算术编码代替Holman编码进行无损压缩。由于JPEG使用Huffman编码,难以发挥多线程的优势,Lepton使用“Huffmanswitchwords”进行改进。其次,Lepton使用了一个复杂的自适应概率模型,该模型是通过对大量野外图像进行测试而开发的。该模型的目标是对每个系数的值进行最准确的预测,从而产生更小的文件;在工程上,它允许多线程并发处理,允许块分布在多个服务器上,逐行处理流,内存得到有效控制,数据读取和输出的安全性也得到保障。正是Lepton针对上述关键问题的优化,使其能够在生产环境中得到很好的应用。3.3轻子探索活体存储的预期收益:目前其中一个对象存储集群的数据量约为100PB,其中图片数据约占70%,其中90%的图片为jpeg类型图片。如果平均值为23%,则100PB*70%*90%*23%=14.5PB,这将实现大约14.5PB的成本节约。同时,由于无损压缩,用户体验得到了很好的保障。目前轻子压缩功能的设计如下图所示:当前挑战:轻子压缩和解压对服务器的计算性能要求高,消耗大。期望充分利用闲置的服务器CPU资源,降低成本,提高效率。面对潮汐现象,它具有动态伸缩的能力。我们目前面临的主要问题:目前大部分图片的大小都是4M-5M。经测试,4M-5M文件的压缩延迟在1s左右时,需要至少16核5QPS的服务器。此时每个核心的利用率都在95%以上。可见Lepton的压缩对计算性能要求很高。目前常见的解决方案是使用FPGA卡进行硬件加速和大量计算节点的水平扩展。FPGA的使用增加了硬件成本并降低了压缩的成本效益。解决方案:为解决上述问题和挑战,我们尝试采用物理服务器和Kubernetes混合部署的方式来解决计算资源使用和动态扩容的问题。在Discovery注册,可以灵活扩展,通过这个cgroup/Taskset等方式管理进程的cpu使用情况。同时,对接使用Kubernetes以容器的形式进行管理,容器的灵活性更适合这种计算服务。3.4性能评价无论是同步压缩还是异步压缩,通常都比较关注图像读取的延迟。读取大量的图片会给服务器带来很大的压力,而压力主要来自图片的解压计算。为提高解压效率,充分利用公司资源,未来我们会将轻子压缩服务以独立服务的方式,分发到CPU闲置的服务器上,充分利用峰谷资源,提升计算性能。资源谷根据资源闲置程度和闲置时间。压测数据:我们选取了不同大小的图片文件,在单机环境下进行了压缩和解压测试。测试结果如下图所示:平均压缩率保持在22%左右。上图是不同大小文件的压缩解压时间比例图,橙色为解压时间,蓝色为压缩时间。上图是不同大小的图片,有32个线程并发运行,每个线程处理100个文件的测试数据。4.图像压缩常见问题4.1按文件格式区分有损和无损压缩有损压缩格式JPEG、JPG、WMF等无损压缩算法Run-LengthEncodingRun-lengthencoding,Shannon-FanoCoding,HuffmanCoding,ArithmeticCoding,Burrow-LengthTransformBruce-Wheelertransformation五、总结Lepton的无损压缩可以在不影响用户图像质量和用户体验的情况下提供比较高的压缩比,在数据量大的场景下会获得更明显的收益。缺点是对计算性能要求高,只支持jpeg类型的图片。业界对于性能需求也有比较成熟的解决方案,比如上面提到的FPGA和弹性计算方案。关键是要根据企业的需求选择合理的方案。引用:《The Design, Implementation, and Deployment of a System to Transparently Compress Hundreds of Petabytes of Image Files For a File-Storage Service》《基于深度学习的JPEG图像云存储研究》《JPEG-Lepton压缩技术关键模块VLSI结构设计研究》
