backup
This commit is contained in:
+191
@@ -0,0 +1,191 @@
|
||||
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 convnext.models.convnext_tf import ConvNeXt, ConvNeXtReverse, Block
|
||||
from auto_encoder_body import AutoEncoder as BodyAE
|
||||
from auto_encoder_curv import AutoEncoder as CurvatureAE
|
||||
from auto_encoder_static import AutoEncoder as StaticAE
|
||||
|
||||
|
||||
class Bottleneck(tf.keras.Model):
|
||||
|
||||
def __init__(self, dim):
|
||||
super(Bottleneck, self).__init__()
|
||||
|
||||
self.bottleneck = tf.keras.Sequential(
|
||||
[Block(dim=dim, drop_path=0,
|
||||
layer_scale_init_value=1e-6, prefix=f'bottleneck{j}') for j in range(5)]
|
||||
)
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
|
||||
x = self.bottleneck(x, training=training)
|
||||
|
||||
return x
|
||||
|
||||
|
||||
class Encoder(tf.keras.Model):
|
||||
|
||||
def __init__(self, latent_dim):
|
||||
super(Encoder, self).__init__()
|
||||
|
||||
self.encoder = ConvNeXt(depths=[3, 3, 9, 3], dims=[32, 64, 128, 256], include_top=False)
|
||||
self.flatten = tf.keras.layers.Flatten()
|
||||
self.mean = tf.keras.layers.Dense(latent_dim)
|
||||
self.log_var = tf.keras.layers.Dense(latent_dim)
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
|
||||
x = self.encoder(x)
|
||||
x = self.flatten(x)
|
||||
mean = self.mean(x)
|
||||
log_var = self.log_var(x)
|
||||
|
||||
return mean, log_var
|
||||
|
||||
|
||||
class Decoder(tf.keras.Model):
|
||||
|
||||
def __init__(self):
|
||||
super(Decoder, self).__init__()
|
||||
|
||||
self.dense = tf.keras.layers.Dense(16 * 8 * 80)
|
||||
self.reshape = tf.keras.layers.Reshape((16, 8, 80))
|
||||
self.decoder = ConvNeXtReverse(depths=list(reversed([3, 3, 9, 3])), dims=list(reversed([256, 128, 64, 16])))
|
||||
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
|
||||
x = self.dense(x)
|
||||
x = self.reshape(x)
|
||||
x = self.decoder(x)
|
||||
|
||||
return x
|
||||
|
||||
|
||||
class CVAE(tf.keras.Model):
|
||||
|
||||
def __init__(self, avg_garment_path='custom_data/jumpsuit_20_avg_uv.npy',
|
||||
latent_dim=128, static_model='checkpoints/ae_static_3',
|
||||
body_model='checpoints/ae_body_6',
|
||||
curvature_model='checpoints/ae_curvature_6'):
|
||||
super(CVAE, self).__init__()
|
||||
self.latent_dim = latent_dim
|
||||
|
||||
model : StaticAE = StaticAE()
|
||||
load_model(model, static_model)
|
||||
self.static_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
self.static_enc.trainable = False
|
||||
|
||||
model : BodyAE = BodyAE()
|
||||
load_model(model, body_model)
|
||||
self.body_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
self.body_enc.trainable = False
|
||||
|
||||
model : CurvatureAE = CurvatureAE()
|
||||
load_model(model, curvature_model)
|
||||
self.curv_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
self.curv_enc.trainable = False
|
||||
|
||||
self.encoder = Encoder(latent_dim)
|
||||
self.decoder = Decoder()
|
||||
|
||||
self.avg_garment = np.load(avg_garment_path)
|
||||
|
||||
self.cond_encoder = tf.keras.Sequential([tf.keras.layers.Dense(512, activation='relu'),
|
||||
tf.keras.layers.Dense(256, activation='relu'),
|
||||
tf.keras.layers.Dense(128, activation='relu'),
|
||||
tf.keras.layers.Dense(latent_dim),])
|
||||
|
||||
# self.shuffle = tf.keras.layers.Lambda(lambda x: tf.stack([tf.gather(x[i], tf.random.shuffle(tf.range(x[i].shape[0]))) for i in range(x.shape[0])]))
|
||||
|
||||
# @tf.function
|
||||
def sample(self, uv_template, uv_body_posed, uv_curv, uv_mask, nr_of_samples=4, fix_noise=False, zero_latent=False):
|
||||
if not fix_noise:
|
||||
eps = tf.random.normal(shape=(nr_of_samples, self.latent_dim))
|
||||
else:
|
||||
eps = tf.random.normal(shape=(1, self.latent_dim))
|
||||
eps = tf.tile(eps, [nr_of_samples,1])
|
||||
|
||||
uv_template = tf.tile(tf.transpose(uv_template, [1,2,0])[tf.newaxis,:,:,:], [nr_of_samples,1,1,1])
|
||||
uv_body_posed = tf.tile(tf.transpose(uv_body_posed, [1,2,0])[tf.newaxis,:,:,:], [nr_of_samples,1,1,1])
|
||||
if len(uv_curv.shape) == 3:
|
||||
uv_curv = tf.tile(uv_curv[tf.newaxis,:,:,:], [nr_of_samples,1,1,1])
|
||||
uv_mask = tf.tile(uv_mask[tf.newaxis,:,:], [nr_of_samples,1,1])
|
||||
|
||||
# uv_template, uv_body_posed = tf.transpose(uv_template, [0,2,3,1]), tf.transpose(uv_body_posed, [0,2,3,1])
|
||||
z_static = self.static_enc(uv_template)
|
||||
z_body = self.body_enc(uv_body_posed)
|
||||
z_curv = self.curv_enc(uv_curv)
|
||||
|
||||
z_cond = tf.concat([z_static, z_body, z_curv], axis=-1)
|
||||
z_cond = self.cond_encoder(z_cond)
|
||||
|
||||
if zero_latent:
|
||||
eps = tf.zeros_like(eps)
|
||||
|
||||
z = tf.concat([eps, z_cond], axis=-1)
|
||||
|
||||
x = self.decoder(z)
|
||||
x = x + self.avg_garment[tf.newaxis,:,:,:]
|
||||
x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
|
||||
return x
|
||||
|
||||
|
||||
def reparameterize(self, mean, logvar):
|
||||
eps = tf.random.normal(shape=mean.shape)
|
||||
return eps * tf.exp(logvar * .5) + mean
|
||||
|
||||
|
||||
def decode(self, z, apply_sigmoid=False):
|
||||
logits = self.decoder(z)
|
||||
if apply_sigmoid:
|
||||
probs = tf.sigmoid(logits)
|
||||
return probs
|
||||
return logits
|
||||
|
||||
|
||||
def call(self, inputs, training=None, zero_latent=False):
|
||||
uv_unposed, uv_template, uv_body_posed, uv_curv, uv_mask, uv_shaped_body = inputs
|
||||
uv_unposed, uv_template, uv_body_posed = tf.transpose(uv_unposed, [0,2,3,1]), tf.transpose(uv_template, [0,2,3,1]), tf.transpose(uv_body_posed, [0,2,3,1])
|
||||
z_static = self.static_enc(uv_template)
|
||||
z_body = self.body_enc(uv_body_posed)
|
||||
z_curv = self.curv_enc(uv_curv)
|
||||
|
||||
x = tf.concat([uv_unposed, uv_template, uv_body_posed, uv_curv], axis=-1)
|
||||
|
||||
mean, logvar = self.encoder(x)
|
||||
z = self.reparameterize(mean, logvar)
|
||||
z_cond = tf.concat([z_static, z_body, z_curv], axis=-1)
|
||||
z_cond = self.cond_encoder(z_cond)
|
||||
|
||||
if zero_latent:
|
||||
z = tf.zeros_like(z)
|
||||
|
||||
z = tf.concat([z, z_cond], axis=-1)
|
||||
|
||||
# z = self.shuffle(z)
|
||||
|
||||
# z = tf.concat([z, z_curv], axis=-1)
|
||||
x = self.decoder(z)
|
||||
|
||||
|
||||
# x = tf.transpose(x, [0,3,1,2])
|
||||
# x = x * uv_mask[:,tf.newaxis,:,:]
|
||||
# x = tf.image.resize(x, (512, 256), tf.image.ResizeMethod.LANCZOS5)
|
||||
# x = x + tf.transpose(uv_shaped_body, [0,2,3,1])
|
||||
x = x + self.avg_garment[tf.newaxis,:,:,:]
|
||||
x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
|
||||
return x, mean, logvar, z
|
||||
@@ -0,0 +1,187 @@
|
||||
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 convnext.models.convnext_tf import ConvNeXt, Block, ConvNeXtReverseLabels
|
||||
from auto_encoder_body import AutoEncoder as BodyAE
|
||||
from auto_encoder_static import AutoEncoder as StaticAE
|
||||
|
||||
|
||||
|
||||
class Bottleneck(tf.keras.Model):
|
||||
|
||||
def __init__(self, dim):
|
||||
super(Bottleneck, self).__init__()
|
||||
|
||||
self.bottleneck = tf.keras.Sequential(
|
||||
[Block(dim=dim, drop_path=0,
|
||||
layer_scale_init_value=1e-6, prefix=f'bottleneck{j}') for j in range(5)]
|
||||
)
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
|
||||
x = self.bottleneck(x, training=training)
|
||||
|
||||
return x
|
||||
|
||||
|
||||
class Encoder(tf.keras.Model):
|
||||
|
||||
def __init__(self, latent_dim):
|
||||
super(Encoder, self).__init__()
|
||||
|
||||
self.encoder = ConvNeXt(depths=[3, 3, 9, 3], dims=[32, 64, 128, 256], include_top=False)
|
||||
self.flatten = tf.keras.layers.Flatten()
|
||||
self.mean = tf.keras.layers.Dense(latent_dim)
|
||||
self.log_var = tf.keras.layers.Dense(latent_dim)
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
|
||||
x = self.encoder(x)
|
||||
x = self.flatten(x)
|
||||
mean = self.mean(x)
|
||||
log_var = self.log_var(x)
|
||||
|
||||
return mean, log_var
|
||||
|
||||
|
||||
class Decoder(tf.keras.Model):
|
||||
|
||||
def __init__(self):
|
||||
super(Decoder, self).__init__()
|
||||
|
||||
self.dense = tf.keras.layers.Dense(16 * 8 * 80)
|
||||
self.reshape = tf.keras.layers.Reshape((16, 8, 80))
|
||||
self.decoder = ConvNeXtReverseLabels(depths=list(reversed([3, 3, 9, 3])), dims=list(reversed([256, 128, 64, 16])))
|
||||
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
|
||||
x = self.dense(x)
|
||||
x = self.reshape(x)
|
||||
x = self.decoder(x)
|
||||
|
||||
return x
|
||||
|
||||
|
||||
class CVAE(tf.keras.Model):
|
||||
|
||||
def __init__(self, latent_dim=128, static_model='checkpoints/ae_static_3',
|
||||
body_model='checpoints/ae_body_6',):
|
||||
super(CVAE, self).__init__()
|
||||
self.latent_dim = latent_dim
|
||||
|
||||
model : StaticAE = StaticAE()
|
||||
load_model(model, static_model)
|
||||
self.static_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
self.static_enc.trainable = False
|
||||
|
||||
model : BodyAE = BodyAE()
|
||||
load_model(model, body_model)
|
||||
self.body_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
self.body_enc.trainable = False
|
||||
|
||||
self.cond_encoder = tf.keras.Sequential([tf.keras.layers.Dense(256, activation='relu'),
|
||||
tf.keras.layers.Dense(256, activation='relu'),
|
||||
tf.keras.layers.Dense(128, activation='relu'),
|
||||
tf.keras.layers.Dense(latent_dim),])
|
||||
|
||||
self.encoder = Encoder(latent_dim)
|
||||
self.decoder = Decoder()
|
||||
|
||||
|
||||
# @tf.function
|
||||
def sample_single(self, uv_template, uv_body_posed, uv_mask, eps=None, nr_of_samples=4):
|
||||
if eps is None:
|
||||
eps = tf.random.normal(shape=(nr_of_samples, self.latent_dim))
|
||||
|
||||
uv_template = tf.tile(tf.transpose(uv_template, [1,2,0])[tf.newaxis,:,:,:], [nr_of_samples,1,1,1])
|
||||
uv_body_posed = tf.tile(tf.transpose(uv_body_posed, [1,2,0])[tf.newaxis,:,:,:], [nr_of_samples,1,1,1])
|
||||
uv_mask = tf.tile(uv_mask[tf.newaxis,:,:], [nr_of_samples,1,1])
|
||||
|
||||
# uv_template, uv_body_posed = tf.transpose(uv_template, [0,2,3,1]), tf.transpose(uv_body_posed, [0,2,3,1])
|
||||
z_static = self.static_enc(uv_template)
|
||||
z_body = self.body_enc(uv_body_posed)
|
||||
|
||||
z_cond = tf.concat([z_static, z_body], axis=-1)
|
||||
z_cond = self.cond_encoder(z_cond)
|
||||
z = tf.concat([eps, z_cond], axis=-1)
|
||||
|
||||
x = self.decoder(z)
|
||||
x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
|
||||
return x
|
||||
|
||||
|
||||
def sample(self, uv_template, uv_body_posed, uv_mask, eps=None):
|
||||
eps = tf.random.normal(shape=(uv_template.shape[0], self.latent_dim))
|
||||
|
||||
uv_template = tf.transpose(uv_template, [0,2,3,1])
|
||||
uv_body_posed = tf.transpose(uv_body_posed, [0,2,3,1])
|
||||
|
||||
z_static = self.static_enc(uv_template)
|
||||
z_body = self.body_enc(uv_body_posed)
|
||||
|
||||
z_cond = tf.concat([z_static, z_body], axis=-1)
|
||||
z_cond = self.cond_encoder(z_cond)
|
||||
z = tf.concat([eps, z_cond], axis=-1)
|
||||
|
||||
x = self.decoder(z)
|
||||
x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
|
||||
return x
|
||||
|
||||
|
||||
# encoders have to be the same for curv_vae and general CVAE
|
||||
def sample_without_encoding(self, z_static, z_body, uv_mask, eps=None):
|
||||
eps = tf.random.normal(shape=(z_static.shape[0], self.latent_dim))
|
||||
|
||||
z_cond = tf.concat([z_static, z_body], axis=-1)
|
||||
z = tf.concat([eps, z_cond], axis=-1)
|
||||
|
||||
x = self.decoder(z)
|
||||
x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
|
||||
return x
|
||||
|
||||
|
||||
def reparameterize(self, mean, logvar):
|
||||
eps = tf.random.normal(shape=mean.shape)
|
||||
return eps * tf.exp(logvar * .5) + mean
|
||||
|
||||
|
||||
def decode(self, z, apply_sigmoid=False):
|
||||
logits = self.decoder(z)
|
||||
if apply_sigmoid:
|
||||
probs = tf.sigmoid(logits)
|
||||
return probs
|
||||
return logits
|
||||
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
uv_template, uv_body_posed, uv_curv, uv_mask, uv_shaped_body = inputs
|
||||
uv_template, uv_body_posed = tf.transpose(uv_template, [0,2,3,1]), tf.transpose(uv_body_posed, [0,2,3,1])
|
||||
z_static = self.static_enc(uv_template)
|
||||
z_body = self.body_enc(uv_body_posed)
|
||||
|
||||
x = tf.concat([uv_template, uv_body_posed, uv_curv], axis=-1)
|
||||
|
||||
mean, logvar = self.encoder(x)
|
||||
z = self.reparameterize(mean, logvar)
|
||||
z_cond = tf.concat([z_static, z_body], axis=-1)
|
||||
z_cond = self.cond_encoder(z_cond)
|
||||
z = tf.concat([z, z_cond], axis=-1)
|
||||
x = self.decoder(z)
|
||||
|
||||
x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
|
||||
return x, mean, logvar, z
|
||||
Reference in New Issue
Block a user