Stable Diffusion 2.0で追加された機能を試してみようStable Diffusion入門(2/2 ページ)

» 2022年12月02日 05時00分 公開
[かわさきしんじDeep Insider編集部]
前のページへ 1|2       

4倍のサイズにアップスケール

 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に縮小

ネコちゃん画像を読み込んでそれを縦横4分の1に縮小

 最後にプロンプトとこの画像をモデルに入力するだけです。

prompt = 'a white dog'

upscaled_image = pipe(prompt=prompt, image=low_res_img,).images[0]
upscaled_image

縦横4分の1に縮小した画像をアップスケール

 プロンプトに「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')

StableDiffusionInpaintingPipelineオブジェクトの生成

 そして、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モデルについては機会があれば触れてみることにしましょう。

「Stable Diffusion入門」のインデックス

Stable Diffusion入門

前のページへ 1|2       

Copyright© Digital Advantage Corp. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。