修圖的時候,有沒有遇過「如果當初再左邊一點就好了!」「如果當初廣角一點就好了!」以前只能想辦法手工 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 章節。

如何用 Stable Diffusion + ControlNet 向外擴展圖片?| Outpainting

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 就代表安裝完成!

如何用 Stable Diffusion + ControlNet 向外擴展圖片?| Outpainting

註:若先前已經安裝過 ControlNet,務必更新到 ControlNet v1.1 以上才有 inpaint 功能!

準備實驗圖片

為了「對照」 Stable Diffusion 向外擴展的能力,我刻意使用完整的圖片作裁切去除兩側,留下中央部分給 AI 去補完,最後再與原圖做一番比較

如何用 Stable Diffusion + ControlNet 向外擴展圖片?| Outpainting
裁切掉兩側的測試圖

使用 Interrogate 推理提示詞

為了讓出圖能夠更完善,可以使用 Stable Diffusion img2img tab 裡內建的 Interrogate CLIP 或 Interrogate DeepBooru 從圖面推理出提詞,再依情況人工修改,速度比較快。詳細步驟如下:

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

使用 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. 其他保留預設即可
如何用 Stable Diffusion + ControlNet 向外擴展圖片?| Outpainting

ControlNet 設定

接下來重點是 ControlNet 的設定:

  1. 勾選 enable
  2. 將圖片拖到 source
  3. Preprocessor: 選擇 inpaint_only
  4. Model: 選擇 control_v11p_sd15_inpaint
  5. Resize Mode: 選擇 Resize and Fill,很重要!因為要讓他 fill 空白的部分,選錯就不會 outpainting!
如何用 Stable Diffusion + ControlNet 向外擴展圖片?| Outpainting

開始算圖

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

如何用 Stable Diffusion + ControlNet 向外擴展圖片?| Outpainting

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

如何用 Stable Diffusion + ControlNet 向外擴展圖片?| Outpainting

雖然補完的不錯,但有明顯接縫,沒關係,我們選一張感覺還可以的進 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. 其他保留預設
如何用 Stable Diffusion + ControlNet 向外擴展圖片?| Outpainting

ControlNet 設定

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

  1. 勾選 enable
  2. Preprocessor: 選擇 canny
  3. Model: 選擇 control_v11p_sd15_canny (如果沒有此模型,請與前述相同方法下載並放置對應資料夾中)
  4. 其他保留預設
如何用 Stable Diffusion + ControlNet 向外擴展圖片?| Outpainting

開始算圖

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

如何用 Stable Diffusion + ControlNet 向外擴展圖片?| Outpainting

有了補完的圖,可以依照 如何用 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% 的成功人士,於是加入其他成功人士的新創公司,專職開發後端。沒想到卻在採前人坑的過程中,拓寬了眼界,得到了深層的領悟。