large refactor
This commit is contained in:
+130
-151
@@ -1,223 +1,202 @@
|
||||
import tensorflow as tf
|
||||
from convnext.models.convnext_tf import ConvNeXt, ConvNeXtReverse, Block
|
||||
|
||||
|
||||
|
||||
|
||||
class Bottleneck(tf.keras.Model):
|
||||
|
||||
def __init__(self, dim, latent_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)]
|
||||
)
|
||||
self.flatten = tf.keras.layers.Flatten()
|
||||
self.dense = tf.keras.layers.Dense(latent_dim)
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
|
||||
x = self.bottleneck(x)
|
||||
x = self.flatten(x)
|
||||
x = self.dense(x)
|
||||
|
||||
return x
|
||||
|
||||
|
||||
class Decoder(tf.keras.Model):
|
||||
|
||||
def __init__(self, bottleneck_size, latent_dim):
|
||||
super(Decoder, self).__init__()
|
||||
|
||||
self.dense = tf.keras.layers.Dense(4 * 2 * bottleneck_size)
|
||||
self.reshape = tf.keras.layers.Reshape((4, 2, bottleneck_size))
|
||||
self.decoder = ConvNeXtReverse(depths=list(reversed([3, 3, 9, 3])), dims=list(reversed([bottleneck_size, 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
|
||||
from models.base import AEEncoder, Bottleneck, Decoder
|
||||
|
||||
|
||||
class AutoEncoder(tf.keras.Model):
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, size):
|
||||
super(AutoEncoder, self).__init__()
|
||||
|
||||
if size == 512:
|
||||
bottleneck_size = 64
|
||||
latent_dim = 128
|
||||
kernel_size = 7
|
||||
encoder_depths = [3, 3, 9, 9, 3]
|
||||
encoder_dims = [32, 64, 128, 256, bottleneck_size]
|
||||
decoder_input = (8, 4, bottleneck_size)
|
||||
decoder_depths = [3, 3, 9, 3, 3]
|
||||
decoder_dims = [bottleneck_size, 256, 128, 64, 16]
|
||||
elif size == 128:
|
||||
raise NotImplementedError
|
||||
bottleneck_size = 512
|
||||
latent_dim = 128
|
||||
kernel_size = 5
|
||||
encoder_depths =[16, 16, 9, 9]
|
||||
encoder_dims = [64, 128, 256, bottleneck_size]
|
||||
decoder_input = (4, 2, bottleneck_size)
|
||||
decoder_depths = [16, 16, 9, 9]
|
||||
decoder_dims = [bottleneck_size, 256, 128, 64]
|
||||
elif size == 32:
|
||||
raise NotImplementedError
|
||||
bottleneck_size = 512
|
||||
latent_dim = 128
|
||||
kernel_size = 3
|
||||
encoder_depths = [27, 27]
|
||||
encoder_dims = [256, bottleneck_size]
|
||||
decoder_input = (4, 2, bottleneck_size)
|
||||
decoder_depths = [27, 27]
|
||||
decoder_dims = [bottleneck_size, 256]
|
||||
else:
|
||||
raise NotImplementedError
|
||||
|
||||
bottleneck_size = 512
|
||||
latent_dim = 128
|
||||
|
||||
self.encoder = ConvNeXt(depths=[3, 3, 9, 9, 3, 3], dims=[32, 64, 128, 256, 256, bottleneck_size], include_top=False)
|
||||
self.bottleneck = Bottleneck(bottleneck_size, latent_dim)
|
||||
self.decoder = Decoder(bottleneck_size, latent_dim)
|
||||
self.encoder : AEEncoder = AEEncoder(latent_dim, encoder_depths, encoder_dims, bottleneck_size, kernel_size)
|
||||
self.decoder = Decoder(decoder_input, decoder_depths, decoder_dims, kernel_size=kernel_size)
|
||||
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
def call(self, inputs, training=None, use_mask=True):
|
||||
if use_mask:
|
||||
x, mask = inputs
|
||||
else:
|
||||
x = inputs
|
||||
|
||||
x = tf.transpose(x, [0,2,3,1])
|
||||
x = self.encoder(x, training=training)
|
||||
# x = self.pooling(x)
|
||||
# x = self.reshape(x)
|
||||
# x = self.flatten(x)
|
||||
|
||||
x = self.bottleneck(x, training=training)
|
||||
|
||||
x = self.decoder(x, training=training)
|
||||
x = tf.image.resize(x, (512, 256), tf.image.ResizeMethod.LANCZOS5)
|
||||
x = tf.transpose(x, [0,3,1,2])
|
||||
|
||||
# x = x * uv_mask[:,:, tf.newaxis]
|
||||
# x = x * uv_mask_body[tf.newaxis,tf.newaxis,:,:]
|
||||
if use_mask:
|
||||
x = x * mask[tf.newaxis,:,:,tf.newaxis]
|
||||
|
||||
return x
|
||||
|
||||
|
||||
|
||||
class Bottleneck32(tf.keras.Model):
|
||||
# class Bottleneck32(tf.keras.Model):
|
||||
|
||||
def __init__(self, dim, latent_dim):
|
||||
super(Bottleneck32, self).__init__()
|
||||
# def __init__(self, dim, latent_dim):
|
||||
# super(Bottleneck32, 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)]
|
||||
)
|
||||
self.flatten = tf.keras.layers.Flatten()
|
||||
self.dense = tf.keras.layers.Dense(latent_dim)
|
||||
# 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)]
|
||||
# )
|
||||
# self.flatten = tf.keras.layers.Flatten()
|
||||
# self.dense = tf.keras.layers.Dense(latent_dim)
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
# def call(self, inputs, training=None):
|
||||
# x = inputs
|
||||
|
||||
x = self.bottleneck(x)
|
||||
x = self.flatten(x)
|
||||
x = self.dense(x)
|
||||
# x = self.bottleneck(x)
|
||||
# x = self.flatten(x)
|
||||
# x = self.dense(x)
|
||||
|
||||
return x
|
||||
# return x
|
||||
|
||||
|
||||
class Decoder32(tf.keras.Model):
|
||||
# class Decoder32(tf.keras.Model):
|
||||
|
||||
def __init__(self, bottleneck_size, latent_dim):
|
||||
super(Decoder32, self).__init__()
|
||||
# def __init__(self, bottleneck_size, latent_dim):
|
||||
# super(Decoder32, self).__init__()
|
||||
|
||||
self.dense = tf.keras.layers.Dense(4 * 2 * bottleneck_size)
|
||||
self.reshape = tf.keras.layers.Reshape((4, 2, bottleneck_size))
|
||||
self.decoder = ConvNeXtReverse(depths=list(reversed([27, 27])), dims=list(reversed([bottleneck_size, 256])))
|
||||
# self.dense = tf.keras.layers.Dense(4 * 2 * bottleneck_size)
|
||||
# self.reshape = tf.keras.layers.Reshape((4, 2, bottleneck_size))
|
||||
# self.decoder = ConvNeXtReverse(depths=list(reversed([27, 27])), dims=list(reversed([bottleneck_size, 256])))
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
# def call(self, inputs, training=None):
|
||||
# x = inputs
|
||||
|
||||
x = self.dense(x)
|
||||
x = self.reshape(x)
|
||||
x = self.decoder(x)
|
||||
# x = self.dense(x)
|
||||
# x = self.reshape(x)
|
||||
# x = self.decoder(x)
|
||||
|
||||
return x
|
||||
# return x
|
||||
|
||||
|
||||
class AutoEncoder32(tf.keras.Model):
|
||||
# class AutoEncoder32(tf.keras.Model):
|
||||
|
||||
def __init__(self):
|
||||
super(AutoEncoder32, self).__init__()
|
||||
# def __init__(self):
|
||||
# super(AutoEncoder32, self).__init__()
|
||||
|
||||
|
||||
bottleneck_size = 512
|
||||
latent_dim = 128
|
||||
# bottleneck_size = 512
|
||||
# latent_dim = 128
|
||||
|
||||
self.encoder = ConvNeXt(depths=[27, 27], dims=[256, bottleneck_size], include_top=False)
|
||||
self.bottleneck = Bottleneck32(bottleneck_size, latent_dim)
|
||||
self.decoder = Decoder32(bottleneck_size, latent_dim)
|
||||
# self.encoder = ConvNeXt(depths=[27, 27], dims=[256, bottleneck_size], include_top=False)
|
||||
# self.bottleneck = Bottleneck32(bottleneck_size, latent_dim)
|
||||
# self.decoder = Decoder32(bottleneck_size, latent_dim)
|
||||
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
# def call(self, inputs, training=None):
|
||||
# x = inputs
|
||||
|
||||
x = tf.transpose(x, [0,2,3,1])
|
||||
x = self.encoder(x, training=training)
|
||||
# x = tf.transpose(x, [0,2,3,1])
|
||||
# x = self.encoder(x, training=training)
|
||||
|
||||
x = self.bottleneck(x, training=training)
|
||||
# x = self.bottleneck(x, training=training)
|
||||
|
||||
x = self.decoder(x, training=training)
|
||||
# x = tf.image.resize(x, (512, 256), tf.image.ResizeMethod.LANCZOS5)
|
||||
x = tf.transpose(x, [0,3,1,2])
|
||||
# x = self.decoder(x, training=training)
|
||||
# # x = tf.image.resize(x, (512, 256), tf.image.ResizeMethod.LANCZOS5)
|
||||
# x = tf.transpose(x, [0,3,1,2])
|
||||
|
||||
return x
|
||||
# return x
|
||||
|
||||
|
||||
|
||||
|
||||
class Bottleneck128(tf.keras.Model):
|
||||
# class Bottleneck128(tf.keras.Model):
|
||||
|
||||
def __init__(self, dim, latent_dim):
|
||||
super(Bottleneck128, self).__init__()
|
||||
# def __init__(self, dim, latent_dim):
|
||||
# super(Bottleneck128, 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)]
|
||||
)
|
||||
self.flatten = tf.keras.layers.Flatten()
|
||||
self.dense = tf.keras.layers.Dense(latent_dim)
|
||||
# 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)]
|
||||
# )
|
||||
# self.flatten = tf.keras.layers.Flatten()
|
||||
# self.dense = tf.keras.layers.Dense(latent_dim)
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
# def call(self, inputs, training=None):
|
||||
# x = inputs
|
||||
|
||||
x = self.bottleneck(x)
|
||||
x = self.flatten(x)
|
||||
x = self.dense(x)
|
||||
# x = self.bottleneck(x)
|
||||
# x = self.flatten(x)
|
||||
# x = self.dense(x)
|
||||
|
||||
return x
|
||||
# return x
|
||||
|
||||
|
||||
class Decoder128(tf.keras.Model):
|
||||
# class Decoder128(tf.keras.Model):
|
||||
|
||||
def __init__(self, bottleneck_size, latent_dim):
|
||||
super(Decoder128, self).__init__()
|
||||
# def __init__(self, bottleneck_size, latent_dim):
|
||||
# super(Decoder128, self).__init__()
|
||||
|
||||
self.dense = tf.keras.layers.Dense(4 * 2 * bottleneck_size)
|
||||
self.reshape = tf.keras.layers.Reshape((4, 2, bottleneck_size))
|
||||
self.decoder = ConvNeXtReverse(depths=list(reversed([16, 16, 9, 9])), dims=list(reversed([bottleneck_size, 256, 128, 64])))
|
||||
# self.dense = tf.keras.layers.Dense(4 * 2 * bottleneck_size)
|
||||
# self.reshape = tf.keras.layers.Reshape((4, 2, bottleneck_size))
|
||||
# self.decoder = ConvNeXtReverse(depths=list(reversed([16, 16, 9, 9])), dims=list(reversed([bottleneck_size, 256, 128, 64])))
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
# def call(self, inputs, training=None):
|
||||
# x = inputs
|
||||
|
||||
x = self.dense(x)
|
||||
x = self.reshape(x)
|
||||
x = self.decoder(x)
|
||||
# x = self.dense(x)
|
||||
# x = self.reshape(x)
|
||||
# x = self.decoder(x)
|
||||
|
||||
return x
|
||||
# return x
|
||||
|
||||
|
||||
class AutoEncoder128(tf.keras.Model):
|
||||
# class AutoEncoder128(tf.keras.Model):
|
||||
|
||||
def __init__(self):
|
||||
super(AutoEncoder128, self).__init__()
|
||||
# def __init__(self):
|
||||
# super(AutoEncoder128, self).__init__()
|
||||
|
||||
|
||||
bottleneck_size = 512
|
||||
latent_dim = 128
|
||||
# bottleneck_size = 512
|
||||
# latent_dim = 128
|
||||
|
||||
self.encoder = ConvNeXt(depths=[16, 16, 9, 9], dims=[64, 128, 256, bottleneck_size], include_top=False)
|
||||
self.bottleneck = Bottleneck128(bottleneck_size, latent_dim)
|
||||
self.decoder = Decoder128(bottleneck_size, latent_dim)
|
||||
# self.encoder = ConvNeXt(depths=[16, 16, 9, 9], dims=[64, 128, 256, bottleneck_size], include_top=False)
|
||||
# self.bottleneck = Bottleneck128(bottleneck_size, latent_dim)
|
||||
# self.decoder = Decoder128(bottleneck_size, latent_dim)
|
||||
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
# def call(self, inputs, training=None):
|
||||
# x = inputs
|
||||
|
||||
x = tf.transpose(x, [0,2,3,1])
|
||||
x = self.encoder(x, training=training)
|
||||
# x = tf.transpose(x, [0,2,3,1])
|
||||
# x = self.encoder(x, training=training)
|
||||
|
||||
x = self.bottleneck(x, training=training)
|
||||
# x = self.bottleneck(x, training=training)
|
||||
|
||||
x = self.decoder(x, training=training)
|
||||
# x = tf.image.resize(x, (512, 256), tf.image.ResizeMethod.LANCZOS5)
|
||||
x = tf.transpose(x, [0,3,1,2])
|
||||
# x = self.decoder(x, training=training)
|
||||
# # x = tf.image.resize(x, (512, 256), tf.image.ResizeMethod.LANCZOS5)
|
||||
# x = tf.transpose(x, [0,3,1,2])
|
||||
|
||||
return x
|
||||
# return x
|
||||
+109
-103
@@ -1,63 +1,73 @@
|
||||
import tensorflow as tf
|
||||
from convnext.models.convnext_tf import ConvNeXt, ConvNeXtReverseLabels, Block
|
||||
from models.base import AEEncoder, Bottleneck, Decoder
|
||||
|
||||
|
||||
|
||||
class Bottleneck(tf.keras.Model):
|
||||
# class Bottleneck(tf.keras.Model):
|
||||
|
||||
def __init__(self, dim, latent_dim):
|
||||
super(Bottleneck, self).__init__()
|
||||
# def __init__(self, dim, latent_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)]
|
||||
)
|
||||
self.flatten = tf.keras.layers.Flatten()
|
||||
self.dense = tf.keras.layers.Dense(latent_dim)
|
||||
# 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)]
|
||||
# )
|
||||
# self.flatten = tf.keras.layers.Flatten()
|
||||
# self.dense = tf.keras.layers.Dense(latent_dim)
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
# def call(self, inputs, training=None):
|
||||
# x = inputs
|
||||
|
||||
x = self.bottleneck(x)
|
||||
x = self.flatten(x)
|
||||
x = self.dense(x)
|
||||
# x = self.bottleneck(x)
|
||||
# x = self.flatten(x)
|
||||
# x = self.dense(x)
|
||||
|
||||
return x
|
||||
# return x
|
||||
|
||||
|
||||
class Decoder(tf.keras.Model):
|
||||
# class Decoder(tf.keras.Model):
|
||||
|
||||
def __init__(self, bottleneck_size, latent_dim):
|
||||
super(Decoder, self).__init__()
|
||||
# def __init__(self, bottleneck_size, latent_dim):
|
||||
# super(Decoder, self).__init__()
|
||||
|
||||
self.dense = tf.keras.layers.Dense(16 * 8 * bottleneck_size)
|
||||
self.reshape = tf.keras.layers.Reshape((16, 8, bottleneck_size))
|
||||
self.decoder = ConvNeXtReverseLabels(depths=list(reversed([3, 3, 9, 3])), dims=list(reversed([bottleneck_size, 128, 64, 16])), nr_of_classes=7)
|
||||
# self.dense = tf.keras.layers.Dense(16 * 8 * bottleneck_size)
|
||||
# self.reshape = tf.keras.layers.Reshape((16, 8, bottleneck_size))
|
||||
# self.decoder = ConvNeXtReverseLabels(depths=list(reversed([3, 3, 9, 3])), dims=list(reversed([bottleneck_size, 128, 64, 16])), nr_of_classes=7)
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
# def call(self, inputs, training=None):
|
||||
# x = inputs
|
||||
|
||||
x = self.dense(x)
|
||||
x = self.reshape(x)
|
||||
x = self.decoder(x)
|
||||
# x = self.dense(x)
|
||||
# x = self.reshape(x)
|
||||
# x = self.decoder(x)
|
||||
|
||||
return x
|
||||
# return x
|
||||
|
||||
|
||||
class AutoEncoder(tf.keras.Model):
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, size=512):
|
||||
super(AutoEncoder, self).__init__()
|
||||
|
||||
if size == 512:
|
||||
bottleneck_size = 64
|
||||
latent_dim = 128
|
||||
kernel_size = 7
|
||||
encoder_depths = [3, 3, 9, 3, 3]
|
||||
encoder_dims = [32, 64, 128, 256, bottleneck_size]
|
||||
decoder_input = (16, 8, bottleneck_size)
|
||||
decoder_depths = [3, 3, 9, 3, 3]
|
||||
decoder_dims = [bottleneck_size, 256, 128, 64, 16]
|
||||
elif size == 128:
|
||||
raise NotImplementedError
|
||||
elif size == 32:
|
||||
raise NotImplementedError
|
||||
else:
|
||||
raise NotImplementedError
|
||||
|
||||
bottleneck_size = 32
|
||||
latent_dim = 128
|
||||
self.decoder = Decoder(bottleneck_size, latent_dim)
|
||||
|
||||
self.bottleneck = Bottleneck(bottleneck_size, latent_dim)
|
||||
|
||||
self.encoder = ConvNeXt(depths=[3, 3, 9, 3], dims=[32, 64, 128, bottleneck_size], include_top=False)
|
||||
|
||||
self.encoder : AEEncoder = AEEncoder(latent_dim, encoder_depths, encoder_dims, bottleneck_size, kernel_size)
|
||||
self.decoder = Decoder(decoder_input, decoder_depths, decoder_dims, kernel_size, is_label=True)
|
||||
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
@@ -65,117 +75,113 @@ class AutoEncoder(tf.keras.Model):
|
||||
|
||||
# x = tf.transpose(x, [0,2,3,1])
|
||||
x = self.encoder(x, training=training)
|
||||
|
||||
|
||||
x = self.bottleneck(x, training=training)
|
||||
|
||||
x = self.decoder(x, training=training)
|
||||
# x = tf.transpose(x, [0,3,1,2])
|
||||
|
||||
# x = x * uv_mask[:,:, tf.newaxis]
|
||||
# x = x * uv_mask[:,tf.newaxis,:,:]
|
||||
# x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
|
||||
return x
|
||||
|
||||
|
||||
|
||||
class Decoder32(tf.keras.Model):
|
||||
# class Decoder32(tf.keras.Model):
|
||||
|
||||
def __init__(self, bottleneck_size, latent_dim):
|
||||
super(Decoder32, self).__init__()
|
||||
# def __init__(self, bottleneck_size, latent_dim):
|
||||
# super(Decoder32, self).__init__()
|
||||
|
||||
self.dense = tf.keras.layers.Dense(4 * 2 * bottleneck_size)
|
||||
self.reshape = tf.keras.layers.Reshape((4, 2, bottleneck_size))
|
||||
self.decoder = ConvNeXtReverseLabels(depths=list(reversed([27, 27])), dims=list(reversed([bottleneck_size, 256])), nr_of_classes=7)
|
||||
# self.dense = tf.keras.layers.Dense(4 * 2 * bottleneck_size)
|
||||
# self.reshape = tf.keras.layers.Reshape((4, 2, bottleneck_size))
|
||||
# self.decoder = ConvNeXtReverseLabels(depths=list(reversed([27, 27])), dims=list(reversed([bottleneck_size, 256])), nr_of_classes=7)
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
# def call(self, inputs, training=None):
|
||||
# x = inputs
|
||||
|
||||
x = self.dense(x)
|
||||
x = self.reshape(x)
|
||||
x = self.decoder(x)
|
||||
# x = self.dense(x)
|
||||
# x = self.reshape(x)
|
||||
# x = self.decoder(x)
|
||||
|
||||
return x
|
||||
# return x
|
||||
|
||||
|
||||
class AutoEncoder32(tf.keras.Model):
|
||||
# class AutoEncoder32(tf.keras.Model):
|
||||
|
||||
def __init__(self):
|
||||
super(AutoEncoder32, self).__init__()
|
||||
# def __init__(self):
|
||||
# super(AutoEncoder32, self).__init__()
|
||||
|
||||
bottleneck_size = 512
|
||||
latent_dim = 128
|
||||
# bottleneck_size = 512
|
||||
# latent_dim = 128
|
||||
|
||||
self.encoder = ConvNeXt(depths=[27, 27], dims=[256, bottleneck_size], include_top=False)
|
||||
self.bottleneck = Bottleneck(bottleneck_size, latent_dim)
|
||||
self.decoder = Decoder32(bottleneck_size, latent_dim)
|
||||
# self.encoder = ConvNeXt(depths=[27, 27], dims=[256, bottleneck_size], include_top=False)
|
||||
# self.bottleneck = Bottleneck(bottleneck_size, latent_dim)
|
||||
# self.decoder = Decoder32(bottleneck_size, latent_dim)
|
||||
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x, uv_mask = inputs
|
||||
# def call(self, inputs, training=None):
|
||||
# x, uv_mask = inputs
|
||||
|
||||
# x = tf.transpose(x, [0,2,3,1])
|
||||
x = self.encoder(x, training=training)
|
||||
# # x = tf.transpose(x, [0,2,3,1])
|
||||
# x = self.encoder(x, training=training)
|
||||
|
||||
x = self.bottleneck(x, training=training)
|
||||
# x = self.bottleneck(x, training=training)
|
||||
|
||||
x = self.decoder(x, training=training)
|
||||
# x = tf.transpose(x, [0,3,1,2])
|
||||
# x = self.decoder(x, training=training)
|
||||
# # x = tf.transpose(x, [0,3,1,2])
|
||||
|
||||
# x = x * uv_mask[:,:, tf.newaxis]
|
||||
# x = x * uv_mask[:,tf.newaxis,:,:]
|
||||
# x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
# # x = x * uv_mask[:,:, tf.newaxis]
|
||||
# # x = x * uv_mask[:,tf.newaxis,:,:]
|
||||
# # x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
|
||||
return x
|
||||
# return x
|
||||
|
||||
|
||||
|
||||
class Decoder128(tf.keras.Model):
|
||||
# class Decoder128(tf.keras.Model):
|
||||
|
||||
def __init__(self, bottleneck_size, latent_dim):
|
||||
super(Decoder128, self).__init__()
|
||||
# def __init__(self, bottleneck_size, latent_dim):
|
||||
# super(Decoder128, self).__init__()
|
||||
|
||||
self.dense = tf.keras.layers.Dense(4 * 2 * bottleneck_size)
|
||||
self.reshape = tf.keras.layers.Reshape((4, 2, bottleneck_size))
|
||||
self.decoder = ConvNeXtReverseLabels(depths=list(reversed([16, 16, 9, 9])), dims=list(reversed([bottleneck_size, 256, 128, 64])), nr_of_classes=7)
|
||||
# self.dense = tf.keras.layers.Dense(4 * 2 * bottleneck_size)
|
||||
# self.reshape = tf.keras.layers.Reshape((4, 2, bottleneck_size))
|
||||
# self.decoder = ConvNeXtReverseLabels(depths=list(reversed([16, 16, 9, 9])), dims=list(reversed([bottleneck_size, 256, 128, 64])), nr_of_classes=7)
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
# def call(self, inputs, training=None):
|
||||
# x = inputs
|
||||
|
||||
x = self.dense(x)
|
||||
x = self.reshape(x)
|
||||
x = self.decoder(x)
|
||||
# x = self.dense(x)
|
||||
# x = self.reshape(x)
|
||||
# x = self.decoder(x)
|
||||
|
||||
return x
|
||||
# return x
|
||||
|
||||
|
||||
class AutoEncoder128(tf.keras.Model):
|
||||
# class AutoEncoder128(tf.keras.Model):
|
||||
|
||||
def __init__(self):
|
||||
super(AutoEncoder128, self).__init__()
|
||||
# def __init__(self):
|
||||
# super(AutoEncoder128, self).__init__()
|
||||
|
||||
bottleneck_size = 512
|
||||
latent_dim = 128
|
||||
# bottleneck_size = 512
|
||||
# latent_dim = 128
|
||||
|
||||
self.encoder = ConvNeXt(depths=[16, 16, 9, 9], dims=[64, 128, 256, bottleneck_size], include_top=False)
|
||||
self.bottleneck = Bottleneck(bottleneck_size, latent_dim)
|
||||
self.decoder = Decoder128(bottleneck_size, latent_dim)
|
||||
# self.encoder = ConvNeXt(depths=[16, 16, 9, 9], dims=[64, 128, 256, bottleneck_size], include_top=False)
|
||||
# self.bottleneck = Bottleneck(bottleneck_size, latent_dim)
|
||||
# self.decoder = Decoder128(bottleneck_size, latent_dim)
|
||||
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x, uv_mask = inputs
|
||||
# def call(self, inputs, training=None):
|
||||
# x, uv_mask = inputs
|
||||
|
||||
# x = tf.transpose(x, [0,2,3,1])
|
||||
x = self.encoder(x, training=training)
|
||||
# # x = tf.transpose(x, [0,2,3,1])
|
||||
# x = self.encoder(x, training=training)
|
||||
|
||||
x = self.bottleneck(x, training=training)
|
||||
# x = self.bottleneck(x, training=training)
|
||||
|
||||
x = self.decoder(x, training=training)
|
||||
# x = tf.transpose(x, [0,3,1,2])
|
||||
# x = self.decoder(x, training=training)
|
||||
# # x = tf.transpose(x, [0,3,1,2])
|
||||
|
||||
# x = x * uv_mask[:,:, tf.newaxis]
|
||||
# x = x * uv_mask[:,tf.newaxis,:,:]
|
||||
# x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
# # x = x * uv_mask[:,:, tf.newaxis]
|
||||
# # x = x * uv_mask[:,tf.newaxis,:,:]
|
||||
# # x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
|
||||
return x
|
||||
# return x
|
||||
|
||||
+100
-116
@@ -1,172 +1,156 @@
|
||||
import tensorflow as tf
|
||||
from convnext.models.convnext_tf import ConvNeXt, ConvNeXtReverse, Block
|
||||
from models.base import AEEncoder, Bottleneck, Decoder
|
||||
|
||||
|
||||
|
||||
class Bottleneck(tf.keras.Model):
|
||||
|
||||
def __init__(self, dim, latent_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)]
|
||||
)
|
||||
self.flatten = tf.keras.layers.Flatten()
|
||||
self.dense = tf.keras.layers.Dense(latent_dim)
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
|
||||
x = self.bottleneck(x)
|
||||
x = self.flatten(x)
|
||||
x = self.dense(x)
|
||||
|
||||
return x
|
||||
|
||||
|
||||
class Decoder(tf.keras.Model):
|
||||
|
||||
def __init__(self, bottleneck_size, latent_dim):
|
||||
super(Decoder, self).__init__()
|
||||
|
||||
self.dense = tf.keras.layers.Dense(8 * 4 * bottleneck_size)
|
||||
self.reshape = tf.keras.layers.Reshape((8, 4, bottleneck_size))
|
||||
self.decoder = ConvNeXtReverse(depths=list(reversed([3, 3, 9, 3, 3])), dims=list(reversed([bottleneck_size, 128, 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 AutoEncoder(tf.keras.Model):
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, size=512):
|
||||
super(AutoEncoder, self).__init__()
|
||||
|
||||
if size == 512:
|
||||
bottleneck_size = 64
|
||||
latent_dim = 128
|
||||
kernel_size = 7
|
||||
encoder_depths = [3, 3, 9, 3, 3]
|
||||
encoder_dims = [32, 64, 128, 256, bottleneck_size]
|
||||
decoder_input = (8, 4, bottleneck_size)
|
||||
decoder_depths = [3, 3, 9, 3, 3]
|
||||
decoder_dims = [bottleneck_size, 256, 128, 64, 16]
|
||||
elif size == 128:
|
||||
bottleneck_size = 512
|
||||
latent_dim = 128
|
||||
kernel_size = 5
|
||||
encoder_depths =[16, 16, 9, 9]
|
||||
encoder_dims = [64, 128, 256, bottleneck_size]
|
||||
decoder_input = (4, 2, bottleneck_size)
|
||||
decoder_depths = [16, 16, 9, 9]
|
||||
decoder_dims = [bottleneck_size, 256, 128, 64]
|
||||
elif size == 32:
|
||||
bottleneck_size = 512
|
||||
latent_dim = 128
|
||||
kernel_size = 3
|
||||
encoder_depths = [27, 27]
|
||||
encoder_dims = [256, bottleneck_size]
|
||||
decoder_input = (4, 2, bottleneck_size)
|
||||
decoder_depths = [27, 27]
|
||||
decoder_dims = [bottleneck_size, 256]
|
||||
else:
|
||||
raise NotImplementedError
|
||||
|
||||
bottleneck_size = 32
|
||||
latent_dim = 128
|
||||
self.encoder : AEEncoder = AEEncoder(latent_dim, encoder_depths, encoder_dims, bottleneck_size, kernel_size)
|
||||
self.decoder : Decoder = Decoder(decoder_input, decoder_depths, decoder_dims, kernel_size)
|
||||
|
||||
self.encoder = ConvNeXt(depths=[3, 3, 9, 3, 3], dims=[32, 64, 128, 128, bottleneck_size], include_top=False)
|
||||
self.bottleneck = Bottleneck(bottleneck_size, latent_dim)
|
||||
self.decoder = Decoder(bottleneck_size, latent_dim)
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
def call(self, inputs, training=None, use_mask=True):
|
||||
if use_mask:
|
||||
x, mask = inputs
|
||||
else:
|
||||
x = inputs
|
||||
|
||||
x = tf.transpose(x, [0,2,3,1])
|
||||
x = self.encoder(x, training=training)
|
||||
|
||||
x = self.bottleneck(x, training=training)
|
||||
|
||||
x = self.decoder(x, training=training)
|
||||
x = tf.transpose(x, [0,3,1,2])
|
||||
|
||||
# x = x * uv_mask[:,:, tf.newaxis]
|
||||
# x = x * uv_mask[:,tf.newaxis,:,:]
|
||||
if use_mask:
|
||||
x = x * mask[:,:,:,tf.newaxis]
|
||||
|
||||
return x
|
||||
|
||||
|
||||
class Decoder32(tf.keras.Model):
|
||||
# class Decoder32(tf.keras.Model):
|
||||
|
||||
def __init__(self, bottleneck_size, latent_dim):
|
||||
super(Decoder32, self).__init__()
|
||||
# def __init__(self, bottleneck_size, latent_dim):
|
||||
# super(Decoder32, self).__init__()
|
||||
|
||||
self.dense = tf.keras.layers.Dense(4 * 2 * bottleneck_size)
|
||||
self.reshape = tf.keras.layers.Reshape((4, 2, bottleneck_size))
|
||||
self.decoder = ConvNeXtReverse(depths=list(reversed([27, 27])), dims=list(reversed([bottleneck_size, 256])))
|
||||
# self.dense = tf.keras.layers.Dense(4 * 2 * bottleneck_size)
|
||||
# self.reshape = tf.keras.layers.Reshape((4, 2, bottleneck_size))
|
||||
# self.decoder = ConvNeXtReverse(depths=list(reversed([27, 27])), dims=list(reversed([bottleneck_size, 256])))
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
# def call(self, inputs, training=None):
|
||||
# x = inputs
|
||||
|
||||
x = self.dense(x)
|
||||
x = self.reshape(x)
|
||||
x = self.decoder(x)
|
||||
# x = self.dense(x)
|
||||
# x = self.reshape(x)
|
||||
# x = self.decoder(x)
|
||||
|
||||
return x
|
||||
# return x
|
||||
|
||||
|
||||
class AutoEncoder32(tf.keras.Model):
|
||||
# class AutoEncoder32(tf.keras.Model):
|
||||
|
||||
def __init__(self):
|
||||
super(AutoEncoder32, self).__init__()
|
||||
# def __init__(self):
|
||||
# super(AutoEncoder32, self).__init__()
|
||||
|
||||
|
||||
bottleneck_size = 512
|
||||
latent_dim = 128
|
||||
# bottleneck_size = 512
|
||||
# latent_dim = 128
|
||||
|
||||
self.encoder = ConvNeXt(depths=[27, 27], dims=[256, bottleneck_size], include_top=False)
|
||||
self.bottleneck = Bottleneck(bottleneck_size, latent_dim)
|
||||
self.decoder = Decoder32(bottleneck_size, latent_dim)
|
||||
# self.encoder = ConvNeXt(depths=[27, 27], dims=[256, bottleneck_size], include_top=False)
|
||||
# self.bottleneck = Bottleneck(bottleneck_size, latent_dim)
|
||||
# self.decoder = Decoder32(bottleneck_size, latent_dim)
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
# def call(self, inputs, training=None):
|
||||
# x = inputs
|
||||
|
||||
x = tf.transpose(x, [0,2,3,1])
|
||||
x = self.encoder(x, training=training)
|
||||
# x = tf.transpose(x, [0,2,3,1])
|
||||
# x = self.encoder(x, training=training)
|
||||
|
||||
x = self.bottleneck(x, training=training)
|
||||
# x = self.bottleneck(x, training=training)
|
||||
|
||||
x = self.decoder(x, training=training)
|
||||
x = tf.transpose(x, [0,3,1,2])
|
||||
# x = self.decoder(x, training=training)
|
||||
# x = tf.transpose(x, [0,3,1,2])
|
||||
|
||||
# x = x * uv_mask[:,:, tf.newaxis]
|
||||
# x = x * uv_mask[:,tf.newaxis,:,:]
|
||||
# # x = x * uv_mask[:,:, tf.newaxis]
|
||||
# # x = x * uv_mask[:,tf.newaxis,:,:]
|
||||
|
||||
return x
|
||||
# return x
|
||||
|
||||
|
||||
class Decoder128(tf.keras.Model):
|
||||
# class Decoder128(tf.keras.Model):
|
||||
|
||||
def __init__(self, bottleneck_size, latent_dim):
|
||||
super(Decoder128, self).__init__()
|
||||
# def __init__(self, bottleneck_size, latent_dim):
|
||||
# super(Decoder128, self).__init__()
|
||||
|
||||
self.dense = tf.keras.layers.Dense(4 * 2 * bottleneck_size)
|
||||
self.reshape = tf.keras.layers.Reshape((4, 2, bottleneck_size))
|
||||
self.decoder = ConvNeXtReverse(depths=list(reversed([16, 16, 9, 9])), dims=list(reversed([bottleneck_size, 256, 128, 64])))
|
||||
# self.dense = tf.keras.layers.Dense(4 * 2 * bottleneck_size)
|
||||
# self.reshape = tf.keras.layers.Reshape((4, 2, bottleneck_size))
|
||||
# self.decoder = ConvNeXtReverse(depths=list(reversed([16, 16, 9, 9])), dims=list(reversed([bottleneck_size, 256, 128, 64])))
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
# def call(self, inputs, training=None):
|
||||
# x = inputs
|
||||
|
||||
x = self.dense(x)
|
||||
x = self.reshape(x)
|
||||
x = self.decoder(x)
|
||||
# x = self.dense(x)
|
||||
# x = self.reshape(x)
|
||||
# x = self.decoder(x)
|
||||
|
||||
return x
|
||||
# return x
|
||||
|
||||
|
||||
class AutoEncoder128(tf.keras.Model):
|
||||
# class AutoEncoder128(tf.keras.Model):
|
||||
|
||||
def __init__(self):
|
||||
super(AutoEncoder128, self).__init__()
|
||||
# def __init__(self):
|
||||
# super(AutoEncoder128, self).__init__()
|
||||
|
||||
|
||||
bottleneck_size = 512
|
||||
latent_dim = 128
|
||||
# bottleneck_size = 512
|
||||
# latent_dim = 128
|
||||
|
||||
self.encoder = ConvNeXt(depths=[16, 16, 9, 9], dims=[64, 128, 256, bottleneck_size], include_top=False)
|
||||
self.bottleneck = Bottleneck(bottleneck_size, latent_dim)
|
||||
self.decoder = Decoder128(bottleneck_size, latent_dim)
|
||||
# self.encoder = ConvNeXt(depths=[16, 16, 9, 9], dims=[64, 128, 256, bottleneck_size], include_top=False)
|
||||
# self.bottleneck = Bottleneck(bottleneck_size, latent_dim)
|
||||
# self.decoder = Decoder128(bottleneck_size, latent_dim)
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
# def call(self, inputs, training=None):
|
||||
# x = inputs
|
||||
|
||||
x = tf.transpose(x, [0,2,3,1])
|
||||
x = self.encoder(x, training=training)
|
||||
# x = tf.transpose(x, [0,2,3,1])
|
||||
# x = self.encoder(x, training=training)
|
||||
|
||||
x = self.bottleneck(x, training=training)
|
||||
# x = self.bottleneck(x, training=training)
|
||||
|
||||
x = self.decoder(x, training=training)
|
||||
x = tf.transpose(x, [0,3,1,2])
|
||||
# x = self.decoder(x, training=training)
|
||||
# x = tf.transpose(x, [0,3,1,2])
|
||||
|
||||
# x = x * uv_mask[:,:, tf.newaxis]
|
||||
# x = x * uv_mask[:,tf.newaxis,:,:]
|
||||
# # x = x * uv_mask[:,:, tf.newaxis]
|
||||
# # x = x * uv_mask[:,tf.newaxis,:,:]
|
||||
|
||||
return x
|
||||
# return x
|
||||
+106
@@ -0,0 +1,106 @@
|
||||
import os
|
||||
import tensorflow as tf
|
||||
|
||||
from custom_utils.custom_utils import load_model
|
||||
from convnext.models.convnext_tf import ConvNeXt, ConvNeXtReverse, Block, ConvNeXtReverseLabels
|
||||
|
||||
class Bottleneck(tf.keras.Model):
|
||||
|
||||
def __init__(self, dim, latent_dim, kernel_size=7):
|
||||
super(Bottleneck, self).__init__()
|
||||
|
||||
self.bottleneck = tf.keras.Sequential(
|
||||
[Block(dim=dim, drop_path=0, kernel_size=kernel_size,
|
||||
layer_scale_init_value=1e-6, prefix=f'bottleneck{j}') for j in range(5)]
|
||||
)
|
||||
# self.bottleneck = [Block(dim=dim, drop_path=0, kernel_size=kernel_size, layer_scale_init_value=1e-6, prefix=f'bottleneck{j}') for j in range(5)]
|
||||
|
||||
self.flatten = tf.keras.layers.Flatten()
|
||||
self.dense = tf.keras.layers.Dense(latent_dim)
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
|
||||
# for bt in self.bottleneck:
|
||||
# x = bt(x, training=training)
|
||||
x = self.bottleneck(x)
|
||||
x = self.flatten(x)
|
||||
x = self.dense(x)
|
||||
|
||||
return x
|
||||
|
||||
|
||||
class VariationalEncoder(tf.keras.Model):
|
||||
|
||||
def __init__(self, latent_dim, depths, dims, use_bottleneck=True, kernel_size=7):
|
||||
super(VariationalEncoder, self).__init__()
|
||||
|
||||
self.encoder = ConvNeXt(depths=depths, dims=dims, include_top=False, kernel_size=kernel_size)
|
||||
|
||||
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, training=training)
|
||||
x = self.flatten(x)
|
||||
mean = self.mean(x)
|
||||
log_var = self.log_var(x)
|
||||
|
||||
return mean, log_var
|
||||
|
||||
|
||||
class AEEncoder(tf.keras.Model):
|
||||
|
||||
def __init__(self, latent_dim, depths, dims, bottleneck_size=32, kernel_size=7):
|
||||
super(AEEncoder, self).__init__()
|
||||
|
||||
self.encoder = ConvNeXt(depths=depths, dims=dims, include_top=False, kernel_size=kernel_size)
|
||||
self.bottleneck = Bottleneck(bottleneck_size, latent_dim, kernel_size)
|
||||
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
if len(inputs) == 2:
|
||||
x, _ = inputs
|
||||
else:
|
||||
x = inputs
|
||||
|
||||
x = self.encoder(x, training=training)
|
||||
x = self.bottleneck(x, training=training)
|
||||
|
||||
return x
|
||||
|
||||
|
||||
class Decoder(tf.keras.Model):
|
||||
|
||||
def __init__(self, input_size, depths, dims, kernel_size=7, is_label=False):
|
||||
super(Decoder, self).__init__()
|
||||
|
||||
self.dense = tf.keras.layers.Dense(tf.reduce_prod(input_size))
|
||||
self.reshape = tf.keras.layers.Reshape(input_size)
|
||||
|
||||
if not is_label:
|
||||
self.decoder = ConvNeXtReverse(depths=list(reversed(depths)), dims=list(reversed(dims)), kernel_size=kernel_size)
|
||||
else:
|
||||
self.decoder = ConvNeXtReverseLabels(depths=list(reversed(depths)), dims=list(reversed(dims)), nr_of_classes=7)
|
||||
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
if len(inputs) == 2:
|
||||
x, mask = inputs
|
||||
else:
|
||||
x = inputs
|
||||
|
||||
x = self.dense(x)
|
||||
x = self.reshape(x)
|
||||
x = self.decoder(x, training=training)
|
||||
|
||||
if len(inputs) == 2:
|
||||
if len(mask.shape) == 2:
|
||||
x = x * mask[tf.newaxis,:,:,tf.newaxis]
|
||||
else:
|
||||
x = x * mask[:,:,:,tf.newaxis]
|
||||
|
||||
return x
|
||||
@@ -0,0 +1,20 @@
|
||||
import tensorflow as tf
|
||||
from models.base import AEEncoder, Decoder
|
||||
|
||||
|
||||
class AutoEncoder(tf.keras.Model):
|
||||
|
||||
def __init__(self, config):
|
||||
super(AutoEncoder, self).__init__()
|
||||
|
||||
self.encoder : AEEncoder = AEEncoder(config['latent_dim'], config['encoder_depths'], config['encoder_dims'], config['bottleneck_size'], config['kernel_size'])
|
||||
self.decoder : Decoder= Decoder(config['decoder_input'], config['decoder_depths'], config['decoder_dims'], kernel_size=config['kernel_size'], is_label=config['is_label'])
|
||||
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
|
||||
x = self.encoder(x, training=training)
|
||||
x = self.decoder(x, training=training)
|
||||
|
||||
return x
|
||||
@@ -80,12 +80,12 @@ class CVAE(tf.keras.Model):
|
||||
super(CVAE, self).__init__()
|
||||
self.latent_dim = latent_dim
|
||||
|
||||
model : StaticAE = StaticAE()
|
||||
model : StaticAE = StaticAE(size=512)
|
||||
load_model(model, static_model)
|
||||
self.static_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
self.static_enc.trainable = False
|
||||
|
||||
model : BodyAE = BodyAE()
|
||||
model : BodyAE = BodyAE(size=512)
|
||||
load_model(model, body_model)
|
||||
self.body_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
self.body_enc.trainable = False
|
||||
|
||||
+48
-469
@@ -9,119 +9,61 @@ import scipy as sp
|
||||
|
||||
from custom_utils.custom_utils import load_model
|
||||
from convnext.models.convnext_tf import ConvNeXt, ConvNeXtReverse, Block
|
||||
from models.ae_body_model import AutoEncoder as BodyAE
|
||||
from models.ae_curv_model import AutoEncoder as CurvatureAE
|
||||
from models.ae_static_model import AutoEncoder as StaticAE
|
||||
from models.ae_body_model import AutoEncoder32 as BodyAE32
|
||||
from models.ae_curv_model import AutoEncoder32 as CurvatureAE32
|
||||
from models.ae_static_model import AutoEncoder32 as StaticAE32
|
||||
from models.ae_body_model import AutoEncoder128 as BodyAE128
|
||||
from models.ae_curv_model import AutoEncoder128 as CurvatureAE128
|
||||
from models.ae_static_model import AutoEncoder128 as StaticAE128
|
||||
from models.base import Bottleneck, VariationalEncoder, Decoder
|
||||
from models.cond_encoder import AutoEncoder
|
||||
# from models.ae_body_model import AutoEncoder as BodyAE
|
||||
# from models.ae_curv_model import AutoEncoder as CurvatureAE
|
||||
# from models.ae_static_model import AutoEncoder as StaticAE
|
||||
# from models.ae_body_model import AutoEncoder32 as BodyAE32
|
||||
# from models.ae_curv_model import AutoEncoder32 as CurvatureAE32
|
||||
# from models.ae_static_model import AutoEncoder32 as StaticAE32
|
||||
# from models.ae_body_model import AutoEncoder128 as BodyAE128
|
||||
# from models.ae_curv_model import AutoEncoder128 as CurvatureAE128
|
||||
# from models.ae_static_model import AutoEncoder128 as StaticAE128
|
||||
|
||||
|
||||
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, latent_dim=128,
|
||||
avg_garment_path='',
|
||||
static_model='',
|
||||
body_model='',
|
||||
curvature_model='',
|
||||
freeze_encoders=False):
|
||||
def __init__(self, config):
|
||||
super(CVAE, self).__init__()
|
||||
self.latent_dim = latent_dim
|
||||
self.latent_dim = config['latent_dim']
|
||||
self.size = config['resolution']
|
||||
|
||||
model : StaticAE = StaticAE()
|
||||
if static_model != '':
|
||||
load_model(model, static_model)
|
||||
self.static_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
model : AutoEncoder = AutoEncoder(config['cond_ae'])
|
||||
if config['static_model'] != '':
|
||||
load_model(model, config['static_model'])
|
||||
# self.static_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
self.static_enc = model.encoder
|
||||
|
||||
model : BodyAE = BodyAE()
|
||||
if body_model != '':
|
||||
load_model(model, body_model)
|
||||
self.body_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
model : AutoEncoder = AutoEncoder(config['cond_ae'])
|
||||
if config['body_model'] != '':
|
||||
load_model(model, config['body_model'])
|
||||
self.body_enc = model.encoder
|
||||
|
||||
model : CurvatureAE = CurvatureAE()
|
||||
if curvature_model != '':
|
||||
load_model(model, curvature_model)
|
||||
self.curv_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
model : AutoEncoder = AutoEncoder(config['cond_ae'])
|
||||
if config['curvature_model'] != '':
|
||||
load_model(model, config['curvature_model'])
|
||||
self.curv_enc = model.encoder
|
||||
|
||||
if freeze_encoders:
|
||||
if config['freeze_encoders']:
|
||||
self.static_enc.trainable = False
|
||||
self.body_enc.trainable = False
|
||||
self.curv_enc.trainable = False
|
||||
|
||||
self.encoder = Encoder(latent_dim)
|
||||
self.decoder = Decoder()
|
||||
|
||||
if avg_garment_path != '':
|
||||
self.avg_garment = np.load(avg_garment_path)
|
||||
self.encoder = VariationalEncoder(config['cvae']['latent_dim'], config['cvae']['encoder_depths'], config['cvae']['encoder_dims'], kernel_size=config['cvae']['kernel_size'])
|
||||
self.decoder = Decoder(config['cvae']['decoder_input'], config['cvae']['decoder_depths'], config['cvae']['decoder_dims'], config['cvae']['kernel_size'])
|
||||
|
||||
if config['avg_garment_path'] != '':
|
||||
self.avg_garment = np.load(config['avg_garment_path'])
|
||||
else:
|
||||
self.avg_garment = None
|
||||
|
||||
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),])
|
||||
tf.keras.layers.Dense(config['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])]))
|
||||
|
||||
@@ -212,30 +154,28 @@ class CVAE(tf.keras.Model):
|
||||
|
||||
|
||||
def call(self, inputs, training=None, use_mask=False):
|
||||
|
||||
if use_mask:
|
||||
uv_unposed, uv_template, uv_body_posed, uv_curv, uv_mask = inputs
|
||||
if self.size == 512:
|
||||
uv_unposed, uv_template, uv_body_posed, uv_curv, uv_mask = inputs
|
||||
uv_template_high, uv_body_posed_high, uv_curv_high = uv_template, uv_body_posed, uv_curv
|
||||
else:
|
||||
uv_unposed, uv_template, uv_body_posed, uv_curv, uv_mask, uv_template_high, uv_body_posed_high, uv_curv_high, uv_mask_high = inputs
|
||||
else:
|
||||
uv_unposed, uv_template, uv_body_posed, uv_curv = 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])
|
||||
if self.size == 512:
|
||||
uv_unposed, uv_template, uv_body_posed, uv_curv = inputs
|
||||
uv_template_high, uv_body_posed_high, uv_curv_high = uv_template, uv_body_posed, uv_curv
|
||||
else:
|
||||
uv_unposed, uv_template, uv_body_posed, uv_curv, uv_template_high, uv_body_posed_high, uv_curv_high = inputs
|
||||
|
||||
x = tf.concat([uv_unposed, uv_template, uv_body_posed, uv_curv], axis=-1)
|
||||
|
||||
mean, logvar = self.encoder(x)
|
||||
mean, logvar = self.encoder(x, training=training)
|
||||
z = self.reparameterize(mean, logvar)
|
||||
|
||||
z_cond = self.encode_conds(uv_template, uv_body_posed, uv_curv)
|
||||
z_cond = self.encode_conds(uv_template_high, uv_body_posed_high, uv_curv_high)
|
||||
|
||||
z = tf.concat([z, z_cond], axis=-1)
|
||||
x = self.decoder(z, training=training)
|
||||
|
||||
# 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])
|
||||
if self.avg_garment is not None:
|
||||
x = x + self.avg_garment[tf.newaxis,:,:,:]
|
||||
if use_mask:
|
||||
@@ -243,364 +183,3 @@ class CVAE(tf.keras.Model):
|
||||
|
||||
return x, mean, logvar, z
|
||||
|
||||
|
||||
|
||||
|
||||
class Encoder32(tf.keras.Model):
|
||||
|
||||
def __init__(self, latent_dim):
|
||||
super(Encoder32, self).__init__()
|
||||
|
||||
self.encoder = ConvNeXt(depths=[27, 27], dims=[256, 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 Decoder32(tf.keras.Model):
|
||||
|
||||
def __init__(self):
|
||||
super(Decoder32, self).__init__()
|
||||
|
||||
self.dense = tf.keras.layers.Dense(4 * 2 * 256)
|
||||
self.reshape = tf.keras.layers.Reshape((4, 2, 256))
|
||||
self.decoder = ConvNeXtReverse(depths=list(reversed([27, 27])), dims=list(reversed([256, 256])))
|
||||
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
|
||||
x = self.dense(x)
|
||||
x = self.reshape(x)
|
||||
x = self.decoder(x)
|
||||
|
||||
return x
|
||||
|
||||
|
||||
class CVAE32(tf.keras.Model):
|
||||
|
||||
def __init__(self, latent_dim=128,
|
||||
avg_garment_path='',
|
||||
static_model='',
|
||||
body_model='',
|
||||
curvature_model='',
|
||||
freeze_encoders=False,
|
||||
use_full_res_encoders=True):
|
||||
super(CVAE32, self).__init__()
|
||||
self.latent_dim = latent_dim
|
||||
|
||||
if use_full_res_encoders:
|
||||
model : StaticAE = StaticAE()
|
||||
else:
|
||||
model : StaticAE32 = StaticAE32()
|
||||
if static_model != '':
|
||||
load_model(model, static_model)
|
||||
self.static_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
|
||||
if use_full_res_encoders:
|
||||
model : BodyAE = BodyAE()
|
||||
else:
|
||||
model : BodyAE32 = BodyAE32()
|
||||
if body_model != '':
|
||||
load_model(model, body_model)
|
||||
self.body_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
|
||||
if use_full_res_encoders:
|
||||
model : CurvatureAE = CurvatureAE()
|
||||
else:
|
||||
model : CurvatureAE32 = CurvatureAE32()
|
||||
if curvature_model != '':
|
||||
load_model(model, curvature_model)
|
||||
self.curv_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
|
||||
if freeze_encoders:
|
||||
self.static_enc.trainable = False
|
||||
self.body_enc.trainable = False
|
||||
self.curv_enc.trainable = False
|
||||
|
||||
self.encoder = Encoder32(latent_dim)
|
||||
self.decoder = Decoder32()
|
||||
|
||||
if avg_garment_path != '':
|
||||
self.avg_garment = np.load(avg_garment_path)
|
||||
else:
|
||||
self.avg_garment = None
|
||||
|
||||
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),])
|
||||
|
||||
|
||||
# @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_template_high, uv_body_posed_high, uv_curv_high = 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_high)
|
||||
z_body = self.body_enc(uv_body_posed_high)
|
||||
z_curv = self.curv_enc(uv_curv_high)
|
||||
|
||||
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])
|
||||
if self.avg_garment is not None:
|
||||
x = x + self.avg_garment[tf.newaxis,:,:,:]
|
||||
# x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
|
||||
return x, mean, logvar, z
|
||||
|
||||
|
||||
|
||||
|
||||
class Encoder128(tf.keras.Model):
|
||||
|
||||
def __init__(self, latent_dim):
|
||||
super(Encoder128, self).__init__()
|
||||
|
||||
self.encoder = ConvNeXt(depths=[16, 16, 9, 9], dims=[256, 256, 128, 64], 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 Decoder128(tf.keras.Model):
|
||||
|
||||
def __init__(self):
|
||||
super(Decoder128, self).__init__()
|
||||
|
||||
self.dense = tf.keras.layers.Dense(4 * 2 * 128)
|
||||
self.reshape = tf.keras.layers.Reshape((4, 2, 128))
|
||||
self.decoder = ConvNeXtReverse(depths=list(reversed([16, 16, 9, 9])), dims=list(reversed([256, 256, 128, 64])))
|
||||
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
|
||||
x = self.dense(x)
|
||||
x = self.reshape(x)
|
||||
x = self.decoder(x)
|
||||
|
||||
return x
|
||||
|
||||
|
||||
class CVAE128(tf.keras.Model):
|
||||
|
||||
def __init__(self, latent_dim=128,
|
||||
avg_garment_path='',
|
||||
static_model='',
|
||||
body_model='',
|
||||
curvature_model='',
|
||||
freeze_encoders=False,
|
||||
use_full_res_encoders=True):
|
||||
super(CVAE128, self).__init__()
|
||||
self.latent_dim = latent_dim
|
||||
|
||||
if use_full_res_encoders:
|
||||
model : StaticAE = StaticAE()
|
||||
else:
|
||||
model : StaticAE128 = StaticAE128()
|
||||
if static_model != '':
|
||||
load_model(model, static_model)
|
||||
self.static_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
|
||||
if use_full_res_encoders:
|
||||
model : BodyAE = BodyAE()
|
||||
else:
|
||||
model : BodyAE128 = BodyAE128()
|
||||
if body_model != '':
|
||||
load_model(model, body_model)
|
||||
self.body_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
|
||||
if use_full_res_encoders:
|
||||
model : CurvatureAE = CurvatureAE()
|
||||
else:
|
||||
model : CurvatureAE128 = CurvatureAE128()
|
||||
if curvature_model != '':
|
||||
load_model(model, curvature_model)
|
||||
self.curv_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
|
||||
if freeze_encoders:
|
||||
self.static_enc.trainable = False
|
||||
self.body_enc.trainable = False
|
||||
self.curv_enc.trainable = False
|
||||
|
||||
self.encoder = Encoder128(latent_dim)
|
||||
self.decoder = Decoder128()
|
||||
|
||||
if avg_garment_path != '':
|
||||
self.avg_garment = np.load(avg_garment_path)
|
||||
else:
|
||||
self.avg_garment = None
|
||||
|
||||
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),])
|
||||
|
||||
|
||||
# @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_template_high, uv_body_posed_high, uv_curv_high = 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_high)
|
||||
z_body = self.body_enc(uv_body_posed_high)
|
||||
z_curv = self.curv_enc(uv_curv_high)
|
||||
|
||||
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])
|
||||
if self.avg_garment is not None:
|
||||
x = x + self.avg_garment[tf.newaxis,:,:,:]
|
||||
# x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
|
||||
return x, mean, logvar, z
|
||||
@@ -0,0 +1,621 @@
|
||||
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 models.ae_body_model import AutoEncoder as BodyAE
|
||||
from models.ae_curv_model import AutoEncoder as CurvatureAE
|
||||
from models.ae_static_model import AutoEncoder as StaticAE
|
||||
from models.ae_body_model import AutoEncoder32 as BodyAE32
|
||||
from models.ae_curv_model import AutoEncoder32 as CurvatureAE32
|
||||
from models.ae_static_model import AutoEncoder32 as StaticAE32
|
||||
from models.ae_body_model import AutoEncoder128 as BodyAE128
|
||||
from models.ae_curv_model import AutoEncoder128 as CurvatureAE128
|
||||
from models.ae_static_model import AutoEncoder128 as StaticAE128
|
||||
|
||||
|
||||
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, latent_dim=128,
|
||||
avg_garment_path='',
|
||||
static_model='',
|
||||
body_model='',
|
||||
curvature_model='',
|
||||
freeze_encoders=False):
|
||||
super(CVAE, self).__init__()
|
||||
self.latent_dim = latent_dim
|
||||
|
||||
model : StaticAE = StaticAE()
|
||||
if static_model != '':
|
||||
load_model(model, static_model)
|
||||
self.static_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
|
||||
model : BodyAE = BodyAE()
|
||||
if body_model != '':
|
||||
load_model(model, body_model)
|
||||
self.body_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
|
||||
model : CurvatureAE = CurvatureAE()
|
||||
if curvature_model != '':
|
||||
load_model(model, curvature_model)
|
||||
self.curv_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
|
||||
if freeze_encoders:
|
||||
self.static_enc.trainable = False
|
||||
self.body_enc.trainable = False
|
||||
self.curv_enc.trainable = False
|
||||
|
||||
self.encoder = Encoder(latent_dim)
|
||||
self.decoder = Decoder()
|
||||
|
||||
if avg_garment_path != '':
|
||||
self.avg_garment = np.load(avg_garment_path)
|
||||
else:
|
||||
self.avg_garment = None
|
||||
|
||||
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_single(self, uv_template, uv_body_posed, uv_curv, uv_mask, nr_of_samples=4, fix_noise=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)
|
||||
|
||||
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 sample(self, uv_template, uv_body_posed, uv_curv, uv_mask=None, noise=None):
|
||||
if noise is None:
|
||||
eps = tf.random.normal(shape=(uv_template.shape[0], self.latent_dim))
|
||||
else:
|
||||
eps = noise
|
||||
|
||||
z_cond = self.encode_conds(uv_template, uv_body_posed, uv_curv)
|
||||
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,:,:,:]
|
||||
|
||||
if uv_mask is not None:
|
||||
x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
|
||||
return x
|
||||
|
||||
|
||||
def reparameterize(self, mean, logvar, fix_noise=False):
|
||||
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])
|
||||
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 encode_conds(self, uv_template, uv_body_posed, uv_curv):
|
||||
if uv_template.shape[1] == 3:
|
||||
uv_template = tf.transpose(uv_template, [0,2,3,1])
|
||||
if uv_body_posed.shape[1] == 3:
|
||||
uv_body_posed = tf.transpose(uv_body_posed, [0,2,3,1])
|
||||
if uv_curv.shape[1] == 3:
|
||||
uv_curv = tf.transpose(uv_curv, [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)
|
||||
|
||||
return z_cond
|
||||
|
||||
|
||||
def call(self, inputs, training=None, use_mask=False):
|
||||
if use_mask:
|
||||
uv_unposed, uv_template, uv_body_posed, uv_curv, uv_mask = inputs
|
||||
else:
|
||||
uv_unposed, uv_template, uv_body_posed, uv_curv = 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])
|
||||
|
||||
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 = self.encode_conds(uv_template, uv_body_posed, uv_curv)
|
||||
|
||||
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])
|
||||
if self.avg_garment is not None:
|
||||
x = x + self.avg_garment[tf.newaxis,:,:,:]
|
||||
if use_mask:
|
||||
x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
|
||||
return x, mean, logvar, z
|
||||
|
||||
|
||||
|
||||
class Encoder32(tf.keras.Model):
|
||||
|
||||
def __init__(self, latent_dim):
|
||||
super(Encoder32, self).__init__()
|
||||
|
||||
self.encoder = ConvNeXt(depths=[27, 27], dims=[256, 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 Decoder32(tf.keras.Model):
|
||||
|
||||
def __init__(self):
|
||||
super(Decoder32, self).__init__()
|
||||
|
||||
self.dense = tf.keras.layers.Dense(4 * 2 * 256)
|
||||
self.reshape = tf.keras.layers.Reshape((4, 2, 256))
|
||||
self.decoder = ConvNeXtReverse(depths=list(reversed([27, 27])), dims=list(reversed([256, 256])))
|
||||
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
|
||||
x = self.dense(x)
|
||||
x = self.reshape(x)
|
||||
x = self.decoder(x)
|
||||
|
||||
return x
|
||||
|
||||
|
||||
class CVAE32(tf.keras.Model):
|
||||
|
||||
def __init__(self, latent_dim=128,
|
||||
avg_garment_path='',
|
||||
static_model='',
|
||||
body_model='',
|
||||
curvature_model='',
|
||||
freeze_encoders=False,
|
||||
use_full_res_encoders=True):
|
||||
super(CVAE32, self).__init__()
|
||||
self.latent_dim = latent_dim
|
||||
|
||||
if use_full_res_encoders:
|
||||
model : StaticAE = StaticAE()
|
||||
else:
|
||||
model : StaticAE32 = StaticAE32()
|
||||
if static_model != '':
|
||||
load_model(model, static_model)
|
||||
self.static_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
|
||||
if use_full_res_encoders:
|
||||
model : BodyAE = BodyAE()
|
||||
else:
|
||||
model : BodyAE32 = BodyAE32()
|
||||
if body_model != '':
|
||||
load_model(model, body_model)
|
||||
self.body_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
|
||||
if use_full_res_encoders:
|
||||
model : CurvatureAE = CurvatureAE()
|
||||
else:
|
||||
model : CurvatureAE32 = CurvatureAE32()
|
||||
if curvature_model != '':
|
||||
load_model(model, curvature_model)
|
||||
self.curv_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
|
||||
if freeze_encoders:
|
||||
self.static_enc.trainable = False
|
||||
self.body_enc.trainable = False
|
||||
self.curv_enc.trainable = False
|
||||
|
||||
self.encoder = Encoder32(latent_dim)
|
||||
self.decoder = Decoder32()
|
||||
|
||||
if avg_garment_path != '':
|
||||
self.avg_garment = np.load(avg_garment_path)
|
||||
else:
|
||||
self.avg_garment = None
|
||||
|
||||
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),])
|
||||
|
||||
|
||||
# @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 sample(self, uv_template, uv_body_posed, uv_curv, uv_mask=None, noise=None):
|
||||
if noise is None:
|
||||
eps = tf.random.normal(shape=(uv_template.shape[0], self.latent_dim))
|
||||
else:
|
||||
eps = noise
|
||||
|
||||
z_cond = self.encode_conds(uv_template, uv_body_posed, uv_curv)
|
||||
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,:,:,:]
|
||||
|
||||
if uv_mask is not None:
|
||||
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 encode_conds(self, uv_template, uv_body_posed, uv_curv):
|
||||
if uv_template.shape[1] == 3:
|
||||
uv_template = tf.transpose(uv_template, [0,2,3,1])
|
||||
if uv_body_posed.shape[1] == 3:
|
||||
uv_body_posed = tf.transpose(uv_body_posed, [0,2,3,1])
|
||||
if uv_curv.shape[1] == 3:
|
||||
uv_curv = tf.transpose(uv_curv, [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)
|
||||
|
||||
return z_cond
|
||||
|
||||
def call(self, inputs, training=None, use_mask=False):
|
||||
if use_mask:
|
||||
uv_unposed, uv_template, uv_body_posed, uv_curv, uv_mask = inputs
|
||||
else:
|
||||
uv_unposed, uv_template, uv_body_posed, uv_curv = 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])
|
||||
|
||||
|
||||
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 = self.encode_conds(uv_template, uv_body_posed, uv_curv)
|
||||
|
||||
z = tf.concat([z, z_cond], axis=-1)
|
||||
x = self.decoder(z)
|
||||
|
||||
if self.avg_garment is not None:
|
||||
x = x + self.avg_garment[tf.newaxis,:,:,:]
|
||||
if use_mask:
|
||||
x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
|
||||
return x, mean, logvar, z
|
||||
|
||||
|
||||
|
||||
|
||||
class Encoder128(tf.keras.Model):
|
||||
|
||||
def __init__(self, latent_dim):
|
||||
super(Encoder128, self).__init__()
|
||||
|
||||
self.encoder = ConvNeXt(depths=[16, 16, 9, 9], dims=[256, 256, 128, 64], 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 Decoder128(tf.keras.Model):
|
||||
|
||||
def __init__(self):
|
||||
super(Decoder128, self).__init__()
|
||||
|
||||
self.dense = tf.keras.layers.Dense(4 * 2 * 128)
|
||||
self.reshape = tf.keras.layers.Reshape((4, 2, 128))
|
||||
self.decoder = ConvNeXtReverse(depths=list(reversed([16, 16, 9, 9])), dims=list(reversed([256, 256, 128, 64])))
|
||||
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
x = inputs
|
||||
|
||||
x = self.dense(x)
|
||||
x = self.reshape(x)
|
||||
x = self.decoder(x)
|
||||
|
||||
return x
|
||||
|
||||
|
||||
class CVAE128(tf.keras.Model):
|
||||
|
||||
def __init__(self, latent_dim=128,
|
||||
avg_garment_path='',
|
||||
static_model='',
|
||||
body_model='',
|
||||
curvature_model='',
|
||||
freeze_encoders=False,
|
||||
use_full_res_encoders=True):
|
||||
super(CVAE128, self).__init__()
|
||||
self.latent_dim = latent_dim
|
||||
|
||||
if use_full_res_encoders:
|
||||
model : StaticAE = StaticAE()
|
||||
else:
|
||||
model : StaticAE128 = StaticAE128()
|
||||
if static_model != '':
|
||||
load_model(model, static_model)
|
||||
self.static_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
|
||||
if use_full_res_encoders:
|
||||
model : BodyAE = BodyAE()
|
||||
else:
|
||||
model : BodyAE128 = BodyAE128()
|
||||
if body_model != '':
|
||||
load_model(model, body_model)
|
||||
self.body_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
|
||||
if use_full_res_encoders:
|
||||
model : CurvatureAE = CurvatureAE()
|
||||
else:
|
||||
model : CurvatureAE128 = CurvatureAE128()
|
||||
if curvature_model != '':
|
||||
load_model(model, curvature_model)
|
||||
self.curv_enc = tf.keras.Sequential([model.encoder, model.bottleneck])
|
||||
|
||||
if freeze_encoders:
|
||||
self.static_enc.trainable = False
|
||||
self.body_enc.trainable = False
|
||||
self.curv_enc.trainable = False
|
||||
|
||||
self.encoder = Encoder128(latent_dim)
|
||||
self.decoder = Decoder128()
|
||||
|
||||
if avg_garment_path != '':
|
||||
self.avg_garment = np.load(avg_garment_path)
|
||||
else:
|
||||
self.avg_garment = None
|
||||
|
||||
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),])
|
||||
|
||||
|
||||
# @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_template_high, uv_body_posed_high, uv_curv_high = 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_high)
|
||||
z_body = self.body_enc(uv_body_posed_high)
|
||||
z_curv = self.curv_enc(uv_curv_high)
|
||||
|
||||
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])
|
||||
if self.avg_garment is not None:
|
||||
x = x + self.avg_garment[tf.newaxis,:,:,:]
|
||||
# x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
|
||||
return x, mean, logvar, z
|
||||
@@ -7,7 +7,7 @@ import numpy as np
|
||||
# import plotly.express as ex
|
||||
|
||||
from custom_utils.custom_utils import load_model
|
||||
from models.cvae_model import CVAE, CVAE128, CVAE32
|
||||
from models.cvae_model import CVAE
|
||||
from models.upscaler import UpscalerBasic as Upscaler
|
||||
|
||||
|
||||
@@ -24,26 +24,22 @@ class Pyramid(tf.keras.Model):
|
||||
use_full_res_encoders=True):
|
||||
super(Pyramid, self).__init__()
|
||||
|
||||
if low_res == 32:
|
||||
self.model_low = CVAE32(latent_dim=latent_dim,
|
||||
static_model=static_model,
|
||||
body_model=body_model,
|
||||
curvature_model=curvature_model,
|
||||
freeze_encoders=freeze_encoders,
|
||||
use_full_res_encoders=use_full_res_encoders)
|
||||
if low_res == 128:
|
||||
self.model_low = CVAE128(latent_dim=latent_dim,
|
||||
static_model=static_model,
|
||||
body_model=body_model,
|
||||
curvature_model=curvature_model,
|
||||
freeze_encoders=freeze_encoders,
|
||||
use_full_res_encoders=use_full_res_encoders)
|
||||
|
||||
self.model_low = CVAE(latent_dim=latent_dim,
|
||||
size=low_res,
|
||||
static_model=static_model,
|
||||
body_model=body_model,
|
||||
curvature_model=curvature_model,
|
||||
freeze_encoders=freeze_encoders,
|
||||
encoder_res=512 if use_full_res_encoders else 32)
|
||||
|
||||
self.model_full = CVAE(latent_dim=latent_dim,
|
||||
size=512,
|
||||
static_model=static_model,
|
||||
body_model=body_model,
|
||||
curvature_model=curvature_model,
|
||||
freeze_encoders=freeze_encoders)
|
||||
freeze_encoders=freeze_encoders,
|
||||
encoder_res=512)
|
||||
|
||||
self.upscale_enhancer = None
|
||||
if upscaler_model != '':
|
||||
@@ -64,6 +60,12 @@ class Pyramid(tf.keras.Model):
|
||||
else:
|
||||
self.avg_garment = None
|
||||
|
||||
def enhance(self, low, mask, training=None):
|
||||
x = self.upscale_enhancer(low, training=training)
|
||||
x = x * (1 - mask[:,:,:,tf.newaxis])
|
||||
low = x + low
|
||||
return low
|
||||
|
||||
def call(self, inputs, training=None):
|
||||
uv_unposed, uv_static, uv_body_posed, uv_curv, uv_mask, uv_unposed_low, uv_static_low, uv_body_posed_low, uv_curv_low, uv_mask_low = inputs
|
||||
|
||||
@@ -75,11 +77,9 @@ class Pyramid(tf.keras.Model):
|
||||
pred_low = pred_low * uv_mask_low[:,:,:,tf.newaxis]
|
||||
|
||||
if self.upscale_enhancer is not None:
|
||||
x = self.upscale_enhancer(pred_low, training=training)
|
||||
x = x * (1 - uv_mask_low[:,:,:,tf.newaxis])
|
||||
pred_low = x + pred_low
|
||||
pred_low = self.enhance(pred_low, uv_mask_low, training=training)
|
||||
|
||||
x = tf.image.resize(x, (512, 256), tf.image.ResizeMethod.LANCZOS5)
|
||||
x = tf.image.resize(pred_low, (512, 256), tf.image.ResizeMethod.LANCZOS5)
|
||||
x = x * uv_mask[:,:,:,tf.newaxis]
|
||||
|
||||
pred_full, mean_full, logvar_full, _ = self.model_full([uv_unposed, uv_static, uv_body_posed, uv_curv], training=training)
|
||||
|
||||
Reference in New Issue
Block a user