[StaD] 高解析修正(HiresFix)低Denoising的異常

看板AI_Art作者 (阿緯)時間1年前 (2023/04/30 03:34), 編輯推噓2(201)
留言3則, 3人參與, 1年前最新討論串1/1
前陣子在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://www.ptt.cc/bbs/AI_Art/M.1682796894.A.2B1.html

04/30 07:28, 1年前 , 1F
看來chatgpt翻譯真的還早
04/30 07:28, 1F

04/30 13:49, 1年前 , 2F
這應該不是gpt 翻的
04/30 13:49, 2F

04/30 14:16, 1年前 , 3F
是GPT3.5翻譯的沒錯喔 https://i.imgur.com/zn4b2M2.png
04/30 14:16, 3F
文章代碼(AID): #1aJN5UAn (AI_Art)