Spaces:
Running
Running
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} |