修圖的時候,有沒有遇過「如果當初再左邊一點就好了!」「如果當初廣角一點就好了!」以前只能想辦法手工 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.pthcontrol_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 從圖面推理出提詞,再依情況人工修改,速度比較快。詳細步驟如下:

  1. 將圖片拖入 img2img tab 的 source 區塊
  2. 點擊右上方橘色 Interrogate CLIP 按鈕 (DeepBooru 也可以,會以關鍵字的方式產出)
  3. 等待一小段計算時間,推理出的提示詞會出現在 Positive Prompt 輸入框中
  4. 複製備用

使用 ControlNet Inpaint 來 Outpainting

基本 txt2img 設定

一切準備妥當,回到 Stable Diffusion txt2img tab 頁面開始實作:

  1. 貼上剛剛的 Prompt,並適當增加 Negative Prompt
  2. Sampling Method: 選擇 Euler a,因為算圖速度比較快,用來初步構圖
  3. Sampling Steps: 先用預設 20
  4. Width / Hight: 分別設定為 784, 512,數值可自由選擇,但為了讓他能夠作 outpainting,比例一定要和原圖不一樣!以範例來說,原圖是直幅,要讓他 outpainting 成橫幅,寬一定要設定比高來的多。
  5. 其他保留預設即可

ControlNet 設定

接下來重點是 ControlNet 的設定:

  1. 勾選 enable
  2. 將圖片拖到 source
  3. Preprocessor: 選擇 inpaint_only
  4. Model: 選擇 control_v11p_sd15_inpaint
  5. Resize Mode: 選擇 Resize and Fill,很重要!因為要讓他 fill 空白的部分,選錯就不會 outpainting!

開始算圖

按下算圖,原本圖片被裁掉的兩側就慢慢長出來囉!

可以將 Batch count 調到 4 讓他一次算四張挑選

雖然補完的不錯,但有明顯接縫,沒關係,我們選一張感覺還可以的進 img2img 繼續處理。

用 img2img 修補 outpainting 結果

在剛剛出圖結果下方點選 Send to img2img,將 prompt、設定、圖片全部轉到 img2img tab 中。

基本 img2img 設定

進入 img2img,開始對畫質做調整,因此我們可以選用速度比較慢的 Sampling Method 和比較大的 Steps。

  1. Sampling Method: 選擇 DPM++ SDE Karras
  2. Sampling Steps: 選擇 30
  3. Denoising Strength: 先選擇 0.65 ,讓 AI 自由度中等偏多一點,目的是讓 AI 在不改變太多畫面的元素下,能有自由度幫我們把不合理的接縫處理掉
  4. 其他保留預設

ControlNet 設定

為了控制 img2img 構圖不變,我們開啟 ControlNet 選擇 Canny,用輪廓線作控制。

  1. 勾選 enable
  2. Preprocessor: 選擇 canny
  3. Model: 選擇 control_v11p_sd15_canny (如果沒有此模型,請與前述相同方法下載並放置對應資料夾中)
  4. 其他保留預設

開始算圖

發現接縫已經消失了!多跑幾張,調整不同的 Denoising Strength 看看效果,找出甜蜜點。

有了補完的圖,可以依照 如何用 Stable Diffusion 產生高解析度的圖? 文中提到的方法提高圖片解析度,解決現實世界中的畫面缺失問題,再進 PhotoShop 後製調色。

結論

以這次實驗的結果,看起來 outpainting 的結果還不賴!但有些情境還是會走鐘,比如說遇到剛好被裁切的肢體,outpainting 出來就會一踏糊塗!不過大部分的情況都算可使用的程度了!值得讚賞!

看一下原圖和 Stable Diffusion 幫我們想像的圖,你覺得你比較喜歡哪一張呢?

延伸閱讀

如何讓 Stable Diffusion 算圖更精細生動? | ControlNet Tile Resample | Detail Tweaker LoRA
兩階段解決 Stable Diffusion 臉崩問題
如何用 Stable Diffusion 產生高解析度的圖?
LoRA 是什麼?如何使用?| Stable Diffusion

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