[StaD] 高解析修正(HiresFix)低Denoising的異常
前陣子在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://i.imgur.com/45GVTnV.jpg)
不過有時候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
![](https://i.imgur.com/n7o8uy0.jpg)
_________________________________
在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
![](https://i.imgur.com/tyT5N6G.jpg)
放大後(放大後的 hires fix ayaka):
https://i.imgur.com/bVJpIsI.png
![](https://i.imgur.com/bVJpIsI.jpg)
完整的 hires fix(帶有 hires fix 的 txt2img 結果 ayaka):
https://i.imgur.com/mEg6bPz.png
![](https://i.imgur.com/mEg6bPz.jpg)
因此,我們最終可以得出模糊、故障或變形圖像是由變數放大引起的結論。
=================
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
![](https://i.imgur.com/or3DgQd.jpg)
使用LANCZOS上採樣器:
00005-1135528403
https://i.imgur.com/i96vzuX.png
![](https://i.imgur.com/i96vzuX.jpg)
=================
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://www.ptt.cc/bbs/AI_Art/M.1682796894.A.2B1.html
推
04/30 07:28,
1年前
, 1F
04/30 07:28, 1F
推
04/30 13:49,
1年前
, 2F
04/30 13:49, 2F
→
04/30 14:16,
1年前
, 3F
04/30 14:16, 3F
![](https://i.imgur.com/zn4b2M2.jpg)