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 | |