txt2img 時,會用 512、768 等等大小來測試算圖,反覆迭代找到一個適合的 prompt 和參數組合。如果想要以此組合算出高解析度的圖片,直接調整長寬會遇到畫面跑掉的問題。該如何在固定構圖的情況下增加圖片的解析度呢?本文提供三個方法讓大家嘗試看看!

法一:透過 img2img 放大

將 txt2img 算出的圖片送入 img2img ,並輸入一樣的 prompt,如此及能算出高度類似,但細節略為不同的圖片。

img2img 法詳細步驟

在 txt2img 得到適合的結果後,點選 send to img2img

如何用 Stable Diffusion 產生高解析度的圖?

延伸閱讀:最詳細的 Stable diffusion WebUI 操作教學 – txt2img

或者將圖片拉到 png info,再點選 send to img2img

如何用 Stable Diffusion 產生高解析度的圖?

跳轉至 img2img tab,調整長寬放大圖片。調整 denoising strength 控制 AI 自由度。

如何用 Stable Diffusion 產生高解析度的圖?

denoising strength 以 0.5 作為臨界值,大於 0.5 表示 Stable Diffusion 算圖自由度越高,與原圖差異越大。反之小於 0.5 AI 自由度下降,與原圖較為相似。

原圖:

如何用 Stable Diffusion 產生高解析度的圖?

透過 img2img 放大,點擊查看大圖

img2img 算圖時拉高 denoising strength 構圖有可能跑掉,我們可以嘗試使用 ControlNet 控制畫面。ControlNet 使用方法將在另一篇文章中介紹。

原圖:

如何用 Stable Diffusion 產生高解析度的圖?

透過 img2img 放大,點擊查看大圖:

如何用 Stable Diffusion 產生高解析度的圖?
denoising strength = 0.7
如何用 Stable Diffusion 產生高解析度的圖?
denoising strength = 0.7, enable ControlNet OpenPose

img2img 法小結

優點:

  • 因為是透過 Stable Diffusion Model 算圖,除了放大解析度外,還能增加細部細節!
  • 調整 prompt 和 denoising strength,在此階段同時對圖片作更進一步的優化

缺點:

  • 解析度拉越高,所需算圖時間越久,VRAM 也需要更多、甚至會爆顯存,因此提高的解析度有上限
    • 以 google Colab 的 T4 為例,15 GB 的 VRAM 在接近 2000 x 2000 的時候就會爆掉
  • 是本文篇文章三法中,放大到同等級解析度時最耗費 VRAM 的方法
  • 放大圖片的細節或構圖可能會改變,需要依照經驗調整 denoising strength,或者引入 ControlNet 來解決

法二:透過 AI Upscaler 放大

透過 ESRGAN 等 AI upscaler 的方式將原圖放大,相對於傳統的 upscaler(如 PhotoShop),放大時能夠增加細節,算圖速度也比 img2img 快。

AI Upscaler 詳細步驟

  • 切換到 Extras tab,點選 Single Image,將想放大的圖片丟到 Source 中
  • 調整 Resize 決定放大幾倍。比如說原圖為 512×512,Resize = 2x 會變成 1024×1024
  • 選擇 Upscaler 1,如果是放大「真實照片」等類型,建議使用 R-ESRGAN 4x+ 或是 4x-UltraSharp。如果是「圖畫、動漫風格」,可以使用 R-ESRGAN 4x+ Anime6B。
  • Upscaler 2 我們不使用,留白即可。
如何用 Stable Diffusion 產生高解析度的圖?

點下 Generate,沒一會功夫就算完了!相對 img2img 快非常多

原圖:

如何用 Stable Diffusion 產生高解析度的圖?

透過 AI Upscaler 放大,點擊查看大圖:

如何用 Stable Diffusion 產生高解析度的圖?

AI Upscaler 、PhotoShop 大比拼

把臉部 zoom in,並與 PhotoShop 保留細節 2.0 放大兩倍的圖一起比較

原圖:

如何用 Stable Diffusion 產生高解析度的圖?

AI Upscaler 放大:

如何用 Stable Diffusion 產生高解析度的圖?

PhotoShop 保留細節 2.0 放大,顆粒感很重

如何用 Stable Diffusion 產生高解析度的圖?

AI Upscaler 法小結

優點:

  • 算圖速度非常快,也非常節省資源
  • 放大的圖片會與原圖幾乎一樣,同時填補細節

缺點:

  • AI Upscaler 是依照原圖的資訊去作算圖放大和細節增強,在原圖很小時,放大後細節的表現可能不盡理想
  • 依照所選 Upscaler 可能會有細節過度銳利的現象(如 4x-UltraSharp)
  • 因為放大的圖片會與原圖一樣,如果原圖角色的臉已經崩壞,放大後還是保持崩壞不會修復

法三:透過 Tiled Upscaling 放大

此法動用 img2img + ControlNet + AI Upscaler,結合了法一和法二的優勢並互相彌補了缺點,可以說是目前放大圖片的最佳方法!

Ultimate SD Upscale 安裝步驟

首先需要安裝 Ultimate SD Upscale,前往 Extensions tab,點 Install from URL。

URL for extension's git repository 貼上 https://github.com/Coyote-A/ultimate-upscale-for-automatic1111 後點 Install

如何用 Stable Diffusion 產生高解析度的圖?

點 Installed,並點 Apply and restart UI,讓外掛生效

如何用 Stable Diffusion 產生高解析度的圖?

Tiled Upscaling 詳細步驟

切換到 img2img,將要放大的圖片拖進去,prompt 的地方可以留白(原因可參考原理解釋)或建議保留原圖 prompt ,寫入 PNG Info 供後續參考使用。

如何用 Stable Diffusion 產生高解析度的圖?

調整 Width / Height 至原圖大小,並降低 denoising strength 至 0.35,如果想要更接近原圖,可以考慮 0.15 ~ 0.20(以上調整方式為 Ultimate SD Upscale 官方建議

如何用 Stable Diffusion 產生高解析度的圖?

打開 ControlNet 區塊

  • 確認是 1.1 以上的版本
  • 勾選 enable
  • preprocessor 選擇 tile_resample
  • model 選擇 control_v11f1e_sd15_tile (模型檔可到 huggingface 下載)
  • 將原圖拖入 source。
如何用 Stable Diffusion 產生高解析度的圖?

往下在 script 的下拉式選單中選擇 Ultimate SD upscale

  • Target size type 選擇 Scale from image size
  • Scale 拉出想要放大的倍數
  • Upscale 選擇 4x-UltraSharpR-ESRGAN_4xR-ESRGAN 4x+ Anime6B,選擇方式如同 AI Upscaler 中討論的原則
  • Type 保持 Linear
  • Tile width 保持 512,Tile height 預設零,表示與 width 相同
如何用 Stable Diffusion 產生高解析度的圖?

設定完畢,按下 Generate,Stable Diffusion 就會一個個 tile 幫你算圖放大囉!

如何用 Stable Diffusion 產生高解析度的圖?

原圖:

如何用 Stable Diffusion 產生高解析度的圖?

透過 Tiled Upscaler 放大,雖然 denoising strength 已經降低,但仔細觀察臉部還是有些為變化。

點擊查看大圖:

如何用 Stable Diffusion 產生高解析度的圖?

Tiled Upscaling、AI Upscaler 大比拼

原圖:

如何用 Stable Diffusion 產生高解析度的圖?

Tilted Upscaling:放大時有補上眼睫毛的細節,瞳孔也比較清楚

如何用 Stable Diffusion 產生高解析度的圖?

AI Upscaling:單純參考小圖作放大,眼睫毛細節增加有限,瞳孔則混濁

如何用 Stable Diffusion 產生高解析度的圖?

Tiled Upscaling 原理

整個 Tiled Upscaling 步驟由 Ultimate SD Upscale 的 script 控制, 其算圖步驟如下:

  • 先將原圖切成一塊塊小圖片(tile),排入隊列,每個 tile 依序處理
  • 將 tile 透過 AI Upscaler 放大成,比如說 512×512 的圖
  • 用 ControlNet 1.1 新推出的 Tile Model 對放大的 tile 重新繪製,修復細節
  • 將所有修復好的 512×512 tile 重新組合成一張大圖,隨即完成

這邊精妙的地方在於,他善用 ControlNet 1.1 的 Tile Model 的行為,摘取自原文:

  • Ignore the details in an image and generate new details.
  • Ignore global prompts if local tile semantics and prompts mismatch, and guide diffusion with local context.

意思是說,Control Net 的 Tile 模型用途在於「修補細節」。他會「參考」目前的圖片,進行修復(增補)細節的缺失。

如何用 Stable Diffusion 產生高解析度的圖?

同時會忽略 global prompts,讓繪圖的方向以 tile 中的內容為主。原文中舉例如下圖,雖然 prompt 給的是 a handsome man,但採用 tile model 控制繪圖,因此他能夠以方框區的圖片內容作為方向重繪出一片葉子,而不會是一個男人。

(註:實測整個 Tiled Upscaling 發現修改 prompt 還是會對圖片有微小的變化,因此這部份不確定原文案例是否僅適合只有套用 ControlNet Tile Model 的情境)

如何用 Stable Diffusion 產生高解析度的圖?

ControlNet Tile Model 這些特性有什麼好處呢?前面提到

  • img2img 法在放大時能夠增加細節,但是非常耗費資源(VRAM)
  • AI Upscale 法在放大時能夠增加的細節有限(被原圖大小限制),但是相對節省資源

因此 Tile Upscaling 的作法能

  • 善用 AI Upscale 迅速放大且省資源的優勢,先將每個 tile 放大(如:512×512)
  • 再用 ControlNet Tile 控制 img2img 重繪,因為每個 tile 大小只有 512×512,相當節省資源(VRAM),又能增加細節

各取其優點並互相彌補了缺點,讓 Stable Diffusion 也能在 VRAM 不夠的情況下,將放大圖片的任務切成多個子任務,用時間換取空間。

ControlNet Tile Model 扮演的角色

假如我們故意關閉 ControlNet Tile Model 的控制,會發生什麼事情?

如前面所述,整個放大的過程是一個個 tile 下去繪製,如果沒有 ControlNet,會導致 Stable Diffusion 在算每個 tile 時候都會去看 prompt 的內容 。如果 prompt 是要他畫一個老男人,你會發現最後每一個 tile 都是一個老男人的臉!

因為繪製過程中他沒有上下文的概念,他只看到一張 512×512 的畫布並想辦法透過 prompt 把他填滿。因此 ControlNet 目的就是引入 Tile Model 的行為,讓他有 context,因此 Tile Upscaling 可以實現。

如何用 Stable Diffusion 產生高解析度的圖?
圖片來自於 Youtube

Seam Artifacts 接縫問題

但 Tile Upscaling 也有其缺點,因為大圖是由多個 tile 重繪後組成,每個 tile 間可能會有微小的「接縫」(seam artifacts),將圖片對比拉到很高時比較容易發現,一般情況下肉眼不太能區別。

如果遇到很明顯的情況,Ultimate SD Upscale 建議此時可以將 Type 設定為 Chess 降低接縫的問題。

如何用 Stable Diffusion 產生高解析度的圖?

或是使用 Seams fix 功能

如何用 Stable Diffusion 產生高解析度的圖?

注意 Denoising strength 參數調整

官方文件建議給定 0.35,或是往下調到 0.15 ~ 0.20,如果調太高會發生什麼事?如下圖範例,調太高時算出來的圖會過度增加不必要的細節,可能反而讓圖變醜!因此使用時若發現不如預期,記得先確認一下 denoising strength 是否調太高

(點擊可看大圖)

不過以這張圖的例子,增加的細節其實好像還不錯XD,還蠻 case by case

Tiled Upscaling 法小結

優點:

  • 算圖過程相比 img2img 非常節省資源
  • 放大的圖片會與原圖非常接近,且能夠填充更多的細節
  • 能夠放大圖片到非常大張,不會頂到 VRAM 上限

缺點:

  • 因將大圖切成多個 tile 一個個重繪,如果 Scale 到很大會非常耗時
  • 可能會有接縫(seam artifact)的問題

結論

將這篇文章討論的三個方法的 pros and cons 整理成下表

方法優點缺點
img2img1. 能增加細部細節 2. 可調整 prompt 和 denoising strength 進一步優化圖片1. 解析度拉高時需算圖時間長且需要更多VRAM 2. 可能改變圖片細節或構圖,需要調整 denoising strength 或使用ControlNet
AI Upscaler1. 算圖速度快且節省資源 2. 放大圖片與原圖幾乎一樣1. 原圖很小時,放大後細節可能不理想 2. 選擇某些 Upscaler 可能出現細節過度銳利的現象 3. 無法修復原圖已經崩壞的部分
Tiled Upscaling1. 同時享有 img2img 和 AI Upscaler 的優點 2. 使用 ControlNet Tile 重繪,能增加更多細節且節省資源tile 間可能出現微小的接縫(seam artifacts)

或許有人會問,為何不討論 txt2img 中的 Hires.fix?主要是作圖的流程和效率問題。

txt2img 的階段主要是透過調整 prompt 和 CFG scale 找到一個理想的構圖,接下來才進 img2img 作細部編修和放大。

因此在 txt2img 時應該要讓 AI 能夠快速產生很多張圖作挑選,如果此時引入 Hires.fix 不但會拖慢速度,透過他放大的圖片也可能和 txt2img 產生的原圖不同(因為他其實就是 img2img),反而增加調教上的困難。所以不推薦使用 Hires.fix 來作放大,本文就不特別討論了。

以上就是目前最新的 Stable Diffusion 三種放大圖片的方法,大家趕快試試看吧!

延伸閱讀

兩階段解決 Stable Diffusion 臉崩問題
LoRA 是什麼?如何使用?| Stable Diffusion
最詳細的 Stable diffusion WebUI 操作教學 – txt2img
免費用 Google Colab 玩 Stable Diffusion WebUI
如何在 M1 Macbook 上跑 Stable Diffusion?

參考資料

WOW! ControlNet 1.1 Tiles Tutorial – High Resolution for Everyone! ULTIMATE Upscale for SLOW GPUs – Fast Workflow, High Quality, A1111 How to use AI upscaler to improve image details ultimate-upscale-for-automatic1111

Written by J
雖然大學唸的是生物,但持著興趣與熱情自學,畢業後轉戰硬體工程師,與宅宅工程師們一起過著沒日沒夜的生活,做著台灣最薄的 intel 筆電,要與 macbook air 比拼。 離開後,憑著一股傻勁與朋友創業,再度轉戰軟體工程師,一手扛起前後端、雙平台 app 開發,過程中雖跌跌撞撞,卻也累計不少經驗。 可惜不是那 1% 的成功人士,於是加入其他成功人士的新創公司,專職開發後端。沒想到卻在採前人坑的過程中,拓寬了眼界,得到了深層的領悟。