Stable Diffusion 算圖時,有時算出來的人臉都像是被揍過一樣!這其實是解析度過小的問題,我們可以透過 img2img upscale 加 inpaint 的手法來解決,只需要兩階段,一起來看看怎麼做吧!
第一階段:增加圖面解析度
以下這一張用 Stable Diffusion 畫出小朋友與老師的畢業合照,整張圖的解析度為 784 x 512。因為每個人臉所佔畫面(解析度)過小,就算我們 prompt 下再多 beautiful face 等關鍵字,Stable Diffusion 還是兩手一攤擺爛亂畫。
既然是解析度問題,我們設法增加臉部解析度試試能不能好轉,我們可以使用 img2img 將整張圖的解析度增加。
給定與原圖一樣的 prompt,denoising strength 可以調 0.5 附近,讓算圖結果與原圖差異不要太大。
延伸閱讀:如何用 Stable Diffusion 產生高解析度的圖?
下圖採用 denoising strength = 0.65,長寬 1568 x 1024,其他參數則與原圖相同。同時開啟 ControlNet openpose 固定人物肢體與排列 ,結果如下:
雖然人物的衣服改變了,但整體來說比之更好,衣服的質感也比較自然。同時發現臉部已經好很多,但還是偏呆滯,接下來我們用 Inpaint 來解決這個問題。
第二階段:使用 Inpaint 重繪臉部
Inpaint 原理是,我們在圖片上塗抹一個區域,告訴 AI 只需要幫我們重繪被遮住的區塊。如此即能在不動整個畫面的情況下,微調 AI 畫不好的小地方。
一樣在 img2img 頁面:
- 切換子 tab 為
Inpaint
- 將剛剛放大的圖片拖入 source
- Mask mode 選擇
Inpaint masked
- Mask content 選擇
original
- Inpaint area 選擇
Only masked
- Width、Height 都設定為
512
選擇 only masked 的原因是,我們讓 Stable Diffusion 用給定的長寬
畫被遮住的部分
,好處是:
- 增加局部解析度:讓需要修改的地方,保證至少有
512x512 的解析度
。如果選擇 all xxx,則會依照給定的長寬
下去整張重畫
,因為整個解析度分散到整張圖片
上,反而需要修改的地方分到的解析度不夠高,並不能解決問題。 - 節省算圖時間:當修改的地方不大時,只需要 512 ~ 768 等解析度就足夠修復區域問題,避免算整張圖耗費時間
如同上述,為了確保每張臉的解析度是足夠的,我們一次僅塗抹一張臉。
按下 Generate,就能修復好一張臉。
這邊有個小技巧,塗抹的面積要比臉部稍微大一點點,這樣重繪後的五官比較不會發生偏移而看起來怪怪的
把修好一張臉的圖拖入 source,再塗抹下一張臉,不斷重複直到每張臉都修復完成!(這張圖臉實在有點多……)
重複多次後就能得到修復完成的圖了!會發現每張臉都長得一樣XD!若要得到有差異性的五官,每次修復時微調 prompt 即可!
與原始圖對比一下,進步非常多!
最後可以透過 Tiled Upscaling 的手法將圖再次放大,即能輸出高解析度的結果。大家試試看吧!
延伸閱讀
如何用 Stable Diffusion 產生高解析度的圖?
LoRA 是什麼?如何使用?| Stable Diffusion
最詳細的 Stable diffusion WebUI 操作教學 – txt2img
免費用 Google Colab 玩 Stable Diffusion WebUI
如何在 M1 Macbook 上跑 Stable Diffusion?