免費開源的 Stable Diffusion 又被玩兒出了新花樣:
這次是被拿來壓縮圖片。
Stable Diffusion 不僅能把同一張原圖縮到更小,而且表現還肉眼可見地優于 JPEG 和 WebP。

對于同一張原圖,Stable Diffusion 壓縮出來的圖像不僅有更多細節,而且壓縮偽影也變少了。
但用 Stable Diffusion 來壓縮圖的軟件工程師 Matthias B ü hlmann(咱們就叫他 MB 哥吧)也指出,這種方式也有明顯的局限性。
因為這不太擅長處理人臉和文字等,有時甚至會在解碼擴展回去后,幻化出原圖中不存在的特征。
比如像這樣(效果可以讓人嚇一跳):

△左為原圖,右為 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 上,感興趣的朋友可以仔細看看 ~
原文地址:http://www.myzaker.com/article/6335c151b15ec021af5bf347