Spaces:
Running
Running
File size: 2,621 Bytes
afe6a1b 09a9f19 afe6a1b d4d13e2 afe6a1b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
from __future__ import annotations
import pathlib
import pickle
import sys
import numpy as np
import torch
import torch.nn as nn
from huggingface_hub import hf_hub_download
current_dir = pathlib.Path(__file__).parent
submodule_dir = current_dir / 'projected_gan'
sys.path.insert(0, submodule_dir.as_posix())
class Model:
MODEL_NAMES = [
'art_painting',
'church',
'bedroom',
'cityscapes',
'clevr',
'ffhq',
'flowers',
'landscape',
'pokemon',
]
def __init__(self):
self.device = torch.device(
'cuda:0' if torch.cuda.is_available() else 'cpu')
self._download_all_models()
self.model_name = self.MODEL_NAMES[3]
self.model = self._load_model(self.model_name)
def _load_model(self, model_name: str) -> nn.Module:
path = hf_hub_download('public-data/projected_gan',
f'models/{model_name}.pkl')
with open(path, 'rb') as f:
model = pickle.load(f)['G_ema']
model.eval()
model.to(self.device)
return model
def set_model(self, model_name: str) -> None:
if model_name == self.model_name:
return
self.model_name = model_name
self.model = self._load_model(model_name)
def _download_all_models(self):
for name in self.MODEL_NAMES:
self._load_model(name)
def generate_z(self, seed: int) -> torch.Tensor:
seed = int(np.clip(seed, 0, np.iinfo(np.uint32).max))
z = np.random.RandomState(seed).randn(1, self.model.z_dim)
return torch.from_numpy(z).float().to(self.device)
def postprocess(self, tensor: torch.Tensor) -> np.ndarray:
tensor = (tensor.permute(0, 2, 3, 1) * 127.5 + 128).clamp(0, 255).to(
torch.uint8)
return tensor.cpu().numpy()
@torch.inference_mode()
def generate(self, z: torch.Tensor, label: torch.Tensor,
truncation_psi: float) -> torch.Tensor:
return self.model(z, label, truncation_psi=truncation_psi)
def generate_image(self, seed: int, truncation_psi: float) -> np.ndarray:
z = self.generate_z(seed)
label = torch.zeros([1, self.model.c_dim], device=self.device)
out = self.generate(z, label, truncation_psi)
out = self.postprocess(out)
return out[0]
def set_model_and_generate_image(self, model_name: str, seed: int,
truncation_psi: float) -> np.ndarray:
self.set_model(model_name)
return self.generate_image(seed, truncation_psi)
|