| import numpy as np |
| import torch |
| import torch.nn.functional as F |
| import torchvision.transforms.functional as TF |
| from diffusers import DiffusionPipeline |
|
|
|
|
| class LGMPipeline(DiffusionPipeline): |
| def __init__(self, lgm): |
| super().__init__() |
|
|
| self.imagenet_default_mean = (0.485, 0.456, 0.406) |
| self.imagenet_default_std = (0.229, 0.224, 0.225) |
|
|
| lgm = lgm.half().cuda() |
| self.register_modules(lgm=lgm) |
|
|
| def save_ply(self, gaussians, path): |
| self.lgm.gs.save_ply(gaussians, path) |
|
|
| @torch.no_grad() |
| def __call__(self, images): |
| images = np.stack([images[1], images[2], images[3], images[0]], axis=0) |
| images = torch.from_numpy(images).permute(0, 3, 1, 2).float().cuda() |
| images = F.interpolate( |
| images, |
| size=(256, 256), |
| mode="bilinear", |
| align_corners=False, |
| ) |
| images = TF.normalize( |
| images, self.imagenet_default_mean, self.imagenet_default_std |
| ) |
|
|
| rays_embeddings = self.lgm.prepare_default_rays("cuda", elevation=0) |
| images = torch.cat([images, rays_embeddings], dim=1).unsqueeze(0) |
| images = images.half().cuda() |
|
|
| result = self.lgm(images) |
| return result |
|
|