Danielsz's picture
Migrate xtalker to Dockerized Hugging Face Space with GPU support and LFS
31bd91f
Raw History Blame Contribute Delete
1.59 kB
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
class MappingNet(nn.Module):
def __init__(self, coeff_nc, descriptor_nc, layer, num_kp, num_bins):
super( MappingNet, self).__init__()
self.layer = layer
nonlinearity = nn.LeakyReLU(0.1)
self.first = nn.Sequential(
torch.nn.Conv1d(coeff_nc, descriptor_nc, kernel_size=7, padding=0, bias=True))
for i in range(layer):
net = nn.Sequential(nonlinearity,
torch.nn.Conv1d(descriptor_nc, descriptor_nc, kernel_size=3, padding=0, dilation=3))
setattr(self, 'encoder' + str(i), net)
self.pooling = nn.AdaptiveAvgPool1d(1)
self.output_nc = descriptor_nc
self.fc_roll = nn.Linear(descriptor_nc, num_bins)
self.fc_pitch = nn.Linear(descriptor_nc, num_bins)
self.fc_yaw = nn.Linear(descriptor_nc, num_bins)
self.fc_t = nn.Linear(descriptor_nc, 3)
self.fc_exp = nn.Linear(descriptor_nc, 3*num_kp)
def forward(self, input_3dmm):
out = self.first(input_3dmm)
for i in range(self.layer):
model = getattr(self, 'encoder' + str(i))
out = model(out) + out[:,:,3:-3]
out = self.pooling(out)
out = out.view(out.shape[0], -1)
#print('out:', out.shape)
yaw = self.fc_yaw(out)
pitch = self.fc_pitch(out)
roll = self.fc_roll(out)
t = self.fc_t(out)
exp = self.fc_exp(out)
return {'yaw': yaw, 'pitch': pitch, 'roll': roll, 't': t, 'exp': exp}