Stable Diffusion 还能压缩图:比 JPEG 更小
免费开源的 Stable Diffusion 又被玩儿出了新花样:
这次是被拿来压缩图片。
Stable Diffusion 不仅能把同一张原图缩到更小,而且表现还肉眼可见地优于 JPEG 和 WebP。
对于同一张原图,Stable Diffusion 压缩出来的图像不仅有更多细节,而且压缩伪影也变少了。
但用 Stable Diffusion 来压缩图的软件工程师 Matthias Bühlmann(咱们就叫他 MB 哥吧)也指出,这种方式也有明显的局限性。
因为这不太擅长处理人脸和文字等,有时甚至会在解码扩展回去后,幻化出原图中不存在的特征。
比如像这样(效果可以让人吓一跳):
△ 左为原图,右为 Stable Diffusion 压缩再扩展的生成图
不过,话说回来 ——
Stable Diffusion 是如何压缩图片的?
要讲清楚 Stable Diffusion 怎么压缩图片,不妨从 Stable Diffusion 的一些重要工作原理说起。
Stable Diffusion 是一种特殊的扩散模型,叫作潜在扩散 (Latent Diffusion)。
和标准扩散(Standard Diffusion )不同,潜在扩散在维度较低的隐空间(Latent Space)上进行扩散过程,而不使用实际的像素空间。
也就是说,隐空间的表示结果是一些分辨率较低的压缩图,不过这些图有较高的精确度。
这里说一下,图像的分辨率和精度是两回事儿。分辨率是表示一张图数据量多少的参数,而精度是反映结果与真值接近程度的量。
就拿这个骆驼的大头照来举例:原图大小 768KB,分辨率为 512×512,精度为 3×8 位。
用 Stable Diffusion 压缩到 4.98KB 后,分辨率减少为 64×64,而精度反而提升到 4×32 位了。
所以看起来,Stable Diffusion 的压缩图和原图相比,差别不大。
如果再进一步具体而言的话,Stable Diffusion 这种潜在扩散模型有三个主要组成部分:
VAE (Variational Auto Encoder,变分自编码器),U-Net,和文本编码器 (Text-encoder)。
不过在这项压缩图像的测验中,文本编码器没什么用。
发挥主要作用的还是 VAE,它由两部分组成:一个编码器和一个解码器。
所以,VAE 可以将一张图从图像空间中,编码再解码得到一些潜在空间表示(Latent space representation)。
MB 哥发现,VAE 的解码功能对于量化潜在表示来说,表现非常稳定。
通过缩放、拖拽和重新映射,将潜在表示从浮点量化为 8 位无符号整数,就可以得到不怎么失真的压缩图了:
首先将 latents 量化为 8 位无符号整数,此时图像大小为 64×64×4×8Bit=16 kB(原图大小 512×512×3×8Bit=768 kB)。
然后再运用调色板(Palette)和抖动(Dither),进一步使数据缩小到 5kB,同时还提高了图像的还原度。
作为一位严谨的程序员,MB 哥除了通过肉眼观察,还对图像质量进行了数据分析。
不过,从图像质量评估的两项重要指标 PSNR(峰值信噪比)和 SSIM(结构相似性)来看,Stable Diffusion 的压缩结果并没有比 JPG 和 WebP 好到哪儿去。
另外,当把潜在表示重新解码扩展到原图分辨率时,虽然图像的主要特征仍然可见,但 VAE 也会将高分辨率的特征赋予这些像素值。
用大白话讲,就是重建的图像往往和原图不一样,里面夹杂了不少新生成的“鬼畜”特征。
让我们再来回顾一下这张图:
虽然用 Stable Diffusion 来压缩图确实还存在不少问题,但用 MB 哥的话来说,其效果还是很惊艳的,非常有发展前途。
现在 MB 哥已经把相关代码放到了 Google Colab 上,感兴趣的朋友可以仔细看看~