183 lines
6.5 KiB
Python
183 lines
6.5 KiB
Python
import os
|
|
import time
|
|
import random
|
|
import tensorflow as tf
|
|
import numpy as np
|
|
import scipy as sp
|
|
# import plotly.graph_objects as go
|
|
# import plotly.express as ex
|
|
|
|
from custom_utils.custom_utils import load_model
|
|
from models.base import AEEncoder, VariationalEncoder, Decoder, VariationalEncoderNew, DecoderNew
|
|
from models.upscaler import UpscalerBasic, UpscalerBasicConv, UpscalerBasicNew
|
|
|
|
|
|
class PyramidLevel(tf.keras.Model):
|
|
|
|
def __init__(self, config):
|
|
super(PyramidLevel, self).__init__()
|
|
self.latent_dim = config['latent_dim']
|
|
self.size = config['resolution']
|
|
|
|
self.encoder = VariationalEncoder(config['latent_dim'], config['encoder_depths'], config['encoder_dims'], kernel_size=config['kernel_size'])
|
|
self.decoder = Decoder(config['decoder_input'], config['decoder_depths'], config['decoder_dims'], config['kernel_size'])
|
|
|
|
self.upscale_enhancer = None
|
|
if config['upscale_enhancer'] != '':
|
|
k_size = config['upscale_enhancer_kernel_size'] if 'upscale_enhancer_kernel_size' in config.keys() else ((3 if config['resolution'] <= 64 else 5))
|
|
self.upscale_enhancer = UpscalerBasicConv(config['resolution'], kernel_size=k_size)
|
|
load_model(self.upscale_enhancer, config['upscale_enhancer'])
|
|
self.upscale_enhancer.trainable = not config['upscale_enhancer_freeze']
|
|
|
|
if config['avg_garment_path'] != '':
|
|
self.avg_garment = np.load(config['avg_garment_path'])
|
|
else:
|
|
self.avg_garment = None
|
|
|
|
|
|
def enhance(self, low, mask, training=None):
|
|
x = self.upscale_enhancer([low, mask], training=training)
|
|
return x
|
|
|
|
|
|
def sample(self, z_cond, uv_mask, noise=None):
|
|
if noise is None:
|
|
eps = tf.random.normal(shape=(uv_mask.shape[0], self.latent_dim))
|
|
else:
|
|
eps = noise
|
|
|
|
z = tf.concat([eps, z_cond], axis=-1)
|
|
|
|
x = self.decoder(z)
|
|
|
|
if self.avg_garment is not None:
|
|
x = x + self.avg_garment[tf.newaxis,:,:,:]
|
|
|
|
x = x * uv_mask[:,:,:,tf.newaxis]
|
|
|
|
return x
|
|
|
|
|
|
def reparameterize(self, mean, logvar, training, fix_noise=False):
|
|
if training == True:
|
|
if not fix_noise:
|
|
eps = tf.random.normal(shape=mean.shape)
|
|
else:
|
|
eps = tf.random.normal(shape=(1, mean.shape[1]))
|
|
eps = tf.tile(eps, [mean.shape[0],1])
|
|
out = eps * tf.exp(logvar * .5) + mean
|
|
else:
|
|
out = tf.exp(logvar * .5) + mean
|
|
return out
|
|
|
|
|
|
def call(self, inputs, z_cond, training=None):
|
|
uv_unposed, uv_template, uv_body_posed, uv_curv, uv_mask, uv_mask_high = inputs
|
|
|
|
x = tf.concat([uv_unposed, uv_template, uv_body_posed, uv_curv], axis=-1)
|
|
mean, logvar = self.encoder(x, training=training)
|
|
z = self.reparameterize(mean, logvar, training)
|
|
|
|
z = tf.concat([z, z_cond], axis=-1)
|
|
x = self.decoder(z, training=training)
|
|
|
|
if self.avg_garment is not None:
|
|
x = x + self.avg_garment[tf.newaxis,:,:,:]
|
|
|
|
x = x * uv_mask[:,:,:,tf.newaxis]
|
|
|
|
# if self.upscale_enhancer is not None:
|
|
# pred_low = self.enhance(x, uv_mask, training=training)
|
|
# x = tf.image.resize(pred_low, (512, 256), tf.image.ResizeMethod.LANCZOS5)
|
|
|
|
# x = x * uv_mask_high[:,:,:,tf.newaxis]
|
|
|
|
return x, mean, logvar
|
|
|
|
|
|
|
|
class PyramidLevelNew(tf.keras.Model):
|
|
|
|
def __init__(self, config):
|
|
super(PyramidLevelNew, self).__init__()
|
|
self.size = config['resolution']
|
|
self.latent_dim=config['latent_dim']
|
|
|
|
self.encoder = VariationalEncoderNew(config['encoder_depths'], config['encoder_dims'], kernel_size=config['kernel_size'], latent_dim=config['latent_dim'])
|
|
self.decoder = DecoderNew(config['decoder_depths'], config['decoder_dims'], config['kernel_size'])
|
|
|
|
self.upscale_enhancer = None
|
|
if config['upscale_enhancer'] != '':
|
|
self.upscale_enhancer = UpscalerBasicConv(config['resolution'], kernel_size=config['kernel_size'])
|
|
load_model(self.upscale_enhancer, config['upscale_enhancer'])
|
|
self.upscale_enhancer.trainable = not config['upscale_enhancer_freeze']
|
|
|
|
if config['avg_garment_path'] != '':
|
|
self.avg_garment = np.load(config['avg_garment_path'])
|
|
else:
|
|
self.avg_garment = None
|
|
|
|
self.reshape = tf.keras.layers.Reshape((8, 4, config['latent_dim']))
|
|
|
|
|
|
def enhance(self, low, mask, training=None):
|
|
x = self.upscale_enhancer([low, mask], training=training)
|
|
return x
|
|
|
|
|
|
def sample(self, z_cond, uv_mask, noise=None):
|
|
if noise is None:
|
|
eps = tf.random.normal(shape=(uv_mask.shape[0], 8, 4, self.latent_dim))
|
|
else:
|
|
eps = noise
|
|
|
|
z = tf.concat([eps, z_cond], axis=-1)
|
|
x = self.decoder(z, training=False)
|
|
|
|
if self.avg_garment is not None:
|
|
x = x + self.avg_garment[tf.newaxis,:,:,:]
|
|
|
|
x = x * uv_mask[:,:,:,tf.newaxis]
|
|
|
|
return x
|
|
|
|
|
|
def reparameterize(self, mean, logvar, training, fix_noise=False):
|
|
if training == True:
|
|
if not fix_noise:
|
|
eps = tf.random.normal(shape=mean.shape)
|
|
else:
|
|
eps = tf.random.normal(shape=(1, mean.shape[1]))
|
|
eps = tf.tile(eps, [mean.shape[0],1])
|
|
out = eps * tf.exp(logvar * .5) + mean
|
|
else:
|
|
out = tf.exp(logvar * .5) + mean
|
|
return out
|
|
|
|
|
|
def call(self, inputs, z_cond, prev_latent=None, training=None):
|
|
uv_unposed, uv_template, uv_body_posed, uv_curv, uv_mask, uv_mask_high = inputs
|
|
|
|
x = tf.concat([uv_unposed, uv_template, uv_body_posed, uv_curv], axis=-1)
|
|
mean, logvar = self.encoder(x, training=training)
|
|
z = self.reparameterize(mean, logvar, training)
|
|
z_latent = self.reshape(z)
|
|
|
|
if prev_latent is not None:
|
|
z_latent = tf.concat([z_latent, prev_latent], axis=-1)
|
|
|
|
z = tf.concat([z_latent, z_cond], axis=-1)
|
|
x = self.decoder(z, training=training)
|
|
|
|
if self.avg_garment is not None:
|
|
x = x + self.avg_garment[tf.newaxis,:,:,:]
|
|
|
|
x = x * uv_mask[:,:,:,tf.newaxis]
|
|
|
|
# if self.upscale_enhancer is not None:
|
|
# pred_low = self.enhance(x, uv_mask, training=training)
|
|
# x = tf.image.resize(pred_low, (512, 256), tf.image.ResizeMethod.LANCZOS5)
|
|
|
|
# x = x * uv_mask_high[:,:,:,tf.newaxis]
|
|
|
|
return x, mean, logvar, z_latent |