🚀 潜在拡散モデル (LDM)
潜在拡散モデル(LDM)は、画像生成や画像修復などのタスクで高い性能を発揮する拡散モデルです。計算コストを削減しつつ、高品質な画像合成を可能にします。
🚀 クイックスタート
潜在拡散モデル(LDM)は、画像形成プロセスをノイズ除去オートエンコーダの逐次適用に分解することで、画像データなどで最先端の合成結果を達成します。
✨ 主な機能
- 高解像度画像合成:潜在空間での拡散モデルのトレーニングにより、高解像度の画像合成が可能です。
- 柔軟な生成:クロスアテンション層を導入することで、テキストやバウンディングボックスなどの一般的な条件入力に対応した強力で柔軟な生成器となります。
- 計算コスト削減:ピクセル空間での操作ではなく、事前学習されたオートエンコーダの潜在空間で動作するため、計算コストを大幅に削減します。
📚 ドキュメント
論文情報
- 論文:High-Resolution Image Synthesis with Latent Diffusion Models
- 概要:拡散モデル(DM)は、画像形成プロセスをノイズ除去オートエンコーダの逐次適用に分解することで、画像データなどで最先端の合成結果を達成します。また、再トレーニングすることなく画像生成プロセスを制御するためのガイドメカニズムを可能にします。しかし、これらのモデルは通常ピクセル空間で直接動作するため、強力なDMの最適化には数百GPU日を消費することが多く、逐次評価による推論コストも高いです。計算資源が限られた環境でもDMの品質と柔軟性を維持しながらトレーニングを可能にするため、強力な事前学習されたオートエンコーダの潜在空間でDMを適用します。以前の研究とは対照的に、このような表現上で拡散モデルをトレーニングすることで、初めて複雑性の削減と詳細の保存の間でほぼ最適なポイントに到達することができ、視覚的な忠実度が大幅に向上します。モデルアーキテクチャにクロスアテンション層を導入することで、拡散モデルをテキストやバウンディングボックスなどの一般的な条件入力に対する強力で柔軟な生成器に変え、畳み込み方式で高解像度合成が可能になります。我々の潜在拡散モデル(LDM)は、画像修復において新たな最先端技術を達成し、無条件画像生成、セマンティックシーン合成、超解像などの様々なタスクで非常に競争力のある性能を発揮し、ピクセルベースのDMと比較して計算要件を大幅に削減します。
- 著者:Robin Rombach, Andreas Blattmann, Dominik Lorenz, Patrick Esser, Björn Ommer
💻 使用例
基本的な使用法
!pip install diffusers
from diffusers import DiffusionPipeline
model_id = "CompVis/ldm-celebahq-256"
pipeline = DiffusionPipeline.from_pretrained(model_id)
image = pipeline(num_inference_steps=200)["sample"]
image[0].save("ldm_generated_image.png")
高度な使用法
!pip install diffusers
from diffusers import UNet2DModel, DDIMScheduler, VQModel
import torch
import PIL.Image
import numpy as np
import tqdm
seed = 3
unet = UNet2DModel.from_pretrained("CompVis/ldm-celebahq-256", subfolder="unet")
vqvae = VQModel.from_pretrained("CompVis/ldm-celebahq-256", subfolder="vqvae")
scheduler = DDIMScheduler.from_config("CompVis/ldm-celebahq-256", subfolder="scheduler")
torch_device = "cuda" if torch.cuda.is_available() else "cpu"
unet.to(torch_device)
vqvae.to(torch_device)
generator = torch.manual_seed(seed)
noise = torch.randn(
(1, unet.in_channels, unet.sample_size, unet.sample_size),
generator=generator,
).to(torch_device)
scheduler.set_timesteps(num_inference_steps=200)
image = noise
for t in tqdm.tqdm(scheduler.timesteps):
with torch.no_grad():
residual = unet(image, t)["sample"]
prev_image = scheduler.step(residual, t, image, eta=0.0)["prev_sample"]
image = prev_image
with torch.no_grad():
image = vqvae.decode(image)
image_processed = image.cpu().permute(0, 2, 3, 1)
image_processed = (image_processed + 1.0) * 127.5
image_processed = image_processed.clamp(0, 255).numpy().astype(np.uint8)
image_pil = PIL.Image.fromarray(image_processed[0])
image_pil.save(f"generated_image_{seed}.png")
📦 サンプル




📄 ライセンス
このプロジェクトは、Apache-2.0ライセンスの下で公開されています。