修圖的時候,有沒有遇過「如果當初再左邊一點就好了!」「如果當初廣角一點就好了!」以前只能想辦法手工 P 出來,但靠 Stable Diffusion + ControlNet 新推出的 Inpaint 模型,除了可以做圖片內修補外,也能往外擴展補完圖片 (outpaintng)!實在太強了!趕快來看看怎麼作吧!
目錄
準備素材
下載 ControlNet Inpaint Model
此作法需要用到 ControlNet 與 ControlNet Inpaint Model,還沒安裝 ControlNet 的話,可以到 Extension Tab ,在 Install from URL 輸入 https://github.com/Mikubill/sd-webui-controlnet.git
安裝 。詳細安裝步驟請參考 github 的 installation 章節。
ControlNet Inpaint Model 請到 HuggingFace 下載 control_v11p_sd15_inpaint.pth
和 control_v11p_sd15_inpaint.yaml
後,放入 stable-diffusion-webui\extensions\sd-webui-controlnet
資料夾內。
回到 StableDiffusion WebUI,重啟一下,如果有看到 ControlNet v1.1 區塊以及 Inpaint Model 就代表安裝完成!
註:若先前已經安裝過 ControlNet,務必更新到 ControlNet v1.1 以上才有 inpaint 功能!
準備實驗圖片
為了「對照」 Stable Diffusion 向外擴展的能力,我刻意使用完整的圖片作裁切去除兩側,留下中央部分給 AI 去補完,最後再與原圖做一番比較
使用 Interrogate 推理提示詞
為了讓出圖能夠更完善,可以使用 Stable Diffusion img2img tab 裡內建的 Interrogate CLIP 或 Interrogate DeepBooru 從圖面推理出提詞,再依情況人工修改,速度比較快。詳細步驟如下:
- 將圖片拖入 img2img tab 的
source
區塊 - 點擊右上方橘色
Interrogate CLIP
按鈕 (DeepBooru 也可以,會以關鍵字的方式產出) - 等待一小段計算時間,推理出的提示詞會出現在
Positive Prompt
輸入框中 - 複製備用
使用 ControlNet Inpaint 來 Outpainting
基本 txt2img 設定
一切準備妥當,回到 Stable Diffusion txt2img tab 頁面開始實作:
- 貼上剛剛的
Prompt
,並適當增加Negative Prompt
- Sampling Method: 選擇
Euler a
,因為算圖速度比較快,用來初步構圖 - Sampling Steps: 先用預設
20
- Width / Hight: 分別設定為
784, 512
,數值可自由選擇,但為了讓他能夠作 outpainting,比例一定要和原圖不一樣!以範例來說,原圖是直幅,要讓他 outpainting 成橫幅,寬一定要設定比高來的多。 - 其他保留預設即可
ControlNet 設定
接下來重點是 ControlNet 的設定:
- 勾選
enable
- 將圖片拖到
source
區 - Preprocessor: 選擇
inpaint_only
- Model: 選擇
control_v11p_sd15_inpaint
- Resize Mode: 選擇
Resize and Fill
,很重要!因為要讓他 fill 空白的部分,選錯就不會 outpainting!
開始算圖
按下算圖,原本圖片被裁掉的兩側就慢慢長出來囉!
可以將 Batch count 調到 4 讓他一次算四張挑選
雖然補完的不錯,但有明顯接縫,沒關係,我們選一張感覺還可以的進 img2img 繼續處理。
用 img2img 修補 outpainting 結果
在剛剛出圖結果下方點選 Send to img2img
,將 prompt、設定、圖片全部轉到 img2img tab 中。
基本 img2img 設定
進入 img2img,開始對畫質做調整,因此我們可以選用速度比較慢的 Sampling Method 和比較大的 Steps。
- Sampling Method: 選擇
DPM++ SDE Karras
- Sampling Steps: 選擇
30
- Denoising Strength: 先選擇
0.65
,讓 AI 自由度中等偏多一點,目的是讓 AI 在不改變太多畫面的元素下,能有自由度幫我們把不合理的接縫處理掉 - 其他保留預設
ControlNet 設定
為了控制 img2img 構圖不變,我們開啟 ControlNet 選擇 Canny,用輪廓線作控制。
- 勾選
enable
- Preprocessor: 選擇
canny
- Model: 選擇
control_v11p_sd15_canny
(如果沒有此模型,請與前述相同方法下載並放置對應資料夾中) - 其他保留預設
開始算圖
發現接縫已經消失了!多跑幾張,調整不同的 Denoising Strength 看看效果,找出甜蜜點。
有了補完的圖,可以依照 如何用 Stable Diffusion 產生高解析度的圖? 文中提到的方法提高圖片解析度,解決現實世界中的畫面缺失問題,再進 PhotoShop 後製調色。
結論
以這次實驗的結果,看起來 outpainting 的結果還不賴!但有些情境還是會走鐘,比如說遇到剛好被裁切的肢體,outpainting 出來就會一踏糊塗!不過大部分的情況都算可使用的程度了!值得讚賞!
看一下原圖和 Stable Diffusion 幫我們想像的圖,你覺得你比較喜歡哪一張呢?
延伸閱讀
如何讓 Stable Diffusion 算圖更精細生動? | ControlNet Tile Resample | Detail Tweaker LoRA
兩階段解決 Stable Diffusion 臉崩問題
如何用 Stable Diffusion 產生高解析度的圖?
LoRA 是什麼?如何使用?| Stable Diffusion