1 Commits
Author SHA1 Message Date
luni e14a2374c2 helper 2023-02-21 10:37:58 +00:00
11 changed files with 59 additions and 377 deletions
+1 -5
View File
@@ -1,9 +1,5 @@
nohup python cvae.py --name="lhunor_weights_test_10_2" > nohup/iccv/weights_test_10_2.out 2>&1 &
nohup python evaluate_ae.py --name iccv_weights_test_6 > nohup/iccv/evaluate_iccv_weights_test_6.out 2>&1 &
nohup python calculate_error.py --name iccv_weights_test_6 > nohup/iccv/error_iccv_weights_test_6.out 2>&1 &
one final convolutional layer for smoothing, on the final coordinates one final convolutional layer for smoothing, on the final coordinates
nohup python calculate_error.py --name error_al_all_150k > nohup/error/post_al_all_150k.out 2>&1 &
skirts!!!! skirts!!!!
pyramid next week pyramid next week
-188
View File
@@ -1,188 +0,0 @@
import os
import sys
from configs.config_abl_all_post import config as config_a
os.environ["CUDA_VISIBLE_DEVICES"] = '5'
import tensorflow as tf
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
try:
# Currently, memory growth needs to be the same across GPUs
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)
logical_gpus = tf.config.experimental.list_logical_devices('GPU')
print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
except RuntimeError as e:
# Memory growth must be set before GPUs have been initialized
print(e)
import glob
import time
import argparse
import wandb
import tqdm
import random
import numpy as np
import plotly.graph_objects as go
import plotly.express as ex
from PIL import Image
from postprocessing import fix_collision
if config_a['is_skirt']:
from losses import edge_loss_skirt as edge_loss
else:
from losses import edge_loss
from losses import collision_ratio, kl_loss #, concept_loss
# from losses import collision_penalty as collision_penalty
from losses import collision_loss as collision_penalty
from custom_utils.custom_utils import batch_to_dict, load_model, plot_3d, UV2Mesh, get_summary_html, maskFacesBatch, _maskFaces, plot_3d_collision
from dataset import DatasetFactory, StaticDataset
from custom_utils.smpl import SMPL
from models.cvae_model import CVAE
from custom_utils.supersmpl_io import writeOBJ
from plotly.subplots import make_subplots
# uv2mesh = UV2Mesh(res=256, is_skirt=config_a['is_skirt'], is_adaptive=False)
def plot(mesh_gt, pred_a, pred_b, body, mask):
fig = make_subplots(rows=1, cols=3, start_cell="top-left", specs = [ [{ 'type': 'scene' } for _ in range(3)] ])
_, faces_garment = _maskFaces(np.zeros((14475, 3), np.float32), F, mask)
faces = np.concatenate((F, faces_garment + 14475), axis=0)
mesh_gt = np.concatenate((body, mesh_gt[mask, :]), axis=0)
pred_a = np.concatenate((body, pred_a), axis=0)
pred_b = np.concatenate((body, pred_b), axis=0)
colors = np.concatenate((np.ones_like(body, dtype=np.int32)*100, np.ones_like(mesh_gt, dtype=np.int32)*230), axis=0)
# colors = np.ones_like(mesh_gt, dtype=np.int32)*230
fig.add_trace(go.Mesh3d(
x=mesh_gt[:,0],
y=mesh_gt[:,2],
z=mesh_gt[:,1],
i = faces[:,0],
j = faces[:,1],
k = faces[:,2],
text="Ground Truth",
vertexcolor=colors,
),
row=1, col=1)
fig.add_trace(go.Mesh3d(
x=pred_a[:,0],
y=pred_a[:,2],
z=pred_a[:,1],
i = faces[:,0],
j = faces[:,1],
k = faces[:,2],
text="Pred A",
vertexcolor=colors,
),
row=1, col=2)
fig.add_trace(go.Mesh3d(
x=pred_b[:,0],
y=pred_b[:,2],
z=pred_b[:,1],
i = faces[:,0],
j = faces[:,1],
k = faces[:,2],
text="Pred B",
vertexcolor=colors,
),
row=1, col=3)
fig.update_layout(scene_aspectmode='manual', scene_aspectratio=dict(x=1, y=1, z=1),
scene2_aspectmode='manual', scene2_aspectratio=dict(x=1, y=1, z=1),
scene3_aspectmode='manual', scene3_aspectratio=dict(x=1, y=1, z=1),
)
helper = dict(xaxis = dict(nticks=4, range=[-1,1],),
yaxis = dict(nticks=4, range=[-1,1],),
zaxis = dict(nticks=4, range=[-1,1],),)
fig.update_layout(scene = helper,
scene2 = helper,
scene3 = helper,
)
return fig
if __name__ == '__main__':
run = wandb.init(project='plots', name=config_a['name'], notes=config_a['notes'], dir='/wandb')
parser = argparse.ArgumentParser(description='')
parser.add_argument('--name', type=str)
args = vars(parser.parse_args())
skirt_modifier = '_skirt' if config_a['is_skirt'] else ''
folder = config_a['test_dir']
# smpl = SMPL(use_one_hot=False)
F = np.load("custom_utils/smpl_faces" + skirt_modifier + ".npy").astype(np.int32)
iteration = ''
# load_model(model, 'checkpoints/' + 'abl_all_120k')
factory = DatasetFactory()
dataset_a = factory.get_dataset(folder=config_a['test_dir'],
batch_size=config_a['batch_size'],
signature=config_a['signature_dynamic'],
resolutions=[config_a['resolution']],
in_memory=False,
do_repeat=False,
use_one_hot=config_a['use_one_hot'],
use_no_orient=config_a['remove_global_orientation'],
shuffle=False,
testing=True,
# frames_file='frames_abl.txt',
)
static_dataset_a = StaticDataset(folder=config_a['test_dir'],
signature=config_a['signature_static'],
resolutions=[config_a['resolution']],
in_memory=True)
iterator_a = iter(dataset_a)
faces_folder = '/home/workspace/data/results/support/faces' + ('_skirt' if config_a['is_skirt'] else '')
ids = os.listdir(faces_folder)
ids = [id.split('.')[0] for id in ids]
faces = {id : np.load(faces_folder + '/' + id + '.npy') for id in ids }
results_folder = '/home/workspace/data/results/post'
count = 0
while True:
batch = iterator_a.get_next()
batch = static_dataset_a.expand_batch(batch_to_dict(batch, config_a['signature_dynamic']))
mask = batch['mesh_mask'].numpy().astype(bool)
gt = batch['mesh_posed'].numpy()
body = batch['mesh_body_posed'].numpy()
for i in range(mask.shape[0]):
id, frame_nr = batch['id'][i].numpy().decode("utf-8"), batch['frame_nr'][i].numpy().decode("utf-8")
pred_a = np.load(results_folder + '/al_all_post-/' + id + '_' + frame_nr + '.npy')
pred_b = np.load(results_folder + '/iccv_weights_test_6-/' + id + '_' + frame_nr + '.npy')
# pred_c = np.load(results_folder + '/iccv_weights_test_6-/' + id + '_' + frame_nr + '.npy')
fig = plot(gt[i], pred_a, pred_b, body[i], mask[i])
wandb.log({f'{id}_{frame_nr}': fig}, step = count)
count += 1
print(count)
+9 -10
View File
@@ -7,7 +7,7 @@ config = dict()
# DON'T FORGET TO LOAD FINAL UPSCALER UNLESS HAVE LEVEL 512 # DON'T FORGET TO LOAD FINAL UPSCALER UNLESS HAVE LEVEL 512
# DON'T FORGET TO CHECK AVG GARMENT USED # DON'T FORGET TO CHECK AVG GARMENT USED
config['use_skinning'] = False # and deshaping config['use_skinning'] = True # and deshaping
config['remove_global_orientation'] = True config['remove_global_orientation'] = True
config['use_curvature'] = True config['use_curvature'] = True
config['use_extra_losses'] = True # edge, collision, 3d mesh config['use_extra_losses'] = True # edge, collision, 3d mesh
@@ -19,13 +19,13 @@ config['only_curvatures'] = False
ablation_count = [config['use_skinning'], config['remove_global_orientation'], config['use_curvature'], config['use_extra_losses'], config['use_offsets']].count(False) ablation_count = [config['use_skinning'], config['remove_global_orientation'], config['use_curvature'], config['use_extra_losses'], config['use_offsets']].count(False)
assert ablation_count == 1 or ablation_count == 0 assert ablation_count == 1 or ablation_count == 0
config['gpu'] = '6' config['gpu'] = '4'
config['name'] = 'iccv_weights_test_10_3' config['name'] = 'al_all_post'
config['notes'] = 'smaller weight loss coeff, 1e-6, convolutional weight learning, add gnn but smaller, same as 10 but training from zero and no avg garment' config['notes'] = ''
config['avg_garment_path'] = ''# 'custom_data/train_no_shape_avg_uv.npy' #custom_data/train_no_shape_avg_uv.npy # train_no_shape_avg_uv train_no_shape_one_hot_avg_uv config['avg_garment_path'] = 'custom_data/train_no_shape_avg_uv.npy' #custom_data/train_no_shape_avg_uv.npy # train_no_shape_avg_uv train_no_shape_one_hot_avg_uv
# if config['use_skinning']: if config['use_skinning']:
# assert (config['use_offsets'] and config['avg_garment_path'] != '') or (not config['use_offsets'] and config['avg_garment_path'] == '') assert (config['use_offsets'] and config['avg_garment_path'] != '') or (not config['use_offsets'] and config['avg_garment_path'] == '')
config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision
@@ -86,15 +86,14 @@ config['use_one_hot'] = False
config['cvae'] = dict() config['cvae'] = dict()
config['cvae']['is_label'] = False config['cvae']['is_label'] = False
config['cvae']['add_noise'] = True config['cvae']['add_noise'] = True
config['cvae']['noise_amount'] = 0.00001 config['cvae']['noise_amount'] = 0.001
config['cvae']['kernel_size'] = 7 config['cvae']['kernel_size'] = 7
config['cvae']['encoder_depths'] = [3, 3, 3, 9, 3] config['cvae']['encoder_depths'] = [3, 3, 3, 9, 3]
config['cvae']['encoder_dims'] = [32, 64, 128, 256, 64] config['cvae']['encoder_dims'] = [32, 64, 128, 256, 64]
config['cvae']['decoder_depths'] = config['cvae']['encoder_depths'] config['cvae']['decoder_depths'] = config['cvae']['encoder_depths']
config['cvae']['decoder_dims'] = config['cvae']['encoder_dims'] config['cvae']['decoder_dims'] = config['cvae']['encoder_dims']
config['cvae']['decoder_weights_depths'] = [3, 3, 3, 5, 3]
config['cvae']['decoder_weights_dims'] = [24, 32, 64, 128, 256]
config['cond_ae_static'] = dict() config['cond_ae_static'] = dict()
config['cond_ae_static']['is_label'] = False config['cond_ae_static']['is_label'] = False
+3 -10
View File
@@ -2,7 +2,7 @@ from unittest import skip
import numpy as np import numpy as np
import tensorflow as tf import tensorflow as tf
from tensorflow.keras.layers import (Conv2D, Conv2DTranspose, Dense, DepthwiseConv2D, from tensorflow.keras.layers import (Conv2D, Conv2DTranspose, Dense, DepthwiseConv2D,
GlobalAveragePooling2D, Layer, Activation, Lambda, GlobalAveragePooling2D, Layer,
LayerNormalization, Flatten, Reshape, UpSampling2D) LayerNormalization, Flatten, Reshape, UpSampling2D)
def drop_path(inputs, drop_prob, is_training): def drop_path(inputs, drop_prob, is_training):
@@ -222,7 +222,7 @@ class ConvNeXtReverse(tf.keras.Model):
def __init__(self, def __init__(self,
depths=[3, 3, 9, 3], dims=[96, 192, 384, 768], kernel_size=7, depths=[3, 3, 9, 3], dims=[96, 192, 384, 768], kernel_size=7,
drop_path_rate=0., layer_scale_init_value=1e-6, head_init_scale=1., learn_weights=False, drop_path_rate=0., layer_scale_init_value=1e-6, head_init_scale=1.,
): ):
super().__init__() super().__init__()
self.upsample_layers = [] # stem and 3 intermediate downsampling conv layers self.upsample_layers = [] # stem and 3 intermediate downsampling conv layers
@@ -255,19 +255,12 @@ class ConvNeXtReverse(tf.keras.Model):
self.stages.append(stage) self.stages.append(stage)
cur += depths[i] cur += depths[i]
if not learn_weights: self.last = Dense(3, activation='tanh')
self.last = Dense(3, activation='tanh')
else:
self.last = Activation('softmax')
# self.last = lambda x, training: x
# self.last = Dense(24, activation='softmax')
def call(self, x, training): def call(self, x, training):
for i in reversed(range(len(self.upsample_layers))): for i in reversed(range(len(self.upsample_layers))):
x = self.upsample_layers[i](x, training=training) x = self.upsample_layers[i](x, training=training)
x = self.stages[i](x, training=training) x = self.stages[i](x, training=training)
x = self.last(x, training=training) x = self.last(x, training=training)
return x return x
-30
View File
@@ -2,7 +2,6 @@ import json
import numpy as np import numpy as np
import tensorflow as tf import tensorflow as tf
import scipy as sp import scipy as sp
import cmapy as cm
import plotly.graph_objects as go import plotly.graph_objects as go
from plotly.subplots import make_subplots from plotly.subplots import make_subplots
@@ -217,35 +216,6 @@ def plot_3d(mesh_gt, mesh_pred_unposed, faces, collision, collision_faces, colli
return fig return fig
def plot_weights(weights, body, faces):
fig = go.Figure()
colors = np.array([cm.color('jet', 1 - w) for w in weights.numpy()])
# if flip_xy:
# mesh_gt = flip_axis(mesh_gt)
# mesh_pred_unposed = flip_axis(mesh_pred_unposed)
# collision = flip_axis(collision, ind=14475)
fig.add_trace(go.Mesh3d(
x=body[:,0],
y=body[:,2],
z=body[:,1],
i = faces[:,0],
j = faces[:,1],
k = faces[:,2],
vertexcolor=colors
))
fig.update_layout(scene_aspectmode='manual', scene_aspectratio=dict(x=1, y=1, z=1),)
helper = dict(xaxis = dict(nticks=4, range=[-1,1],),
yaxis = dict(nticks=4, range=[-1,1],),
zaxis = dict(nticks=4, range=[-1,1],),)
fig.update_layout(scene = helper,)
return fig
def plot_3d_collision(gt, collision_1, collision_2, collision_faces, collision_color, flip_xy=False): def plot_3d_collision(gt, collision_1, collision_2, collision_faces, collision_color, flip_xy=False):
fig = make_subplots(rows=1, cols=3, start_cell="top-left", specs = [ [{ 'type': 'scene' } for _ in range(3)] ]) fig = make_subplots(rows=1, cols=3, start_cell="top-left", specs = [ [{ 'type': 'scene' } for _ in range(3)] ])
+3 -3
View File
@@ -406,8 +406,7 @@ class SMPL:
return T_out, J_out return T_out, J_out
def run_garment_with_weights(self, pose, betas, v_cloth, weights, J=None): def run_garment_with_weights(self, R, betas, v_cloth, weights, J=None):
R = self.run_rodrigues(pose)
if J is None: if J is None:
J = self.get_joints_template(betas) J = self.get_joints_template(betas)
@@ -431,12 +430,13 @@ class SMPL:
J = tf.gather(J, tf.constant([0, 1, 2], tf.int32), axis=1) J = tf.gather(J, tf.constant([0, 1, 2], tf.int32), axis=1)
T = tf.tensordot(weights, results, axes=((1), (0))) T = tf.tensordot(weights, results, axes=((1), (0)))
rest_shape_h = tf.concat((v_cloth, tf.ones((v_cloth.shape[0], 1), dtype=tf.float32)), axis=1) rest_shape_h = tf.concat((v_cloth, tf.ones((v_cloth.get_shape().as_list()[0], 1), dtype=tf.float32)), axis=1)
v = tf.matmul(T, tf.reshape(rest_shape_h, (-1, 4, 1))) v = tf.matmul(T, tf.reshape(rest_shape_h, (-1, 4, 1)))
v = tf.reshape(v, (-1, 4))[:, :3] v = tf.reshape(v, (-1, 4))[:, :3]
return v, tf.squeeze(J) return v, tf.squeeze(J)
# gender = tf.cast(tf.greater_equal(betas[:, 10] , 0), tf.int32)
T_out, J_out = tf.map_fn(single_run, (R, J, v_cloth, weights), (tf.float32, tf.float32)) T_out, J_out = tf.map_fn(single_run, (R, J, v_cloth, weights), (tf.float32, tf.float32))
J0 = tf.reshape(J_out[:,0,:], (-1, 1, 3)) J0 = tf.reshape(J_out[:,0,:], (-1, 1, 3))
+32 -75
View File
@@ -38,11 +38,10 @@ else:
from losses import collision_ratio, kl_loss, normal_loss #, concept_loss from losses import collision_ratio, kl_loss, normal_loss #, concept_loss
# from losses import collision_penalty as collision_penalty # from losses import collision_penalty as collision_penalty
from losses import collision_loss as collision_penalty from losses import collision_loss as collision_penalty
from custom_utils.custom_utils import batch_to_dict, load_model, plot_3d, UV2Mesh, UV2MeshLabel, get_summary_html, maskFacesBatch, _maskFaces, plot_3d_collision, plot_weights from custom_utils.custom_utils import batch_to_dict, load_model, plot_3d, UV2Mesh, get_summary_html, maskFacesBatch, _maskFaces, plot_3d_collision
from dataset import DatasetFactory, StaticDataset from dataset import DatasetFactory, StaticDataset
from custom_utils.smpl import SMPL from custom_utils.smpl import SMPL
from models.cvae_model import CVAENew as CVAE from models.cvae_model import CVAENew as CVAE
from models.gnn import Smoother
def init_wandb(): def init_wandb():
@@ -63,7 +62,6 @@ def init_wandb():
run.log_artifact(artifact) run.log_artifact(artifact)
uv2mesh = UV2Mesh(res=256, is_skirt=config['is_skirt'], is_adaptive=False, is_smpl_orig=config['is_cape']) uv2mesh = UV2Mesh(res=256, is_skirt=config['is_skirt'], is_adaptive=False, is_smpl_orig=config['is_cape'])
uv2mesh_label = UV2MeshLabel(res=256, is_skirt=config['is_skirt'], is_smpl_orig=config['is_cape'])
def kl_loss(mean, logvar): def kl_loss(mean, logvar):
@@ -73,15 +71,9 @@ def kl_loss(mean, logvar):
return kl_loss return kl_loss
def blend_weights_reg(pred_w, gender=None):
orig = smpl.weights
l1 = tf.reduce_mean(tf.abs(pred_w - orig[None, 0, :, :]))
return l1
# 3d loss on posed !!!!!!!!!!!! # 3d loss on posed !!!!!!!!!!!!
@tf.function # @tf.function
def train_step(batch): def train_step(batch):
with tf.GradientTape() as tape: with tf.GradientTape() as tape:
@@ -90,12 +82,9 @@ def train_step(batch):
else: else:
mesh_orig, uv_orig = batch['mesh_posed'], batch['uv_posed'] mesh_orig, uv_orig = batch['mesh_posed'], batch['uv_posed']
pred, mean, logvar, weights = model([uv_orig, batch['uv_static'], batch['uv_body_posed'], batch['uv_curvature'], batch['uv_mask']], training=True) pred, mean, logvar = model([uv_orig, batch['uv_static'], batch['uv_body_posed'], batch['uv_curvature'], batch['uv_mask']], training=True)
mesh_pred = uv2mesh(pred) mesh_pred = uv2mesh(pred)
mesh_pred = smoother(mesh_pred, training=True)
mesh_weigths = uv2mesh_label(weights)
mesh_weigths = smoother_weights(mesh_weigths, training=True)
if config['use_skinning']: if config['use_skinning']:
shape = batch['pose_shape'][:, 72:] shape = batch['pose_shape'][:, 72:]
@@ -105,31 +94,25 @@ def train_step(batch):
mesh_pred_shaped = mesh_pred + shape_offsets * batch['mesh_mask'][:,:,tf.newaxis] mesh_pred_shaped = mesh_pred + shape_offsets * batch['mesh_mask'][:,:,tf.newaxis]
mesh_pred_posed = smpl.run_garment(batch['pose_shape'][:, :72], batch['pose_shape'][:, 72:], mesh_pred_shaped) mesh_pred_posed = smpl.run_garment(batch['pose_shape'][:, :72], batch['pose_shape'][:, 72:], mesh_pred_shaped)
else: else:
shape = batch['pose_shape'][:, 72:] mesh_pred_posed = mesh_pred
gender = tf.cast(tf.greater_equal(shape[:, 10] , 0.5), tf.int32)
shape_offsets = tf.stack([tf.gather(tf.tensordot(shape[i,:10][tf.newaxis, :], smpl.shapedirs[gender[i]], axes=[[1], [2]])[0,:,:], smpl.to_keep, axis=0) for i in range(shape.shape[0])])
mesh_pred_shaped = mesh_pred + shape_offsets * batch['mesh_mask'][:,:,tf.newaxis]
mesh_pred_posed = smpl.run_garment_with_weights(batch['pose_shape'][:, :72], batch['pose_shape'][:, 72:], mesh_pred_shaped, mesh_weigths)
# is the output already masked? # is the output already masked?
e_loss = tf.reduce_mean(edge_loss(mesh_pred, mesh_orig, batch['mesh_mask'])) e_loss = tf.reduce_mean(edge_loss(mesh_pred, mesh_orig, batch['mesh_mask']))
c_loss, c_ratio = collision_penalty(mesh_pred_posed, batch['mesh_body_posed'], batch['mesh_mask']) c_loss, c_ratio = collision_penalty(mesh_pred_posed, batch['mesh_body_posed'], batch['mesh_mask'])
c_loss, c_ratio = tf.reduce_mean(c_loss), tf.reduce_mean(c_ratio) c_loss, c_ratio = tf.reduce_mean(c_loss), tf.reduce_mean(c_ratio)
# l2_loss = tf.reduce_mean(1e3 * tf.reduce_mean(tf.reduce_sum(((uv_orig - pred) ** 2), axis=-1), axis=[1, 2])) l2_loss = tf.reduce_mean(1e3 * tf.reduce_mean(tf.reduce_sum(((uv_orig - pred) ** 2), axis=-1), axis=[1, 2]))
l2_mesh_loss = tf.reduce_mean(1e3 * tf.reduce_mean(tf.reduce_sum(batch['mesh_mask'][:,:,tf.newaxis] * (batch['mesh_posed'] - mesh_pred_posed) ** 2, axis=-1), axis=-1)) l2_mesh_loss = tf.reduce_mean(1e3 * tf.reduce_mean(tf.reduce_sum(batch['mesh_mask'][:,:,tf.newaxis] * (batch['mesh_posed'] - mesh_pred_posed) ** 2, axis=-1), axis=-1))
n_loss = normal_loss(mesh_pred_posed, batch['mesh_posed'], batch['mesh_mask'], is_skirt=config['is_skirt'], is_smpl_orig=config['is_cape']) n_loss = normal_loss(mesh_pred_posed, batch['mesh_posed'], batch['mesh_mask'], is_skirt=config['is_skirt'], is_smpl_orig=config['is_cape'])
# conc_loss = concept_loss(pred, batch['uv_unposed']) # conc_loss = concept_loss(pred, batch['uv_unposed'])
kl = kl_loss(mean, logvar) kl = kl_loss(mean, logvar)
weights_l = blend_weights_reg(mesh_weigths)
reconstr_loss = l2_mesh_loss + 1e-6 * weights_l reconstr_loss = l2_loss
if config['use_extra_losses']: if config['use_extra_losses']:
if 'block_collision_loss' in config.keys() and config['block_collision_loss'] == True: if 'block_collision_loss' in config.keys() and config['block_collision_loss'] == True:
reconstr_loss = reconstr_loss + (e_loss) * config['reg_loss_coeff'] reconstr_loss = reconstr_loss + l2_mesh_loss + (e_loss) * config['reg_loss_coeff']
else: else:
reconstr_loss = reconstr_loss + (e_loss + c_loss) * config['reg_loss_coeff'] reconstr_loss = reconstr_loss + l2_mesh_loss + (e_loss + c_loss) * config['reg_loss_coeff']
if config['use_norm_loss'] and step > 2000: if config['use_norm_loss'] and step > 2000:
reconstr_loss = reconstr_loss + n_loss * config['reg_loss_coeff'] reconstr_loss = reconstr_loss + n_loss * config['reg_loss_coeff']
@@ -139,14 +122,14 @@ def train_step(batch):
logvar = tf.reduce_mean(logvar) logvar = tf.reduce_mean(logvar)
# ms_ssim = tf.reduce_mean(tf.image.ssim_multiscale(pred + 5, batch['uv_unposed'] + 5, max_val=10, power_factors=(0.5, 0.2, 0.1, 0.1, 0.1))) # ms_ssim = tf.reduce_mean(tf.image.ssim_multiscale(pred + 5, batch['uv_unposed'] + 5, max_val=10, power_factors=(0.5, 0.2, 0.1, 0.1, 0.1)))
metric = tf.reduce_sum(tf.math.sqrt(tf.reduce_sum(batch['mesh_mask'][:,:,tf.newaxis] * (mesh_orig - mesh_pred_posed) ** 2, axis=-1))) / tf.reduce_sum(batch['mesh_mask']) metric = tf.reduce_sum(tf.math.sqrt(tf.reduce_sum(batch['mesh_mask'][:,:,tf.newaxis] * (mesh_orig - mesh_pred) ** 2, axis=-1))) / tf.reduce_sum(batch['mesh_mask'])
gradients = tape.gradient(loss, model.trainable_variables + smoother.trainable_variables + smoother_weights.trainable_variables) gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables + smoother.trainable_variables + smoother_weights.trainable_variables)) optimizer.apply_gradients(zip(gradients, model.trainable_variables))
return { 'train/loss': loss, 'train/edge_loss': e_loss, 'train/collision_loss': c_loss, 'train/euclid_error': metric, return { 'train/loss': loss, 'train/edge_loss': e_loss, 'train/collision_loss': c_loss, 'train/euclid_error': metric,
'train/reconstr_loss': reconstr_loss, 'train/collision_ratio': c_ratio, 'train/reconstr_loss': reconstr_loss, 'train/collision_ratio': c_ratio,
'train/mean': mean, 'train/logvar': logvar, 'train/kl_loss': kl, 'train/var': np.e ** logvar, 'train/mean': mean, 'train/logvar': logvar, 'train/kl_loss': kl, 'train/var': np.e ** logvar,
'train/l2_mesh_loss': l2_mesh_loss, 'train/normal_loss': n_loss, 'train/weights_loss': weights_l, 'train/l2_loss': l2_loss, 'train/l2_mesh_loss': l2_mesh_loss, 'train/normal_loss': n_loss,
# 'train/ms_ssim': ms_ssim, 'train/l2_loss': l2_loss, # 'train/ms_ssim': ms_ssim,
} }
@@ -157,12 +140,9 @@ def valid_step(batch):
else: else:
mesh_orig, uv_orig = batch['mesh_posed'], batch['uv_posed'] mesh_orig, uv_orig = batch['mesh_posed'], batch['uv_posed']
pred, mean, logvar, weights = model([uv_orig, batch['uv_static'], batch['uv_body_posed'], batch['uv_curvature'], batch['uv_mask']], training=False) pred, mean, logvar = model([uv_orig, batch['uv_static'], batch['uv_body_posed'], batch['uv_curvature'], batch['uv_mask']], training=False)
mesh_pred = uv2mesh(pred) mesh_pred = uv2mesh(pred)
mesh_pred = smoother(mesh_pred, training=False)
mesh_weigths = uv2mesh_label(weights)
mesh_weigths = smoother_weights(mesh_weigths, training=False)
if config['use_skinning']: if config['use_skinning']:
shape = batch['pose_shape'][:, 72:] shape = batch['pose_shape'][:, 72:]
@@ -172,28 +152,22 @@ def valid_step(batch):
mesh_pred_shaped = mesh_pred + shape_offsets * batch['mesh_mask'][:,:,tf.newaxis] mesh_pred_shaped = mesh_pred + shape_offsets * batch['mesh_mask'][:,:,tf.newaxis]
mesh_pred_posed = smpl.run_garment(batch['pose_shape'][:, :72], batch['pose_shape'][:, 72:], mesh_pred_shaped) mesh_pred_posed = smpl.run_garment(batch['pose_shape'][:, :72], batch['pose_shape'][:, 72:], mesh_pred_shaped)
else: else:
shape = batch['pose_shape'][:, 72:] mesh_pred_posed = mesh_pred
gender = tf.cast(tf.greater_equal(shape[:, 10] , 0.5), tf.int32)
shape_offsets = tf.stack([tf.gather(tf.tensordot(shape[i,:10][tf.newaxis, :], smpl.shapedirs[gender[i]], axes=[[1], [2]])[0,:,:], smpl.to_keep, axis=0) for i in range(shape.shape[0])])
mesh_pred_shaped = mesh_pred + shape_offsets * batch['mesh_mask'][:,:,tf.newaxis]
mesh_pred_posed = smpl.run_garment_with_weights(batch['pose_shape'][:, :72], batch['pose_shape'][:, 72:], mesh_pred_shaped, mesh_weigths)
# is the output already masked? # is the output already masked?
e_loss = tf.reduce_mean(edge_loss(mesh_pred, mesh_orig, batch['mesh_mask'])) e_loss = tf.reduce_mean(edge_loss(mesh_pred, mesh_orig, batch['mesh_mask']))
c_loss, c_ratio = collision_penalty(mesh_pred_posed, batch['mesh_body_posed'], batch['mesh_mask']) c_loss, c_ratio = collision_penalty(mesh_pred_posed, batch['mesh_body_posed'], batch['mesh_mask'])
c_loss, c_ratio = tf.reduce_mean(c_loss), tf.reduce_mean(c_ratio) c_loss, c_ratio = tf.reduce_mean(c_loss), tf.reduce_mean(c_ratio)
# l2_loss = tf.reduce_mean(1e3 * tf.reduce_mean(tf.reduce_sum(((uv_orig - pred) ** 2), axis=-1), axis=[1, 2])) l2_loss = tf.reduce_mean(1e3 * tf.reduce_mean(tf.reduce_sum(((uv_orig - pred) ** 2), axis=-1), axis=[1, 2]))
l2_mesh_loss = tf.reduce_mean(1e3 * tf.reduce_mean(tf.reduce_sum(batch['mesh_mask'][:,:,tf.newaxis] * (batch['mesh_posed'] - mesh_pred_posed) ** 2, axis=-1), axis=-1)) l2_mesh_loss = tf.reduce_mean(1e3 * tf.reduce_mean(tf.reduce_sum(batch['mesh_mask'][:,:,tf.newaxis] * (batch['mesh_posed'] - mesh_pred_posed) ** 2, axis=-1), axis=-1))
n_loss = normal_loss(mesh_pred_posed, batch['mesh_posed'], batch['mesh_mask'], is_skirt=config['is_skirt'], is_smpl_orig=config['is_cape']) n_loss = normal_loss(mesh_pred_posed, batch['mesh_posed'], batch['mesh_mask'], is_skirt=config['is_skirt'], is_smpl_orig=config['is_cape'])
# conc_loss = concept_loss(pred, batch['uv_unposed']) # conc_loss = concept_loss(pred, batch['uv_unposed'])
kl = kl_loss(mean, logvar) kl = kl_loss(mean, logvar)
weights_l = blend_weights_reg(mesh_weigths)
reconstr_loss = l2_mesh_loss + 1e-6 * weights_l reconstr_loss = l2_loss
if config['use_extra_losses']: if config['use_extra_losses']:
reconstr_loss = reconstr_loss + (e_loss + c_loss) * config['reg_loss_coeff'] reconstr_loss = reconstr_loss + l2_mesh_loss + (e_loss + c_loss) * config['reg_loss_coeff']
if config['use_norm_loss']: if config['use_norm_loss']:
reconstr_loss = reconstr_loss + n_loss * config['reg_loss_coeff'] reconstr_loss = reconstr_loss + n_loss * config['reg_loss_coeff']
@@ -203,12 +177,12 @@ def valid_step(batch):
logvar = tf.reduce_mean(logvar) logvar = tf.reduce_mean(logvar)
# ms_ssim = tf.reduce_mean(tf.image.ssim_multiscale(pred + 5, batch['uv_unposed'] + 5, max_val=10, power_factors=(0.5, 0.2, 0.1, 0.1, 0.1))) # ms_ssim = tf.reduce_mean(tf.image.ssim_multiscale(pred + 5, batch['uv_unposed'] + 5, max_val=10, power_factors=(0.5, 0.2, 0.1, 0.1, 0.1)))
metric = tf.reduce_sum(tf.math.sqrt(tf.reduce_sum(batch['mesh_mask'][:,:,tf.newaxis] * (mesh_orig - mesh_pred_posed) ** 2, axis=-1))) / tf.reduce_sum(batch['mesh_mask']) metric = tf.reduce_sum(tf.math.sqrt(tf.reduce_sum(batch['mesh_mask'][:,:,tf.newaxis] * (mesh_orig - mesh_pred) ** 2, axis=-1))) / tf.reduce_sum(batch['mesh_mask'])
# c_ratio = tf.reduce_mean(collision_ratio(mesh_pred_posed, batch['mesh_body_posed'], batch['mesh_mask'])) # c_ratio = tf.reduce_mean(collision_ratio(mesh_pred_posed, batch['mesh_body_posed'], batch['mesh_mask']))
return { 'valid/loss': loss, 'valid/edge_loss': e_loss, 'valid/collision_loss': c_loss, 'valid/euclid_error': metric, return { 'valid/loss': loss, 'valid/edge_loss': e_loss, 'valid/collision_loss': c_loss, 'valid/euclid_error': metric,
'valid/reconstr_loss': reconstr_loss, 'valid/l2_mesh_loss': l2_mesh_loss, 'valid/collision_ratio': c_ratio, 'valid/reconstr_loss': reconstr_loss, 'valid/l2_mesh_loss': l2_mesh_loss, 'valid/collision_ratio': c_ratio,
'valid/mean': mean, 'valid/logvar': logvar, 'valid/kl_loss': kl, 'valid/var': np.e ** logvar, 'valid/weights_loss': weights_l, 'valid/mean': mean, 'valid/logvar': logvar, 'valid/kl_loss': kl, 'valid/var': np.e ** logvar,
'valid/normal_loss': n_loss,# 'valid/ms_ssim': ms_ssim, 'valid/normal_loss': n_loss,# 'valid/ms_ssim': ms_ssim,
} }
@@ -220,7 +194,7 @@ def test_step(batch):
else: else:
mesh_orig, uv_orig = batch['mesh_posed'], batch['uv_posed'] mesh_orig, uv_orig = batch['mesh_posed'], batch['uv_posed']
pred, mean, logvar, weights = model([uv_orig, batch['uv_static'], batch['uv_body_posed'], batch['uv_curvature'], batch['uv_mask']], training=False) pred, mean, logvar = model([uv_orig, batch['uv_static'], batch['uv_body_posed'], batch['uv_curvature'], batch['uv_mask']], training=False)
mesh_pred = uv2mesh(pred) mesh_pred = uv2mesh(pred)
@@ -234,7 +208,7 @@ def test_step(batch):
mesh_orig_shaped = mesh_orig + shape_offsets * batch['mesh_mask'][:,:,tf.newaxis] mesh_orig_shaped = mesh_orig + shape_offsets * batch['mesh_mask'][:,:,tf.newaxis]
mesh_orig_posed = smpl.run_garment(batch['pose_shape'][:, :72], batch['pose_shape'][:, 72:], mesh_orig_shaped) mesh_orig_posed = smpl.run_garment(batch['pose_shape'][:, :72], batch['pose_shape'][:, 72:], mesh_orig_shaped)
else: else:
mesh_pred_posed = smpl.run_garment_with_weights(batch['pose_shape'][:, :72], batch['pose_shape'][:, 72:], mesh_pred, weights) mesh_pred_posed = mesh_pred
mesh_orig_posed = mesh_orig mesh_orig_posed = mesh_orig
mesh_pred_posed_fixed = fix_collision(mesh_pred_posed, batch['mesh_body_posed'], batch['mesh_mask']) mesh_pred_posed_fixed = fix_collision(mesh_pred_posed, batch['mesh_body_posed'], batch['mesh_mask'])
@@ -276,12 +250,9 @@ def plot_everything(batch: dict, type: str):
else: else:
mesh_orig, uv_orig = batch['mesh_posed'], batch['uv_posed'] mesh_orig, uv_orig = batch['mesh_posed'], batch['uv_posed']
pred, mean, logvar, weights = model([uv_orig, batch['uv_static'], batch['uv_body_posed'], batch['uv_curvature'], batch['uv_mask']], training=False) pred, mean, logvar = model([uv_orig, batch['uv_static'], batch['uv_body_posed'], batch['uv_curvature'], batch['uv_mask']], training=False)
mesh_pred = uv2mesh(pred) mesh_pred = uv2mesh(pred).numpy()
mesh_pred = smoother(mesh_pred, training=False).numpy()
mesh_weigths = uv2mesh_label(weights)
mesh_weigths = smoother_weights(mesh_weigths, training=False)
orig_img = uv_orig orig_img = uv_orig
uv_static_img = batch['uv_static'] uv_static_img = batch['uv_static']
@@ -289,9 +260,6 @@ def plot_everything(batch: dict, type: str):
pred_img = pred pred_img = pred
img = tf.concat((uv_static_img, uv_body_posed_img, orig_img, pred_img), axis=2) img = tf.concat((uv_static_img, uv_body_posed_img, orig_img, pred_img), axis=2)
imgs = [wandb.Image((img[i] + 1) / 2.0) for i in range(4)] imgs = [wandb.Image((img[i] + 1) / 2.0) for i in range(4)]
# min max normalization of weights
weights = (weights - tf.reduce_min(weights, axis=[1,2,3], keepdims=True)) / (tf.reduce_max(weights, axis=[1,2,3], keepdims=True) - tf.reduce_min(weights, axis=[1,2,3], keepdims=True))
weights_imgs = [wandb.Image(np.concatenate((np.concatenate([weights[b,:,:,i].numpy() for i in range(12)], axis=-1), np.concatenate([weights[b,:,:,i].numpy() for i in range(12,24)], axis=-1)), axis=0)) for b in range(4)]
F = np.load("custom_utils/smpl_faces" + skirt_modifier + ("_orig" if config['is_cape'] else "") + ".npy") F = np.load("custom_utils/smpl_faces" + skirt_modifier + ("_orig" if config['is_cape'] else "") + ".npy")
mask = batch['mesh_mask'].numpy().astype(bool) mask = batch['mesh_mask'].numpy().astype(bool)
@@ -309,12 +277,7 @@ def plot_everything(batch: dict, type: str):
mesh_pred[i, mask[i], :] += shape_offsets.numpy()[i, mask[i], :] mesh_pred[i, mask[i], :] += shape_offsets.numpy()[i, mask[i], :]
mesh_posed = smpl.run_garment(batch['pose_shape'][:, :72], batch['pose_shape'][:, 72:], mesh_pred).numpy() mesh_posed = smpl.run_garment(batch['pose_shape'][:, :72], batch['pose_shape'][:, 72:], mesh_pred).numpy()
else: else:
shape = batch['pose_shape'][:, 72:] mesh_posed = mesh_pred
gender = tf.cast(tf.greater_equal(shape[:, 10] , 0.5), tf.int32)
shape_offsets = tf.stack([tf.gather(tf.tensordot(shape[i,:10][tf.newaxis, :], smpl.shapedirs[gender[i]], axes=[[1], [2]])[0,:,:], smpl.to_keep, axis=0) for i in range(shape.shape[0])])
mesh_pred_shaped = mesh_pred + shape_offsets * batch['mesh_mask'][:,:,tf.newaxis]
mesh_posed = smpl.run_garment_with_weights(batch['pose_shape'][:, :72], batch['pose_shape'][:, 72:], mesh_pred_shaped, mesh_weigths).numpy()
gt = [mesh_orig[i].numpy()[mask[i], :] for i in range(pred.shape[0])] gt = [mesh_orig[i].numpy()[mask[i], :] for i in range(pred.shape[0])]
garment_unposed, faces = maskFacesBatch(mesh_pred, F, mask) garment_unposed, faces = maskFacesBatch(mesh_pred, F, mask)
@@ -333,16 +296,13 @@ def plot_everything(batch: dict, type: str):
collision_fixed = [np.concatenate((body[i], garment_posed_fixed[i]), axis=0) for i in range(len(garment_posed))] collision_fixed = [np.concatenate((body[i], garment_posed_fixed[i]), axis=0) for i in range(len(garment_posed))]
collision_gt = [np.concatenate((body[i], gt_posed[i]), axis=0) for i in range(len(garment_posed))] collision_gt = [np.concatenate((body[i], gt_posed[i]), axis=0) for i in range(len(garment_posed))]
# figs = { type + "/garment_" + str(i): plot_3d(gt[i], garment_unposed[i], faces[i], garment_posed[i], faces[i], collision_color[i], flip_xy=(not config['use_skinning'] and config['remove_global_orientation'])) for i in range(4) } figs = { type + "/garment_" + str(i): plot_3d(gt[i], garment_unposed[i], faces[i], collision[i], collision_faces[i], collision_color[i], flip_xy=(not config['use_skinning'] and config['remove_global_orientation'])) for i in range(4) }
figs = { type + "/garment_" + str(i): plot_3d(gt[i], garment_unposed[i], faces[i], collision[i], collision_faces[i], collision_color[i],) for i in range(4) } figs_coll = { type + "/garment_" + str(i) + '_collision': plot_3d_collision(collision_gt[i], collision[i], collision_fixed[i], collision_faces[i], collision_color[i], flip_xy=(not config['use_skinning'] and config['remove_global_orientation'])) for i in range(4) }
figs_coll = { type + "/garment_" + str(i) + '_collision': plot_3d_collision(collision_gt[i], collision[i], collision_fixed[i], collision_faces[i], collision_color[i],) for i in range(4) }
figs_weights = { type + '/weights_' + str(i): plot_weights(mesh_weigths[0,:,i], body[0], F) for i in range(24) }
# figs_weights = { type + '/weights_' + str(i): plot_weights(smpl.weights[0,:,i], body[0], F) for i in range(24) }
mean_hist = wandb.Histogram(sequence=mean.numpy().mean(axis=0)) mean_hist = wandb.Histogram(sequence=mean.numpy().mean(axis=0))
logvar_hist = wandb.Histogram(sequence=logvar.numpy().mean(axis=0)) logvar_hist = wandb.Histogram(sequence=logvar.numpy().mean(axis=0))
return { **figs, **figs_coll, **figs_weights, **{ type + '/images': imgs, type + '/weight_images': weights_imgs, type + '/mean_hist': mean_hist, type + '/logvar_hist': logvar_hist } } return { **figs, **figs_coll, **{ type + '/images': imgs, type + '/mean_hist': mean_hist, type + '/logvar_hist': logvar_hist } }
def sample(folder): def sample(folder):
@@ -516,7 +476,7 @@ def test():
if __name__ == '__main__': if __name__ == '__main__':
init_wandb() # init_wandb()
parser = argparse.ArgumentParser(description='') parser = argparse.ArgumentParser(description='')
parser.add_argument('--name', type=str) parser.add_argument('--name', type=str)
args = vars(parser.parse_args()) args = vars(parser.parse_args())
@@ -557,8 +517,6 @@ if __name__ == '__main__':
is_cape=config['is_cape']) is_cape=config['is_cape'])
model = CVAE(config) model = CVAE(config)
smoother = Smoother(features=24, activation_middle='tanh', activation_final='tanh', learn_weights=False)
smoother_weights = Smoother(features=3, activation_middle=None, activation_final='softmax', learn_weights=True)
optimizer = tf.optimizers.Adam(learning_rate=config['lr']) optimizer = tf.optimizers.Adam(learning_rate=config['lr'])
balancing_activated_step = 0 balancing_activated_step = 0
@@ -583,10 +541,9 @@ if __name__ == '__main__':
train_loss = train_step(batch) train_loss = train_step(batch)
if step % 25 == 0: data_valid = valid_iterator.get_next()
data_valid = valid_iterator.get_next() data_valid = static_dataset_valid.expand_batch(batch_to_dict(data_valid, config['signature_dynamic']))
data_valid = static_dataset_valid.expand_batch(batch_to_dict(data_valid, config['signature_dynamic'])) valid_loss = valid_step(data_valid)
valid_loss = valid_step(data_valid)
to_log = { **train_loss, **valid_loss, **{ 'current_step': step} } to_log = { **train_loss, **valid_loss, **{ 'current_step': step} }
if step % 5000 == 0 or (step < 5000 and step % 500 == 0): if step % 5000 == 0 or (step < 5000 and step % 500 == 0):
+3 -11
View File
@@ -39,7 +39,7 @@ else:
from losses import collision_ratio, kl_loss #, concept_loss from losses import collision_ratio, kl_loss #, concept_loss
# from losses import collision_penalty as collision_penalty # from losses import collision_penalty as collision_penalty
from losses import collision_loss as collision_penalty from losses import collision_loss as collision_penalty
from custom_utils.custom_utils import batch_to_dict, load_model, plot_3d, UV2Mesh, UV2MeshLabel, get_summary_html, maskFacesBatch, _maskFaces, plot_3d_collision from custom_utils.custom_utils import batch_to_dict, load_model, plot_3d, UV2Mesh, get_summary_html, maskFacesBatch, _maskFaces, plot_3d_collision
from dataset import DatasetFactory, StaticDataset from dataset import DatasetFactory, StaticDataset
from custom_utils.smpl import SMPL from custom_utils.smpl import SMPL
from models.cvae_model import CVAENew as CVAE from models.cvae_model import CVAENew as CVAE
@@ -48,7 +48,6 @@ from custom_utils.supersmpl_io import writeOBJ
uv2mesh = UV2Mesh(res=256, is_skirt=config['is_skirt'], is_adaptive=False, is_smpl_orig=config['is_cape']) uv2mesh = UV2Mesh(res=256, is_skirt=config['is_skirt'], is_adaptive=False, is_smpl_orig=config['is_cape'])
uv2mesh_label = UV2MeshLabel(res=256, is_skirt=config['is_skirt'], is_smpl_orig=config['is_cape'])
@tf.function @tf.function
def step(batch): def step(batch):
@@ -57,10 +56,9 @@ def step(batch):
else: else:
uv_orig = batch['uv_posed'] uv_orig = batch['uv_posed']
pred, _, _, weights = model([uv_orig, batch['uv_static'], batch['uv_body_posed'], batch['uv_curvature'], batch['uv_mask']], training=False) pred, _, _ = model([uv_orig, batch['uv_static'], batch['uv_body_posed'], batch['uv_curvature'], batch['uv_mask']], training=False)
mesh_pred = uv2mesh(pred) mesh_pred = uv2mesh(pred)
mesh_weigths = uv2mesh_label(weights)
if config['use_skinning']: if config['use_skinning']:
shape = batch['pose_shape'][:, 72:] shape = batch['pose_shape'][:, 72:]
@@ -70,13 +68,7 @@ def step(batch):
mesh_pred_shaped = mesh_pred + shape_offsets * batch['mesh_mask'][:,:,tf.newaxis] mesh_pred_shaped = mesh_pred + shape_offsets * batch['mesh_mask'][:,:,tf.newaxis]
mesh_pred_posed = smpl.run_garment(batch['pose_shape'][:, :72], batch['pose_shape'][:, 72:], mesh_pred_shaped) mesh_pred_posed = smpl.run_garment(batch['pose_shape'][:, :72], batch['pose_shape'][:, 72:], mesh_pred_shaped)
else: else:
shape = batch['pose_shape'][:, 72:] mesh_pred_posed = mesh_pred
gender = tf.cast(tf.greater_equal(shape[:, 10] , 0.5), tf.int32)
shape_offsets = tf.stack([tf.gather(tf.tensordot(shape[i,:10][tf.newaxis, :], smpl.shapedirs[gender[i]], axes=[[1], [2]])[0,:,:], smpl.to_keep, axis=0) for i in range(shape.shape[0])])
mesh_pred_shaped = mesh_pred + shape_offsets * batch['mesh_mask'][:,:,tf.newaxis]
mesh_pred_posed = smpl.run_garment_with_weights(batch['pose_shape'][:, :72], batch['pose_shape'][:, 72:], mesh_pred_shaped, mesh_weigths)
# mesh_pred_posed_fixed = fix_collision(mesh_pred_posed, batch['mesh_body_posed'], batch['mesh_mask']) # mesh_pred_posed_fixed = fix_collision(mesh_pred_posed, batch['mesh_body_posed'], batch['mesh_mask'])
+2 -2
View File
@@ -171,13 +171,13 @@ class AEEncoderNew(tf.keras.Model):
class DecoderNew(tf.keras.Model): class DecoderNew(tf.keras.Model):
def __init__(self, depths, dims, kernel_size=7, is_label=False, learn_weights=False): def __init__(self, depths, dims, kernel_size=7, is_label=False):
super(DecoderNew, self).__init__() super(DecoderNew, self).__init__()
self.is_label = is_label self.is_label = is_label
if not is_label: if not is_label:
self.decoder = ConvNeXtReverse(depths=depths, dims=dims, kernel_size=kernel_size, learn_weights=learn_weights) self.decoder = ConvNeXtReverse(depths=depths, dims=dims, kernel_size=kernel_size)
else: else:
self.decoder = ConvNeXtReverseLabels(depths=depths, dims=dims, nr_of_classes=7) self.decoder = ConvNeXtReverseLabels(depths=depths, dims=dims, nr_of_classes=7)
+5 -8
View File
@@ -181,7 +181,6 @@ class CVAENew(tf.keras.Model):
self.encoder = VariationalEncoderNew(config['cvae']['encoder_depths'], config['cvae']['encoder_dims'], kernel_size=config['cvae']['kernel_size']) self.encoder = VariationalEncoderNew(config['cvae']['encoder_depths'], config['cvae']['encoder_dims'], kernel_size=config['cvae']['kernel_size'])
self.decoder = DecoderNew(config['cvae']['decoder_depths'], config['cvae']['decoder_dims'], config['cvae']['kernel_size']) self.decoder = DecoderNew(config['cvae']['decoder_depths'], config['cvae']['decoder_dims'], config['cvae']['kernel_size'])
self.decoder_weights = DecoderNew(config['cvae']['decoder_weights_depths'], config['cvae']['decoder_weights_dims'], config['cvae']['kernel_size'], learn_weights=True)
self.reshape = tf.keras.layers.Reshape((8, 4, 64)) self.reshape = tf.keras.layers.Reshape((8, 4, 64))
@@ -194,12 +193,12 @@ class CVAENew(tf.keras.Model):
self.noise_amount = config['cvae']['noise_amount'] self.noise_amount = config['cvae']['noise_amount']
self.use_curvature = config['use_curvature'] self.use_curvature = config['use_curvature']
self.only_curvatures = config['only_curvatures'] if 'only_curvatures' in config.keys() and config['only_curvatures'] == True else None self.only_curvatures = config['only_curvatures'] if 'only_curvatures' in config.keys() and config['only_curvatures'] == True else None
self.use_offsets_over_body = False self.use_offsets_over_body = not config['use_skinning']
if self.use_offsets_over_body: if self.use_offsets_over_body:
assert self.avg_garment is None, 'When we are not using skinning, we can\'t use avg_garment!' assert self.avg_garment is None, 'When we are not using skinning, we can\'t use avg_garment!'
# if self.avg_garment is not None: if self.avg_garment is not None:
# assert not self.use_offsets_over_body, 'When avg_garment is given, we must use skinning!' assert not self.use_offsets_over_body, 'When avg_garment is given, we must use skinning!'
# @tf.function # @tf.function
def sample(self, uv_template, uv_body_posed, uv_curv, uv_mask, noise=None, add_noise=False): def sample(self, uv_template, uv_body_posed, uv_curv, uv_mask, noise=None, add_noise=False):
@@ -215,7 +214,6 @@ class CVAENew(tf.keras.Model):
z = tf.concat([eps, z_cond], axis=-1) z = tf.concat([eps, z_cond], axis=-1)
x = self.decoder(z, training=False) x = self.decoder(z, training=False)
weights = self.decoder_weights(z, training=False)
if self.avg_garment is not None: if self.avg_garment is not None:
x = x + self.avg_garment[tf.newaxis,:,:,:] x = x + self.avg_garment[tf.newaxis,:,:,:]
@@ -225,7 +223,7 @@ class CVAENew(tf.keras.Model):
x = x * uv_mask[:,:,:,tf.newaxis] x = x * uv_mask[:,:,:,tf.newaxis]
return x, weights return x
def reparameterize(self, mean, logvar, training, fix_noise=False): def reparameterize(self, mean, logvar, training, fix_noise=False):
@@ -274,7 +272,6 @@ class CVAENew(tf.keras.Model):
z = tf.concat([z, z_cond], axis=-1) z = tf.concat([z, z_cond], axis=-1)
x = self.decoder(z, training=training) x = self.decoder(z, training=training)
weights = self.decoder_weights(z, training=training)
if self.avg_garment is not None: if self.avg_garment is not None:
x = x + self.avg_garment[tf.newaxis,:,:,:] x = x + self.avg_garment[tf.newaxis,:,:,:]
@@ -284,5 +281,5 @@ class CVAENew(tf.keras.Model):
x = x * uv_mask[:,:,:,tf.newaxis] x = x * uv_mask[:,:,:,tf.newaxis]
return x, mean, logvar, weights return x, mean, logvar
-34
View File
@@ -1,34 +0,0 @@
import os
import sys
import scipy.io as sio
import tensorflow as tf
from spektral.layers import GCNConv, GeneralConv
from spektral.utils import sp_matrix_to_sp_tensor
from tensorflow.keras.layers import (Conv2D, Conv2DTranspose, Dense, DepthwiseConv2D,
GlobalAveragePooling2D, Layer,
LayerNormalization, Flatten, Reshape, UpSampling2D)
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
class Smoother(tf.keras.Model):
def __init__(self, features=64, activation_middle='tanh', activation_final='tanh', learn_weights=False):
super().__init__()
self.a = sp_matrix_to_sp_tensor(sio.loadmat("custom_utils/ssmpl0.mat")['L'].tocoo())
self.conv1 = GCNConv(features, activation=activation_middle, use_bias=False)
self.conv2 = GCNConv(features, activation=activation_middle, use_bias=False)
# self.conv3 = GCNConv(features, activation=activation_middle, use_bias=False)
# self.conv4 = GCNConv(64, activation='tanh', use_bias=False)
# self.conv5 = GCNConv(64, activation='tanh', use_bias=False)
self.conv6 = GCNConv(3 if not learn_weights else 24, activation=activation_final, use_bias=False)
def call(self, inputs, training=None):
x = inputs
x = self.conv1([x, self.a], training=training)
x = self.conv2([x, self.a], training=training)
# x = self.conv3([x, self.a], training=training)
# x = self.conv4([x, self.a], training=training)
# x = self.conv5([x, self.a], training=training)
x = self.conv6([x, self.a], training=training)
return x