見出し画像

StableDiffusionでシームレスなテクスチャ・タイリング画像を出力する方法

先日、StableDiffusionでシームレスなテクスチャを出力してみたのですが、たくさんの反響があったのでnoteで使用方法について具体的に書いてみました。こちらの記事は既にローカルでStableDiffusionの実行環境を構築していることが前提となります。

まず初めに、lox9973さんが2022年8月25日にシームレスなテクスチャ画像を出力する為のスクリプトを作成し、公開してくださいました。神に感謝。

こちらの公開されているスクリプトを利用して、シームレスな画像を出力する方法を解説します。Diffusersを使って出力している場合とtxt2img.pyを直接実行している場合で2種類ご紹介します。

(方法1) Diffusersを使って出力している場合

diffusersを使って実行している場合は tileable.py の17行目

pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", use_auth_token=YOUR_TOKEN)

YOUR_TOKENの部分をhugging faceで取得したトークンに置きかえます。一度diffusersでの動作セットアップを行っている必要があります。

次にコマンドプロンプトから
python tileable.py 
を実行すると
stable_diffusionフォルダにoutput.pngが出力されました。確認するとシームレスな画像になっています。凄い!

(方法2)「 txt2img.py」を直接実行している場合

stable-diffusion\scriptsフォルダのtxt2img.pyを改変します。
ライブラリのインポートが終わったあたり、txt2img.pyの24行目くらいにtileable.py の以下の部分をコピペして挿入して保存します。(ちなみに出力される画像はすべてシームレスな画像として出力される為、コピーして別ファイルで行うのを推奨)と言いつつ自分は元ファイルでやります。

def patch_conv(klass):
	init = klass.__init__
	def __init__(self, *args, **kwargs):
		return init(self, *args, **kwargs, padding_mode='circular')
	klass.__init__ = __init__

for klass in [torch.nn.Conv2d, torch.nn.ConvTranspose2d]:
	patch_conv(klass)

自分はGPUのVRAMが足りないので最適化されたfolk版を使用していますが、その場合はoptimized_txt2img.pyを改変します。17行目付近

コマンドプロンプトから
python scripts/txt2img.py --prompt "a photograph of an astronaut riding a horse"
を実行します。

シームレスな画像が出力されます。

全てタイリング可能な画像として機能していますね!

以上です。ちなみに冒頭で紹介した私のTwitterのスレッドに色々な方の作られた作例をぶら下げていますので試してみる際はぜひ参考にしてみてください。

その他

こちらはVRAMが足りなくでも動作するfolk版

Diffusersのセットアップに関してはこちらのまとめを参考にしました。

https://togetter.com/li/1934571


この記事が気に入ったらサポートをしてみませんか?