stable-diffusion-x4-upscalerモデルを使って、アップスケールする場合もその使い方は上と同様です。ただし、使用するパイプラインクラスはStableDiffusionUpscalePipelineクラスに、モデルIDは「stabilityai/stable-diffusion-x4-upscaler」になります。
以下に簡単な例を示します。
from diffusers import StableDiffusionUpscalePipeline
from PIL import Image
model_id = 'stabilityai/stable-diffusion-x4-upscaler'
pipe = StableDiffusionUpscalePipeline.from_pretrained(model_id, revision='fp16', torch_dtype=torch.float16)
pipe = pipe.to('cuda')
上で述べた通り、「stabilityai/stable-diffusion-x4-upscaler」をモデルIDとして、StableDiffusionUpscalePipelineクラスのインスタンスを生成しています。そして、ここでは以下に示すネコちゃんの写真をアップスケールしてみることにしました。
なお、上の画像は512×512ピクセルの画像となっているので、ご自分でコードを試してみるのであれば画像を保存して、Google Colabにアップロードしてください(ファイル形式に合わせてコード中の拡張子を修正してください)。
この画像をまずは縦横4分の1のサイズつまり128×128ピクセルに縮小しておきます。その後、アップスケールを行って、元の画像と遜色ないものになっていれば万々歳です。
img = Image.open('cat.jpg') # 512×512ピクセルのネコ画像を読み込み
low_res_img = img.resize((128, 128)) # それを4分の1に縮小
最後にプロンプトとこの画像をモデルに入力するだけです。
prompt = 'a white dog'
upscaled_image = pipe(prompt=prompt, image=low_res_img,).images[0]
upscaled_image
プロンプトに「a white dog」にしている点に注目してください。果たして、ネコちゃんはワンちゃんになった上で512×512ピクセルになるのでしょうか。
ワンちゃんには全くなりませんでしたね。
ソースコードを見る限りはある程度の影響はありそうなのですが、どうしてこうなった(何度やってもこんな感じなので、画像のアップスケールという目的を考えると、プロンプトによる影響が出ないようになっているのかもしれません)。
ネコちゃんの元画像を再掲しておきます。
首輪の周辺や背中の毛並みなどをよく見ると、アップスケールされた画像と元画像には相違点があることが分かります。これは128×128ピクセルの画像をアップスケールしたからかもしれません(元画像のサイズがもっと大きければ、もっとよい結果が出そうな気はします)。
ここまでくればお分かりでしょうが、画像の一部を書き換えるコードもほぼほぼ同じです。特にモデルに画像を入力する点は同じです。ですが、画像の一部を書き換えるときには、書き換えたい部分とそうではない部分を指定する必要があります。stable-diffusion-inpaintingモデルでは、書き換えたい部分は白で、そのままにしておきたい部分は黒で塗りつぶした「マスク画像」も入力することになります。
ここではマスク画像として以下を用意しました(書き換えを行う元画像は先ほどのネコちゃんです)。
マスク画像は筆者がPhotoshopで適当に作ったものですが、まあ、こんなものでしょう。
マスク画像が必要なのは手間ですね……。正直、使いづらいなと思います。候補マスク画像も自動生成してくれるともっと良いのだけど。
元の画像と上のマスク画像、それからプロンプトをモデルに入力すると、マスク画像で白くなっている箇所に対応する元画像の位置がプロンプトに従って書き換えられるというわけです。
まずはパイプラインクラスのインスタンスを取得するコードから。
from diffusers import StableDiffusionInpaintPipeline
from PIL import Image
model_id = 'stabilityai/stable-diffusion-2-inpainting'
pipe = StableDiffusionInpaintPipeline.from_pretrained(model_id, revision='fp16', torch_dtype=torch.float16)
pipe = pipe.to('cuda')
そして、2つの画像を読み込みます。
img = Image.open('cat.jpg')
img_mask = Image.open('cat_mask.jpg')
最後にプロンプトを指定して、モデルを呼び出しましょう。
prompt = 'silver fox'
image = pipe(prompt=prompt, image=img, mask_image=img_mask, num_inference_steps=25).images[0]
image
ここではプロンプトはシンプルに「a silver fox」にしてあります。結果は次のようになりました。
元画像ではネコちゃんがいたところに銀狐(silver fox)っぽいものが見事に描画されています(わーい)。
マスク部分に無理やり当てはめているため、若干、無理やり感ありますね……。
それはいわない約束でしょっ。
このようにStable Diffusion 2.0では少量のコードで高度な機能を簡単に扱えるようになっています。stable-diffusion-2-depthモデルについては機会があれば触れてみることにしましょう。
Copyright© Digital Advantage Corp. All Rights Reserved.