VIVEK JAYARAM
commited on
Commit
·
c63740a
1
Parent(s):
b487d98
Diffusers unet working
Browse files- cdim/diffusion/diffusion_pipeline.py +7 -4
- inference.py +16 -6
- requirements.txt +3 -0
cdim/diffusion/diffusion_pipeline.py
CHANGED
@@ -15,7 +15,8 @@ def run_diffusion(
|
|
15 |
num_inference_steps: int = 1000,
|
16 |
K=5,
|
17 |
image_dim=256,
|
18 |
-
image_channels=3
|
|
|
19 |
):
|
20 |
batch_size = noisy_observation.shape[0]
|
21 |
image_shape = (batch_size, image_channels, image_dim, image_dim)
|
@@ -26,7 +27,8 @@ def run_diffusion(
|
|
26 |
|
27 |
for i, t in tqdm(enumerate(scheduler.timesteps), total=len(scheduler.timesteps), desc="Processing timesteps"):
|
28 |
# 1. predict noise model_output
|
29 |
-
model_output = model(image, t.unsqueeze(0).to(device))
|
|
|
30 |
|
31 |
# 2. compute previous image: x_t -> x_t-1
|
32 |
image = scheduler.step(model_output, t, image).prev_sample
|
@@ -38,7 +40,8 @@ def run_diffusion(
|
|
38 |
|
39 |
with torch.enable_grad():
|
40 |
# Calculate x^hat_0
|
41 |
-
model_output = model(image, (t - t_skip).unsqueeze(0).to(device))
|
|
|
42 |
x_0 = (image - beta_prod_t_prev ** (0.5) * model_output) / alpha_prod_t_prev ** (0.5)
|
43 |
|
44 |
distance = operator(x_0) - noisy_observation
|
@@ -48,6 +51,6 @@ def run_diffusion(
|
|
48 |
print(loss.mean())
|
49 |
loss.mean().backward()
|
50 |
|
51 |
-
image -=
|
52 |
|
53 |
return image
|
|
|
15 |
num_inference_steps: int = 1000,
|
16 |
K=5,
|
17 |
image_dim=256,
|
18 |
+
image_channels=3,
|
19 |
+
model_type="diffusers"
|
20 |
):
|
21 |
batch_size = noisy_observation.shape[0]
|
22 |
image_shape = (batch_size, image_channels, image_dim, image_dim)
|
|
|
27 |
|
28 |
for i, t in tqdm(enumerate(scheduler.timesteps), total=len(scheduler.timesteps), desc="Processing timesteps"):
|
29 |
# 1. predict noise model_output
|
30 |
+
model_output = model(image, t.unsqueeze(0).to(device))
|
31 |
+
model_output = model_output.sample if model_type == "diffusers" else model_output[:, :3]
|
32 |
|
33 |
# 2. compute previous image: x_t -> x_t-1
|
34 |
image = scheduler.step(model_output, t, image).prev_sample
|
|
|
40 |
|
41 |
with torch.enable_grad():
|
42 |
# Calculate x^hat_0
|
43 |
+
model_output = model(image, (t - t_skip).unsqueeze(0).to(device))
|
44 |
+
model_output = model_output.sample if model_type == "diffusers" else model_output[:, :3]
|
45 |
x_0 = (image - beta_prod_t_prev ** (0.5) * model_output) / alpha_prod_t_prev ** (0.5)
|
46 |
|
47 |
distance = operator(x_0) - noisy_observation
|
|
|
51 |
print(loss.mean())
|
52 |
loss.mean().backward()
|
53 |
|
54 |
+
image -= 15 / torch.linalg.norm(image.grad) * image.grad
|
55 |
|
56 |
return image
|
inference.py
CHANGED
@@ -7,6 +7,8 @@ from PIL import Image
|
|
7 |
import numpy as np
|
8 |
import torch
|
9 |
|
|
|
|
|
10 |
from cdim.noise import get_noise
|
11 |
from cdim.operators import get_operator
|
12 |
from cdim.image_utils import save_to_image
|
@@ -51,11 +53,18 @@ def main(args):
|
|
51 |
operator_config["device"] = device
|
52 |
operator = get_operator(**operator_config)
|
53 |
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
59 |
|
60 |
# All the models have the same scheduler.
|
61 |
# you can change this for different models
|
@@ -77,7 +86,8 @@ def main(args):
|
|
77 |
model, ddim_scheduler,
|
78 |
noisy_measurement, operator, noise_function, device,
|
79 |
num_inference_steps=args.T,
|
80 |
-
K=args.K
|
|
|
81 |
print(f"total time {time.time() - t0}")
|
82 |
|
83 |
save_to_image(output_image, os.path.join(args.output_dir, "output.png"))
|
|
|
7 |
import numpy as np
|
8 |
import torch
|
9 |
|
10 |
+
from diffusers import DiffusionPipeline
|
11 |
+
|
12 |
from cdim.noise import get_noise
|
13 |
from cdim.operators import get_operator
|
14 |
from cdim.image_utils import save_to_image
|
|
|
53 |
operator_config["device"] = device
|
54 |
operator = get_operator(**operator_config)
|
55 |
|
56 |
+
if args.model_config.endswith(".yaml"):
|
57 |
+
# Local model from DPS
|
58 |
+
model_type = "dps"
|
59 |
+
model_config = load_yaml(args.model_config)
|
60 |
+
model = create_model(**model_config)
|
61 |
+
model = model.to(device)
|
62 |
+
model.eval()
|
63 |
+
|
64 |
+
else:
|
65 |
+
# Huggingface diffusers model
|
66 |
+
model_type = "diffusers"
|
67 |
+
model = DiffusionPipeline.from_pretrained(args.model_config).to("cuda").unet
|
68 |
|
69 |
# All the models have the same scheduler.
|
70 |
# you can change this for different models
|
|
|
86 |
model, ddim_scheduler,
|
87 |
noisy_measurement, operator, noise_function, device,
|
88 |
num_inference_steps=args.T,
|
89 |
+
K=args.K,
|
90 |
+
model_type=model_type)
|
91 |
print(f"total time {time.time() - t0}")
|
92 |
|
93 |
save_to_image(output_image, os.path.join(args.output_dir, "output.png"))
|
requirements.txt
CHANGED
@@ -1,2 +1,5 @@
|
|
|
|
1 |
numpy==2.1.2
|
2 |
Pillow==11.0.0
|
|
|
|
|
|
1 |
+
diffusers==0.30.3
|
2 |
numpy==2.1.2
|
3 |
Pillow==11.0.0
|
4 |
+
PyYAML==6.0.2
|
5 |
+
tqdm==4.66.5
|