Author SHA1 Message Date
luni 19938273c3 save 2023-02-13 10:03:19 +00:00
luni 11a8c7e63e imporve plot 2023-01-30 11:18:59 +00:00
luni 798bf1367d option to use global binning 2023-01-29 12:51:17 +00:00
luni b8fdf26750 more runs 2023-01-28 23:48:54 +00:00
luni 6bfd18f3c7 regenerate curv based on new binning 2023-01-28 23:37:08 +00:00
luni feadeb3b5a update 2023-01-28 22:04:41 +00:00
luni 28cdd79a6b generate test curv 2023-01-28 20:25:31 +00:00
luni b121ee25e1 generate curv with 100 2023-01-28 19:35:10 +00:00
luni a63a47d84e generating more curvatures 2023-01-28 19:12:34 +00:00
luni 632d8db815 generate raw curv values for test set 2023-01-28 16:18:29 +00:00
luni a5659196a2 fix generation location 2023-01-28 12:54:39 +00:00
luni 1beda23ce2 save config files update 2023-01-28 12:24:17 +00:00
luni c7e75acc2d generate curv with different radius 2023-01-28 10:59:41 +00:00
luni ef81e702fa generating skirt 10 curvatures 2023-01-27 23:22:09 +00:00
luni 4bc57b6067 geenrate curv based on frames file 2023-01-27 19:55:58 +00:00
luni 22f77aba6a visualize curv with different radius 2023-01-27 19:20:16 +00:00
luni 80381df65a optimizing curvature generation 2023-01-27 17:17:36 +00:00
27 changed files with 495 additions and 456 deletions
+4 -8
View File
@@ -1,11 +1,7 @@
nohup python cvae_pyramid.py --name="lhunor_abl_pyr_32_no_curv_r1" > nohup/review/abl_pyr_32_no_curv_r1.out 2>&1 &
nohup python auto_encoder_static.py --name="lhunor_ae_static_orig_10p_r1" > nohup/review/static_orig_10p_r1.out 2>&1 &
nohup python auto_encoder_body.py --name="lhunor_ae_body_orig_10p_r1" > nohup/review/body_orig_10p_r1.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_abl_32_64_skirt_no_curv_r1" > nohup/review/abl_pyr_32_64_skirt_no_curv_r1.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_abl_pyr_32_no_curv_r1 > nohup/evaluate/abl_pyr_32_no_curv_r1.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_abl_32_64_skirt_no_curv_r1 > nohup/evaluate/abl_32_64_skirt_no_curv_r1.out 2>&1 &
nohup python calculate_error.py --name error_abl_pyr_32_no_curv_r1 > nohup/error/abl_pyr_32_no_curv_r1.out 2>&1 &
nohup python calculate_error.py --name error_pyr_abl_32_64_skirt_no_curv_r1 > nohup/error/pyr_abl_32_64_skirt_no_curv_r1.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_all_10p_curv_10_r2" > nohup/review/abl_all_10p_curv_10_r2.out 2>&1 &
nohup python auto_encoder_curv.py --name="lhunor_ae_curv_1_orig_curv_10_10p_r2" > nohup/review/curv_1_orig_curv_10_10p_r2.out 2>&1 &
nohup python auto_encoder_curv.py --name="lhunor_ae_curv_1_orig_curv_25_10p_r2" > nohup/review/curv_1_orig_curv_25_10p_r2.out 2>&1 &
nohup python auto_encoder_curv.py --name="lhunor_ae_curv_1_orig_curv_100_10p_r2" > nohup/review/curv_1_orig_curv_100_10p_r2.out 2>&1 &
one final convolutional layer for smoothing, on the final coordinates
+4 -2
View File
@@ -1,6 +1,6 @@
import os
import sys
from configs.config_ae_body import config
from configs.config_ae_body_post import config
os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu']
import tensorflow as tf
@@ -30,7 +30,7 @@ from tf_utils import check_tf_version, allow_memory_growth
from losses import edge_loss, uv_mask_loss
from dataset import DatasetFactory, StaticDataset
from custom_utils.custom_utils import batch_to_dict, plot_3d
from models.cond_encoder import AutoEncoder
from models.cond_encoder import AutoEncoderNew as AutoEncoder
def init_wandb():
@@ -171,6 +171,7 @@ if __name__ == '__main__':
signature=config['signature_dynamic'],
resolutions=[config['resolution']],
in_memory=config['dataset_in_memory'],
use_no_orient=config['remove_global_orientation'],
frames_file=config['frames_file'] if 'frames_file' in config.keys() else None,
is_cape=config['is_cape'])
static_dataset_train = StaticDataset(folder=config['train_dir'],
@@ -184,6 +185,7 @@ if __name__ == '__main__':
signature=config['signature_dynamic'],
resolutions=[config['resolution']],
in_memory=config['dataset_in_memory'],
use_no_orient=config['remove_global_orientation'],
frames_file=config['frames_file_valid'] if 'frames_file_valid' in config.keys() else None,
is_cape=config['is_cape'])
static_dataset_valid = StaticDataset(folder=config['valid_dir'],
+3 -1
View File
@@ -33,7 +33,7 @@ else:
from tf_utils import check_tf_version, allow_memory_growth
from dataset import DatasetFactory, StaticDataset
from custom_utils.custom_utils import batch_to_dict, plot_3d
from models.cond_encoder import AutoEncoder
from models.cond_encoder import AutoEncoderNew as AutoEncoder
def init_wandb():
@@ -205,6 +205,7 @@ if __name__ == '__main__':
signature=config['signature_dynamic'],
resolutions=[config['resolution']],
in_memory=config['dataset_in_memory'],
use_no_orient=config['remove_global_orientation'],
frames_file=config['frames_file'] if 'frames_file' in config.keys() else None,
is_cape=config['is_cape'])
static_dataset_train = StaticDataset(folder=config['train_dir'],
@@ -218,6 +219,7 @@ if __name__ == '__main__':
signature=config['signature_dynamic'],
resolutions=[config['resolution']],
in_memory=config['dataset_in_memory'],
use_no_orient=config['remove_global_orientation'],
frames_file=config['frames_file_valid'] if 'frames_file_valid' in config.keys() else None,
is_cape=config['is_cape'])
static_dataset_valid = StaticDataset(folder=config['valid_dir'],
+4 -4
View File
@@ -1,6 +1,6 @@
import os
import sys
from configs.config_abl_pyr_32_64_skirt_r1 import config
from configs.config_abl_all_post import config
os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu']
# import tensorflow as tf
@@ -59,13 +59,13 @@ if __name__ == '__main__':
folder = config['test_dir']
checkpoint_name = config['name']
iteration = '50000'
iteration = ''
F = np.load("custom_utils/smpl_faces" + skirt_modifier + ".npy").astype(np.int32)
garment_type_table = np.load('custom_data/garment_type_table_test.npy', allow_pickle=True).item()
output_folder = '/home/workspace/data/results/' + checkpoint_name + '-' + iteration
output_folder = '/home/workspace/data/results/post/' + checkpoint_name + '-' + iteration
faces_folder = '/home/workspace/data/results/support/faces' + ('_skirt' if config['is_skirt'] else '')
@@ -107,7 +107,7 @@ if __name__ == '__main__':
for key in per_garment_errors.keys():
print(key + ': ' + str(np.mean(per_garment_errors[key])))
with open('/home/workspace/data/results/errors/' + checkpoint_name + '-' + iteration + '.csv', mode='w') as f:
with open('/home/workspace/data/results/errors/post/' + checkpoint_name + '-' + iteration + '.csv', mode='w') as f:
file_writer = csv.writer(f, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
for key in sorted(errors.keys()):
-189
View File
@@ -1,189 +0,0 @@
config = dict()
config['gpu'] = '1'
config['name'] = 'pyr_abl_32_64_skirt_no_curv_r1'
config['notes'] = 'no curv, 10p data'
config['tags'] = ['review_1']
# DON'T FORGET TO RESET SSIM LOSS USAGE
# DON'T FORGET TO CHECK MODEL LOADING
# DON'T FORGET TO CHECK IF STORE IN MEMORY
# DON'T FORGET TO CHECK REG LOSS COEFF
# DON'T FORGET TO LOAD FINAL UPSCALER UNLESS HAVE LEVEL 512
# DON'T FORGET TO CHECK IF SKIRT
# DON'T FORGET TO CHECK IF CAPE
# DON'T FORGET TO CHECK IF USING DOWNSCALE NONE OR _2
# DON'T FORGET TO CHECK UPSCALING and ENCODER CHECKPOINTS
config['use_skinning'] = True # and deshaping
config['remove_global_orientation'] = True
config['use_extra_losses'] = True # edge, collision, 3d mesh
config['use_offsets'] = False
config['use_curvature'] = False
config['pyramid'] = dict()
config['pyramid']['resolutions'] = [32, 64]
config['pyramid']['pretrained_pyramid'] = 'checkpoints/pyr_abl_32_skirt_no_curv_r1'
config['pyramid']['final_upscale_enhancer'] = 'checkpoints/64_512_skirt'
config['pretrained_model'] = ''
config['pretrained_model_iteration'] = ''
config['train_dir'] = '/home/workspace/data/dataset/local-cache/train_skirt'
config['valid_dir'] = '/home/workspace/local-data/valid_skirt'
config['test_dir'] = '/home/workspace/data/dataset/test_skirt_ready_2'
config['batch_size'] = 4
config['is_skirt'] = True
config['is_cape'] = False
config['frames_file'] = 'frames_skirt_10p.txt'
config['frames_file_valid'] = 'frames_skirt_10p.txt'
config['pyramid']['static_model'] = 'checkpoints/static_1_skirt'
config['pyramid']['body_model'] = 'checkpoints/body_1_skirt_2_2'
config['pyramid']['curvature_model'] = 'checkpoints/curv_1_skirt'
config['dataset_in_memory'] = True
config['resolution'] = None
config['latent_dim'] = 128
config['smpl_res'] = 14475
if config['is_cape']:
config['smpl_res'] = 3638
config['lr'] = 0.0001
config['starting_balancing_coeff'] = 0.0001
config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision
config['avg_garment_path'] = ''
config['signature_dynamic'] = { 'id': (), 'frame_nr': (),
'pose_shape': (72 + 11,),
'uv_body_posed': (512, 256, 3),
'mesh_body_posed': (config['smpl_res'], 3,),
'mesh_posed': (config['smpl_res'], 3,),
'mesh_unposed': (config['smpl_res'], 3,),
'uv_unposed': (512, 256, 3),
'uv_curvature': (512, 256, 7),
}
config['signature_static'] = { 'uv_static': (512, 256, 3),
'mesh_mask': (config['smpl_res'],),
'uv_mask': (512, 256,),
}
config['pyramid']['is_label'] = False
config['pyramid']['latent_dim'] = config['latent_dim']
config['pyramid']['add_noise'] = True
config['pyramid']['noise_amount'] = 0.001
config['pyramid']['loss_weights'] = [1,1,1,1,1]
for res in config['pyramid']['resolutions']:
if res != 512:
res_modifier = '_' + str(res)
config['signature_dynamic']['uv_body_posed' + res_modifier] = (res, res//2, 3)
config['signature_dynamic']['uv_unposed' + res_modifier] = (res, res//2, 3)
config['signature_dynamic']['uv_curvature' + res_modifier] = (res, res//2, 7)
config['signature_static']['uv_static' + res_modifier] = (res, res//2, 3)
config['signature_static']['uv_mask' + res_modifier] = (res, res//2)
config['pyramid']['freeze_encoders'] = True
config['pyramid']['levels'] = []
for res in config['pyramid']['resolutions']:
if res == 512:
level = dict()
level['resolution'] = 512
level['latent_dim'] = config['latent_dim']
level['kernel_size'] = 7
level['encoder_depths'] = [3, 3, 9, 3]
level['encoder_dims'] = [32, 64, 128, 256]
level['decoder_input'] = (16, 8, 80)
level['decoder_depths'] = [3, 3, 9, 3]
level['decoder_dims'] = [256, 128, 64, 16]
level['avg_garment_path'] = ''
level['upscale_enhancer'] = ''
config['pyramid']['levels'].append(level)
elif res == 256:
level = dict()
level['resolution'] = 256
level['latent_dim'] = config['latent_dim']
level['kernel_size'] = 7
level['encoder_depths'] = [9, 9, 9, 9]
level['encoder_dims'] = [32, 64, 128, 256]
level['decoder_input'] = (8, 4, 128)
level['decoder_depths'] = [9, 9, 9, 9]
level['decoder_dims'] = [256, 128, 64, 16]
level['avg_garment_path'] = ''
level['upscale_enhancer'] = ''#'checkpoints/up_3_d256_512_2'
level['upscale_enhancer_freeze'] = True
config['pyramid']['levels'].append(level)
elif res == 128:
level = dict()
level['resolution'] = 128
level['latent_dim'] = config['latent_dim']
level['kernel_size'] = 5
level['encoder_depths'] = [16, 9, 9, 9]
level['encoder_dims'] = [64, 128, 128, 256]
level['decoder_input'] = (4, 2, 128)
level['decoder_depths'] = [16, 9, 9, 9]
level['decoder_dims'] = [256, 128, 128, 64]
level['avg_garment_path'] = ''
level['upscale_enhancer'] = ''#'checkpoints/up_3_d128_256_2'
level['upscale_enhancer_freeze'] = True
config['pyramid']['levels'].append(level)
elif res == 64:
level = dict()
level['resolution'] = 64
level['latent_dim'] = config['latent_dim']
level['kernel_size'] = 5
level['encoder_depths'] = [9, 9, 9]
level['encoder_dims'] = [64, 128, 256]
level['decoder_input'] = (4, 2, 256)
level['decoder_depths'] = [9, 9, 9]
level['decoder_dims'] = [256, 128, 64]
level['avg_garment_path'] = ''
level['upscale_enhancer'] = ''#checkpoints/up_3_d64_128_2'
level['upscale_enhancer_freeze'] = False
config['pyramid']['levels'].append(level)
elif res == 32:
level = dict()
level['resolution'] = 32
level['latent_dim'] = config['latent_dim']
level['kernel_size'] = 3
level['encoder_depths'] = [9, 9]
level['encoder_dims'] = [256, 256]
level['decoder_input'] = (4, 2, 256)
level['decoder_depths'] = [9, 9]
level['decoder_dims'] = [256, 256]
level['avg_garment_path'] = ''
level['upscale_enhancer'] = 'checkpoints/32_512_skirt'#'checkpoints/up_3_d32_64_2'
level['upscale_enhancer_freeze'] = True
config['pyramid']['levels'].append(level)
else:
raise NotImplementedError
config['cond_ae'] = dict()
config['cond_ae']['is_label'] = False
config['cond_ae']['upscale_output'] = False
config['cond_ae']['latent_dim'] = config['latent_dim']
config['cond_ae']['kernel_size'] = 7
config['cond_ae']['bottleneck_size'] = 64
config['cond_ae']['encoder_depths'] = [3, 3, 9, 9, 3]
config['cond_ae']['encoder_dims'] = [32, 64, 128, 256, config['cond_ae']['bottleneck_size']]
config['cond_ae']['decoder_input'] = (8, 4, config['cond_ae']['bottleneck_size'])
config['cond_ae']['decoder_depths'] = [3, 3, 9, 3, 3]
config['cond_ae']['decoder_dims'] = [config['cond_ae']['bottleneck_size'], 256, 128, 64, 16]
config['cond_ae_body'] = dict()
config['cond_ae_body']['latent_dim'] = config['latent_dim']
config['cond_ae_body']['kernel_size'] = 7
config['cond_ae_body']['upscale_output'] = True
config['cond_ae_body']['bottleneck_size'] = 512
config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3, 3]
config['cond_ae_body']['encoder_dims'] = [32, 64, 128, 256, 256, config['cond_ae_body']['bottleneck_size']]
config['cond_ae_body']['decoder_input'] = (4, 2, config['cond_ae_body']['bottleneck_size'])
config['cond_ae_body']['decoder_depths'] = [3, 3, 9, 3]
config['cond_ae_body']['decoder_dims'] = [config['cond_ae_body']['bottleneck_size'], 128, 64, 16]
+3 -7
View File
@@ -1,9 +1,8 @@
config = dict()
config['gpu'] = '4'
config['name'] = 'pyr_abl_32_skirt_no_curv_r1'
config['notes'] = 'no curv, 10p data'
config['tags'] = ['review_1']
config['gpu'] = '3'
config['name'] = 'pyr_abl_32_skirt_r1'
config['notes'] = ''
# DON'T FORGET TO RESET SSIM LOSS USAGE
# DON'T FORGET TO CHECK MODEL LOADING
@@ -19,7 +18,6 @@ config['use_skinning'] = True # and deshaping
config['remove_global_orientation'] = True
config['use_extra_losses'] = True # edge, collision, 3d mesh
config['use_offsets'] = False
config['use_curvature'] = False
config['pyramid'] = dict()
config['pyramid']['resolutions'] = [32]
@@ -35,8 +33,6 @@ config['test_dir'] = '/home/workspace/data/dataset/test_skirt_ready_2'
config['batch_size'] = 4
config['is_skirt'] = True
config['is_cape'] = False
config['frames_file'] = 'frames_skirt_10p.txt'
config['frames_file_valid'] = 'frames_skirt_10p.txt'
config['pyramid']['static_model'] = 'checkpoints/static_1_skirt'
config['pyramid']['body_model'] = 'checkpoints/body_1_skirt_2_2'
+3 -4
View File
@@ -1,9 +1,8 @@
from configs.config_base import config
config['gpu'] = '1'
config['gpu'] = '2'
config['lr'] = 0.0001
config['name'] = 'body_orig_10p_r1'
config['tags'] = ['review_1']
config['name'] = 'body_1_skirt_2_2'
config['notes'] = 'convnext + convnext, add dense with tanh at the end of reverse convnext, | \
flattened bottleneck with 128 latent_dim\ remove global orientation | \
@@ -16,7 +15,7 @@ config['notes'] = 'convnext + convnext, add dense with tanh at the end of revers
continued from body_1_skirt_2 | \
'
config['dataset_in_memory'] = True
config['dataset_in_memory'] = False
config['batch_size'] = 32
config['signature_dynamic'] = { 'id': (), 'frame_nr': (),
+38 -8
View File
@@ -1,14 +1,44 @@
from configs.config_base import config
config = dict()
config['gpu'] = '3'
config['batch_size'] = 4
config['train_dir'] = '/home/workspace/local-data/train'
config['valid_dir'] = '/home/workspace/local-data/valid'
config['test_dir'] = '/home/workspace/data/dataset/test_ready'
config['use_filled'] = False
config['resolution'] = 512
config['is_skirt'] = False
config['dataset_in_memory'] = True
config['is_cape'] = False
config['remove_global_orientation'] = True
config['smpl_res'] = 14475
if config['is_cape']:
config['smpl_res'] = 3638
config['latent_dim'] = 128
config['cond_ae'] = dict()
config['cond_ae']['is_label'] = False
config['cond_ae']['upscale_output'] = False
config['cond_ae']['latent_dim'] = config['latent_dim']
config['cond_ae']['kernel_size'] = 7
config['cond_ae']['bottleneck_size'] = 8
config['cond_ae']['encoder_depths'] = [3, 3, 3, 27, 3]
config['cond_ae']['encoder_dims'] = [8, 16, 32, 32, config['cond_ae']['bottleneck_size']]
config['cond_ae']['decoder_depths'] = config['cond_ae']['encoder_depths']
config['cond_ae']['decoder_dims'] = config['cond_ae']['encoder_dims']
config['cond_ae']['activation'] = 'linear'
config['gpu'] = '5'
config['lr'] = 0.0005
config['name'] = 'static_orig_10p_r1'
config['tags'] = ['review_1']
config['notes'] = 'convnext + convnext, add dense with tanh at the end of reverse convnext, | \
flattened latent dim to 128 | \
train on 100 garments | \
config['name'] = 'static_post_4'
config['notes'] = 'convnext + convnext, | \
\
| \
deeper model | \
larger batch size | \
linear activation| \
'
config['cond_ae']['upscale_output'] = False
-53
View File
@@ -1,53 +0,0 @@
config = dict()
config['batch_size'] = 4
config['train_dir'] = '/home/workspace/local-data/train'
config['valid_dir'] = '/home/workspace/local-data/valid'
config['test_dir'] = '/home/workspace/data/dataset/test_ready'
config['use_filled'] = False
config['resolution'] = 512
config['is_skirt'] = False
config['dataset_in_memory'] = True
config['is_cape'] = False
config['remove_global_orientation'] = True
config['smpl_res'] = 14475
if config['is_cape']:
config['smpl_res'] = 3638
config['latent_dim'] = 128
config['cond_ae'] = dict()
config['cond_ae']['is_label'] = False
config['cond_ae']['upscale_output'] = False
config['cond_ae']['latent_dim'] = config['latent_dim']
config['cond_ae']['kernel_size'] = 7
config['cond_ae']['bottleneck_size'] = 8
config['cond_ae']['encoder_depths'] = [3, 3, 3, 27, 3]
config['cond_ae']['encoder_dims'] = [8, 16, 32, 32, config['cond_ae']['bottleneck_size']]
config['cond_ae']['decoder_depths'] = config['cond_ae']['encoder_depths']
config['cond_ae']['decoder_dims'] = config['cond_ae']['encoder_dims']
config['cond_ae']['activation'] = 'linear'
config['gpu'] = '5'
config['lr'] = 0.0005
config['name'] = 'static_post_4'
config['notes'] = 'convnext + convnext, | \
\
| \
deeper model | \
linear activation| \
'
config['cond_ae']['upscale_output'] = False
config['pretrained_model'] = ''
config['signature_dynamic'] = { 'id': (), 'frame_nr': (), }
config['signature_static'] = { 'uv_static': (512, 256, 3),
'mesh_static': (config['smpl_res'], 3,),
'mesh_mask': (config['smpl_res'],),
'uv_mask': (512, 256,),
}
+4 -6
View File
@@ -5,19 +5,17 @@ config['batch_size'] = 4
# config['train_dir'] = '/home/workspace/local-data/cape_processed/train/female'
# config['valid_dir'] = '/home/workspace/local-data/cape_processed/test/female'
# config['test_dir'] = '/home/workspace/local-data/cape_processed/test/female'
config['train_dir'] = '/home/workspace/data/dataset/local-cache/train_skirt'
config['valid_dir'] = '/home/workspace/local-data/valid_skirt'
config['test_dir'] = '/home/workspace/data/dataset/test_ready_skirt_2'
config['train_dir'] = '/home/workspace/local-data/train'
config['valid_dir'] = '/home/workspace/local-data/valid'
config['test_dir'] = '/home/workspace/data/dataset/test_ready'
# config['train_dir'] = '/home/workspace/local-data/train_skirt'
# config['valid_dir'] = '/home/workspace/local-data/valid_skirt'
# config['test_dir'] = '/home/workspace/local-data/test_skirt_ready'
config['use_filled'] = False
config['resolution'] = 512
config['is_skirt'] = False
config['dataset_in_memory'] = True
config['dataset_in_memory'] = False
config['is_cape'] = False
config['frames_file'] = 'frames_skirt_10p.txt'
config['frames_file_valid'] = 'frames_skirt_10p.txt'
config['smpl_res'] = 14475
if config['is_cape']:
+3 -3
View File
@@ -1,9 +1,9 @@
config = dict()
config['gpu'] = '6'
config['gpu'] = '2'
config['name'] = 'abl_pyr_32'
config['notes'] = ''
config['tags'] = ['review_1']
config['notes'] = 'fixed noise handling'
config['tags'] = ['pyr_post']
# DON'T FORGET TO RESET SSIM LOSS USAGE
# DON'T FORGET TO CHECK MODEL LOADING
+30 -13
View File
@@ -384,9 +384,9 @@ def test(verts, faces, values):
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("-f", "--folder", help = "end of range", default='/home/workspace/local-data/valid')
parser.add_argument("-f", "--folder", help = "end of range", default='/home/workspace/data/dataset/test_skirt_ready_2')
parser.add_argument("-s", "--start", help = "start of range", default=0)
parser.add_argument("-e", "--end", help = "end of range", default=1500)
parser.add_argument("-e", "--end", help = "end of range", default=30000)
parser.add_argument("-n", "--name", help = "end of range", default='lhunor')
parser.add_argument("-sk", "--skirt", help = "end of range", default=1)
args = parser.parse_args()
@@ -436,6 +436,23 @@ if __name__ == '__main__':
# ids = os.listdir(os.path.join(local_folder, 'mesh_static'))[int(args.start):int(args.end)]
# ids = [id.split('.')[0] for id in ids]
is_skirt = True if args.skirt == 1 else False
skirt_modifier = '_skirt' if is_skirt else ''
folder = args.folder
frames_file = 'frames' + skirt_modifier + '_10p.txt'
neighbourhood = 10
# frames = []
# with open(os.path.join(folder, frames_file), 'r') as f:
# lines = f.readlines()
# lines = [line.strip() for line in lines]
# frames = lines#[int(args.start):int(args.end)]
# ids = [frame.split('_')[0] for frame in frames]
print(f'params: -f {args.folder} -s {args.start} -e {args.end} -n {args.name} -skirt {args.skirt} -neigh {neighbourhood}')
ids = os.listdir(os.path.join(local_folder, 'pose_shape'))
ids = [id.split('_')[0] for id in ids]
ids = sorted(list(set(ids)))[int(args.start):int(args.end)]
@@ -452,16 +469,16 @@ if __name__ == '__main__':
# plt.show()
# pass
frames = glob.glob(os.path.join(local_folder, 'pose_shape', id + '_*'))
frames = len(frames)
assert frames <= 300
frames_len = glob.glob(os.path.join(local_folder, 'pose_shape', id + '_*'))
frames_len = len(frames_len)
assert frames_len <= 300
# offsets = sio.loadmat(os.path.join(folder, id, garment + '_offsets_static.mat'))['label'][:,:3]
verts_static = np.load(os.path.join(local_folder, 'mesh_static', id + '.npz'))['mesh_static']
mask = np.load(os.path.join(local_folder, 'mesh_mask', id + '.npy')).astype(bool)
# body = readPC2(os.path.join(folder, id, 'Body_posed.pc16'), True)['V']
# gt = readPC2(os.path.join(folder, id, garment + '_registered.pc16'), True)['V']
# curvature = np.load(os.path.join(folder, id, 'curvature_label_' + curvature_label_type + '.npy'))
curvature = np.stack([np.load(os.path.join(local_folder, f'mesh_curvature_{neighbourhood}_2', f'{id}_{i}.npz'))['mesh_curvature'] for i in range(frames_len)])
# mesh_unposed = [np.load(os.path.join(folder, id, 'mesh_unposed', id + '_' + str(i) + '.npz')) for i in range(gt.shape[0])]
# mesh_unposed = np.stack([mesh_unposed[i]['mesh_unposed'] for i in range(gt.shape[0])])
# mesh_unposed_no_shape = [np.load(os.path.join(folder, id, 'mesh_unposed_no_shape', id + '_' + str(i) + '.npz')) for i in range(gt.shape[0])]
@@ -470,8 +487,8 @@ if __name__ == '__main__':
# body_no_orient = np.stack([body_no_orient[i]['mesh_posed_body_no_orient'] for i in range(gt.shape[0])])
# mesh_unposed_no_shape_one_hot = [np.load(os.path.join(local_folder, 'mesh_unposed_no_shape_one_hot', id + '_' + str(i) + '.npz')) for i in range(frames)]
# mesh_unposed_no_shape_one_hot = [mesh_unposed_no_shape_one_hot[i]['mesh_unposed_no_shape'] for i in range(frames)]
mesh_posed_no_orient = [np.load(os.path.join(local_folder, 'mesh_posed_no_orient', id + '_' + str(i) + '.npz')) for i in range(frames)]
mesh_posed_no_orient = [mesh_posed_no_orient[i]['mesh_posed_no_orient'] for i in range(frames)]
# mesh_posed_no_orient = [np.load(os.path.join(local_folder, 'mesh_posed_no_orient', id + '_' + str(i) + '.npz')) for i in range(frames)]
# mesh_posed_no_orient = [mesh_posed_no_orient[i]['mesh_posed_no_orient'] for i in range(frames)]
# verts_dynamic = gt
@@ -491,11 +508,11 @@ if __name__ == '__main__':
# uv_body = convert_to_uv_batch(uv_res, m2uv, uv_map, body[:, :, :], neighbours=3, mask=None, method='rbf', garment_uv_mask=None, garment_uv_mask_border=garment_uv_mask_border).astype(np.float32)
# uv_posed_body_no_orient = convert_to_uv_batch(uv_res, m2uv, uv_map, body_no_orient[:, :, :], neighbours=3, mask=None, method='rbf', garment_uv_mask=None, garment_uv_mask_border=garment_uv_mask_border).astype(np.float32)
# uv_gt = convert_to_uv_batch(uv_res, m2uv, uv_map, gt[:, :, :], neighbours=3, mask=mask, method='rbf', garment_uv_mask=garment_uv_mask, garment_uv_mask_border=garment_uv_mask_border).astype(np.float32)
# uv_curvature = convert_to_uv_batch_label(uv_res, m2uv, uv_map, curvature[:, :], neighbours=3, mask=mask, method='nearest', garment_uv_mask=garment_uv_mask, garment_uv_mask_border=garment_uv_mask_border).astype(np.float32)
uv_curvature = convert_to_uv_batch_label(uv_res, m2uv, uv_map, curvature[:, :], neighbours=3, mask=mask, method='nearest', garment_uv_mask=garment_uv_mask, garment_uv_mask_border=garment_uv_mask_border).astype(np.float32)
# uv_unposed = convert_to_uv_batch(uv_res, m2uv, uv_map, mesh_unposed[:, :, :], neighbours=3, mask=mask, method='rbf', garment_uv_mask=garment_uv_mask, garment_uv_mask_border=garment_uv_mask_border).astype(np.float32)
# uv_unposed_no_shape = convert_to_uv_batch(uv_res, m2uv, uv_map, mesh_unposed_no_shape[:, :, :], neighbours=3, mask=mask, method='rbf', garment_uv_mask=garment_uv_mask, garment_uv_mask_border=garment_uv_mask_border).astype(np.float32)
# uv_unposed_no_shape_one_hot = convert_to_uv_batch(uv_res, m2uv, uv_map, mesh_unposed_no_shape_one_hot, neighbours=3, mask=mask, method='rbf', garment_uv_mask=garment_uv_mask, garment_uv_mask_border=garment_uv_mask_border, id=id)
uv_posed_no_orient = convert_to_uv_batch(uv_res, m2uv, uv_map, mesh_posed_no_orient, neighbours=3, mask=mask, method='rbf', garment_uv_mask=garment_uv_mask, garment_uv_mask_border=garment_uv_mask_border, id=id)
# uv_posed_no_orient = convert_to_uv_batch(uv_res, m2uv, uv_map, mesh_posed_no_orient, neighbours=3, mask=mask, method='rbf', garment_uv_mask=garment_uv_mask, garment_uv_mask_border=garment_uv_mask_border, id=id)
# uv_shaped_body = convert_to_uv(uv_res, m2uv, uv_map, shaped_body, neighbours=3, mask=None, method='rbf', garment_uv_mask=None).astype(np.float32)
print(time.perf_counter() - start)
@@ -516,9 +533,9 @@ if __name__ == '__main__':
# for i in range(uv_gt.shape[0]):
# np.savez_compressed(os.path.join(folder, id, 'gt_uv', garment + '_' + str(i) + '.npz'), uv_gt=uv_gt[i, :, :, :])
# os.makedirs(os.path.join(folder, id, 'curvature_uv'), exist_ok=True)
# for i in range(uv_curvature.shape[0]):
# np.savez_compressed(os.path.join(folder, id, 'curvature_uv', garment + '_' + str(i) + '.npz'), curvature_uv=uv_curvature[i, :, :])
os.makedirs(os.path.join(folder, f'uv_curvature_{neighbourhood}_2'), exist_ok=True)
for i in range(uv_curvature.shape[0]):
np.savez_compressed(os.path.join(folder, f'uv_curvature_{neighbourhood}_2', id + '_' + str(i) + '.npz'), curvature_uv=uv_curvature[i, :, :])
# os.makedirs(os.path.join(folder, id, 'uv_unposed'), exist_ok=True)
# for i in range(uv_unposed.shape[0]):
+235
View File
@@ -0,0 +1,235 @@
import os
import sys
import tqdm
import argparse
import random
import string
import time
import numpy as np
import trimesh as tm
import cmapy as cm
import scipy as sp
import scipy.io as sio
import plotly.graph_objects as go
from pyntcloud import PyntCloud
from scipy.sparse import csr_matrix, coo_matrix
from scipy.sparse.csgraph import floyd_warshall, dijkstra
from plotly.subplots import make_subplots
from custom_utils.custom_utils import _maskFaces
from custom_utils.supersmpl_io import readPC2, readPC2Frame, writePC2, readOBJ
from custom_utils.custom_utils import _maskFaces
def export_to_ply(mesh, file):
ply = tm.exchange.ply.export_ply(mesh, encoding='binary', vertex_normal=True, include_attributes=True)
output_file = open(file, "wb+")
output_file.write(ply)
output_file.close()
def get_closest_n_points(verts, idx, n):
dist = sp.spatial.distance.cdist(verts[idx, :], verts)
dist[dist == 0] = 1e9
idx_sort = np.argsort(dist, axis=-1)
closest = idx_sort[:, :n]
return closest
def calculate_dist(folder, neighbourhood):
out = dict()
frames = sorted(os.listdir(os.path.join(folder, 'mesh_posed')))[int(args.start):int(args.end)]
for frame in tqdm.tqdm(frames):
id = frame.split('_')[0]
if id in out.keys():
continue
mask = np.load(os.path.join(folder, 'mesh_mask', f'{id}.npy')).astype(bool)
k_neighbors = np.argsort(dist[mask, :][:, mask], axis=-1)[:, :neighbourhood] #cloud.get_neighbors(k=neighbourhood)
out[id] = k_neighbors
return out
def histedges_equalN(x, nbin):
npt = len(x)
return np.interp(np.linspace(0, npt, nbin + 1),
np.arange(npt),
np.sort(x))
def get_bins(values, nr_of_bins):
flattened = []
for c in values:
flattened.extend(c.flatten())
flattened = np.array(flattened)
bins = histedges_equalN(flattened, nr_of_bins)
return bins
def generate_curvatures(folder, frame, bins, neighbourhoods=[25], nr_of_labels=[6]):
id = frame.split('_')[0]
frame_nr = int(frame.split('_')[1].split('.')[0])
mask = np.load(os.path.join(folder, 'mesh_mask', f'{id}.npy')).astype(bool)
_, faces = _maskFaces(np.zeros((14475,3)), F, mask)
v = np.load(os.path.join(folder, 'mesh_posed', f'{id}_{frame_nr}.npz'))['mesh_posed'][mask,:]
m = tm.Trimesh(v, faces, process=False, validate=False)
outliers = np.array([len(v) for v in m.vertex_neighbors]) == 0
outliers = np.nonzero(outliers)[0]
outliers_n_neighbours = get_closest_n_points(v, outliers, 2)
outliers_faces = np.concatenate((outliers[:, np.newaxis], outliers_n_neighbours), axis=-1)
faces = np.concatenate((faces, outliers_faces), axis=0)
verts = v
m = tm.Trimesh(verts, faces, process=False, validate=False)
export_to_ply(m, temp_file)
cloud = PyntCloud.from_file(temp_file)
curvatures = []
for neighbourhood, nr_labels in zip(neighbourhoods, nr_of_labels):
k_neighbors = np.argsort(dist[mask, :][:, mask], axis=-1)[:, :neighbourhood] #cloud.get_neighbors(k=neighbourhood)
#k_neighbors = k_neighbors_cache[id] # np.argsort(dist[mask, :][:, mask], axis=-1)[:, :neighbourhood] #cloud.get_neighbors(k=neighbourhood)
ev = cloud.add_scalar_field("eigen_values", k_neighbors=k_neighbors)
cloud.add_scalar_field("curvature", ev=ev)
curvature = np.array(cloud.points["curvature(" + str(neighbourhood+1) + ")"])
bins_local = bins[neighbourhood] if bins is not None else get_bins(curvature, nr_labels)
labels = np.linspace(0, bins_local.shape[0] - 2, bins_local.shape[0] - 1)
frame_labels = np.zeros((curvature.shape[0]), dtype=np.float32)
for j in range(bins_local.shape[0] - 2):
frame_labels[(curvature >= bins_local[j]) * (curvature < bins_local[j+1])] = labels[j]
frame_labels[curvature >= bins_local[-2]] = labels[-1]
curvatures.append(frame_labels)
return curvatures
def visualize_curvature_labels(folder, frame, bins, neighbourhoods, nr_of_labels):
id = frame.split('_')[0]
frame_nr = frame.split('_')[1].split('.')[0]
mask = np.load(os.path.join(folder, 'mesh_mask', f'{id}.npy')).astype(bool)
_, faces = _maskFaces(np.zeros((14475,3)), F, mask)
verts = np.load(os.path.join(folder, 'mesh_posed', f'{id}_{frame_nr}.npz'))['mesh_posed'][mask,:]
curvature_labels_all = generate_curvatures(folder, frame, bins, neighbourhoods, nr_of_labels)
colors_binned_all = []
for curvature_labels in curvature_labels_all:
colors = np.array([cm.color('jet', 1 - i) for i in np.linspace(0, 1, int(curvature_labels.max()+1))])
colors_binned = np.zeros((curvature_labels.shape[0], 3))
for i in range(int(curvature_labels.max())+1):
# print(np.count_nonzero(curvature_labels == i))
colors_binned[curvature_labels == i, :] = colors[i]
colors_binned_all.append(colors_binned)
fig = make_subplots(rows=1, cols=len(colors_binned_all)+1, start_cell="top-left", specs = [ [{ 'type': 'scene' } for _ in range(len(colors_binned_all)+1)] ])
colors = np.ones((verts.shape[0],3))*np.array([255,200,200])[None,:]
fig.add_trace(go.Mesh3d(
# 8 vertices of a cube
x=verts[:,0],
y=verts[:,1],
z=verts[:,2],
# i, j and k give the vertices of triangles
i = faces[:,0],
j = faces[:,1],
k = faces[:,2],
vertexcolor=colors,
lighting={ 'ambient':0.9, 'diffuse':0.5, 'roughness':0.5 }
),
row=1, col=1)
for i, colors_binned in enumerate(colors_binned_all):
fig.add_trace(go.Mesh3d(
# 8 vertices of a cube
x=verts[:,0],
y=verts[:,1],
z=verts[:,2],
# i, j and k give the vertices of triangles
i = faces[:,0],
j = faces[:,1],
k = faces[:,2],
vertexcolor=colors_binned,
# lighting={ 'ambient':0.8, 'diffuse':0.5, 'roughness':0.5 }
),
row=1, col=i+2)
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),
scene4_aspectmode='manual', scene4_aspectratio=dict(x=1, y=1, z=1),
# scene5_aspectmode='manual', scene5_aspectratio=dict(x=1, y=1, z=1),
)
helper = dict(xaxis = dict(range=[-1,1], showbackground=False, showticklabels=False, showaxeslabels=False, showspikes=False, visible=False),
yaxis = dict(range=[-1,1], showbackground=False, showticklabels=False, showaxeslabels=False, showspikes=False, visible=False),
zaxis = dict(range=[-1,1], showbackground=False, showticklabels=False, showaxeslabels=False, showspikes=False, visible=False),)
fig.update_layout(scene = helper,
scene2 = helper,
scene3 = helper,
scene4 = helper,
# scene5 = helper,
)
# meshes = [go.Mesh3d(
# x=x[:,0],
# y=x[:,1],
# z=x[:,2],
# i = faces[:,0],
# j = faces[:,1],
# k = faces[:,2],
# vertexcolor=colors_binned
# )]
# fig = go.Figure(data=meshes)
# fig.update_layout(scene_aspectmode='manual', scene_aspectratio=dict(x=1, y=1, z=1))
# fig.update_layout(
# scene = dict(
# xaxis = dict(nticks=4, range=[-1,1],),
# yaxis = dict(nticks=4, range=[-1,1],),
# zaxis = dict(nticks=4, range=[-1,1],),)
# )
fig.show()
print()
if __name__ == '__main__':
is_skirt = True
skirt_modifier = '_skirt' if is_skirt else ''
F = np.load("custom_utils/smpl_faces" + skirt_modifier + ".npy").astype(np.int32)
# k_neighbours(k=25)
folder = '/home/workspace/local-data/valid_skirt'
bins = dict()
bins[10] = np.load(f'custom_data/train_bins_skirt_10.npy')
bins[25] = np.load(f'custom_data/train_bins_skirt.npy')
bins[100] = np.load(f'custom_data/train_bins_skirt_100.npy')
bins = None
nr_of_labels = 6
neighbourhood = 50
temp_file = '/home/workspace/local-data/temp/' + ''.join(random.choice(string.ascii_lowercase) for i in range(10)) + '.ply'
if not is_skirt:
dist = np.load('custom_data/dijkstra.npy')
else:
dist = np.load('custom_data/dijkstra_skirt.npy')
visualize_curvature_labels(folder, '02572_1', bins, neighbourhoods=[25, 25, 25], nr_of_labels=[3,6,12])
+8 -6
View File
@@ -4,15 +4,17 @@ import os
if __name__ == '__main__':
folder = '/home/workspace/local-data/cape/train/male'
out_folder = '/home/workspace/local-data/cape_processed/train/male'
ids = os.listdir(folder)
# folder = '/home/workspace/data/dataset/test_skirt_ready_2'
# folder = '/home/workspace/data/dataset/local-cache/train_skirt'
folder = '/home/workspace/local-data/valid_skirt'
ids = os.listdir(folder + '/mesh_posed')
count = 0
step = 1
step = 10000
while count < len(ids):
while count < 20*step:
# while count < 10000:
# os.system('nohup python MeshUtils/curvature_labels.py -f ' + folder + ' -s ' + str(count) + ' -e ' + str(count + step) + ' -n ' + 'curv_train_' + str(count) + '_' + str(count+step) + ' > curv_train_' + str(count) + '_' + str(count+step) + '.out' + ' 2>&1 &')
os.system('nohup python curvature_labels_cape.py -if ' + folder + ' -of ' + out_folder + ' -s ' + str(count) + ' -e ' + str(count + step) + ' -n ' + 'curv_gen_2_cape_train_male_' + str(count) + '_' + str(count+step) + ' > nohup/curv_gen_2_cape_train_male_' + str(count) + '_' + str(count+step) + '.out' + ' 2>&1 &')
os.system('nohup python curvature_labels.py -f ' + folder + ' -s ' + str(0) + ' -e ' + str(0 + step) + ' -n ' + 'speed_test_' + str(count) + '_' + str(count+step) + ' > nohup/speed/speed_test_' + str(count) + '_' + str(count+step) + '.out' + ' 2>&1 &')
# os.system('python Data/convert_to_uv.py -f ' + folder + ' -s ' + str(count) + ' -e ' + str(count + step) + '')
count += step
+99 -112
View File
@@ -4,6 +4,7 @@ import tqdm
import argparse
import random
import string
import time
import numpy as np
import trimesh as tm
import cmapy as cm
@@ -40,6 +41,8 @@ def export_to_ply(mesh, file):
output_file.close()
def get_closest_n_points(verts, idx, n):
dist = sp.spatial.distance.cdist(verts[idx, :], verts)
dist[dist == 0] = 1e9
@@ -80,67 +83,65 @@ def k_neighbours(k):
pass
def generate_curvatures(folder, neighbourhood):
def calculate_dist(folder, neighbourhood, frames):
out = dict()
# frames = frames[int(args.start):int(args.end)]
ids = os.listdir(folder)[int(args.start):int(args.end)]
curvatures_all = []
for id in tqdm.tqdm(ids):
garment_dir = os.path.join(folder, id)
if not os.path.isdir(garment_dir):
for frame in tqdm.tqdm(frames):
id = frame.split('_')[0]
if id in out.keys():
continue
# if os.path.exists(garment_dir + '/curvature_25_raw.npy'):
# continue
curvatures_garment = []
garments = [f.replace('.pc16','') for f in os.listdir(garment_dir) if f.find('_') == -1 and f != 'info.mat' and not f.endswith('.obj')]
# assert len (garments) == 1
if len (garments) != 1:
continue
garment = garments[0]
bodies = readPC2(os.path.join(folder, id, 'Body_posed.pc16'), True)['V']
offsetss = readPC2(os.path.join(folder, id, garment + '_registered.pc16'), True)['V']
mask = np.squeeze(sio.loadmat(os.path.join(garment_dir, garment + '_mask.mat'))['mask'].astype(bool))
_, faces = _maskFaces(bodies[0, :, :], F, mask)
v = bodies[0, mask, :] + offsetss[0, mask, :]
m = tm.Trimesh(v, faces, process=False, validate=False)
outliers = np.array([len(v) for v in m.vertex_neighbors]) == 0
outliers = np.nonzero(outliers)[0]
outliers_n_neighbours = get_closest_n_points(v, outliers, 2)
outliers_faces = np.concatenate((outliers[:, np.newaxis], outliers_n_neighbours), axis=-1)
faces = np.concatenate((faces, outliers_faces), axis=0)
step = 0
for body, offsets in zip(bodies, offsetss):
verts = body + offsets
verts = verts[mask, :]
m = tm.Trimesh(verts, faces, process=False, validate=False)
export_to_ply(m, temp_file)
cloud = PyntCloud.from_file(temp_file)
# cloud.plot(mesh=True)
mask = np.load(os.path.join(folder, 'mesh_mask', f'{id}.npy')).astype(bool)
k_neighbors = np.argsort(dist[mask, :][:, mask], axis=-1)[:, :neighbourhood] #cloud.get_neighbors(k=neighbourhood)
ev = cloud.add_scalar_field("eigen_values", k_neighbors=k_neighbors)
cloud.add_scalar_field("curvature", ev=ev)
curvature = np.array(cloud.points["curvature(" + str(neighbourhood+1) + ")"])
curvatures_garment.append(curvature)
out[id] = k_neighbors
print(step)
step += 1
return out
# curvatures_all.append(np.array(curvatures_garment))
np.save(garment_dir + '/curvature_25_raw.npy', np.array(curvatures_garment))
def generate_curvatures(folder, neighbourhood, frames):
return curvatures_all
# ids = os.listdir(folder)[int(args.start):int(args.end)]
# frames = frames[int(args.start):int(args.end)]
os.makedirs(os.path.join(folder, f'mesh_curvature_raw_{neighbourhood}'), exist_ok=True)
k_neighbors_cache = calculate_dist(folder, neighbourhood, frames)
# for frame in tqdm.tqdm(frames):
# id = frame.split('_')[0]
# frame_nr = frame.split('_')[1].split('.')[0]
# # bodies = readPC2(os.path.join(folder, id, 'Body_posed.pc16'), True)['V']
# # offsetss = readPC2(os.path.join(folder, id, garment + '_registered.pc16'), True)['V']
# mask = np.load(os.path.join(folder, 'mesh_mask', f'{id}.npy')).astype(bool)
# _, faces = _maskFaces(np.zeros((14475,3)), F, mask) #np.load(os.path.join(folder, 'faces', f'{id}.npy'))
# v = np.load(os.path.join(folder, 'mesh_posed', f'{id}_{frame_nr}.npz'))['mesh_posed'][mask,:]
# m = tm.Trimesh(v, faces, process=False, validate=False)
# outliers = np.array([len(v) for v in m.vertex_neighbors]) == 0
# outliers = np.nonzero(outliers)[0]
# outliers_n_neighbours = get_closest_n_points(v, outliers, 2)
# outliers_faces = np.concatenate((outliers[:, np.newaxis], outliers_n_neighbours), axis=-1)
# faces = np.concatenate((faces, outliers_faces), axis=0)
# verts = v
# m = tm.Trimesh(verts, faces, process=False, validate=False)
# export_to_ply(m, temp_file)
# cloud = PyntCloud.from_file(temp_file)
# k_neighbors = k_neighbors_cache[id] # np.argsort(dist[mask, :][:, mask], axis=-1)[:, :neighbourhood] #cloud.get_neighbors(k=neighbourhood)
# ev = cloud.add_scalar_field("eigen_values", k_neighbors=k_neighbors)
# cloud.add_scalar_field("curvature", ev=ev)
# curvature = np.array(cloud.points["curvature(" + str(neighbourhood+1) + ")"])
# out = np.zeros((14475), dtype=np.float32)
# out[mask] = curvature
# np.savez_compressed(os.path.join(folder, f'mesh_curvature_raw_{neighbourhood}', f'{id}_{frame_nr}.npz'), mesh_curvature_raw=out)
return None
def get_bins(values, nr_of_bins):
@@ -152,41 +153,23 @@ def get_bins(values, nr_of_bins):
return bins
def generate_curvature_labels(folder, bins, curvatures):
def generate_curvature_labels(folder, bins, curvatures, frames, neighbourhood):
ids = os.listdir(folder)#[:10]
os.makedirs(os.path.join(folder, f'mesh_curvature_{neighbourhood}_2'), exist_ok=True)
labels = np.linspace(0, bins.shape[0] - 2, bins.shape[0] - 1)
i = 0
for id in tqdm.tqdm(ids):
garment_dir = os.path.join(folder, id)
if not os.path.isdir(garment_dir):
continue
garments = [f.replace('.pc16','') for f in os.listdir(garment_dir) if f.find('_') == -1 and f != 'info.mat' and not f.endswith('.obj')]
# assert len (garments) == 1
if len (garments) != 1:
continue
garment = garments[0]
mask = np.squeeze(sio.loadmat(os.path.join(garment_dir, garment + '_mask.mat'))['mask'].astype(bool))
for i, frame in enumerate(tqdm.tqdm(frames)):
# id = frame.split('_')[0]
# mask = np.load(os.path.join(folder, 'mesh_mask', f'{id}.npy'))
# print(i)
curvature = curvatures[i]
i += 1
curvature_label = np.zeros((curvature.shape[0], curvature.shape[1]))
frame = 0
for frame in range(curvature.shape[0]):
frame_labels = np.zeros((curvature.shape[1]), dtype=np.float32)
frame_labels = np.zeros((curvature.shape[0]), dtype=np.float32)
for j in range(bins.shape[0] - 2):
frame_labels[(curvature[frame, :] >= bins[j]) * (curvature[frame, :] < bins[j+1])] = labels[j]
frame_labels[curvature[frame, :] >= bins[-2]] = labels[-1]
curvature_label[frame, :] = frame_labels
frame += 1
frame_labels[(curvature >= bins[j]) * (curvature < bins[j+1])] = labels[j]
frame_labels[curvature >= bins[-2]] = labels[-1]
unmasked_label = np.zeros((curvature.shape[0], 14475), dtype=np.float32)
unmasked_label[:, mask] = curvature_label
np.save(os.path.join(garment_dir, "curvature_label_" + str(nr_of_labels) + "_" + str(neighbourhood) + ".npy"), unmasked_label)
np.savez_compressed(os.path.join(folder, f'mesh_curvature_{neighbourhood}_2', f'{frame}.npz'), mesh_curvature=frame_labels)
# writePC2(os.path.join(garment_dir, "curvature_label_" + str(nr_of_labels) + "_" + str(neighbourhood) + ".pc16"), unmasked_label, True)
@@ -257,24 +240,10 @@ def visualize_curvature_labels(folder):
print()
def read_raw_curvatures(folder):
ids = os.listdir(folder)[int(args.start):int(args.end)]
def read_raw_curvatures(folder, frames, neighbourhood):
curvatures_all = []
for id in tqdm.tqdm(ids):
garment_dir = os.path.join(folder, id)
if not os.path.isdir(garment_dir):
continue
garments = [f.replace('.pc16','') for f in os.listdir(garment_dir) if f.find('_') == -1 and f != 'info.mat' and not f.endswith('.obj')]
# assert len (garments) == 1
if len (garments) != 1:
continue
curv = np.load(garment_dir + '/curvature_25_raw.npy')
for frame in tqdm.tqdm(frames):
curv = np.load(os.path.join(folder, f'mesh_curvature_raw_{neighbourhood}', f'{frame}.npz'))['mesh_curvature_raw']
curvatures_all.append(curv)
return curvatures_all
@@ -282,28 +251,46 @@ def read_raw_curvatures(folder):
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("-f", "--folder", help = "process the given folder", default=r'/home/workspace/data/dataset/test')
parser.add_argument("-f", "--folder", help = "process the given folder", default=r'/home/workspace/data/dataset/local-cache/train_skirt')
parser.add_argument("-s", "--start", help = "start of range", default=0)
parser.add_argument("-e", "--end", help = "end of range", default=1500)
parser.add_argument("-e", "--end", help = "end of range", default=30000)
parser.add_argument("-n", "--name", help = "end of range", default="lhunor")
args = parser.parse_args()
F = np.load("FeatureLines/superSMPL/smpl_faces.npy")
is_skirt = True
skirt_modifier = '_skirt' if is_skirt else ''
F = np.load("custom_utils/smpl_faces" + skirt_modifier + ".npy").astype(np.int32)
# k_neighbours(k=25)
folder = args.folder
nr_of_labels = 6
neighbourhood = 25
temp_file = 'temp/' + ''.join(random.choice(string.ascii_lowercase) for i in range(10)) + '.ply'
dist = np.load('MeshUtils/dijsktra.npy')
# dist = np.load('MeshUtils/dijkstra_skirt.npy')
frames_file = 'frames' + skirt_modifier + '_10p.txt'
generate_curvatures(folder, neighbourhood)
# curvatures = read_raw_curvatures(folder)
nr_of_labels = 6
neighbourhood = 100
temp_file = '/home/workspace/local-data/temp/' + ''.join(random.choice(string.ascii_lowercase) for i in range(10)) + '.ply'
if not is_skirt:
dist = np.load('custom_data/dijkstra.npy')
else:
dist = np.load('custom_data/dijkstra_skirt.npy')
print('SKIRT' if is_skirt else 'NOT SKIRT')
print(f'params: -f {args.folder} -s {args.start} -e {args.end} -n {args.name} -skirt {is_skirt} -neigh {neighbourhood}')
frames = sorted(os.listdir(os.path.join(folder, 'mesh_posed')))[int(args.start):int(args.end)]
frames = [frame.split('.')[0] for frame in frames]
# frames = []
# with open(os.path.join(folder, frames_file), 'r') as f:
# lines = f.readlines()
# lines = [line.strip() for line in lines]
# frames = lines[int(args.start):int(args.end)]
generate_curvatures(folder, neighbourhood, frames)
# curvatures = read_raw_curvatures(folder, frames, neighbourhood)
# bins = get_bins(curvatures, nr_of_labels)
# np.save('train_bins_skirt.npy', bins)
# bins = np.load('train_bins.npy')
# generate_curvature_labels(folder, bins, curvatures)
# np.save(f'custom_data/train_bins_skirt_{neighbourhood}.npy', bins)
# bins = np.load(f'custom_data/train_bins_skirt_{neighbourhood}.npy')
# generate_curvature_labels(folder, bins, curvatures, frames, neighbourhood)
# visualize_curvature_labels(folder)
pass
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+4 -2
View File
@@ -45,7 +45,7 @@ from models.cvae_model import CVAENew as CVAE
def init_wandb():
run = wandb.init(project='ablation', name=config['name'], notes=config['notes'], dir='/wandb')
run = wandb.init(project='ablation', name=config['name'], notes=config['notes'], dir='/wandb', tags=config['tags'])
artifact = wandb.Artifact('code', type='code')
artifact.add_file('cvae.py')
artifact.add_file('models/cvae_model.py')
@@ -58,7 +58,9 @@ def init_wandb():
artifact.add_file('convnext/models/convnext_tf.py')
config_file_names = [key for key in sys.modules.keys() if key.startswith('configs.')]
for config_file_name in config_file_names:
artifact.add_file('/'.join(config_file_name.split('.')) + '.py')
file_name = '/'.join(config_file_name.split('.')) + '.py'
if os.path.exists(file_name):
artifact.add_file(file_name)
run.log_artifact(artifact)
uv2mesh = UV2Mesh(res=256, is_skirt=config['is_skirt'], is_adaptive=False, is_smpl_orig=config['is_cape'])
+3 -5
View File
@@ -1,6 +1,6 @@
import os
import sys
from configs.config_abl_pyr_32_64_skirt_r1 import config
from configs.config_abl_pyr_32_skirt import config
os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu']
import tensorflow as tf
@@ -210,7 +210,7 @@ def plot_3d(mesh_gt, mesh_pred_unposed_levels, faces, mesh_posed, collision, col
return fig
@tf.function
# @tf.function
def train_step(batch):
levels_input, conds = group_inputs_for_levels(batch, config)
@@ -733,7 +733,7 @@ def speed_step(levels_input, conds):
if __name__ == '__main__':
init_wandb()
# init_wandb()
parser = argparse.ArgumentParser(description='')
parser.add_argument('--name', type=str, default='lhunor')
args = vars(parser.parse_args())
@@ -803,13 +803,11 @@ if __name__ == '__main__':
if len(config['pyramid']['resolutions']) == 1:
model.static_enc.trainable = False
model.body_enc.trainable = False
if config['use_curvature']:
model.curv_enc.trainable = False
else:
load_model(model, config['pyramid']['pretrained_pyramid'], iteration=(config['pyramid']['pretrained_pyramid_iteration'] if 'pretrained_pyramid_iteration' in config.keys() else ''))
model.static_enc.trainable = False
model.body_enc.trainable = False
if config['use_curvature']:
model.curv_enc.trainable = False
model.cond_encoder.trainable = False
+1 -1
View File
@@ -1,6 +1,6 @@
import os
import sys
from configs.config_abl_pyr_32_64_skirt_r1 import config
from configs.config_abl_2_pyr_32_64_128_256_512 import config
os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu']
import tensorflow as tf
+23
View File
@@ -0,0 +1,23 @@
import os
import shutil
import tqdm
if __name__ == '__main__':
folder = '/home/workspace/data/dataset/local-cache/train_skirt'
is_skirt = True
skirt_modifier = '_skirt' if is_skirt else ''
frames_file = 'frames' + skirt_modifier + '_10p.txt'
neighbourhood = 10
frames = []
with open(os.path.join(folder, frames_file), 'r') as f:
lines = f.readlines()
lines = [line.strip() for line in lines]
frames = lines
os.makedirs(os.path.join(folder, f'uv_curvature_{neighbourhood}'), exist_ok=True)
for frame in tqdm.tqdm(frames):
id = frame.split('_')[0]
src = os.path.join(folder, f'{id}', 'curvature_uv_10', f'{frame}.npz')
dst = os.path.join(folder, f'uv_curvature_{neighbourhood}', f'{frame}.npz')
shutil.move(src, dst)
+5 -13
View File
@@ -25,7 +25,6 @@ class Pyramid(tf.keras.Model):
if config['pyramid']['body_model'] != '':
load_model(self.body_enc, config['pyramid']['body_model'] + '_enc')
if config['use_curvature']:
self.curv_enc : AEEncoder = AEEncoder(config['cond_ae']['latent_dim'], config['cond_ae']['encoder_depths'], config['cond_ae']['encoder_dims'], config['cond_ae']['bottleneck_size'], config['cond_ae']['kernel_size'])
if config['pyramid']['curvature_model'] != '':
load_model(self.curv_enc, config['pyramid']['curvature_model'] + '_enc')
@@ -33,7 +32,6 @@ class Pyramid(tf.keras.Model):
if config['pyramid']['freeze_encoders']:
self.static_enc.trainable = False
self.body_enc.trainable = False
if config['use_curvature']:
self.curv_enc.trainable = False
self.cond_encoder = tf.keras.Sequential([tf.keras.layers.Dense(512, activation='relu'),
@@ -72,12 +70,11 @@ class Pyramid(tf.keras.Model):
self.add_noise = config['pyramid']['add_noise']
self.noise_amount = config['pyramid']['noise_amount']
self.use_offsets = config['use_offsets']
self.use_curvature = config['use_curvature']
self.upscale_enhancer = None
if config['pyramid']['final_upscale_enhancer'] != '':
k_size = config['pyramid']['final_upscale_enhancer_kernel_size'] if 'final_upscale_enhancer_kernel_size' in config['pyramid'].keys() else ((3 if config['pyramid']['resolutions'][-1] <= 64 else 5))
self.upscale_enhancer : tf.keras.Model = UpscalerBasicConv(low_res=config['pyramid']['resolutions'][-1], kernel_size=k_size)
self.upscale_enhancer = UpscalerBasicConv(low_res=config['pyramid']['resolutions'][-1], kernel_size=k_size)
load_model(self.upscale_enhancer, config['pyramid']['final_upscale_enhancer'])
self.upscale_enhancer.trainable = False
@@ -88,11 +85,9 @@ class Pyramid(tf.keras.Model):
def encode_conds(self, uv_template, uv_body_posed, uv_curv, training):
z_static = self.static_enc(uv_template, training)
z_body = self.body_enc(uv_body_posed, training)
if self.use_curvature:
z_curv = self.curv_enc(uv_curv, training=training)
z_curv = self.curv_enc(uv_curv, training)
z_cond = tf.concat([z_static, z_body, z_curv], axis=-1)
else:
z_cond = tf.concat([z_static, z_body], axis=-1)
z_cond = self.cond_encoder(z_cond, training=training)
return z_cond
@@ -299,7 +294,6 @@ class PyramidNew(tf.keras.Model):
self.add_noise = config['pyramid']['add_noise']
self.noise_amount = config['pyramid']['noise_amount']
self.use_offsets = config['use_offsets']
self.use_curvature = config['use_curvature']
self.upscale_enhancer = None
if config['pyramid']['final_upscale_enhancer'] != '':
@@ -315,11 +309,9 @@ class PyramidNew(tf.keras.Model):
def encode_conds(self, uv_template, uv_body_posed, uv_curv, training):
z_static = self.static_enc(uv_template, training)
z_body = self.body_enc(uv_body_posed, training)
if self.use_curvature:
z_curv = self.curv_enc(uv_curv, training=training)
z_curv = self.curv_enc(uv_curv, training)
z_cond = tf.concat([z_static, z_body, z_curv], axis=-1)
else:
z_cond = tf.concat([z_static, z_body], axis=-1)
return z_cond
+8 -8
View File
@@ -232,17 +232,17 @@ def generate_frames_file(folder, ratio=0.1):
selected = []
for id in tqdm.tqdm(sub_ids):
# if garment_type_table[id] != 'Dress':
# continue
# if len(selected) > 30000:
# break
if garment_type_table[id] != 'Dress':
continue
if len(selected) > 30000:
break
# frames = glob.glob(os.path.join(folder, 'pose_shape', id + '_*'))
frames = [frame for frame in all_frames if frame.startswith(id + '_')]
frames = [frame.split('/')[-1].split('.')[0] for frame in frames]
selected.extend(frames)
with open(os.path.join(folder, 'frames_skirt_10p.txt'), 'w') as f:
with open(os.path.join(folder, 'frames_dress_30k.txt'), 'w') as f:
for i, frame in enumerate(selected):
f.write(frame + '\n')
@@ -293,9 +293,9 @@ def generate_frames_file_filtered_cape():
if __name__ == '__main__':
src_folder = '/home/workspace/local-data/valid_skirt' #cloth3d_skirt
src_folder = '/home/workspace/local-data/train_skirt' #cloth3d_skirt
# src_folder = r'D:\Work\Dataset\validation_2'
dest_folder = '/home/workspace/data/dataset/local-cache/train_skirt'
dest_folder = '/home/workspace/data/dataset/validation'
# create_no_orient_body(src_folder)
@@ -306,5 +306,5 @@ if __name__ == '__main__':
# verify_poses(src_folder)
# create_garment_type_table()
# generate_faces()
generate_frames_file(src_folder, ratio=0.1)
generate_frames_file(src_folder, ratio=1)
# generate_frames_file_filtered_cape()
+6 -4
View File
@@ -4,24 +4,26 @@ import os
if __name__ == '__main__':
# folder = '/home/workspace/data/dataset/local-cache/train_skirt'
folder = '/home/workspace/data/dataset/test_skirt_ready_2'
# folder = '/home/workspace/local-data/valid_skirt'
# folder = '/home/workspace/local-data/cape_processed/train/male'
# folder = '/home/workspace/local-data/valid_skirt'
# folder = '/home/workspace/local-data/valid'
# ids = os.listdir(folder)
ids = os.listdir(folder + '/mesh_posed_no_orient')#[280000:]
# ids = os.listdir(folder + '/mesh_posed_no_orient')#[280000:]
skirt = 0
count = 0
step = 2000
step = 20
# !!!!!!! change skirt parameter in script
while count < len(ids):
while count < 150:
# os.system('nohup python convert_to_uv_cape.py -f ' + folder + ' -s ' + str(count) + ' -e ' + str(count + step) + ' -n ' + 'to_uv_2_cape_train_male_' + str(count) + '_' + str(count+step) + ' > nohup/to_uv_2_cape_train_male_' + str(count) + '_' + str(count+step) + '.out' + ' 2>&1 &')
# os.system('nohup python convert_to_uv.py -f ' + folder + ' -s ' + str(count) + ' -e ' + str(count + step) + ' -n ' + 'to_uv_train_unposed_onehot_' + str(count) + '_' + str(count+step) + ' > nohup/to_uv_train_unposed_onehot_' + str(count) + '_' + str(count+step) + '.out' + ' 2>&1 &')
# os.system('nohup python convert_to_uv_local.py -f ' + folder + ' -s ' + str(count) + ' -e ' + str(count + step) + ' -n ' + 'to_uv_train_local_unposed_onehot_' + str(count) + '_' + str(count+step) + ' > nohup/to_uv_train_local_unposed_onehot_' + str(count) + '_' + str(count+step) + '.out' + ' 2>&1 &')
os.system('nohup python convert_to_uv_local_single.py -f ' + folder + ' -s ' + str(count) + ' -e ' + str(count + step) + ' -n ' + 'to_uv_posed_no_orient_test_skirt_ready_' + str(count) + '_' + str(count+step) + ' > nohup/to_uv_posed_no_orient_test_skirt_ready_' + str(count) + '_' + str(count+step) + '.out' + ' 2>&1 &')
os.system('nohup python convert_to_uv_local_single.py -f ' + folder + ' -s ' + str(count) + ' -e ' + str(count + step) + ' -n ' + 'to_uv_curv_2_10_test_skirt_' + str(count) + '_' + str(count+step) + ' > nohup/to_uv_curv_2_10_test_skirt_' + str(count) + '_' + str(count+step) + '.out' + ' 2>&1 &')
# os.system('nohup python convert_to_uv_local_single.py -f ' + folder + ' -s ' + str(count) + ' -e ' + str(count + step) + ' -n ' + 'to_uv_train_skirt_local_unposed_onehot_3_' + str(count) + '_' + str(count+step) + ' > nohup/to_uv_train_skirt_local_unposed_onehot_3_' + str(count) + '_' + str(count+step) + '.out' + ' 2>&1 &')
# os.system('nohup python convert_to_uv_local_single.py -f ' + folder + ' -s ' + str(count) + ' -e ' + str(count + step) + ' -n ' + 'to_uv_valid_skirt_local_unposed_onehot_3_' + str(count) + '_' + str(count+step) + ' > nohup/to_uv_valid_skirt_local_unposed_onehot_' + str(count) + '_' + str(count+step) + '.out' + ' 2>&1 &')
# os.system('nohup python downscale.py -f ' + folder + ' -s ' + str(count) + ' -e ' + str(count + step) + ' -n ' + 'downscale_valid_posed_no_orient_' + str(count) + '_' + str(count+step) + ' > nohup/downscale_valid_posed_no_orient_' + str(count) + '_' + str(count+step) + '.out' + ' 2>&1 &')