Spaces:
Running
Running
import sys | |
import torch | |
import torch.nn as nn | |
sys.path.insert(0, "MobileStyleGAN.pytorch") | |
from core.models.mapping_network import MappingNetwork | |
from core.models.mobile_synthesis_network import MobileSynthesisNetwork | |
from core.models.synthesis_network import SynthesisNetwork | |
class Model(nn.Module): | |
def __init__(self): | |
super().__init__() | |
# teacher model | |
mapping_net_params = {"style_dim": 512, "n_layers": 8, "lr_mlp": 0.01} | |
synthesis_net_params = { | |
"size": 1024, | |
"style_dim": 512, | |
"blur_kernel": [1, 3, 3, 1], | |
"channels": [512, 512, 512, 512, 512, 256, 128, 64, 32], | |
} | |
self.mapping_net = MappingNetwork(**mapping_net_params).eval() | |
self.synthesis_net = SynthesisNetwork(**synthesis_net_params).eval() | |
# student network | |
self.student = MobileSynthesisNetwork( | |
style_dim=self.mapping_net.style_dim, channels=synthesis_net_params["channels"][:-1] | |
) | |
self.style_mean = nn.Parameter(torch.zeros((1, 512)), requires_grad=False) | |
def forward(self, var: torch.Tensor, truncation_psi: float = 0.5, generator: str = "student") -> torch.Tensor: | |
style = self.mapping_net(var) | |
style = self.style_mean + truncation_psi * (style - self.style_mean) | |
if generator == "student": | |
img = self.student(style)["img"] | |
elif generator == "teacher": | |
img = self.synthesis_net(style)["img"] | |
else: | |
raise ValueError | |
return img | |