深入解析SDXL潜在空间以及如何改善其生成图像的方法
要点:
SDXL潜在空间包括4个通道,分别是亮度、青/红、绿/紫、图案/结构。
SDXL生成的颜色范围偏向黄色,原因是模型在生成过程中更偏向认知中的亮度、青/红、绿/紫,而相对较少使用蓝色。
通过实验性地探索SDXL潜在空间,作者提出了一些纠正SDXL输出的方法,包括去除异常值、平衡颜色、增加颜色范围等。
近日,Hugging Face社区成员Timothy Alexis Vass撰写了一篇名为《Explaining the SDXL latent space》的文章,重点解释了SDXL(可能是Super Diffusion XL)潜在空间的特性以及如何改善其生成图像的方法。
据了解,SDXL潜在空间的结构包括四个通道,分别对应图像的亮度、青/红、绿/紫、以及图案/结构。这为理解SDXL生成的图像提供了基础。
SDXL生成的图像往往存在颜色偏向黄色的问题,这是因为模型更倾向于使用亮度、青/红、绿/紫这几个主要颜色,而相对较少使用蓝色。通过对SDXL潜在空间的实验性探索,Timothy Alexis Vass提供了一种直接将SDXL潜在空间转换为RGB图像的线性逼近方法。此方法允许在生成图像之前对颜色范围进行调整,从而避免在后处理阶段进行矫正。
我们可以创建一个近似函数,直接将潜在变量转换为 RGB:
deflatents_to_rgb(latents):
在实际操作中,Timothy Alexis Vass提出了一些纠正SDXL输出的方法,包括去除异常值、平衡颜色、增加颜色范围等。通过一系列的代码实现,他展示了如何在生成图像的过程中应用这些方法,从而改善图像的质量。这些方法包括对潜在空间进行软裁剪、颜色平衡和范围增加等。
SDXL 颜色范围偏向黄色的可能原因
自然界中相对较少的东西是蓝色或白色的。在愉快的条件下,这些颜色在天空中最为突出。因此,该模型通过图像了解现实,以亮度(通道0)青色/红色(通道1)和石灰/中紫色(通道2)进行思考,其中红色和绿色是主要的,蓝色是次要的。这就是为什么 SDXL 世代通常偏向黄色(红色 + 绿色)。
在推理过程中,张量中的值将从min -30和开始max 30,解码时的最小/最大边界大约-4为4。guidance_scale值越高,min和之间的差异就越大max。
理解边界的关键之一是查看解码过程中发生的情况:
decoded=vae.decode(latents/vae.scaling_factor).sample#(SDXLvae.scaling_factor=0.13025)decoded=decoded.div(2).add(0.5).clamp(0,1)#Thedynamicsoutsideof0to1atthispointwillbelost
如果此时的值超出0到1的范围,则钳位中的一些信息将会丢失。因此,如果我们能够在去噪过程中进行修正,以满足 VAE 的预期,我们可能会得到更好的结果。
需要纠正什么?
如何锐化模糊图像、白平衡、改善细节、增加对比度或增加颜色范围?最好的方法是从清晰的图像开始,该图像具有正确的白平衡、良好的对比度、清晰的细节和高范围。
模糊清晰的图像、改变色彩平衡、降低对比度、获取无意义的细节以及限制色彩范围比改善图像要容易得多。
SDXL 具有非常明显的颜色偏差倾向,并将值置于实际边界之外(左图)。通过将值居中并将它们置于边界内(右图)可以轻松解决这个问题:
defcenter_tensor(input_tensor,per_channel_shift=1,full_tensor_shift=1,channels=[0,1,2,3]):forchannelinchannels:
让我们以 SDXL 的输出为例
seed:77777777
请注意,我特意选择了较高的指导尺度。
我们如何修复这个图像?一半是绘画,一半是照片。颜色范围偏向黄色。右侧是具有完全相同设置的固定一代。
但在合理guidance_scale设置为7.5的情况下,我们仍然可以得出结论,固定输出更好,没有无意义的细节和正确的白平衡。
我们可以在潜在空间中做很多事情来总体改进一代,并且我们可以做一些非常简单的事情来针对一代中的特定错误:
异常值去除
这将通过修剪距分布平均值最远的值来控制无意义细节的数量。它还有助于以更高的guidance_scale进行生成。
#Shrinkingtowardsthemean(willalsoremoveoutliers)defsoft_clamp_tensor(input_tensor,threshold=3.5,boundary=4):ifmax(abs(input_tensor.max()),abs(input_tensor.min()))4:returninput_tensor
色彩平衡和增加范围
我有两种主要方法来实现这一目标。第一个是在标准化值的同时向平均值收缩(这也将消除异常值),第二个是在值偏向某种颜色时进行修复。这也有助于生成更高的guidance_scale。
#Centertensor(balancecolors)defcenter_tensor(input_tensor,channel_shift=1,full_shift=1,channels=[0,1,2,3]):forchannelinchannels:
张量最大化
这基本上是通过将张量乘以一个非常小的量(例如1e-5几个步骤)来完成的,并确保最终张量在转换为 RGB 之前使用完整的可能范围(接近 -4/4)。请记住,在像素空间中,在保持完整动态的情况下降低对比度、饱和度和清晰度比增加对比度、饱和度和清晰度更容易。
#Maximize/normalizetensordefmaximize_tensor(input_tensor,boundary=4,channels=[0,1,2]):
回调实现示例
defcallback(pipe,step_index,timestep,cbk):iftimestep950:
最后,Timothy Alexis Vass展示了在高引导比例下使用长提示进行生成的图像,通过对颜色范围的调整,使得整个提示成为可能。通过这些方法,可以在生成图像的初步阶段就对输出进行改善,而不是在后期进行矫正。这为提高SDXL生成图像质量提供了一种新的思路。
更新于:11个月前