作者avans (阿纬)
看板AI_Art
标题[StaD] 高解析修正(HiresFix)低Denoising的异常
时间Sun Apr 30 03:34:51 2023
前阵子在civitai站看到有的LORA真人模组作者建议:
启用Hires.fix、Hires steps:17, denoising:04-6
取样方法DPM++ 2M Karras or DPM++ SDE Karras
用20以内的sampling steps
所以最近使用stable-diffusion-webui时
我都会采用上述高解析度修正(Hires. fix)
并搭配Upscaler Latent的放大2倍功能
其中设定过大的重绘幅度(Denoising strength)
将会导致生出来的图片乱七八招
在Youtub上SiliconThaumaturgy经大量测试後
针对Denoising值,有以下心得可参考
https://i.imgur.com/45GVTnV.png
https://youtu.be/sre3bvNg2W0
不过有时候Denoising使用0.6~0.7
因为我还会设定放大2倍,
还是会生出一些奇奇怪怪的内容
就必须降低至0.4左右
但是我发现到画面会变模糊
版上好像还没有人说过类似议题?
_________________________________
查询官方issues中也发现其他人有发现这问题(如下连结)
https://github.com/AUTOMATIC1111/stable-diffusion-webui/issues/6357
该issue中发现放大演算法Upscaler Latent与低重绘幅度Denoising
在高解析度修复中会得到模糊的图(如issue的举例图)
https://i.imgur.com/n7o8uy0.png
_________________________________
在3/27 ToxicObsidian
有留言找到可能原因与建议解法
我用chat翻译写在下面
_________________________________
_________________________________
ToxicObsidian commented on Mar 27:
我已检查程式码,并找到了原因和替代方案。
=================
1.高解析度修复。修复方法是在 txt2img 过程之後应用 img2img。
当您检查 modules/processing.py 时,您可以在
StableDiffusionProcessingTxt2Img.sample() 中
找到高解析度修复过程。
以下行是高解析度修复的主要功能。
__________________
samples = self.sampler.sample_img2img(self, samples, noise, conditioning,
unconditional_conditioning, steps=self.hr_second_pass_steps or self.steps,
image_conditioning=image_conditioning)
__________________
=================
2. 潜在(Latent)采样器与您在 txt2img 中选择的相同。
您可以在几行上方找到 self.sampler 的定义。
当您应用 print(f'{img2img_sampler_name}') 时,
您可以发现它与您在 txt2img 中选择的相同 (不包括高解析度修复),除了 PLMS。
作者的评论:PLMS 不支持 img2img,因此我们只是悄悄地切换到 DDIM。
这意味着您可以劫持 txt2img 过程
并替换高解析度修复过程中的另一个采样器,从技术上讲。
=================
3. 无法找到错误 (因为它不是错误)。
检查图像生成的源代码後,我发现一切正常 (表面上)。
sample_img2img() 函数定义如下:
__________________
def sample_img2_img(self, p, x, noise, ...):
...
return samples
__________________
参数 p 是一个通用的过程对象,包含配置,
如 steps、denoising_strength 和 extra_generation_params 等
(denoising_strength 很少使用,我甚至找不到它存在的位置,这是真正的问题)。
参数 x 是基本潜在(basic latent)。
在 Img2Img 过程中 (不是高解析度修复),x 是初始潜在(initial latent)。
在 Txt2Img 高解析度修复中,这是截断的样本 (图像image)。
参数 noise 只是由某个函数创建的随机张量(tensors)。
这些代码在 Img2Img 过程中非常有效,所以我认为那不是我们需要的。
=================
4. 排除模糊或故障的潜在问题。
在修改 modules/processing.py 的原始码後,
我捕捉了潜在变数放大後的中间图像。
我使用了潜在变数(最近似)【Latent (nearest-exact)】
以非常低的去噪强度(约为0.15)来查看这些图像。
问题就是在这里。
StableDiffusionProcessing.sample() 中修改的代码:
__________________
samples = torch.nn.functional.interpolate(samples, size=(target_height //
opt_f, target_width // opt_f), mode=latent_scale_mode["mode"],
antialias=latent_scale_mode["antialias"])
for i in range(samples.shape[0]):
sample_image = sd_samplers.sample_to_image(samples, i, approximation = 0)
images.save_image(sample_image, self.outpath_samples, "", \
seeds[i], prompts[i], opts.samples_format, \
suffix="-hires-just-after-upscale")
__________________
原始(在 hires. fix 之前):
https://i.imgur.com/tyT5N6G.png
放大後(放大後的 hires fix ayaka):
https://i.imgur.com/bVJpIsI.png
完整的 hires fix(带有 hires fix 的 txt2img 结果 ayaka):
https://i.imgur.com/mEg6bPz.png
因此,我们最终可以得出模糊、故障或变形图像是由变数放大引起的结论。
=================
5. 为什麽?
使用双线性/双三次/最近邻/最近邻(最近似)方法
(bilinear/bicubic/nearest/nearest-exact)
放大图像时会产生问题,但我们在 Img2Img 中没有看到这样的问题,
因此我检查了 Img2Img 的过程。
事实上,Img2Img 的过程根本不使用潜在变数放大(latent upscaling)。
Img2Img 过程不是使用 torch.nn.functional.interpolate() 方法,
而是使用 resize_image() 方法调整大小和放大图像,
其定义位於 modules/images.py。
__________________
def resize_image(resize_mode, im, width, height, upscaler_name=None):
upscaler_name = upscaler_name or opts.upscaler_for_img2img
def resize(im, w, h):
if upscaler_name is None or upscaler_name == "None" or im.mode == 'L':
return im.resize((w, h), resample=LANCZOS)
...
__________________
在这种情况下,我们应该只关注 resize() 函数。
在打印了 upscaler_name 和给定了 None 後,
我终於发现 Img2Img 过程非常可能使用 LANCZOS 作为放大器。
而不是插值方法(interpolation)。
=================
6. 测试 LANCZOS
在更改hires.fix的上采样器为LANCZOS之後,
我使用非常低的降噪强度(约0.15)
得到了一张没有模糊/故障/变形区域的图像。
在hires.fix之前:
00004-1135528403-before-highres-fix
https://i.imgur.com/or3DgQd.png
使用LANCZOS上采样器:
00005-1135528403
https://i.imgur.com/i96vzuX.png
=================
7. 总结和替代方案
那麽,将上采样器更改为LANCZOS就是解决方法吗?
不,这只是其中一种替代方案。
要明确的是,我不是ML专家,甚至不是ML学生,所以解释可能不合理。
当我们将Latent upscaler应用於hires.fix时,
它实际上带来了更多的潜力(potential)。
因此,Latent upscalers需要更多的降噪强度(denoising strength)
来将这些潜力(potential)转换为图像细节。
另一方面,较低的降噪强度可能会导致这种潜力在图像上残留。
通过使用其他上采样器,如LANCZOS或ESRGAN系列,它们加强了图像。
给出的潜力较少,且差异较小。
======
因此,没有100%的解决方案可用於这种图像生成。
但是您可以遵循以下步骤避免此类图像生成:
*如果您对使用的模型有信心,并且希望对图像进行较少的修改。
将降噪强度降至约0.4。
将hires.fix上采样器切换为非潜在上采样器(例如LANCZOS,ESRGAN)。
那麽,您会得到一些漂亮的图像。
*如果您想进行更多的修改和更多的潜力。
应用更高的降噪强度(约0.55至0.7)
选择您喜欢的Latent upscaler
你将得到你想要的。
*对於一般解决方案。
不要使用hires.fix
使用extra->upscale将图像进行上采样(如果可能,使图像更清晰)
将上采样後的图像发送到img2img
如果您希望有更多的潜力,使用Inpaint和Inpaint Sketch会更好
进行处理和微调,你将得到一些令人惊叹的图像。
(与其他替代方案相比,只是浪费太多时间。)
*对於一个偏爱技术的解决方案,
劫持 txt2img 的过程,
应用一些技术。
恭喜,你是最棒的人!
我不是很擅长英语,请容忍我的表达错误。希望我的帖子能帮助你们 <3。
_________________________________
_________________________________
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.136.22.242 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/AI_Art/M.1682796894.A.2B1.html
1F:推 Jotarun: 看来chatgpt翻译真的还早 04/30 07:28
2F:推 Supasizeit: 这应该不是gpt 翻的 04/30 13:49
4F:推 aigame: 躁讯过不去的一律建议0.6 05/03 00:05
5F:推 Aeryzephyr: 这确实是个麻烦,有时想修脸就得开hires fix 05/03 14:34
6F:→ Aeryzephyr: 开了降噪太高会长一堆东西,太低又会图片模糊- 05/03 14:34
7F:→ Aeryzephyr: 现在我基本上是都直接升成大图,不要经过hires fix 05/03 14:35
8F:→ Aeryzephyr: 或者是基本大小512*512那种,再用其他编码器放大 05/03 14:35
9F:→ Aeryzephyr: 但用基本大小的话,初始脸就不能歪,不然放大了还是歪 05/03 14:36