本篇要來討論一些目前在Stable Diffusion裡面,比較可行的向外擴展方法(Outpaint)。
向外擴展跟
局部重繪(Inpaint)有點類似。局部重繪注重的是將原圖裡面想要修改的地方圈選起來,之後依靠AI重算該區域。向外擴展則是將圖的周圍擴展開來,然後填充進新的內容,造成一種Zoom out的感覺。
Automatic1111有提供兩種Outpaint的方法,但是我本人使用之後覺得非常不好用,都不推薦。現行比較好用的Outpaint方法之中,我個人最常用的方法是搭配修圖軟體將圖擴展之後再利用ControlNet的Inpaint模型來達到Outpaint的效果。畢竟,所謂的Outpaint其實也就是在擴展開來的邊界上做局部重繪罷了。
下面將以一張512x512的圖擴展成768x768的結果來展示這個方法:
首先,這個方法需要使用修圖軟體來擴展白邊,儘管圖生圖(img2img)的介面上也可以修改擴增邊界,但是非常麻煩,還不如學一下修圖軟體的功能來得快速。我主要以GIMP這個免費修圖繪圖軟體為主,但是幾乎所有修圖軟體都能提供一樣的功能。
在GIMP中,打開Image -> Canvas Size...功能,就能呼叫設定畫布尺寸功能,然後按下置中按鈕讓原圖置中,這樣就可以生成一張以空白區域圍繞原圖的新圖了:
之後,在Automatic1111的inpaint區域讀取這張圖,然後將圍繞在原圖周圍的白邊,連同一點點原圖的內容都圈選起來,這樣在重繪時AI才比較曉得原圖的結構:
然後,在正面提示詞中,必須詳細敘述想要的畫面,否則可能會出現很奇怪的結果。在我的例子裡,我的提示詞直接沿用了原圖的提示詞:
(best quality), (realistic), (photorealistic), extremely detailed, an extremely delicate and beautiful, RAW photo, low lighting, solo, real face, real skin, realistic face, realistic skin, beautiful eyes,
Hana wearing white kimono and short red skirt, sitting on the ground of a grass field, smiling, from above, landscape, full body shot, dutch angle shot, detailed background
<lora:Hana40:0.35>
然後我們要調整Inpaint的參數,在這裡,Masked content要選擇fill。理論上選擇latent noise或者latent nothing也可以,但是我個人實測發現還是fill產生的結果最好用。而在Sampling steps上最好不要低於50,否則出來的圖會很粗糙。而Denosing strength則要0.75以上,讓整個重繪強度到達能改動架構的程度。
在ControlNet的Inpaint模型出來之前,其實這樣的設定就能跑了,但是常常會出現很明顯的銜接痕跡,或者成果圖與原圖相差太遠。自從ControlNet出了Inpaint模型之後,我們可以靠著這個模型大大改善這問題:
這個地方得益於最近的改版,在選擇Inpaint時不用放入任何參考圖,ControlNet會很聰明地讀取Inpaint的選取範圍,產生效果還算滿意的成果圖。
但有時候還是會在一些地方看到銜接的痕跡,有好幾種方法來做最後修正:
- 將成果圖丟進繪圖軟體,用塗抹工具把有差異的色塊抹掉。
- 將成果圖丟進img2img,用低Denosing strength對整張圖拋光打磨。
- 將成果圖傳回inpaint,選取需要修改的區域,然後用中等強度的Denosing strength重繪。