🚀 DiffusionLight: Light Probes for Free by Painting a Chrome Ball
このプロジェクトは、単一の入力画像から照明を推定するシンプルで効果的な手法を提案しています。現在の手法では、限られた視野の入力を完全な環境マップに回帰するために、HDRパノラマデータセットを使ってニューラルネットワークを訓練することが多いですが、データセットの多様性とサイズが限られているため、実世界の制御されていない環境では苦労することが多いです。この問題を解決するために、数十億枚の標準画像で訓練された拡散モデルを利用して、入力画像にクロムボールをレンダリングします。
プロジェクトページ | 論文 | Github | Colab


🚀 クイックスタート
このプロジェクトは、単一の入力画像から照明を推定する手法を提案しています。現在の手法はHDRパノラマデータセットに依存しており、実世界の環境では苦労することが多いです。本手法では、拡散モデルを利用してクロムボールをレンダリングし、照明を推定します。
✨ 主な機能
- 単一の入力画像から照明を推定する。
- 拡散モデルを利用してクロムボールをレンダリングする。
- LoRAを使ってLDR拡散モデルを微調整し、HDR照明推定を行う。
📦 インストール
このモデルの重みはSafetensors形式で利用可能です。
ダウンロードは、Files & versionsタブで行えます。
💻 使用例
基本的な使用法
import torch
from diffusers.utils import load_image
from diffusers import StableDiffusionXLControlNetInpaintPipeline, ControlNetModel
from transformers import pipeline
from PIL import Image
import numpy as np
IS_UNDER_EXPOSURE = False
if IS_UNDER_EXPOSURE:
PROMPT = "a perfect black dark mirrored reflective chrome ball sphere"
else:
PROMPT = "a perfect mirrored reflective chrome ball sphere"
NEGATIVE_PROMPT = "matte, diffuse, flat, dull"
IMAGE_URL = "https://raw.githubusercontent.com/DiffusionLight/DiffusionLight/main/example/bed.png"
controlnet = ControlNetModel.from_pretrained("diffusers/controlnet-depth-sdxl-1.0", torch_dtype=torch.float16)
pipe = StableDiffusionXLControlNetInpaintPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
controlnet=controlnet,
torch_dtype=torch.float16,
).to("cuda")
pipe.load_lora_weights("DiffusionLight/DiffusionLight")
pipe.fuse_lora(lora_scale=0.75)
depth_estimator = pipeline(task="depth-estimation", model="Intel/dpt-large")
init_image = load_image(IMAGE_URL)
depth_image = depth_estimator(images=init_image)['depth']
def get_circle_mask(size=256):
x = torch.linspace(-1, 1, size)
y = torch.linspace(1, -1, size)
y, x = torch.meshgrid(y, x)
z = (1 - x**2 - y**2)
mask = z >= 0
return mask
mask = get_circle_mask().numpy()
depth = np.asarray(depth_image).copy()
depth[384:640, 384:640] = depth[384:640, 384:640] * (1 - mask) + (mask * 255)
depth_mask = Image.fromarray(depth)
mask_image = np.zeros_like(depth)
mask_image[384:640, 384:640] = mask * 255
mask_image = Image.fromarray(mask_image)
output = pipe(
prompt=PROMPT,
negative_prompt=NEGATIVE_PROMPT,
num_inference_steps=30,
image=init_image,
mask_image=mask_image,
control_image=depth_mask,
controlnet_conditioning_scale=0.5,
)
output["images"][0].save("output.png")
📚 ドキュメント
使用方法
GitHubリポジトリを参照することをおすすめします。ここには、任意の画像から照明を推定するコードが含まれています。これには、クロムボールの生成、クロムボールからの環境マップの抽出、カスタム露出バスケット法を使ったHDR環境マップの作成が含まれます。
トリガーワード
クロムボールの露出状態 |
プロンプト |
通常露出 |
a perfect mirrored reflective chrome ball sphere |
アンダー露出 |
a perfect black dark mirrored reflective chrome ball sphere |
クロムボールの生成
独自のパイプラインを使用して、クロムボールに独自の機能を追加しています。これには、エッジを滑らかにするアンチエイリアシング、光の方向の正確性を向上させる反復的なインペインティング、さまざまな露出でクロムボールを生成する埋め込み補間が含まれます。したがって、GitHubリポジトリをぜひご覧ください。
🔧 技術詳細
現在の照明推定技術は、HDRパノラマデータセットに依存しており、データセットの多様性とサイズが限られているため、実世界の環境では苦労することが多いです。本研究では、拡散モデルを利用してクロムボールをレンダリングし、照明を推定します。拡散モデルを使ったクロムボールのレンダリングは簡単に見えますが、誤ったオブジェクトを挿入したり、HDR形式の画像を生成できなかったりする問題があります。本研究では、クロムボールの外観と初期拡散ノイズマップの間の関係を明らかにし、高品質なクロムボールを一貫して生成できるようにしました。さらに、LoRAを使ってLDR拡散モデル(Stable Diffusion XL)を微調整し、HDR照明推定を行えるようにしました。
📄 ライセンス
このプロジェクトはMITライセンスの下で公開されています。
引用
@inproceedings{Phongthawee2023DiffusionLight,
author = {Phongthawee, Pakkapon and Chinchuthakun, Worameth and Sinsunthithet, Nontaphat and Raj, Amit and Jampani, Varun and Khungurn, Pramook and Suwajanakorn, Supasorn},
title = {DiffusionLight: Light Probes for Free by Painting a Chrome Ball},
booktitle = {ArXiv},
year = {2023},
}
Visit us 🦉
