本次记录是在上一次的基础上进行的,上一次实验:【实验记录】在本地运行基于stable diffusion的图像压缩案例Stable Diffusion based lossy image compression-CSDN博客
在上一次的文末已经提到过一些优化方案,此次优化目标:使得案例可以适配所有分辨率的图像
理论知识
在 VAE 编码器中,经过编码后图像分辨率的计算主要取决于卷积层的配置,尤其是步幅 (stride) 和 padding(填充),这些参数决定了每层卷积后图像分辨率的变化。
通常情况下,VAE 编码器通过若干层的卷积和下采样将输入图像压缩为潜在空间表示。假设编码器每层卷积的步幅和填充都是一致的(如 stride=2),你可以通过递归计算每层卷积后的输出分辨率来确定最终编码后的分辨率。
计算方法:
如果编码器通过 N 层卷积来下采样,且每一层卷积的步幅为 2,那么图像在每经过一层卷积后,宽度和高度都会缩小一半。公式如下:
其中:
- 和
分别是输入图像的高度和宽度,
- 是编码器的卷积层数(每层都进行下采样),
- 和
是编码后图像的高度和宽度。
本次模型使用的是 Stable Diffusion v1-4 VAE 的标准配置,通常经过编码器处理后,输入的分辨率会缩小到原始图像的 1/8。
实践:直接修改源代码
再次提醒,是在前文的基础上进行修改,只展示了在前文基础上进行修改的部分cell
def resize_to_8like(input_file, output_file):
# 作用是把图片修改为宽和高均为8的倍数
img = Image.open(input_file).convert('RGB')
#resize
tmp_w = (img.width // 8)*8
tmp_h = (img.height // 8)*8
print(f"target width: {tmp_w}")
print(f"target height: {tmp_h}")
img = img.resize((tmp_w,tmp_h), Image.