☰
为什么 Qwen-Image-2.1 解码图片总带棋盘格伪影?texture-fix-vae-for-qwen-image-2.1 的修复原理全解析
2026/11/3 10:30:07 网站建设 项目流程

为什么 Qwen-Image-2.1 解码图片总带棋盘格伪影?texture-fix-vae-for-qwen-image-2.1 的修复原理全解析

使用 Qwen-Image-2.1 出图时,不少新手会抱怨:放大细节处总有一层细碎的棋盘格伪影(checkerboard artifacts),尤其在草地、树叶、水面这类照片风格区域格外明显。texture-fix-vae-for-qwen-image-2.1正是为这个问题而生——它是官方 Qwen-Image-2.1 VAE 的一次非官方微调(finetune)版本,专门修复解码时的棋盘格纹理伪影,同时解决了原版 VAE 在 fp16 精度下产生 NaN(紫红色花屏区域)的顽疾,让 ComfyUI 和 Diffusers 用户只需替换一个权重文件,就能获得更干净锐利的解码结果。

🪄 下图是同一组潜变量(latent)分别用原版 VAE 和 texture-fix-vae 解码后的局部放大对比,棋盘格伪影的差异一目了然:

Qwen-Image-2.1 官方 VAE(有棋盘格伪影)texture-fix-vae 修复后(纹理干净)

这组对比图使用了 Qwen-Image-2.1 生成的照片风格提示词(落基山脉野花草甸 + 溪流 + 针叶林)产生的潜变量,完整案例数据见 pnw_meadow_stream_2048.latent.pt。

棋盘格伪影从哪来?三个损失函数在"打架"

要理解修复原理,先要了解 VAE 是怎么训练的。大多数图像自编码器的训练都混合了三类损失函数,而它们的"口味"各不相同:

  • MSE/MAE(像素误差):鼓励模型"求稳",重建不出的细节干脆糊掉;
  • LPIPS(感知误差):追求"看起来像",但当精确细节重建不出来时,容易诱发模糊 + 棋盘格伪影;
  • 对抗(GAN)损失:鼓励生成锐利、可信且无明显伪影的细节,是画质提升的关键。

DC-AE 等研究已经证明:训练配方中是否包含可用的对抗损失项,直接决定了高清 VAE 会不会出现棋盘格。作者推测,原版 Qwen-Image-2.1 VAE 很可能就是在一个没有有效对抗损失项的配方下训练出来的,于是解码器在高频细节区域"力不从心",留下了棋盘格痕迹。

修复原理:用 TAESD 同款对抗配方"点"微调解码器

texture-fix-vae-for-qwen-image-2.1 的修法很克制,可以概括为一句话:只对最高分辨率的解码器部分做短时间对抗微调,其余部分保持不动。

具体做法(源自 README.md 的 Mechanism 与版本历史章节):

  1. 沿用 TAESD 项目的训练配方——混合 PSNR 类(MSE/MAE)、LPIPS 和对抗(GAN)损失,补上缺失的那块拼图;
  2. 只解冻两个最高分辨率的解码阶段和输出头,可训练参数仅约 750 万,以 3e-5 的学习率跑约 5000 步;
  3. 低分辨率阶段完全不碰,因此编码端与官方权重计算的是同一个函数,不影响已有的生成流程和 latent 数据(见 NOTICE 说明)。

这种"小步快走"的微调策略保证了模型行为几乎不变,只是把最影响观感的高频细节部分"治好"了。

顺带治好的另一大病:fp16 下的 NaN 花屏

除了棋盘格,原版 VAE 还有个隐蔽的坑:在 fp16(半精度)下解码经常溢出产生 NaN,图像上表现为紫红色花屏区域,还会向周边内容"渗透"。作者在仓库中提供了复现脚本 fp16_demo.py,可用 1024×1024 的 RGBA 贴纸潜变量 rgba_dragon_sticker_1024.latent.pt 一键验证。

2026-10-05 的更新版通过两步彻底解决了它:

  • 微调解码器权重:在保持输出不变的前提下压低激活幅值(思路类似 SDXL-VAE-FP16-Fix);
  • 手工缩放部分权重:把解码器权重按精确的 2 的幂缩放(解码器 ÷512、编码器 ÷8)。由于每个残差分支都带 RMSNorm,这种缩放不改变输出,只为 fp16 腾出数值余量。

效果对比(来自 README 的压力测试,185 组含透明区域的测试输入):

fp16 指标Qwen-Image-2.1 VAEtexture-fix-vae
解码器最大激活值(fp16 上限 65504)~350 万(溢出)~1300
输出 NaN 的输入数量750

画质指标:主观更清爽,客观数据怎么说?

微调后各指标的变化符合"用极小的重建精度换显著的主观观感"的预期:

指标(COCO val2017, 256²)官方 VAE (bf16)texture-fix-vae (bf16)texture-fix-vae (fp16)
rFID ↓(感知质量,越低越好)3.382.072.06
PSNR ↑(重建精度)33.2932.7332.79
LPIPS ↓0.03570.03840.0380

rFID(反映整体感知质量)从 3.38 降到 2.07,说明人眼观感提升明显;PSNR/LPIPS 只小幅退步——也就是说你失去的几乎只是"逐像素相似度",换来的是肉眼可见的干净纹理。

快速上手:两步替换你的 VAE

ComfyUI 用户(最简单)

  1. 下载本仓库的 texture_fix_vae_for_qwen_image_2.1_bf16.safetensors;
  2. 放入ComfyUI/models/vae/目录,在Load VAE节点中选中它,替代原来的qwen_image_2.1_vae_bf16.safetensors即可;
  3. 开启--fp16-vae参数也完全兼容。

Diffusers 用户

只需把 VAE 换成这个仓库即可:

from diffusers import QwenImage21Pipeline, AutoencoderKLQwenImage21 vae = AutoencoderKLQwenImage21.from_pretrained( "madebyollin/texture-fix-vae-for-qwen-image-2.1", torch_dtype=torch.bfloat16 ) pipe = QwenImage21Pipeline.from_pretrained("Qwen/Qwen-Image-2.1", vae=vae, torch_dtype=torch.bfloat16).to("cuda")

模型结构配置(64 通道 latent、16 倍空间下采样、AutoencoderKLQwenImage21类)见 config.json,与官方 VAE 完全兼容,无需改动任何现有工作流。

版本历史与许可说明

  • 2026-09-24:首个版本,微调解码器修复棋盘格伪影;
  • 2026-10-05:更新版本,额外修复 fp16 下的 NaN 问题,画质指标保持接近。

⚠️ 注意:本项目基于Qwen/Qwen-Image-2.1,遵循 Qwen RESEARCH LICENSE,仅限非商业/研究用途,详情见 LICENSE 与 NOTICE。

总结

如果你也被 Qwen-Image-2.1 解码出的棋盘格伪影和 fp16 花屏困扰,texture-fix-vae-for-qwen-image-2.1 是目前最省事的解法:不动任何代码、不改变工作流,替换一个 VAE 权重文件,就能同时收获更锐利的纹理和稳定的 fp16 推理。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询