From 0b518e7f0e85ce12964c40641cac21c6ae338f98 Mon Sep 17 00:00:00 2001 From: Hunor Laczko Date: Mon, 6 Mar 2023 09:55:48 +0000 Subject: [PATCH] save --- aaa_helpers.txt | 33 ++- calculate_error.py | 4 +- compare_cape.py | 35 ++-- configs/iccv/config_abl_all.py | 4 +- .../iccv/config_abl_all_cape_f_03223_SL.py | 128 ++++++++++++ .../iccv/config_abl_all_cape_f_03223_SS.py | 128 ++++++++++++ .../iccv/config_abl_all_cape_m_00032_SL.py | 128 ++++++++++++ configs/iccv/config_abl_all_skirt.py | 2 +- configs/iccv/config_abl_all_skirt_var.py | 125 +++++++++++ configs/iccv/config_abl_pyr_32_10p.py | 189 +++++++++++++++++ configs/iccv/config_abl_pyr_32_25p.py | 189 +++++++++++++++++ configs/iccv/config_abl_pyr_32_64_128_256.py | 2 +- .../iccv/config_abl_pyr_32_64_128_256_512.py | 187 +++++++++++++++++ .../config_abl_pyr_32_64_128_256_512_curv.py | 187 +++++++++++++++++ .../config_abl_pyr_32_64_128_256_512_skin.py | 195 +++++++++++++++++ .../config_abl_pyr_32_64_128_256_512_skirt.py | 187 +++++++++++++++++ .../iccv/config_abl_pyr_32_64_128_256_curv.py | 187 +++++++++++++++++ .../iccv/config_abl_pyr_32_64_128_256_reg.py | 187 +++++++++++++++++ .../iccv/config_abl_pyr_32_64_128_256_skin.py | 195 +++++++++++++++++ .../config_abl_pyr_32_64_128_256_skirt.py | 11 +- configs/iccv/config_abl_pyr_32_64_128_curv.py | 2 +- .../config_abl_pyr_32_64_128_curv_skirt.py | 189 +++++++++++++++++ configs/iccv/config_abl_pyr_32_64_128_reg.py | 2 +- .../config_abl_pyr_32_64_128_reg_skirt.py | 189 +++++++++++++++++ configs/iccv/config_abl_pyr_32_64_128_skin.py | 2 +- .../config_abl_pyr_32_64_128_skin_skirt.py | 195 +++++++++++++++++ configs/iccv/config_abl_pyr_32_64_128_var.py | 188 +++++++++++++++++ configs/iccv/config_abl_pyr_32_64_reg.py | 6 +- .../iccv/config_abl_pyr_32_64_reg_skirt.py | 4 +- configs/iccv/config_abl_pyr_32_64_skin.py | 2 +- .../iccv/config_abl_pyr_32_64_skin_skirt.py | 196 ++++++++++++++++++ configs/iccv/config_cvae_curv.py | 8 +- custom_utils/faces.mat | Bin 0 -> 230424 bytes custom_utils/faces_skirt.mat | Bin 0 -> 1036256 bytes custom_utils/vg_skirt_smoothing.mat | Bin 0 -> 9984 bytes cvae.py | 2 +- cvae_curv.py | 92 ++------ cvae_pyramid.py | 4 +- evaluate_ae.py | 10 +- evaluate_ae_pyramid.py | 2 +- get_error.py | 8 +- models/cvae_curv_model.py | 5 +- models/cvae_model.py | 2 +- models/pyramid_model_optimized.py | 5 +- plot_examples.py | 76 ++++++- sample_pro_2.py | 60 +++--- 46 files changed, 3392 insertions(+), 160 deletions(-) create mode 100644 configs/iccv/config_abl_all_cape_f_03223_SL.py create mode 100644 configs/iccv/config_abl_all_cape_f_03223_SS.py create mode 100644 configs/iccv/config_abl_all_cape_m_00032_SL.py create mode 100644 configs/iccv/config_abl_all_skirt_var.py create mode 100644 configs/iccv/config_abl_pyr_32_10p.py create mode 100644 configs/iccv/config_abl_pyr_32_25p.py create mode 100644 configs/iccv/config_abl_pyr_32_64_128_256_512.py create mode 100644 configs/iccv/config_abl_pyr_32_64_128_256_512_curv.py create mode 100644 configs/iccv/config_abl_pyr_32_64_128_256_512_skin.py create mode 100644 configs/iccv/config_abl_pyr_32_64_128_256_512_skirt.py create mode 100644 configs/iccv/config_abl_pyr_32_64_128_256_curv.py create mode 100644 configs/iccv/config_abl_pyr_32_64_128_256_reg.py create mode 100644 configs/iccv/config_abl_pyr_32_64_128_256_skin.py create mode 100644 configs/iccv/config_abl_pyr_32_64_128_curv_skirt.py create mode 100644 configs/iccv/config_abl_pyr_32_64_128_reg_skirt.py create mode 100644 configs/iccv/config_abl_pyr_32_64_128_skin_skirt.py create mode 100644 configs/iccv/config_abl_pyr_32_64_128_var.py create mode 100644 configs/iccv/config_abl_pyr_32_64_skin_skirt.py create mode 100644 custom_utils/faces.mat create mode 100644 custom_utils/faces_skirt.mat create mode 100644 custom_utils/vg_skirt_smoothing.mat diff --git a/aaa_helpers.txt b/aaa_helpers.txt index cf9599b..932e274 100644 --- a/aaa_helpers.txt +++ b/aaa_helpers.txt @@ -26,6 +26,8 @@ nohup python cvae.py --name="lhunor_abl_all_gnn_2" > nohup/iccv/ablation/abl_all nohup python cvae.py --name="lhunor_abl_all_cape_f" > nohup/iccv/ablation/abl_all_cape_f_2.out 2>&1 & nohup python cvae.py --name="lhunor_abl_all_skirt" > nohup/iccv/ablation/abl_all_skirt.out 2>&1 & +nohup python cvae.py --name="lhunor_abl_all_skirt_var" > nohup/iccv/ablation/abl_all_skirt_var.out 2>&1 & +nohup python cvae.py --name="lhunor_abl_all_skirt_var" > nohup/iccv/ablation/abl_all_skirt_var_2.out 2>&1 & nohup python cvae.py --name="lhunor_abl_curv" > nohup/iccv/ablation/abl_curv.out 2>&1 & nohup python cvae.py --name="lhunor_abl_curv_skirt" > nohup/iccv/ablation/abl_curv_skirt.out 2>&1 & nohup python cvae.py --name="lhunor_abl_skin" > nohup/iccv/ablation/abl_skin.out 2>&1 & @@ -39,6 +41,9 @@ nohup python cvae.py --name="lhunor_abl_skin_reg" > nohup/iccv/ablation/abl_skin nohup python cvae.py --name="lhunor_abl_skin_reg_skirt" > nohup/iccv/ablation/abl_skin_reg_skirt.out 2>&1 & nohup python cvae.py --name="lhunor_abl_skin_var" > nohup/iccv/ablation/abl_skin_var.out 2>&1 & +nohup python evaluate_ae.py --name abl_all > nohup/iccv/evaluate/abl_all.out 2>&1 & +nohup python evaluate_ae.py --name abl_all_skirt > nohup/iccv/evaluate/abl_all_skirt.out 2>&1 & + nohup python cvae_curv.py --name="lhunor_cvae_curv" > nohup/iccv/ablation/cvae_curv.out 2>&1 & nohup python upscale_test.py --name="iccv_32_2" > nohup/iccv/upscale/iccv_32_2.out 2>&1 & @@ -70,10 +75,13 @@ nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_curv" > nohup/iccv/pyr/i nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_curv_skirt" > nohup/iccv/pyr/iccv_pyr_32_curv_skirt.out 2>&1 & nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_reg" > nohup/iccv/pyr/iccv_pyr_32_reg.out 2>&1 & nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_reg_skirt" > nohup/iccv/pyr/iccv_pyr_32_reg_skirt.out 2>&1 & +nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_10p" > nohup/iccv/pyr/iccv_pyr_32_10p.out 2>&1 & +nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_25p" > nohup/iccv/pyr/iccv_pyr_32_25p.out 2>&1 & nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64" > nohup/iccv/pyr/iccv_pyr_32_64.out 2>&1 & -nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_skin" > nohup/iccv/pyr/iccv_pyr_32_64_skin.out 2>&1 & nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_skirt" > nohup/iccv/pyr/iccv_pyr_32_64_skirt.out 2>&1 & +nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_skin" > nohup/iccv/pyr/iccv_pyr_32_64_skin.out 2>&1 & +nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_skin_skirt" > nohup/iccv/pyr/iccv_pyr_32_64_skin_skirt.out 2>&1 & nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_curv" > nohup/iccv/pyr/iccv_pyr_32_64_curv.out 2>&1 & nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_curv_skirt" > nohup/iccv/pyr/iccv_pyr_32_64_curv_skirt.out 2>&1 & nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_reg" > nohup/iccv/pyr/iccv_pyr_32_64_reg.out 2>&1 & @@ -96,6 +104,8 @@ nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_skirt" > nohup/ic nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_skin" > nohup/iccv/pyr/iccv_pyr_32_64_128_skin_2.out 2>&1 & nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_reg" > nohup/iccv/pyr/iccv_pyr_32_64_128_reg_2.out 2>&1 & nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_curv" > nohup/iccv/pyr/iccv_pyr_32_64_128_curv.out 2>&1 & +nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_curv_skirt" > nohup/iccv/pyr/iccv_pyr_32_64_128_curv_skirt.out 2>&1 & +nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_var" > nohup/iccv/pyr/iccv_pyr_32_64_128_var.out 2>&1 & nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_64_128_cape_m_00032_SL" > nohup/iccv/pyr/iccv_pyr_64_128_cape_m_00032_SL.out 2>&1 & nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_64_128_cape_f_03223_SL" > nohup/iccv/pyr/iccv_pyr_64_128_cape_f_03223_SL.out 2>&1 & @@ -103,6 +113,14 @@ nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_64_128_cape_f_03223_SS" > n nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_2.out 2>&1 & nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_skirt" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_skirt_2.out 2>&1 & +nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_skin" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_skin.out 2>&1 & +nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_curv" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_curv.out 2>&1 & +nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_reg" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_reg.out 2>&1 & + +nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_512" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_512.out 2>&1 & +nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_512_skirt" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_512_skirt.out 2>&1 & +nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_512_skin" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_512_skin.out 2>&1 & +nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_512_curv" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_512_curv.out 2>&1 & nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32 > nohup/iccv/evaluate/iccv_pyr_32.out 2>&1 & nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_skirt > nohup/iccv/evaluate/iccv_pyr_32_skirt.out 2>&1 & @@ -115,6 +133,7 @@ nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_curv_skirt > nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64 > nohup/iccv/evaluate/iccv_pyr_32_64.out 2>&1 & nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_skin > nohup/iccv/evaluate/iccv_pyr_32_64_skin.out 2>&1 & +nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_skin_skirt > nohup/iccv/evaluate/iccv_pyr_32_64_skin_skirt.out 2>&1 & nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_reg > nohup/iccv/evaluate/iccv_pyr_32_64_reg.out 2>&1 & nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_skirt > nohup/iccv/evaluate/iccv_pyr_32_64_skirt.out 2>&1 & nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_curv > nohup/iccv/evaluate/iccv_pyr_32_64_curv.out 2>&1 & @@ -122,8 +141,20 @@ nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_curv_skirt nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128 > nohup/iccv/evaluate/iccv_pyr_32_64_128.out 2>&1 & nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_skirt > nohup/iccv/evaluate/iccv_pyr_32_64_128_skirt.out 2>&1 & +nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_skin > nohup/iccv/evaluate/iccv_pyr_32_64_128_skin.out 2>&1 & +nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_reg > nohup/iccv/evaluate/iccv_pyr_32_64_128_reg.out 2>&1 & +nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_curv > nohup/iccv/evaluate/iccv_pyr_32_64_128_curv.out 2>&1 & +nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_curv_skirt > nohup/iccv/evaluate/iccv_pyr_32_64_128_curv_skirt.out 2>&1 & +nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_256 > nohup/iccv/evaluate/iccv_pyr_32_64_128_256.out 2>&1 & +nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_256_skirt > nohup/iccv/evaluate/iccv_pyr_32_64_128_256_skirt.out 2>&1 & +nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_256_512 > nohup/iccv/evaluate/iccv_pyr_32_64_128_256_512.out 2>&1 & +nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_256_512_skirt > nohup/iccv/evaluate/iccv_pyr_32_64_128_256_512_skirt.out 2>&1 & + +nohup python cvae.py --name="lhunor_cape_f_03223_SL" > nohup/iccv/ablation/abl_all_cape_f_03223_SL.out 2>&1 & +nohup python cvae.py --name="lhunor_cape_f_03223_SS" > nohup/iccv/ablation/abl_all_cape_f_03223_SS.out 2>&1 & +nohup python cvae.py --name="lhunor_cape_m_00032_SL" > nohup/iccv/ablation/abl_all_cape_m_00032_SL.out 2>&1 & diff --git a/calculate_error.py b/calculate_error.py index 70f8fe0..2dcd1d3 100644 --- a/calculate_error.py +++ b/calculate_error.py @@ -1,6 +1,6 @@ import os import sys -from configs.iccv.config_abl_pyr_32_64_128 import config +from configs.iccv.config_abl_pyr_32_64_128_curv_skirt import config os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu'] # import tensorflow as tf @@ -68,7 +68,7 @@ if __name__ == '__main__': output_folder = '/home/workspace/local-data/results/iccv/' + checkpoint_name + '-' # check if there is a folder that starts with this name using glob folders = glob.glob(output_folder + '*') - assert len(folders) == 1, 'There should be only one checkpoint that starts with this name' + assert len(folders) == 1, f'There should be only one checkpoint that starts with this name, but found {len(folders)}' output_folder = folders[0] iteration = output_folder.split('-')[-1] diff --git a/compare_cape.py b/compare_cape.py index 7b35325..880aa8a 100644 --- a/compare_cape.py +++ b/compare_cape.py @@ -23,7 +23,7 @@ import numpy as np import trimesh as tm import plotly.express as ex import plotly.graph_objects as go -from custom_utils.custom_utils import _maskFaces +from custom_utils.custom_utils import _maskFaces, save_stl from custom_utils.smpl import SMPL from plotly.subplots import make_subplots from scipy.spatial.transform import Rotation as R @@ -215,8 +215,8 @@ if __name__ == '__main__': errors_cape_m = get_cape_errors('CAPE/results/CAPE-affineconv_nz18_pose24_clotype8_male/errors.npy', frames_m) errors_cape_m = dict(reversed(sorted(errors_cape_m.items(), key=lambda item: item[1]))) - errors_f = get_errors('temp/error_abl_2_pyr_64_128_256_512_cape_f.txt') - errors_m = get_errors('temp/error_abl_2_pyr_64_128_256_512_cape_m.txt') + errors_f = get_errors('temp/archive/error_abl_2_pyr_64_128_256_512_cape_f.txt') + errors_m = get_errors('temp/archive/error_abl_2_pyr_64_128_256_512_cape_m.txt') folder_pyr_f = '/home/workspace/data/results/cape/abl_2_pyr_64_128_256_512_cape_f' folder_pyr_m = '/home/workspace/data/results/cape/abl_2_pyr_64_128_256_512_cape_m' @@ -238,9 +238,10 @@ if __name__ == '__main__': _, faces = _maskFaces(np.zeros((3638, 3)), np.load('custom_utils/smpl_faces_orig.npy'), cape_mask) + faces = faces.astype(np.int32) colors = np.ones((3627, 3), np.int8) * 230 - gender = 'male' + gender = 'female' if gender == 'male': folder_cape = folder_m @@ -262,11 +263,18 @@ if __name__ == '__main__': all_errors_1 = [] all_errors_2 = [] - # for key in tqdm.tqdm(errors_cape.keys()): - count = 0 - while True: - key = random.choice(list(errors_cape.keys())) + for key in tqdm.tqdm(errors_cape.keys()): + # count = 0 + # while True: + if os.path.exists(f'temp/cape_stl/{key}_gt.stl'): + continue + # key = random.choice(list(errors_cape.keys())) cape = read_obj(os.path.join(folder_cape, '{:0>4d}.obj'.format(frames_to_i[key])))[clothing_verts_idx, :] - J0[np.newaxis, :] + split = key.split('_') + file = '_'.join(split[:-1]) + '.' + split[-1] + '.npy' + pose_shape_path = os.path.join(pose_folder, file) + if not os.path.exists(pose_shape_path): + continue cape = add_global_orientation(cape, key, pose_folder, inverse=True) if not os.path.exists(os.path.join(folder, key + '_posed.npy')): continue @@ -284,10 +292,13 @@ if __name__ == '__main__': # print(np.mean(all_errors_1)) # print(np.mean(all_errors_2)) - fig = plot_fixed_all(gt, cape, ours, errors_cape[key], errors[key], faces, colors) - fig.write_image('temp/cape/' + key + '.png') + # fig = plot_fixed_all(gt, cape, ours, errors_cape[key], errors[key], faces, colors) + # fig.write_image('temp/cape_2/' + key + '.png') + save_stl(f'temp/cape_stl/{key}_gt.stl', gt, faces) + save_stl(f'temp/cape_stl/{key}_cape.stl', cape, faces) + save_stl(f'temp/cape_stl/{key}_ours.stl', ours, faces) - print(count) - count += 1 + # print(count) + # count += 1 print() \ No newline at end of file diff --git a/configs/iccv/config_abl_all.py b/configs/iccv/config_abl_all.py index 6be9b64..9237a4c 100644 --- a/configs/iccv/config_abl_all.py +++ b/configs/iccv/config_abl_all.py @@ -35,9 +35,9 @@ config['is_skirt'] = False config['dataset_in_memory'] = False config['is_cape'] = False -config['train_dir'] = '/home/workspace/local-data/train' +config['train_dir'] = '/home/workspace/local-data_127/train' config['valid_dir'] = '/home/workspace/local-data/valid' -config['test_dir'] = '/home/workspace/data/dataset/test_ready' +config['test_dir'] = '/home/workspace/local-data_127/test_ready' config['static_model'] = 'checkpoints/iccv/static_iccv_1' config['body_model'] = 'checkpoints/iccv/body_iccv_1' diff --git a/configs/iccv/config_abl_all_cape_f_03223_SL.py b/configs/iccv/config_abl_all_cape_f_03223_SL.py new file mode 100644 index 0000000..3f37baf --- /dev/null +++ b/configs/iccv/config_abl_all_cape_f_03223_SL.py @@ -0,0 +1,128 @@ +config = dict() + +# 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 AVG GARMENT USED + +config['use_skinning'] = True # and deshaping +config['remove_global_orientation'] = True +config['use_curvature'] = True +config['use_extra_losses'] = True # edge, collision, 3d mesh +config['use_offsets'] = True + +config['use_norm_loss'] = True + +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 + +config['gpu'] = '2' +config['name'] = 'abl_all_cape_f_03223_SL' +config['notes'] = '' +config['tags'] = ['iccv', 'abl_all'] + +config['avg_garment_path'] = 'custom_data/train_cape_f_03223_SL_2_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']: + 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['batch_size'] = 4 +config['resolution'] = 512 +config['is_skirt'] = False +config['dataset_in_memory'] = False +config['is_cape'] = True + +config['train_dir'] = '/home/workspace/local-data_127/cape_processed/train/female' +config['valid_dir'] = '/home/workspace/local-data_127/cape_processed/train/female' +config['test_dir'] = '/home/workspace/local-data/cape_processed/train/female' +config['frames_file'] = 'frames_03223_SL_train_2.txt' +config['frames_file_valid'] = 'frames_03223_SL_test_2.txt' +config['frames_file_test'] = 'frames_03223_SL_test_2.txt' + +config['static_model'] = 'checkpoints/iccv/static_iccv_1_cape_f' +config['body_model'] = 'checkpoints/iccv/body_iccv_1_cape_f' +config['curvature_model'] = 'checkpoints/iccv/curv_iccv_1_cape_f' + + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['latent_dim'] = 128 + +config['pretrained_model'] = '' + +############### +config['lr'] = 0.0001# 0.0001 +############### +config['starting_balancing_coeff'] = 0.0001 + +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,), + 'uv_curvature': (512, 256, 7), + } +config['signature_static'] = { 'uv_static': (512, 256, 3), + 'mesh_mask': (config['smpl_res'],), + 'uv_mask': (512, 256,), + } + +if config['use_skinning']: + config['signature_dynamic']['uv_unposed'] = (512, 256, 3) + config['signature_dynamic']['mesh_unposed'] = (config['smpl_res'], 3,) +else: + config['signature_dynamic']['uv_posed'] = (512, 256, 3) + + +config['upscale_enhancer'] = '' +config['freeze_encoders'] = True +config['use_one_hot'] = False +config['bottleneck_scale'] = 2 + +config['cvae'] = dict() +config['cvae']['is_label'] = False +config['cvae']['latent_dim'] = 64 * config['bottleneck_scale'] +config['cvae']['add_noise'] = False +config['cvae']['noise_amount'] = 0.0 + +config['cvae']['kernel_size'] = 7 +config['cvae']['encoder_depths'] = [3, 3, 3, 9, 3] +config['cvae']['encoder_dims'] = [32, 64, 128, 256, config['cvae']['latent_dim']] +config['cvae']['decoder_depths'] = config['cvae']['encoder_depths'] +config['cvae']['decoder_dims'] = config['cvae']['encoder_dims'] + + +config['cond_ae_static'] = dict() +config['cond_ae_static']['is_label'] = False +config['cond_ae_static']['kernel_size'] = 7 +config['cond_ae_static']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae_static']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae_static']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae_static']['bottleneck_size']] +config['cond_ae_static']['decoder_depths'] = config['cond_ae_static']['encoder_depths'] +config['cond_ae_static']['decoder_dims'] = config['cond_ae_static']['encoder_dims'] +config['cond_ae_static']['activation'] = 'tanh' + +config['cond_ae_curv'] = dict() +config['cond_ae_curv']['is_label'] = True +config['cond_ae_curv']['kernel_size'] = 7 +config['cond_ae_curv']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae_curv']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_curv']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_curv']['bottleneck_size']] +config['cond_ae_curv']['decoder_depths'] = config['cond_ae_curv']['encoder_depths'] +config['cond_ae_curv']['decoder_dims'] = config['cond_ae_curv']['encoder_dims'] +config['cond_ae_curv']['activation'] = 'tanh' + +config['cond_ae_body'] = dict() +config['cond_ae_body']['is_label'] = False +config['cond_ae_body']['kernel_size'] = 7 +config['cond_ae_body']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_body']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_body']['bottleneck_size']] +config['cond_ae_body']['decoder_depths'] = config['cond_ae_body']['encoder_depths'] +config['cond_ae_body']['decoder_dims'] = config['cond_ae_body']['encoder_dims'] +config['cond_ae_body']['activation'] = 'tanh' \ No newline at end of file diff --git a/configs/iccv/config_abl_all_cape_f_03223_SS.py b/configs/iccv/config_abl_all_cape_f_03223_SS.py new file mode 100644 index 0000000..67aed7f --- /dev/null +++ b/configs/iccv/config_abl_all_cape_f_03223_SS.py @@ -0,0 +1,128 @@ +config = dict() + +# 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 AVG GARMENT USED + +config['use_skinning'] = True # and deshaping +config['remove_global_orientation'] = True +config['use_curvature'] = True +config['use_extra_losses'] = True # edge, collision, 3d mesh +config['use_offsets'] = True + +config['use_norm_loss'] = True + +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 + +config['gpu'] = '4' +config['name'] = 'abl_all_cape_f_03223_SS' +config['notes'] = '' +config['tags'] = ['iccv', 'abl_all'] + +config['avg_garment_path'] = 'custom_data/train_cape_f_03223_SS_2_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']: + 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['batch_size'] = 4 +config['resolution'] = 512 +config['is_skirt'] = False +config['dataset_in_memory'] = False +config['is_cape'] = True + +config['train_dir'] = '/home/workspace/local-data_127/cape_processed/train/female' +config['valid_dir'] = '/home/workspace/local-data_127/cape_processed/train/female' +config['test_dir'] = '/home/workspace/local-data/cape_processed/train/female' +config['frames_file'] = 'frames_03223_SS_train_2.txt' +config['frames_file_valid'] = 'frames_03223_SS_test_2.txt' +config['frames_file_test'] = 'frames_03223_SS_test_2.txt' + +config['static_model'] = 'checkpoints/iccv/static_iccv_1_cape_f' +config['body_model'] = 'checkpoints/iccv/body_iccv_1_cape_f' +config['curvature_model'] = 'checkpoints/iccv/curv_iccv_1_cape_f' + + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['latent_dim'] = 128 + +config['pretrained_model'] = '' + +############### +config['lr'] = 0.0001# 0.0001 +############### +config['starting_balancing_coeff'] = 0.0001 + +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,), + 'uv_curvature': (512, 256, 7), + } +config['signature_static'] = { 'uv_static': (512, 256, 3), + 'mesh_mask': (config['smpl_res'],), + 'uv_mask': (512, 256,), + } + +if config['use_skinning']: + config['signature_dynamic']['uv_unposed'] = (512, 256, 3) + config['signature_dynamic']['mesh_unposed'] = (config['smpl_res'], 3,) +else: + config['signature_dynamic']['uv_posed'] = (512, 256, 3) + + +config['upscale_enhancer'] = '' +config['freeze_encoders'] = True +config['use_one_hot'] = False +config['bottleneck_scale'] = 2 + +config['cvae'] = dict() +config['cvae']['is_label'] = False +config['cvae']['latent_dim'] = 64 * config['bottleneck_scale'] +config['cvae']['add_noise'] = False +config['cvae']['noise_amount'] = 0.0 + +config['cvae']['kernel_size'] = 7 +config['cvae']['encoder_depths'] = [3, 3, 3, 9, 3] +config['cvae']['encoder_dims'] = [32, 64, 128, 256, config['cvae']['latent_dim']] +config['cvae']['decoder_depths'] = config['cvae']['encoder_depths'] +config['cvae']['decoder_dims'] = config['cvae']['encoder_dims'] + + +config['cond_ae_static'] = dict() +config['cond_ae_static']['is_label'] = False +config['cond_ae_static']['kernel_size'] = 7 +config['cond_ae_static']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae_static']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae_static']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae_static']['bottleneck_size']] +config['cond_ae_static']['decoder_depths'] = config['cond_ae_static']['encoder_depths'] +config['cond_ae_static']['decoder_dims'] = config['cond_ae_static']['encoder_dims'] +config['cond_ae_static']['activation'] = 'tanh' + +config['cond_ae_curv'] = dict() +config['cond_ae_curv']['is_label'] = True +config['cond_ae_curv']['kernel_size'] = 7 +config['cond_ae_curv']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae_curv']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_curv']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_curv']['bottleneck_size']] +config['cond_ae_curv']['decoder_depths'] = config['cond_ae_curv']['encoder_depths'] +config['cond_ae_curv']['decoder_dims'] = config['cond_ae_curv']['encoder_dims'] +config['cond_ae_curv']['activation'] = 'tanh' + +config['cond_ae_body'] = dict() +config['cond_ae_body']['is_label'] = False +config['cond_ae_body']['kernel_size'] = 7 +config['cond_ae_body']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_body']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_body']['bottleneck_size']] +config['cond_ae_body']['decoder_depths'] = config['cond_ae_body']['encoder_depths'] +config['cond_ae_body']['decoder_dims'] = config['cond_ae_body']['encoder_dims'] +config['cond_ae_body']['activation'] = 'tanh' \ No newline at end of file diff --git a/configs/iccv/config_abl_all_cape_m_00032_SL.py b/configs/iccv/config_abl_all_cape_m_00032_SL.py new file mode 100644 index 0000000..69f7871 --- /dev/null +++ b/configs/iccv/config_abl_all_cape_m_00032_SL.py @@ -0,0 +1,128 @@ +config = dict() + +# 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 AVG GARMENT USED + +config['use_skinning'] = True # and deshaping +config['remove_global_orientation'] = True +config['use_curvature'] = True +config['use_extra_losses'] = True # edge, collision, 3d mesh +config['use_offsets'] = True + +config['use_norm_loss'] = True + +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 + +config['gpu'] = '3' +config['name'] = 'abl_all_cape_m_00032_SL' +config['notes'] = '' +config['tags'] = ['iccv', 'abl_all'] + +config['avg_garment_path'] = 'custom_data/train_cape_m_00032_SL_2_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']: + 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['batch_size'] = 4 +config['resolution'] = 512 +config['is_skirt'] = False +config['dataset_in_memory'] = False +config['is_cape'] = True + +config['train_dir'] = '/home/workspace/local-data_127/cape_processed/train/male' +config['valid_dir'] = '/home/workspace/local-data_127/cape_processed/train/male' +config['test_dir'] = '/home/workspace/local-data_127/cape_processed/train/male' +config['frames_file'] = 'frames_00032_SL_train_2.txt' +config['frames_file_valid'] = 'frames_00032_SL_test_2.txt' +config['frames_file_test'] = 'frames_00032_SL_test_2.txt' + +config['static_model'] = 'checkpoints/iccv/static_iccv_1_cape_m' +config['body_model'] = 'checkpoints/iccv/body_iccv_1_cape_m' +config['curvature_model'] = 'checkpoints/iccv/curv_iccv_1_cape_m' + + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['latent_dim'] = 128 + +config['pretrained_model'] = '' + +############### +config['lr'] = 0.0001# 0.0001 +############### +config['starting_balancing_coeff'] = 0.0001 + +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,), + 'uv_curvature': (512, 256, 7), + } +config['signature_static'] = { 'uv_static': (512, 256, 3), + 'mesh_mask': (config['smpl_res'],), + 'uv_mask': (512, 256,), + } + +if config['use_skinning']: + config['signature_dynamic']['uv_unposed'] = (512, 256, 3) + config['signature_dynamic']['mesh_unposed'] = (config['smpl_res'], 3,) +else: + config['signature_dynamic']['uv_posed'] = (512, 256, 3) + + +config['upscale_enhancer'] = '' +config['freeze_encoders'] = True +config['use_one_hot'] = False +config['bottleneck_scale'] = 2 + +config['cvae'] = dict() +config['cvae']['is_label'] = False +config['cvae']['latent_dim'] = 64 * config['bottleneck_scale'] +config['cvae']['add_noise'] = False +config['cvae']['noise_amount'] = 0.0 + +config['cvae']['kernel_size'] = 7 +config['cvae']['encoder_depths'] = [3, 3, 3, 9, 3] +config['cvae']['encoder_dims'] = [32, 64, 128, 256, config['cvae']['latent_dim']] +config['cvae']['decoder_depths'] = config['cvae']['encoder_depths'] +config['cvae']['decoder_dims'] = config['cvae']['encoder_dims'] + + +config['cond_ae_static'] = dict() +config['cond_ae_static']['is_label'] = False +config['cond_ae_static']['kernel_size'] = 7 +config['cond_ae_static']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae_static']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae_static']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae_static']['bottleneck_size']] +config['cond_ae_static']['decoder_depths'] = config['cond_ae_static']['encoder_depths'] +config['cond_ae_static']['decoder_dims'] = config['cond_ae_static']['encoder_dims'] +config['cond_ae_static']['activation'] = 'tanh' + +config['cond_ae_curv'] = dict() +config['cond_ae_curv']['is_label'] = True +config['cond_ae_curv']['kernel_size'] = 7 +config['cond_ae_curv']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae_curv']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_curv']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_curv']['bottleneck_size']] +config['cond_ae_curv']['decoder_depths'] = config['cond_ae_curv']['encoder_depths'] +config['cond_ae_curv']['decoder_dims'] = config['cond_ae_curv']['encoder_dims'] +config['cond_ae_curv']['activation'] = 'tanh' + +config['cond_ae_body'] = dict() +config['cond_ae_body']['is_label'] = False +config['cond_ae_body']['kernel_size'] = 7 +config['cond_ae_body']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_body']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_body']['bottleneck_size']] +config['cond_ae_body']['decoder_depths'] = config['cond_ae_body']['encoder_depths'] +config['cond_ae_body']['decoder_dims'] = config['cond_ae_body']['encoder_dims'] +config['cond_ae_body']['activation'] = 'tanh' \ No newline at end of file diff --git a/configs/iccv/config_abl_all_skirt.py b/configs/iccv/config_abl_all_skirt.py index 0db9fce..34c424b 100644 --- a/configs/iccv/config_abl_all_skirt.py +++ b/configs/iccv/config_abl_all_skirt.py @@ -37,7 +37,7 @@ config['is_cape'] = False config['train_dir'] = '/home/workspace/local-data/train_skirt' config['valid_dir'] = '/home/workspace/local-data_127/valid_skirt' -config['test_dir'] = '/home/workspace/data/dataset/test_skirt_ready_2' +config['test_dir'] = '/home/workspace/local-data_128/test_skirt_ready_2' config['static_model'] = 'checkpoints/iccv/static_iccv_1_skirt' config['body_model'] = 'checkpoints/iccv/body_iccv_1_skirt' diff --git a/configs/iccv/config_abl_all_skirt_var.py b/configs/iccv/config_abl_all_skirt_var.py new file mode 100644 index 0000000..bd74c10 --- /dev/null +++ b/configs/iccv/config_abl_all_skirt_var.py @@ -0,0 +1,125 @@ +config = dict() + +# 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 AVG GARMENT USED + +config['use_skinning'] = True # and deshaping +config['remove_global_orientation'] = True +config['use_curvature'] = True +config['use_extra_losses'] = True # edge, collision, 3d mesh +config['use_offsets'] = True + +config['use_norm_loss'] = True + +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 + +config['gpu'] = '0' +config['name'] = 'abl_all_skirt_var_2' +config['notes'] = '' +config['tags'] = ['iccv', 'abl_all', 'skirt'] + +config['avg_garment_path'] = 'custom_data/train_no_shape_skirt_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']: + 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['batch_size'] = 4 +config['resolution'] = 512 +config['is_skirt'] = True +config['dataset_in_memory'] = False +config['is_cape'] = False + +config['train_dir'] = '/home/workspace/local-data_128/train_skirt' +config['valid_dir'] = '/home/workspace/local-data_127/valid_skirt' +config['test_dir'] = '/home/workspace/local-data_128/test_skirt_ready_2' + +config['static_model'] = 'checkpoints/iccv/static_iccv_1_skirt' +config['body_model'] = 'checkpoints/iccv/body_iccv_1_skirt' +config['curvature_model'] = 'checkpoints/iccv/curv_iccv_1_skirt' + + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['latent_dim'] = 128 + +config['pretrained_model'] = 'checkpoints/iccv/abl_all_skirt' + +############### +config['lr'] = 0.0001# 0.0001 +############### +config['starting_balancing_coeff'] = 0.1 + +config['signature_dynamic'] = { 'id': (), 'frame_nr': (), + 'pose_shape': (72 + 11,), + 'uv_body_posed': (512, 256, 3), + 'mesh_body_posed': (14475, 3,), + 'mesh_posed': (14475, 3,), + 'uv_curvature': (512, 256, 7), + } +config['signature_static'] = { 'uv_static': (512, 256, 3), + 'mesh_mask': (14475,), + 'uv_mask': (512, 256,), + } + +if config['use_skinning']: + config['signature_dynamic']['uv_unposed'] = (512, 256, 3) + config['signature_dynamic']['mesh_unposed'] = (14475, 3,) +else: + config['signature_dynamic']['uv_posed'] = (512, 256, 3) + + +config['upscale_enhancer'] = '' +config['freeze_encoders'] = True +config['use_one_hot'] = False +config['bottleneck_scale'] = 2 + +config['cvae'] = dict() +config['cvae']['is_label'] = False +config['cvae']['latent_dim'] = 64 * config['bottleneck_scale'] +config['cvae']['add_noise'] = False +config['cvae']['noise_amount'] = 0.0 + +config['cvae']['kernel_size'] = 7 +config['cvae']['encoder_depths'] = [3, 3, 3, 9, 3] +config['cvae']['encoder_dims'] = [32, 64, 128, 256, config['cvae']['latent_dim']] +config['cvae']['decoder_depths'] = config['cvae']['encoder_depths'] +config['cvae']['decoder_dims'] = config['cvae']['encoder_dims'] + + +config['cond_ae_static'] = dict() +config['cond_ae_static']['is_label'] = False +config['cond_ae_static']['kernel_size'] = 7 +config['cond_ae_static']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae_static']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae_static']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae_static']['bottleneck_size']] +config['cond_ae_static']['decoder_depths'] = config['cond_ae_static']['encoder_depths'] +config['cond_ae_static']['decoder_dims'] = config['cond_ae_static']['encoder_dims'] +config['cond_ae_static']['activation'] = 'tanh' + +config['cond_ae_curv'] = dict() +config['cond_ae_curv']['is_label'] = True +config['cond_ae_curv']['kernel_size'] = 7 +config['cond_ae_curv']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae_curv']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_curv']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_curv']['bottleneck_size']] +config['cond_ae_curv']['decoder_depths'] = config['cond_ae_curv']['encoder_depths'] +config['cond_ae_curv']['decoder_dims'] = config['cond_ae_curv']['encoder_dims'] +config['cond_ae_curv']['activation'] = 'tanh' + +config['cond_ae_body'] = dict() +config['cond_ae_body']['is_label'] = False +config['cond_ae_body']['kernel_size'] = 7 +config['cond_ae_body']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_body']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_body']['bottleneck_size']] +config['cond_ae_body']['decoder_depths'] = config['cond_ae_body']['encoder_depths'] +config['cond_ae_body']['decoder_dims'] = config['cond_ae_body']['encoder_dims'] +config['cond_ae_body']['activation'] = 'tanh' \ No newline at end of file diff --git a/configs/iccv/config_abl_pyr_32_10p.py b/configs/iccv/config_abl_pyr_32_10p.py new file mode 100644 index 0000000..df06227 --- /dev/null +++ b/configs/iccv/config_abl_pyr_32_10p.py @@ -0,0 +1,189 @@ +config = dict() + +config['gpu'] = '4' +config['name'] = 'iccv_pyr_32_10p' +config['notes'] = '' +config['tags'] = ['pyr', 'iccv'] + +# 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_norm_loss'] = True +config['use_curvature'] = True + +config['pretrained_model'] = '' +config['pretrained_model_iteration'] = '' + +config['pyramid'] = dict() +config['pyramid']['resolutions'] = [32] +config['pyramid']['pretrained_pyramid'] = '' +config['pyramid']['final_upscale_enhancer'] = '' + +config['train_dir'] = '/home/workspace/local-data_127/train' +config['valid_dir'] = '/home/workspace/local-data_127/valid' +config['test_dir'] = '/home/workspace/local-data_127/test_ready' + +config['frames_file'] = 'frames_10p.txt' + +config['batch_size'] = 4 +config['is_skirt'] = False +config['is_cape'] = False + +config['dataset_in_memory'] = False +config['resolution'] = None + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['lr'] = 0.0001 +config['starting_balancing_coeff'] = 0.001 +config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision +config['avg_garment_path'] = '' +config['bottleneck_scale'] = 2 + +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']['add_noise'] = False +config['pyramid']['noise_amount'] = 0.0 + +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']['static_model'] = 'checkpoints/iccv/static_iccv_1_10p' +config['pyramid']['body_model'] = 'checkpoints/iccv/body_iccv_1_10p' +config['pyramid']['curvature_model'] = 'checkpoints/iccv/curv_iccv_1_10p' +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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 7 + level['encoder_depths'] = [3, 3, 3, 9, 3] + level['encoder_dims'] = [16, 32, 64, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = '' + config['pyramid']['levels'].append(level) + elif res == 256: + level = dict() + level['resolution'] = 256 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [3, 3, 9, 3] + level['encoder_dims'] = [64, 128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_256_2'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [9, 9, 9] + level['encoder_dims'] = [128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_128_2'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [9, 9] + level['encoder_dims'] = [64, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_64_2'#checkpoints/up_3_d64_128_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + elif res == 32: + level = dict() + level['resolution'] = 32 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [16] + level['encoder_dims'] = [level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_32_2'#'checkpoints/up_3_d32_64_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + else: + raise NotImplementedError + +config['cond_ae_static'] = dict() +config['cond_ae_static']['is_label'] = False +config['cond_ae_static']['kernel_size'] = 7 +config['cond_ae_static']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae_static']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae_static']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae_static']['bottleneck_size']] +config['cond_ae_static']['decoder_depths'] = config['cond_ae_static']['encoder_depths'] +config['cond_ae_static']['decoder_dims'] = config['cond_ae_static']['encoder_dims'] +config['cond_ae_static']['activation'] = 'tanh' + +config['cond_ae_curv'] = dict() +config['cond_ae_curv']['is_label'] = True +config['cond_ae_curv']['kernel_size'] = 7 +config['cond_ae_curv']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae_curv']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_curv']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_curv']['bottleneck_size']] +config['cond_ae_curv']['decoder_depths'] = config['cond_ae_curv']['encoder_depths'] +config['cond_ae_curv']['decoder_dims'] = config['cond_ae_curv']['encoder_dims'] +config['cond_ae_curv']['activation'] = 'tanh' + +config['cond_ae_body'] = dict() +config['cond_ae_body']['is_label'] = False +config['cond_ae_body']['kernel_size'] = 7 +config['cond_ae_body']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_body']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_body']['bottleneck_size']] +config['cond_ae_body']['decoder_depths'] = config['cond_ae_body']['encoder_depths'] +config['cond_ae_body']['decoder_dims'] = config['cond_ae_body']['encoder_dims'] +config['cond_ae_body']['activation'] = 'tanh' \ No newline at end of file diff --git a/configs/iccv/config_abl_pyr_32_25p.py b/configs/iccv/config_abl_pyr_32_25p.py new file mode 100644 index 0000000..b740e00 --- /dev/null +++ b/configs/iccv/config_abl_pyr_32_25p.py @@ -0,0 +1,189 @@ +config = dict() + +config['gpu'] = '5' +config['name'] = 'iccv_pyr_32_25p' +config['notes'] = '' +config['tags'] = ['pyr', 'iccv'] + +# 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_norm_loss'] = True +config['use_curvature'] = True + +config['pretrained_model'] = '' +config['pretrained_model_iteration'] = '' + +config['pyramid'] = dict() +config['pyramid']['resolutions'] = [32] +config['pyramid']['pretrained_pyramid'] = '' +config['pyramid']['final_upscale_enhancer'] = '' + +config['train_dir'] = '/home/workspace/local-data_127/train' +config['valid_dir'] = '/home/workspace/local-data_127/valid' +config['test_dir'] = '/home/workspace/local-data_127/test_ready' + +config['frames_file'] = 'frames_25p.txt' + +config['batch_size'] = 4 +config['is_skirt'] = False +config['is_cape'] = False + +config['dataset_in_memory'] = False +config['resolution'] = None + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['lr'] = 0.0001 +config['starting_balancing_coeff'] = 0.001 +config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision +config['avg_garment_path'] = '' +config['bottleneck_scale'] = 2 + +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']['add_noise'] = False +config['pyramid']['noise_amount'] = 0.0 + +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']['static_model'] = 'checkpoints/iccv/static_iccv_1_25p' +config['pyramid']['body_model'] = 'checkpoints/iccv/body_iccv_1_25p' +config['pyramid']['curvature_model'] = 'checkpoints/iccv/curv_iccv_1_25p' +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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 7 + level['encoder_depths'] = [3, 3, 3, 9, 3] + level['encoder_dims'] = [16, 32, 64, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = '' + config['pyramid']['levels'].append(level) + elif res == 256: + level = dict() + level['resolution'] = 256 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [3, 3, 9, 3] + level['encoder_dims'] = [64, 128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_256_2'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [9, 9, 9] + level['encoder_dims'] = [128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_128_2'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [9, 9] + level['encoder_dims'] = [64, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_64_2'#checkpoints/up_3_d64_128_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + elif res == 32: + level = dict() + level['resolution'] = 32 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [16] + level['encoder_dims'] = [level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_32_2'#'checkpoints/up_3_d32_64_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + else: + raise NotImplementedError + +config['cond_ae_static'] = dict() +config['cond_ae_static']['is_label'] = False +config['cond_ae_static']['kernel_size'] = 7 +config['cond_ae_static']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae_static']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae_static']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae_static']['bottleneck_size']] +config['cond_ae_static']['decoder_depths'] = config['cond_ae_static']['encoder_depths'] +config['cond_ae_static']['decoder_dims'] = config['cond_ae_static']['encoder_dims'] +config['cond_ae_static']['activation'] = 'tanh' + +config['cond_ae_curv'] = dict() +config['cond_ae_curv']['is_label'] = True +config['cond_ae_curv']['kernel_size'] = 7 +config['cond_ae_curv']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae_curv']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_curv']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_curv']['bottleneck_size']] +config['cond_ae_curv']['decoder_depths'] = config['cond_ae_curv']['encoder_depths'] +config['cond_ae_curv']['decoder_dims'] = config['cond_ae_curv']['encoder_dims'] +config['cond_ae_curv']['activation'] = 'tanh' + +config['cond_ae_body'] = dict() +config['cond_ae_body']['is_label'] = False +config['cond_ae_body']['kernel_size'] = 7 +config['cond_ae_body']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_body']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_body']['bottleneck_size']] +config['cond_ae_body']['decoder_depths'] = config['cond_ae_body']['encoder_depths'] +config['cond_ae_body']['decoder_dims'] = config['cond_ae_body']['encoder_dims'] +config['cond_ae_body']['activation'] = 'tanh' \ No newline at end of file diff --git a/configs/iccv/config_abl_pyr_32_64_128_256.py b/configs/iccv/config_abl_pyr_32_64_128_256.py index 85af18a..0b2de62 100644 --- a/configs/iccv/config_abl_pyr_32_64_128_256.py +++ b/configs/iccv/config_abl_pyr_32_64_128_256.py @@ -1,6 +1,6 @@ config = dict() -config['gpu'] = '0' +config['gpu'] = '1' config['name'] = 'iccv_pyr_32_64_128_256_2' config['notes'] = '' config['tags'] = ['pyr', 'iccv'] diff --git a/configs/iccv/config_abl_pyr_32_64_128_256_512.py b/configs/iccv/config_abl_pyr_32_64_128_256_512.py new file mode 100644 index 0000000..158fcbd --- /dev/null +++ b/configs/iccv/config_abl_pyr_32_64_128_256_512.py @@ -0,0 +1,187 @@ +config = dict() + +config['gpu'] = '0' +config['name'] = 'iccv_pyr_32_64_128_256_512' +config['notes'] = '' +config['tags'] = ['pyr', 'iccv'] + +# 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_norm_loss'] = True +config['use_curvature'] = True + +config['pretrained_model'] = '' +config['pretrained_model_iteration'] = '' + +config['pyramid'] = dict() +config['pyramid']['resolutions'] = [32, 64, 128, 256, 512] +config['pyramid']['pretrained_pyramid'] = 'checkpoints/iccv/iccv_pyr_32_64_128_256_2' +config['pyramid']['pretrained_pyramid_iteration'] = '90000' +config['pyramid']['final_upscale_enhancer'] = '' + +config['train_dir'] = '/home/workspace/local-data/train' +config['valid_dir'] = '/home/workspace/local-data/valid' +config['test_dir'] = '/home/workspace/local-data/test_ready' +config['batch_size'] = 4 +config['is_skirt'] = False +config['is_cape'] = False + +config['dataset_in_memory'] = False +config['resolution'] = None + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['lr'] = 0.0001 +config['starting_balancing_coeff'] = 0.001 +config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision +config['avg_garment_path'] = '' +config['bottleneck_scale'] = 2 + +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']['add_noise'] = False +config['pyramid']['noise_amount'] = 0.0 + +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']['static_model'] = 'checkpoints/iccv/static_iccv_1' +config['pyramid']['body_model'] = 'checkpoints/iccv/body_iccv_1' +config['pyramid']['curvature_model'] = 'checkpoints/iccv/curv_iccv_1' +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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 7 + level['encoder_depths'] = [3, 3, 3, 9, 3] + level['encoder_dims'] = [16, 32, 64, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = '' + config['pyramid']['levels'].append(level) + elif res == 256: + level = dict() + level['resolution'] = 256 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [3, 3, 9, 3] + level['encoder_dims'] = [64, 128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_256_2'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [9, 9, 9] + level['encoder_dims'] = [128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_128_2'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [9, 9] + level['encoder_dims'] = [64, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_64_2'#checkpoints/up_3_d64_128_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + elif res == 32: + level = dict() + level['resolution'] = 32 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [16] + level['encoder_dims'] = [level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_32_2'#'checkpoints/up_3_d32_64_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + else: + raise NotImplementedError + +config['cond_ae_static'] = dict() +config['cond_ae_static']['is_label'] = False +config['cond_ae_static']['kernel_size'] = 7 +config['cond_ae_static']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae_static']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae_static']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae_static']['bottleneck_size']] +config['cond_ae_static']['decoder_depths'] = config['cond_ae_static']['encoder_depths'] +config['cond_ae_static']['decoder_dims'] = config['cond_ae_static']['encoder_dims'] +config['cond_ae_static']['activation'] = 'tanh' + +config['cond_ae_curv'] = dict() +config['cond_ae_curv']['is_label'] = True +config['cond_ae_curv']['kernel_size'] = 7 +config['cond_ae_curv']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae_curv']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_curv']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_curv']['bottleneck_size']] +config['cond_ae_curv']['decoder_depths'] = config['cond_ae_curv']['encoder_depths'] +config['cond_ae_curv']['decoder_dims'] = config['cond_ae_curv']['encoder_dims'] +config['cond_ae_curv']['activation'] = 'tanh' + +config['cond_ae_body'] = dict() +config['cond_ae_body']['is_label'] = False +config['cond_ae_body']['kernel_size'] = 7 +config['cond_ae_body']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_body']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_body']['bottleneck_size']] +config['cond_ae_body']['decoder_depths'] = config['cond_ae_body']['encoder_depths'] +config['cond_ae_body']['decoder_dims'] = config['cond_ae_body']['encoder_dims'] +config['cond_ae_body']['activation'] = 'tanh' \ No newline at end of file diff --git a/configs/iccv/config_abl_pyr_32_64_128_256_512_curv.py b/configs/iccv/config_abl_pyr_32_64_128_256_512_curv.py new file mode 100644 index 0000000..7199e28 --- /dev/null +++ b/configs/iccv/config_abl_pyr_32_64_128_256_512_curv.py @@ -0,0 +1,187 @@ +config = dict() + +config['gpu'] = '3' +config['name'] = 'iccv_pyr_32_64_128_256_512_curv' +config['notes'] = '' +config['tags'] = ['pyr', 'iccv', 'curv'] + +# 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_norm_loss'] = True +config['use_curvature'] = False + +config['pretrained_model'] = '' +config['pretrained_model_iteration'] = '' + +config['pyramid'] = dict() +config['pyramid']['resolutions'] = [32, 64, 128, 256, 512] +config['pyramid']['pretrained_pyramid'] = 'checkpoints/iccv/iccv_pyr_32_64_128_256_curv' +config['pyramid']['pretrained_pyramid_iteration'] = '' +config['pyramid']['final_upscale_enhancer'] = '' + +config['train_dir'] = '/home/workspace/local-data_127/train' +config['valid_dir'] = '/home/workspace/local-data_127/valid' +config['test_dir'] = '/home/workspace/local-data_127/test_ready' +config['batch_size'] = 4 +config['is_skirt'] = False +config['is_cape'] = False + +config['dataset_in_memory'] = False +config['resolution'] = None + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['lr'] = 0.0001 +config['starting_balancing_coeff'] = 0.001 +config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision +config['avg_garment_path'] = '' +config['bottleneck_scale'] = 2 + +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']['add_noise'] = False +config['pyramid']['noise_amount'] = 0.0 + +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']['static_model'] = 'checkpoints/iccv/static_iccv_1' +config['pyramid']['body_model'] = 'checkpoints/iccv/body_iccv_1' +config['pyramid']['curvature_model'] = 'checkpoints/iccv/curv_iccv_1' +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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 7 + level['encoder_depths'] = [3, 3, 3, 9, 3] + level['encoder_dims'] = [16, 32, 64, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = '' + config['pyramid']['levels'].append(level) + elif res == 256: + level = dict() + level['resolution'] = 256 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [3, 3, 9, 3] + level['encoder_dims'] = [64, 128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_256_2'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [9, 9, 9] + level['encoder_dims'] = [128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_128_2'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [9, 9] + level['encoder_dims'] = [64, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_64_2'#checkpoints/up_3_d64_128_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + elif res == 32: + level = dict() + level['resolution'] = 32 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [16] + level['encoder_dims'] = [level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_32_2'#'checkpoints/up_3_d32_64_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + else: + raise NotImplementedError + +config['cond_ae_static'] = dict() +config['cond_ae_static']['is_label'] = False +config['cond_ae_static']['kernel_size'] = 7 +config['cond_ae_static']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae_static']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae_static']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae_static']['bottleneck_size']] +config['cond_ae_static']['decoder_depths'] = config['cond_ae_static']['encoder_depths'] +config['cond_ae_static']['decoder_dims'] = config['cond_ae_static']['encoder_dims'] +config['cond_ae_static']['activation'] = 'tanh' + +config['cond_ae_curv'] = dict() +config['cond_ae_curv']['is_label'] = True +config['cond_ae_curv']['kernel_size'] = 7 +config['cond_ae_curv']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae_curv']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_curv']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_curv']['bottleneck_size']] +config['cond_ae_curv']['decoder_depths'] = config['cond_ae_curv']['encoder_depths'] +config['cond_ae_curv']['decoder_dims'] = config['cond_ae_curv']['encoder_dims'] +config['cond_ae_curv']['activation'] = 'tanh' + +config['cond_ae_body'] = dict() +config['cond_ae_body']['is_label'] = False +config['cond_ae_body']['kernel_size'] = 7 +config['cond_ae_body']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_body']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_body']['bottleneck_size']] +config['cond_ae_body']['decoder_depths'] = config['cond_ae_body']['encoder_depths'] +config['cond_ae_body']['decoder_dims'] = config['cond_ae_body']['encoder_dims'] +config['cond_ae_body']['activation'] = 'tanh' \ No newline at end of file diff --git a/configs/iccv/config_abl_pyr_32_64_128_256_512_skin.py b/configs/iccv/config_abl_pyr_32_64_128_256_512_skin.py new file mode 100644 index 0000000..3a30602 --- /dev/null +++ b/configs/iccv/config_abl_pyr_32_64_128_256_512_skin.py @@ -0,0 +1,195 @@ +config = dict() + +config['gpu'] = '4' +config['name'] = 'iccv_pyr_32_64_128_256_512_skin' +config['notes'] = '' +config['tags'] = ['pyr', 'iccv'] + +# 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'] = False # and deshaping +config['remove_global_orientation'] = True +config['use_extra_losses'] = True # edge, collision, 3d mesh +config['use_offsets'] = False +config['use_norm_loss'] = True +config['use_curvature'] = True + +config['pretrained_model'] = '' +config['pretrained_model_iteration'] = '' + +config['pyramid'] = dict() +config['pyramid']['resolutions'] = [32, 64, 128, 256, 512] +config['pyramid']['pretrained_pyramid'] = 'checkpoints/iccv/iccv_pyr_32_64_128_256_skin' +config['pyramid']['pretrained_pyramid_iteration'] = '' +config['pyramid']['final_upscale_enhancer'] = '' + +config['train_dir'] = '/home/workspace/local-data/train' +config['valid_dir'] = '/home/workspace/local-data/valid' +config['test_dir'] = '/home/workspace/local-data_127/test_ready' +config['batch_size'] = 4 +config['is_skirt'] = False +config['is_cape'] = False + +config['dataset_in_memory'] = False +config['resolution'] = None + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['lr'] = 0.0001 +config['starting_balancing_coeff'] = 0.001 +config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision +config['avg_garment_path'] = '' +config['bottleneck_scale'] = 2 + +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), + } + +if config['use_skinning']: + config['signature_dynamic']['uv_unposed'] = (512, 256, 3) + config['signature_dynamic']['mesh_unposed'] = (config['smpl_res'], 3,) +else: + config['signature_dynamic']['uv_posed'] = (512, 256, 3) +config['signature_static'] = { 'uv_static': (512, 256, 3), + 'mesh_mask': (config['smpl_res'],), + 'uv_mask': (512, 256,), + } + +config['pyramid']['is_label'] = False +config['pyramid']['add_noise'] = False +config['pyramid']['noise_amount'] = 0.0 + +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) + if config['use_skinning']: + config['signature_dynamic']['uv_unposed' + res_modifier] = (res, res//2, 3) + else: + config['signature_dynamic']['uv_posed' + 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']['static_model'] = 'checkpoints/iccv/static_iccv_1' +config['pyramid']['body_model'] = 'checkpoints/iccv/body_iccv_1' +config['pyramid']['curvature_model'] = 'checkpoints/iccv/curv_iccv_1' +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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 7 + level['encoder_depths'] = [3, 3, 3, 9, 3] + level['encoder_dims'] = [16, 32, 64, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = '' + config['pyramid']['levels'].append(level) + elif res == 256: + level = dict() + level['resolution'] = 256 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [3, 3, 9, 3] + level['encoder_dims'] = [64, 128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_256_2'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [9, 9, 9] + level['encoder_dims'] = [128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_128_2'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [9, 9] + level['encoder_dims'] = [64, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_64_2'#checkpoints/up_3_d64_128_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + elif res == 32: + level = dict() + level['resolution'] = 32 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [16] + level['encoder_dims'] = [level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_32_2'#'checkpoints/up_3_d32_64_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + else: + raise NotImplementedError + +config['cond_ae_static'] = dict() +config['cond_ae_static']['is_label'] = False +config['cond_ae_static']['kernel_size'] = 7 +config['cond_ae_static']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae_static']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae_static']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae_static']['bottleneck_size']] +config['cond_ae_static']['decoder_depths'] = config['cond_ae_static']['encoder_depths'] +config['cond_ae_static']['decoder_dims'] = config['cond_ae_static']['encoder_dims'] +config['cond_ae_static']['activation'] = 'tanh' + +config['cond_ae_curv'] = dict() +config['cond_ae_curv']['is_label'] = True +config['cond_ae_curv']['kernel_size'] = 7 +config['cond_ae_curv']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae_curv']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_curv']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_curv']['bottleneck_size']] +config['cond_ae_curv']['decoder_depths'] = config['cond_ae_curv']['encoder_depths'] +config['cond_ae_curv']['decoder_dims'] = config['cond_ae_curv']['encoder_dims'] +config['cond_ae_curv']['activation'] = 'tanh' + +config['cond_ae_body'] = dict() +config['cond_ae_body']['is_label'] = False +config['cond_ae_body']['kernel_size'] = 7 +config['cond_ae_body']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_body']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_body']['bottleneck_size']] +config['cond_ae_body']['decoder_depths'] = config['cond_ae_body']['encoder_depths'] +config['cond_ae_body']['decoder_dims'] = config['cond_ae_body']['encoder_dims'] +config['cond_ae_body']['activation'] = 'tanh' \ No newline at end of file diff --git a/configs/iccv/config_abl_pyr_32_64_128_256_512_skirt.py b/configs/iccv/config_abl_pyr_32_64_128_256_512_skirt.py new file mode 100644 index 0000000..bb50059 --- /dev/null +++ b/configs/iccv/config_abl_pyr_32_64_128_256_512_skirt.py @@ -0,0 +1,187 @@ +config = dict() + +config['gpu'] = '5' +config['name'] = 'iccv_pyr_32_64_128_256_512_skirt' +config['notes'] = '' +config['tags'] = ['pyr', 'iccv'] + +# 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_norm_loss'] = True +config['use_curvature'] = True + +config['pretrained_model'] = '' +config['pretrained_model_iteration'] = '' + +config['pyramid'] = dict() +config['pyramid']['resolutions'] = [32, 64, 128, 256, 512] +config['pyramid']['pretrained_pyramid'] = 'checkpoints/iccv/iccv_pyr_32_64_128_256_skirt_2' +config['pyramid']['pretrained_pyramid_iteration'] = '90000' +config['pyramid']['final_upscale_enhancer'] = '' + +config['train_dir'] = '/home/workspace/local-data_128/train_skirt' +config['valid_dir'] = '/home/workspace/local-data/valid_skirt' +config['test_dir'] = '/home/workspace/local-data/test_skirt_ready_2' +config['batch_size'] = 4 +config['is_skirt'] = True +config['is_cape'] = False + +config['dataset_in_memory'] = False +config['resolution'] = None + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['lr'] = 0.0001 +config['starting_balancing_coeff'] = 0.001 +config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision +config['avg_garment_path'] = '' +config['bottleneck_scale'] = 2 + +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']['add_noise'] = False +config['pyramid']['noise_amount'] = 0.0 + +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']['static_model'] = 'checkpoints/iccv/static_iccv_1_skirt' +config['pyramid']['body_model'] = 'checkpoints/iccv/body_iccv_1_skirt' +config['pyramid']['curvature_model'] = 'checkpoints/iccv/curv_iccv_1_skirt' +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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 7 + level['encoder_depths'] = [3, 3, 3, 9, 3] + level['encoder_dims'] = [16, 32, 64, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = '' + config['pyramid']['levels'].append(level) + elif res == 256: + level = dict() + level['resolution'] = 256 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [3, 3, 9, 3] + level['encoder_dims'] = [64, 128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_256_2_skirt'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [9, 9, 9] + level['encoder_dims'] = [64, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_128_2_skirt'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [9, 9] + level['encoder_dims'] = [64, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_64_2_skirt'#checkpoints/up_3_d64_128_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + elif res == 32: + level = dict() + level['resolution'] = 32 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [16] + level['encoder_dims'] = [level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_32_2_skirt'#'checkpoints/up_3_d32_64_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + else: + raise NotImplementedError + +config['cond_ae_static'] = dict() +config['cond_ae_static']['is_label'] = False +config['cond_ae_static']['kernel_size'] = 7 +config['cond_ae_static']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae_static']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae_static']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae_static']['bottleneck_size']] +config['cond_ae_static']['decoder_depths'] = config['cond_ae_static']['encoder_depths'] +config['cond_ae_static']['decoder_dims'] = config['cond_ae_static']['encoder_dims'] +config['cond_ae_static']['activation'] = 'tanh' + +config['cond_ae_curv'] = dict() +config['cond_ae_curv']['is_label'] = True +config['cond_ae_curv']['kernel_size'] = 7 +config['cond_ae_curv']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae_curv']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_curv']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_curv']['bottleneck_size']] +config['cond_ae_curv']['decoder_depths'] = config['cond_ae_curv']['encoder_depths'] +config['cond_ae_curv']['decoder_dims'] = config['cond_ae_curv']['encoder_dims'] +config['cond_ae_curv']['activation'] = 'tanh' + +config['cond_ae_body'] = dict() +config['cond_ae_body']['is_label'] = False +config['cond_ae_body']['kernel_size'] = 7 +config['cond_ae_body']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_body']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_body']['bottleneck_size']] +config['cond_ae_body']['decoder_depths'] = config['cond_ae_body']['encoder_depths'] +config['cond_ae_body']['decoder_dims'] = config['cond_ae_body']['encoder_dims'] +config['cond_ae_body']['activation'] = 'tanh' \ No newline at end of file diff --git a/configs/iccv/config_abl_pyr_32_64_128_256_curv.py b/configs/iccv/config_abl_pyr_32_64_128_256_curv.py new file mode 100644 index 0000000..b3b452f --- /dev/null +++ b/configs/iccv/config_abl_pyr_32_64_128_256_curv.py @@ -0,0 +1,187 @@ +config = dict() + +config['gpu'] = '3' +config['name'] = 'iccv_pyr_32_64_128_256_curv' +config['notes'] = '' +config['tags'] = ['pyr', 'iccv', 'curv'] + +# 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_norm_loss'] = True +config['use_curvature'] = False + +config['pretrained_model'] = '' +config['pretrained_model_iteration'] = '' + +config['pyramid'] = dict() +config['pyramid']['resolutions'] = [32, 64, 128, 256] +config['pyramid']['pretrained_pyramid'] = 'checkpoints/iccv/iccv_pyr_32_64_128_curv' +config['pyramid']['pretrained_pyramid_iteration'] = '' +config['pyramid']['final_upscale_enhancer'] = '' + +config['train_dir'] = '/home/workspace/local-data_127/train' +config['valid_dir'] = '/home/workspace/local-data_127/valid' +config['test_dir'] = '/home/workspace/local-data_127/test_ready' +config['batch_size'] = 4 +config['is_skirt'] = False +config['is_cape'] = False + +config['dataset_in_memory'] = False +config['resolution'] = None + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['lr'] = 0.0001 +config['starting_balancing_coeff'] = 0.001 +config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision +config['avg_garment_path'] = '' +config['bottleneck_scale'] = 2 + +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']['add_noise'] = False +config['pyramid']['noise_amount'] = 0.0 + +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']['static_model'] = 'checkpoints/iccv/static_iccv_1' +config['pyramid']['body_model'] = 'checkpoints/iccv/body_iccv_1' +config['pyramid']['curvature_model'] = 'checkpoints/iccv/curv_iccv_1' +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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 7 + level['encoder_depths'] = [3, 3, 3, 9, 3] + level['encoder_dims'] = [16, 32, 64, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = '' + config['pyramid']['levels'].append(level) + elif res == 256: + level = dict() + level['resolution'] = 256 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [3, 3, 9, 3] + level['encoder_dims'] = [64, 128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_256_2'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [9, 9, 9] + level['encoder_dims'] = [128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_128_2'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [9, 9] + level['encoder_dims'] = [64, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_64_2'#checkpoints/up_3_d64_128_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + elif res == 32: + level = dict() + level['resolution'] = 32 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [16] + level['encoder_dims'] = [level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_32_2'#'checkpoints/up_3_d32_64_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + else: + raise NotImplementedError + +config['cond_ae_static'] = dict() +config['cond_ae_static']['is_label'] = False +config['cond_ae_static']['kernel_size'] = 7 +config['cond_ae_static']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae_static']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae_static']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae_static']['bottleneck_size']] +config['cond_ae_static']['decoder_depths'] = config['cond_ae_static']['encoder_depths'] +config['cond_ae_static']['decoder_dims'] = config['cond_ae_static']['encoder_dims'] +config['cond_ae_static']['activation'] = 'tanh' + +config['cond_ae_curv'] = dict() +config['cond_ae_curv']['is_label'] = True +config['cond_ae_curv']['kernel_size'] = 7 +config['cond_ae_curv']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae_curv']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_curv']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_curv']['bottleneck_size']] +config['cond_ae_curv']['decoder_depths'] = config['cond_ae_curv']['encoder_depths'] +config['cond_ae_curv']['decoder_dims'] = config['cond_ae_curv']['encoder_dims'] +config['cond_ae_curv']['activation'] = 'tanh' + +config['cond_ae_body'] = dict() +config['cond_ae_body']['is_label'] = False +config['cond_ae_body']['kernel_size'] = 7 +config['cond_ae_body']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_body']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_body']['bottleneck_size']] +config['cond_ae_body']['decoder_depths'] = config['cond_ae_body']['encoder_depths'] +config['cond_ae_body']['decoder_dims'] = config['cond_ae_body']['encoder_dims'] +config['cond_ae_body']['activation'] = 'tanh' \ No newline at end of file diff --git a/configs/iccv/config_abl_pyr_32_64_128_256_reg.py b/configs/iccv/config_abl_pyr_32_64_128_256_reg.py new file mode 100644 index 0000000..1255cc2 --- /dev/null +++ b/configs/iccv/config_abl_pyr_32_64_128_256_reg.py @@ -0,0 +1,187 @@ +config = dict() + +config['gpu'] = '1' +config['name'] = 'iccv_pyr_32_64_128_256_reg' +config['notes'] = '' +config['tags'] = ['pyr', 'iccv', 'reg'] + +# 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'] = False # edge, collision, 3d mesh +config['use_offsets'] = False +config['use_norm_loss'] = False +config['use_curvature'] = True + +config['pretrained_model'] = '' +config['pretrained_model_iteration'] = '' + +config['pyramid'] = dict() +config['pyramid']['resolutions'] = [32, 64, 128, 256] +config['pyramid']['pretrained_pyramid'] = 'checkpoints/iccv/iccv_pyr_32_64_128_reg_2' +config['pyramid']['pretrained_pyramid_iteration'] = '' +config['pyramid']['final_upscale_enhancer'] = '' + +config['train_dir'] = '/home/workspace/local-data_127/train' +config['valid_dir'] = '/home/workspace/local-data_127/valid' +config['test_dir'] = '/home/workspace/local-data_127/test_ready' +config['batch_size'] = 4 +config['is_skirt'] = False +config['is_cape'] = False + +config['dataset_in_memory'] = False +config['resolution'] = None + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['lr'] = 0.0001 +config['starting_balancing_coeff'] = 0.001 +config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision +config['avg_garment_path'] = '' +config['bottleneck_scale'] = 2 + +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']['add_noise'] = False +config['pyramid']['noise_amount'] = 0.0 + +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']['static_model'] = 'checkpoints/iccv/static_iccv_1' +config['pyramid']['body_model'] = 'checkpoints/iccv/body_iccv_1' +config['pyramid']['curvature_model'] = 'checkpoints/iccv/curv_iccv_1' +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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 7 + level['encoder_depths'] = [3, 3, 3, 9, 3] + level['encoder_dims'] = [16, 32, 64, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = '' + config['pyramid']['levels'].append(level) + elif res == 256: + level = dict() + level['resolution'] = 256 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [3, 3, 9, 3] + level['encoder_dims'] = [64, 128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_256_2'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [9, 9, 9] + level['encoder_dims'] = [128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_128_2'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [9, 9] + level['encoder_dims'] = [64, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_64_2'#checkpoints/up_3_d64_128_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + elif res == 32: + level = dict() + level['resolution'] = 32 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [16] + level['encoder_dims'] = [level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_32_2'#'checkpoints/up_3_d32_64_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + else: + raise NotImplementedError + +config['cond_ae_static'] = dict() +config['cond_ae_static']['is_label'] = False +config['cond_ae_static']['kernel_size'] = 7 +config['cond_ae_static']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae_static']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae_static']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae_static']['bottleneck_size']] +config['cond_ae_static']['decoder_depths'] = config['cond_ae_static']['encoder_depths'] +config['cond_ae_static']['decoder_dims'] = config['cond_ae_static']['encoder_dims'] +config['cond_ae_static']['activation'] = 'tanh' + +config['cond_ae_curv'] = dict() +config['cond_ae_curv']['is_label'] = True +config['cond_ae_curv']['kernel_size'] = 7 +config['cond_ae_curv']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae_curv']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_curv']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_curv']['bottleneck_size']] +config['cond_ae_curv']['decoder_depths'] = config['cond_ae_curv']['encoder_depths'] +config['cond_ae_curv']['decoder_dims'] = config['cond_ae_curv']['encoder_dims'] +config['cond_ae_curv']['activation'] = 'tanh' + +config['cond_ae_body'] = dict() +config['cond_ae_body']['is_label'] = False +config['cond_ae_body']['kernel_size'] = 7 +config['cond_ae_body']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_body']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_body']['bottleneck_size']] +config['cond_ae_body']['decoder_depths'] = config['cond_ae_body']['encoder_depths'] +config['cond_ae_body']['decoder_dims'] = config['cond_ae_body']['encoder_dims'] +config['cond_ae_body']['activation'] = 'tanh' \ No newline at end of file diff --git a/configs/iccv/config_abl_pyr_32_64_128_256_skin.py b/configs/iccv/config_abl_pyr_32_64_128_256_skin.py new file mode 100644 index 0000000..266df2e --- /dev/null +++ b/configs/iccv/config_abl_pyr_32_64_128_256_skin.py @@ -0,0 +1,195 @@ +config = dict() + +config['gpu'] = '4' +config['name'] = 'iccv_pyr_32_64_128_256_skin' +config['notes'] = '' +config['tags'] = ['pyr', 'iccv'] + +# 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'] = False # and deshaping +config['remove_global_orientation'] = True +config['use_extra_losses'] = True # edge, collision, 3d mesh +config['use_offsets'] = False +config['use_norm_loss'] = True +config['use_curvature'] = True + +config['pretrained_model'] = '' +config['pretrained_model_iteration'] = '' + +config['pyramid'] = dict() +config['pyramid']['resolutions'] = [32, 64, 128, 256] +config['pyramid']['pretrained_pyramid'] = 'checkpoints/iccv/iccv_pyr_32_64_128_skin_2' +config['pyramid']['pretrained_pyramid_iteration'] = '' +config['pyramid']['final_upscale_enhancer'] = '' + +config['train_dir'] = '/home/workspace/local-data/train' +config['valid_dir'] = '/home/workspace/local-data/valid' +config['test_dir'] = '/home/workspace/local-data_127/test_ready' +config['batch_size'] = 4 +config['is_skirt'] = False +config['is_cape'] = False + +config['dataset_in_memory'] = False +config['resolution'] = None + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['lr'] = 0.0001 +config['starting_balancing_coeff'] = 0.001 +config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision +config['avg_garment_path'] = '' +config['bottleneck_scale'] = 2 + +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), + } +if config['use_skinning']: + config['signature_dynamic']['uv_unposed'] = (512, 256, 3) + config['signature_dynamic']['mesh_unposed'] = (config['smpl_res'], 3,) +else: + config['signature_dynamic']['uv_posed'] = (512, 256, 3) +config['signature_static'] = { 'uv_static': (512, 256, 3), + 'mesh_mask': (config['smpl_res'],), + 'uv_mask': (512, 256,), + } + +config['pyramid']['is_label'] = False +config['pyramid']['add_noise'] = False +config['pyramid']['noise_amount'] = 0.0 + +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) + if config['use_skinning']: + config['signature_dynamic']['uv_unposed' + res_modifier] = (res, res//2, 3) + else: + config['signature_dynamic']['uv_posed' + 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']['static_model'] = 'checkpoints/iccv/static_iccv_1' +config['pyramid']['body_model'] = 'checkpoints/iccv/body_iccv_1' +config['pyramid']['curvature_model'] = 'checkpoints/iccv/curv_iccv_1' +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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 7 + level['encoder_depths'] = [3, 3, 9, 3] + level['encoder_dims'] = [32, 64, 128, level['latent_dim']] + 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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [3, 3, 9, 3] + level['encoder_dims'] = [64, 128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_256_2'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [9, 9, 9] + level['encoder_dims'] = [128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_128_2'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [9, 9] + level['encoder_dims'] = [64, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_64_2'#checkpoints/up_3_d64_128_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + elif res == 32: + level = dict() + level['resolution'] = 32 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [16] + level['encoder_dims'] = [level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_32_2'#'checkpoints/up_3_d32_64_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + else: + raise NotImplementedError + +config['cond_ae_static'] = dict() +config['cond_ae_static']['is_label'] = False +config['cond_ae_static']['kernel_size'] = 7 +config['cond_ae_static']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae_static']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae_static']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae_static']['bottleneck_size']] +config['cond_ae_static']['decoder_depths'] = config['cond_ae_static']['encoder_depths'] +config['cond_ae_static']['decoder_dims'] = config['cond_ae_static']['encoder_dims'] +config['cond_ae_static']['activation'] = 'tanh' + +config['cond_ae_curv'] = dict() +config['cond_ae_curv']['is_label'] = True +config['cond_ae_curv']['kernel_size'] = 7 +config['cond_ae_curv']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae_curv']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_curv']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_curv']['bottleneck_size']] +config['cond_ae_curv']['decoder_depths'] = config['cond_ae_curv']['encoder_depths'] +config['cond_ae_curv']['decoder_dims'] = config['cond_ae_curv']['encoder_dims'] +config['cond_ae_curv']['activation'] = 'tanh' + +config['cond_ae_body'] = dict() +config['cond_ae_body']['is_label'] = False +config['cond_ae_body']['kernel_size'] = 7 +config['cond_ae_body']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_body']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_body']['bottleneck_size']] +config['cond_ae_body']['decoder_depths'] = config['cond_ae_body']['encoder_depths'] +config['cond_ae_body']['decoder_dims'] = config['cond_ae_body']['encoder_dims'] +config['cond_ae_body']['activation'] = 'tanh' \ No newline at end of file diff --git a/configs/iccv/config_abl_pyr_32_64_128_256_skirt.py b/configs/iccv/config_abl_pyr_32_64_128_256_skirt.py index 0d42f49..18125f4 100644 --- a/configs/iccv/config_abl_pyr_32_64_128_256_skirt.py +++ b/configs/iccv/config_abl_pyr_32_64_128_256_skirt.py @@ -1,6 +1,6 @@ config = dict() -config['gpu'] = '1' +config['gpu'] = '3' config['name'] = 'iccv_pyr_32_64_128_256_skirt_2' config['notes'] = '' config['tags'] = ['pyr', 'iccv'] @@ -94,11 +94,10 @@ for res in config['pyramid']['resolutions']: level['resolution'] = 512 level['latent_dim'] = 64 * config['bottleneck_scale'] level['kernel_size'] = 7 - level['encoder_depths'] = [3, 3, 9, 3] - level['encoder_dims'] = [32, 64, 128, level['latent_dim']] - level['decoder_input'] = (16, 8, 80) - level['decoder_depths'] = [3, 3, 9, 3] - level['decoder_dims'] = [256, 128, 64, 16] + level['encoder_depths'] = [3, 3, 3, 9, 3] + level['encoder_dims'] = [16, 32, 64, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] level['avg_garment_path'] = '' level['upscale_enhancer'] = '' config['pyramid']['levels'].append(level) diff --git a/configs/iccv/config_abl_pyr_32_64_128_curv.py b/configs/iccv/config_abl_pyr_32_64_128_curv.py index 38b2a57..edd7eb5 100644 --- a/configs/iccv/config_abl_pyr_32_64_128_curv.py +++ b/configs/iccv/config_abl_pyr_32_64_128_curv.py @@ -1,6 +1,6 @@ config = dict() -config['gpu'] = '5' +config['gpu'] = '2' config['name'] = 'iccv_pyr_32_64_128_curv' config['notes'] = '' config['tags'] = ['pyr', 'iccv', 'curv'] diff --git a/configs/iccv/config_abl_pyr_32_64_128_curv_skirt.py b/configs/iccv/config_abl_pyr_32_64_128_curv_skirt.py new file mode 100644 index 0000000..83c2396 --- /dev/null +++ b/configs/iccv/config_abl_pyr_32_64_128_curv_skirt.py @@ -0,0 +1,189 @@ +config = dict() + +config['gpu'] = '2' +config['name'] = 'iccv_pyr_32_64_128_curv_skirt' +config['notes'] = '' +config['tags'] = ['pyr', 'iccv', 'curv', 'skirt'] + +# 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_norm_loss'] = True +config['use_curvature'] = False + +config['pretrained_model'] = '' +config['pretrained_model_iteration'] = '' + +config['pyramid'] = dict() +config['pyramid']['resolutions'] = [32, 64, 128] +config['pyramid']['pretrained_pyramid'] = 'checkpoints/iccv/iccv_pyr_32_64_curv_skirt' +config['pyramid']['pretrained_pyramid_iteration'] = '60000' +config['pyramid']['final_upscale_enhancer'] = '' + +config['train_dir'] = '/home/workspace/local-data_128/train_skirt' +config['valid_dir'] = '/home/workspace/local-data/valid_skirt' +config['test_dir'] = '/home/workspace/local-data_128/test_skirt_ready_2' +config['batch_size'] = 4 +config['is_skirt'] = True +config['is_cape'] = False + +config['dataset_in_memory'] = False +config['resolution'] = None + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['lr'] = 0.0001 +config['starting_balancing_coeff'] = 0.001 +config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision +config['avg_garment_path'] = '' +config['bottleneck_scale'] = 2 + +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']['add_noise'] = False +config['pyramid']['noise_amount'] = 0.0 + +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']['static_model'] = 'checkpoints/iccv/static_iccv_1_skirt' +config['pyramid']['body_model'] = 'checkpoints/iccv/body_iccv_1_skirt' +config['pyramid']['curvature_model'] = 'checkpoints/iccv/curv_iccv_1_skirt' +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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 7 + level['encoder_depths'] = [3, 3, 9, 3] + level['encoder_dims'] = [32, 64, 128, level['latent_dim']] + 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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [9, 9, 9, 9] + level['encoder_dims'] = [32, 64, 128, level['latent_dim']] + 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/iccv/iccv_'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [9, 9, 9] + level['encoder_dims'] = [128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_128_2_skirt'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [9, 9] + level['encoder_dims'] = [64, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_64_2_skirt'#checkpoints/up_3_d64_128_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + elif res == 32: + level = dict() + level['resolution'] = 32 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [16] + level['encoder_dims'] = [level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_32_2_skirt'#'checkpoints/up_3_d32_64_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + else: + raise NotImplementedError + +config['cond_ae_static'] = dict() +config['cond_ae_static']['is_label'] = False +config['cond_ae_static']['kernel_size'] = 7 +config['cond_ae_static']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae_static']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae_static']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae_static']['bottleneck_size']] +config['cond_ae_static']['decoder_depths'] = config['cond_ae_static']['encoder_depths'] +config['cond_ae_static']['decoder_dims'] = config['cond_ae_static']['encoder_dims'] +config['cond_ae_static']['activation'] = 'tanh' + +config['cond_ae_curv'] = dict() +config['cond_ae_curv']['is_label'] = True +config['cond_ae_curv']['kernel_size'] = 7 +config['cond_ae_curv']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae_curv']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_curv']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_curv']['bottleneck_size']] +config['cond_ae_curv']['decoder_depths'] = config['cond_ae_curv']['encoder_depths'] +config['cond_ae_curv']['decoder_dims'] = config['cond_ae_curv']['encoder_dims'] +config['cond_ae_curv']['activation'] = 'tanh' + +config['cond_ae_body'] = dict() +config['cond_ae_body']['is_label'] = False +config['cond_ae_body']['kernel_size'] = 7 +config['cond_ae_body']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_body']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_body']['bottleneck_size']] +config['cond_ae_body']['decoder_depths'] = config['cond_ae_body']['encoder_depths'] +config['cond_ae_body']['decoder_dims'] = config['cond_ae_body']['encoder_dims'] +config['cond_ae_body']['activation'] = 'tanh' \ No newline at end of file diff --git a/configs/iccv/config_abl_pyr_32_64_128_reg.py b/configs/iccv/config_abl_pyr_32_64_128_reg.py index 05b70b2..23d4fef 100644 --- a/configs/iccv/config_abl_pyr_32_64_128_reg.py +++ b/configs/iccv/config_abl_pyr_32_64_128_reg.py @@ -1,6 +1,6 @@ config = dict() -config['gpu'] = '1' +config['gpu'] = '0' config['name'] = 'iccv_pyr_32_64_128_reg_2' config['notes'] = '' config['tags'] = ['pyr', 'iccv', 'reg'] diff --git a/configs/iccv/config_abl_pyr_32_64_128_reg_skirt.py b/configs/iccv/config_abl_pyr_32_64_128_reg_skirt.py new file mode 100644 index 0000000..4da9afd --- /dev/null +++ b/configs/iccv/config_abl_pyr_32_64_128_reg_skirt.py @@ -0,0 +1,189 @@ +config = dict() + +config['gpu'] = '3' +config['name'] = 'iccv_pyr_32_64_128_reg_skirt' +config['notes'] = '' +config['tags'] = ['pyr', 'iccv', 'reg'] + +# 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'] = False # edge, collision, 3d mesh +config['use_offsets'] = False +config['use_norm_loss'] = False +config['use_curvature'] = True + +config['pretrained_model'] = '' +config['pretrained_model_iteration'] = '' + +config['pyramid'] = dict() +config['pyramid']['resolutions'] = [32, 64, 128] +config['pyramid']['pretrained_pyramid'] = 'checkpoints/iccv/iccv_pyr_32_64_reg_skirt' +config['pyramid']['pretrained_pyramid_iteration'] = '' +config['pyramid']['final_upscale_enhancer'] = '' + +config['train_dir'] = '/home/workspace/local-data_128/train_skirt' +config['valid_dir'] = '/home/workspace/local-data_127/valid_skirt' +config['test_dir'] = '/home/workspace/local-data_128/test_skirt_ready_2' +config['batch_size'] = 4 +config['is_skirt'] = True +config['is_cape'] = False + +config['dataset_in_memory'] = False +config['resolution'] = None + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['lr'] = 0.0001 +config['starting_balancing_coeff'] = 0.001 +config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision +config['avg_garment_path'] = '' +config['bottleneck_scale'] = 2 + +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']['add_noise'] = False +config['pyramid']['noise_amount'] = 0.0 + +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']['static_model'] = 'checkpoints/iccv/static_iccv_1_skirt' +config['pyramid']['body_model'] = 'checkpoints/iccv/body_iccv_1_skirt' +config['pyramid']['curvature_model'] = 'checkpoints/iccv/curv_iccv_1_skirt' +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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 7 + level['encoder_depths'] = [3, 3, 9, 3] + level['encoder_dims'] = [32, 64, 128, level['latent_dim']] + 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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [9, 9, 9, 9] + level['encoder_dims'] = [32, 64, 128, level['latent_dim']] + 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/iccv/iccv_'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [9, 9, 9] + level['encoder_dims'] = [128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_128_2_skirt'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [9, 9] + level['encoder_dims'] = [64, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_64_2_skirt'#checkpoints/up_3_d64_128_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + elif res == 32: + level = dict() + level['resolution'] = 32 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [16] + level['encoder_dims'] = [level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_32_2_skirt'#'checkpoints/up_3_d32_64_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + else: + raise NotImplementedError + +config['cond_ae_static'] = dict() +config['cond_ae_static']['is_label'] = False +config['cond_ae_static']['kernel_size'] = 7 +config['cond_ae_static']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae_static']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae_static']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae_static']['bottleneck_size']] +config['cond_ae_static']['decoder_depths'] = config['cond_ae_static']['encoder_depths'] +config['cond_ae_static']['decoder_dims'] = config['cond_ae_static']['encoder_dims'] +config['cond_ae_static']['activation'] = 'tanh' + +config['cond_ae_curv'] = dict() +config['cond_ae_curv']['is_label'] = True +config['cond_ae_curv']['kernel_size'] = 7 +config['cond_ae_curv']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae_curv']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_curv']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_curv']['bottleneck_size']] +config['cond_ae_curv']['decoder_depths'] = config['cond_ae_curv']['encoder_depths'] +config['cond_ae_curv']['decoder_dims'] = config['cond_ae_curv']['encoder_dims'] +config['cond_ae_curv']['activation'] = 'tanh' + +config['cond_ae_body'] = dict() +config['cond_ae_body']['is_label'] = False +config['cond_ae_body']['kernel_size'] = 7 +config['cond_ae_body']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_body']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_body']['bottleneck_size']] +config['cond_ae_body']['decoder_depths'] = config['cond_ae_body']['encoder_depths'] +config['cond_ae_body']['decoder_dims'] = config['cond_ae_body']['encoder_dims'] +config['cond_ae_body']['activation'] = 'tanh' \ No newline at end of file diff --git a/configs/iccv/config_abl_pyr_32_64_128_skin.py b/configs/iccv/config_abl_pyr_32_64_128_skin.py index 67abeec..aeddde8 100644 --- a/configs/iccv/config_abl_pyr_32_64_128_skin.py +++ b/configs/iccv/config_abl_pyr_32_64_128_skin.py @@ -1,6 +1,6 @@ config = dict() -config['gpu'] = '5' +config['gpu'] = '4' config['name'] = 'iccv_pyr_32_64_128_skin_2' config['notes'] = '' config['tags'] = ['pyr', 'iccv'] diff --git a/configs/iccv/config_abl_pyr_32_64_128_skin_skirt.py b/configs/iccv/config_abl_pyr_32_64_128_skin_skirt.py new file mode 100644 index 0000000..8e48da3 --- /dev/null +++ b/configs/iccv/config_abl_pyr_32_64_128_skin_skirt.py @@ -0,0 +1,195 @@ +config = dict() + +config['gpu'] = '5' +config['name'] = 'iccv_pyr_32_64_128_skin_skirt' +config['notes'] = '' +config['tags'] = ['pyr', 'iccv'] + +# 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'] = False # and deshaping +config['remove_global_orientation'] = True +config['use_extra_losses'] = True # edge, collision, 3d mesh +config['use_offsets'] = False +config['use_norm_loss'] = True +config['use_curvature'] = True + +config['pretrained_model'] = '' +config['pretrained_model_iteration'] = '' + +config['pyramid'] = dict() +config['pyramid']['resolutions'] = [32, 64, 128] +config['pyramid']['pretrained_pyramid'] = 'checkpoints/iccv/iccv_pyr_32_64_skin_skirt' +config['pyramid']['final_upscale_enhancer'] = '' + +config['train_dir'] = '/home/workspace/local-data_128/train_skirt' +config['valid_dir'] = '/home/workspace/local-data_127/valid_skirt' +config['test_dir'] = '/home/workspace/local-data_128/test_skirt_ready_2' +config['batch_size'] = 4 +config['is_skirt'] = True +config['is_cape'] = False + +config['dataset_in_memory'] = False +config['resolution'] = None + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['lr'] = 0.0001 +config['starting_balancing_coeff'] = 0.001 +config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision +config['avg_garment_path'] = '' +config['bottleneck_scale'] = 2 + +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), + } +if config['use_skinning']: + config['signature_dynamic']['uv_unposed'] = (512, 256, 3) + config['signature_dynamic']['mesh_unposed'] = (config['smpl_res'], 3,) +else: + config['signature_dynamic']['uv_posed'] = (512, 256, 3) +config['signature_static'] = { 'uv_static': (512, 256, 3), + 'mesh_mask': (config['smpl_res'],), + 'uv_mask': (512, 256,), + } + +config['pyramid']['is_label'] = False +config['pyramid']['add_noise'] = False +config['pyramid']['noise_amount'] = 0.0 + +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) + if config['use_skinning']: + config['signature_dynamic']['uv_unposed' + res_modifier] = (res, res//2, 3) + else: + config['signature_dynamic']['uv_posed' + 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']['static_model'] = 'checkpoints/iccv/static_iccv_1_skirt' +config['pyramid']['body_model'] = 'checkpoints/iccv/body_iccv_1_skirt' +config['pyramid']['curvature_model'] = 'checkpoints/iccv/curv_iccv_1_skirt' +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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 7 + level['encoder_depths'] = [3, 3, 9, 3] + level['encoder_dims'] = [32, 64, 128, level['latent_dim']] + 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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [9, 9, 9, 9] + level['encoder_dims'] = [32, 64, 128, level['latent_dim']] + 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/iccv/iccv_'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [9, 9, 9] + level['encoder_dims'] = [128, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_128_2_skirt'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [9, 9] + level['encoder_dims'] = [64, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_64_2_skirt'#checkpoints/up_3_d64_128_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + elif res == 32: + level = dict() + level['resolution'] = 32 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [16] + level['encoder_dims'] = [level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_32_2_skirt'#'checkpoints/up_3_d32_64_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + else: + raise NotImplementedError + +config['cond_ae_static'] = dict() +config['cond_ae_static']['is_label'] = False +config['cond_ae_static']['kernel_size'] = 7 +config['cond_ae_static']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae_static']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae_static']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae_static']['bottleneck_size']] +config['cond_ae_static']['decoder_depths'] = config['cond_ae_static']['encoder_depths'] +config['cond_ae_static']['decoder_dims'] = config['cond_ae_static']['encoder_dims'] +config['cond_ae_static']['activation'] = 'tanh' + +config['cond_ae_curv'] = dict() +config['cond_ae_curv']['is_label'] = True +config['cond_ae_curv']['kernel_size'] = 7 +config['cond_ae_curv']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae_curv']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_curv']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_curv']['bottleneck_size']] +config['cond_ae_curv']['decoder_depths'] = config['cond_ae_curv']['encoder_depths'] +config['cond_ae_curv']['decoder_dims'] = config['cond_ae_curv']['encoder_dims'] +config['cond_ae_curv']['activation'] = 'tanh' + +config['cond_ae_body'] = dict() +config['cond_ae_body']['is_label'] = False +config['cond_ae_body']['kernel_size'] = 7 +config['cond_ae_body']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_body']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_body']['bottleneck_size']] +config['cond_ae_body']['decoder_depths'] = config['cond_ae_body']['encoder_depths'] +config['cond_ae_body']['decoder_dims'] = config['cond_ae_body']['encoder_dims'] +config['cond_ae_body']['activation'] = 'tanh' \ No newline at end of file diff --git a/configs/iccv/config_abl_pyr_32_64_128_var.py b/configs/iccv/config_abl_pyr_32_64_128_var.py new file mode 100644 index 0000000..0f12e57 --- /dev/null +++ b/configs/iccv/config_abl_pyr_32_64_128_var.py @@ -0,0 +1,188 @@ +config = dict() + +config['gpu'] = '2' +config['name'] = 'iccv_pyr_32_64_128_var' +config['notes'] = '' +config['tags'] = ['pyr', 'iccv'] + +# 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_norm_loss'] = True +config['use_curvature'] = True + +config['pretrained_model'] = '' +config['pretrained_model_iteration'] = '' + +config['pyramid'] = dict() +config['pyramid']['resolutions'] = [32, 64, 128] +config['pyramid']['pretrained_pyramid'] = 'checkpoints/iccv/iccv_pyr_32_64_var' +config['pyramid']['final_upscale_enhancer'] = '' + +config['train_dir'] = '/home/workspace/local-data_127/train' +config['valid_dir'] = '/home/workspace/local-data_127/valid' +config['test_dir'] = '/home/workspace/local-data_127/test_ready' +config['batch_size'] = 4 +config['is_skirt'] = False +config['is_cape'] = False + +config['dataset_in_memory'] = False +config['resolution'] = None + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['lr'] = 0.0001 +config['starting_balancing_coeff'] = 0.1 +config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision +config['avg_garment_path'] = '' +config['bottleneck_scale'] = 2 + +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']['add_noise'] = False +config['pyramid']['noise_amount'] = 0.0 + +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']['static_model'] = 'checkpoints/iccv/static_iccv_1' +config['pyramid']['body_model'] = 'checkpoints/iccv/body_iccv_1' +config['pyramid']['curvature_model'] = 'checkpoints/iccv/curv_iccv_1' +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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 7 + level['encoder_depths'] = [3, 3, 9, 3] + level['encoder_dims'] = [32, 64, 128, level['latent_dim']] + 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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [9, 9, 9, 9] + level['encoder_dims'] = [32, 64, 128, level['latent_dim']] + 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/iccv/iccv_'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [9, 9, 9] + level['encoder_dims'] = [64, 128, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_128_2'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [9, 9] + level['encoder_dims'] = [64, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_64_2'#checkpoints/up_3_d64_128_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + elif res == 32: + level = dict() + level['resolution'] = 32 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [16] + level['encoder_dims'] = [level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_32_2'#'checkpoints/up_3_d32_64_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + else: + raise NotImplementedError + +config['cond_ae_static'] = dict() +config['cond_ae_static']['is_label'] = False +config['cond_ae_static']['kernel_size'] = 7 +config['cond_ae_static']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae_static']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae_static']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae_static']['bottleneck_size']] +config['cond_ae_static']['decoder_depths'] = config['cond_ae_static']['encoder_depths'] +config['cond_ae_static']['decoder_dims'] = config['cond_ae_static']['encoder_dims'] +config['cond_ae_static']['activation'] = 'tanh' + +config['cond_ae_curv'] = dict() +config['cond_ae_curv']['is_label'] = True +config['cond_ae_curv']['kernel_size'] = 7 +config['cond_ae_curv']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae_curv']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_curv']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_curv']['bottleneck_size']] +config['cond_ae_curv']['decoder_depths'] = config['cond_ae_curv']['encoder_depths'] +config['cond_ae_curv']['decoder_dims'] = config['cond_ae_curv']['encoder_dims'] +config['cond_ae_curv']['activation'] = 'tanh' + +config['cond_ae_body'] = dict() +config['cond_ae_body']['is_label'] = False +config['cond_ae_body']['kernel_size'] = 7 +config['cond_ae_body']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_body']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_body']['bottleneck_size']] +config['cond_ae_body']['decoder_depths'] = config['cond_ae_body']['encoder_depths'] +config['cond_ae_body']['decoder_dims'] = config['cond_ae_body']['encoder_dims'] +config['cond_ae_body']['activation'] = 'tanh' \ No newline at end of file diff --git a/configs/iccv/config_abl_pyr_32_64_reg.py b/configs/iccv/config_abl_pyr_32_64_reg.py index 96617fa..c30542c 100644 --- a/configs/iccv/config_abl_pyr_32_64_reg.py +++ b/configs/iccv/config_abl_pyr_32_64_reg.py @@ -1,6 +1,6 @@ config = dict() -config['gpu'] = '1' +config['gpu'] = '3' config['name'] = 'iccv_pyr_32_64_reg' config['notes'] = '' config['tags'] = ['pyr', 'iccv', 'reg'] @@ -31,8 +31,8 @@ config['pyramid']['pretrained_pyramid'] = 'checkpoints/iccv/iccv_pyr_32_reg/' config['pyramid']['pretrained_pyramid_iteration'] = '150000' config['pyramid']['final_upscale_enhancer'] = '' -config['train_dir'] = '/home/workspace/local-data/train' -config['valid_dir'] = '/home/workspace/local-data/valid' +config['train_dir'] = '/home/workspace/local-data_127/train' +config['valid_dir'] = '/home/workspace/local-data_127/valid' config['test_dir'] = '/home/workspace/local-data_127/test_ready' config['batch_size'] = 4 config['is_skirt'] = False diff --git a/configs/iccv/config_abl_pyr_32_64_reg_skirt.py b/configs/iccv/config_abl_pyr_32_64_reg_skirt.py index 27c4d0d..e44c7eb 100644 --- a/configs/iccv/config_abl_pyr_32_64_reg_skirt.py +++ b/configs/iccv/config_abl_pyr_32_64_reg_skirt.py @@ -1,6 +1,6 @@ config = dict() -config['gpu'] = '2' +config['gpu'] = '3' config['name'] = 'iccv_pyr_32_64_reg_skirt' config['notes'] = '' config['tags'] = ['pyr', 'iccv', 'reg'] @@ -32,7 +32,7 @@ config['pyramid']['pretrained_pyramid_iteration'] = '190000' config['pyramid']['final_upscale_enhancer'] = '' config['train_dir'] = '/home/workspace/local-data_128/train_skirt' -config['valid_dir'] = '/home/workspace/local-data/valid_skirt' +config['valid_dir'] = '/home/workspace/local-data_127/valid_skirt' config['test_dir'] = '/home/workspace/local-data_128/test_skirt_ready_2' config['batch_size'] = 4 config['is_skirt'] = True diff --git a/configs/iccv/config_abl_pyr_32_64_skin.py b/configs/iccv/config_abl_pyr_32_64_skin.py index ab95873..082b286 100644 --- a/configs/iccv/config_abl_pyr_32_64_skin.py +++ b/configs/iccv/config_abl_pyr_32_64_skin.py @@ -1,6 +1,6 @@ config = dict() -config['gpu'] = '1' +config['gpu'] = '2' config['name'] = 'iccv_pyr_32_64_skin' config['notes'] = '' config['tags'] = ['pyr', 'iccv'] diff --git a/configs/iccv/config_abl_pyr_32_64_skin_skirt.py b/configs/iccv/config_abl_pyr_32_64_skin_skirt.py new file mode 100644 index 0000000..f6979e3 --- /dev/null +++ b/configs/iccv/config_abl_pyr_32_64_skin_skirt.py @@ -0,0 +1,196 @@ +config = dict() + +config['gpu'] = '2' +config['name'] = 'iccv_pyr_32_64_skin_skirt' +config['notes'] = '' +config['tags'] = ['pyr', 'iccv'] + +# 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'] = False # and deshaping +config['remove_global_orientation'] = True +config['use_extra_losses'] = True # edge, collision, 3d mesh +config['use_offsets'] = False +config['use_norm_loss'] = True +config['use_curvature'] = True + +config['pretrained_model'] = '' +config['pretrained_model_iteration'] = '' + +config['pyramid'] = dict() +config['pyramid']['resolutions'] = [32, 64] +config['pyramid']['pretrained_pyramid'] = 'checkpoints/iccv/iccv_pyr_32_skin_skirt' +config['pyramid']['final_upscale_enhancer'] = '' + +config['train_dir'] = '/home/workspace/local-data_128/train_skirt' +config['valid_dir'] = '/home/workspace/local-data_127/valid_skirt' +config['test_dir'] = '/home/workspace/local-data_128/test_skirt_ready_2' +config['batch_size'] = 4 +config['is_skirt'] = True +config['is_cape'] = False + +config['dataset_in_memory'] = False +config['resolution'] = None + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['lr'] = 0.0001 +config['starting_balancing_coeff'] = 0.001 +config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision +config['avg_garment_path'] = '' +config['bottleneck_scale'] = 2 + +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), + } +if config['use_skinning']: + config['signature_dynamic']['uv_unposed'] = (512, 256, 3) + config['signature_dynamic']['mesh_unposed'] = (config['smpl_res'], 3,) +else: + config['signature_dynamic']['uv_posed'] = (512, 256, 3) +config['signature_static'] = { 'uv_static': (512, 256, 3), + 'mesh_mask': (config['smpl_res'],), + 'uv_mask': (512, 256,), + } + +config['pyramid']['is_label'] = False +config['pyramid']['add_noise'] = False +config['pyramid']['noise_amount'] = 0.0 + +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) + if config['use_skinning']: + config['signature_dynamic']['uv_unposed' + res_modifier] = (res, res//2, 3) + else: + config['signature_dynamic']['uv_posed' + 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']['static_model'] = 'checkpoints/iccv/static_iccv_1_skirt' +config['pyramid']['body_model'] = 'checkpoints/iccv/body_iccv_1_skirt' +config['pyramid']['curvature_model'] = 'checkpoints/iccv/curv_iccv_1_skirt' +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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 7 + level['encoder_depths'] = [3, 3, 9, 3] + level['encoder_dims'] = [32, 64, 128, level['latent_dim']] + 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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [9, 9, 9, 9] + level['encoder_dims'] = [32, 64, 128, level['latent_dim']] + 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/iccv/iccv_'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 5 + level['encoder_depths'] = [16, 9, 9, 9] + level['encoder_dims'] = [64, 128, 128, 64] + level['decoder_input'] = (4, 2, 128) + level['decoder_depths'] = [16, 9, 9, 9] + level['decoder_dims'] = [256, 128, 128, level['latent_dim']] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_'#'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'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [9, 9] + level['encoder_dims'] = [64, level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_64_2_skirt'#checkpoints/up_3_d64_128_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + elif res == 32: + level = dict() + level['resolution'] = 32 + level['latent_dim'] = 64 * config['bottleneck_scale'] + level['kernel_size'] = 3 + level['encoder_depths'] = [16] + level['encoder_dims'] = [level['latent_dim']] + level['decoder_depths'] = level['encoder_depths'] + level['decoder_dims'] = level['encoder_dims'] + level['avg_garment_path'] = '' + level['upscale_enhancer'] = 'checkpoints/iccv/iccv_32_2_skirt'#'checkpoints/up_3_d32_64_2' + level['upscale_enhancer_freeze'] = True + config['pyramid']['levels'].append(level) + else: + raise NotImplementedError + +config['cond_ae_static'] = dict() +config['cond_ae_static']['is_label'] = False +config['cond_ae_static']['kernel_size'] = 7 +config['cond_ae_static']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae_static']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae_static']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae_static']['bottleneck_size']] +config['cond_ae_static']['decoder_depths'] = config['cond_ae_static']['encoder_depths'] +config['cond_ae_static']['decoder_dims'] = config['cond_ae_static']['encoder_dims'] +config['cond_ae_static']['activation'] = 'tanh' + +config['cond_ae_curv'] = dict() +config['cond_ae_curv']['is_label'] = True +config['cond_ae_curv']['kernel_size'] = 7 +config['cond_ae_curv']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae_curv']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_curv']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_curv']['bottleneck_size']] +config['cond_ae_curv']['decoder_depths'] = config['cond_ae_curv']['encoder_depths'] +config['cond_ae_curv']['decoder_dims'] = config['cond_ae_curv']['encoder_dims'] +config['cond_ae_curv']['activation'] = 'tanh' + +config['cond_ae_body'] = dict() +config['cond_ae_body']['is_label'] = False +config['cond_ae_body']['kernel_size'] = 7 +config['cond_ae_body']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae_body']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae_body']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae_body']['bottleneck_size']] +config['cond_ae_body']['decoder_depths'] = config['cond_ae_body']['encoder_depths'] +config['cond_ae_body']['decoder_dims'] = config['cond_ae_body']['encoder_dims'] +config['cond_ae_body']['activation'] = 'tanh' \ No newline at end of file diff --git a/configs/iccv/config_cvae_curv.py b/configs/iccv/config_cvae_curv.py index 5ce9ad0..76368d0 100644 --- a/configs/iccv/config_cvae_curv.py +++ b/configs/iccv/config_cvae_curv.py @@ -18,7 +18,7 @@ config['use_norm_loss'] = True 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 -config['gpu'] = '5' +config['gpu'] = '0' config['name'] = 'cvae_curv' config['notes'] = '' config['tags'] = ['iccv', 'cvae_curv'] @@ -35,9 +35,9 @@ config['is_skirt'] = False config['dataset_in_memory'] = False config['is_cape'] = False -config['train_dir'] = '/home/workspace/local-data_127/train' -config['valid_dir'] = '/home/workspace/local-data_127/valid' -config['test_dir'] = '/home/workspace/data/dataset/test_ready' +config['train_dir'] = '/home/workspace/local-data/train' +config['valid_dir'] = '/home/workspace/local-data/valid' +config['test_dir'] = '/home/workspace/local-data/test_ready' config['static_model'] = 'checkpoints/iccv/static_iccv_1' config['body_model'] = 'checkpoints/iccv/body_iccv_1' diff --git a/custom_utils/faces.mat b/custom_utils/faces.mat new file mode 100644 index 0000000000000000000000000000000000000000..cd56a2d32730db7d8ff0fc3996c474851050345b GIT binary patch literal 230424 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

_tmsxx##w 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 literal 0 HcmV?d00001 diff --git a/cvae.py b/cvae.py index 7335287..27ee8cf 100644 --- a/cvae.py +++ b/cvae.py @@ -1,6 +1,6 @@ import os import sys -from configs.iccv.config_abl_all_cape_f import config +from configs.iccv.config_abl_all_skirt_var import config os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu'] import tensorflow as tf diff --git a/cvae_curv.py b/cvae_curv.py index d17c125..83838a3 100644 --- a/cvae_curv.py +++ b/cvae_curv.py @@ -251,90 +251,30 @@ def plot_everything(batch: dict, type: str): -def sample(folder): - load_model(model,folder) +def sample(): + iteration = load_model(model, f'checkpoints/iccv/cvae_curv', return_iteration=True) for batch in dataset_train: - batch = static_dataset_train.expand_batch(batch_to_dict(batch, signature_dynamic)) - uv_curvature = tf.one_hot(batch['uv_curvature'], 7) - nr_of_samples = 16 + batch = static_dataset_train.expand_batch(batch_to_dict(batch, config['signature_dynamic'])) + nr_of_samples = 4 # pred = model.sample(batch['uv_static'], batch['uv_body_posed'], batch['uv_mask']) - pred = model.sample_single(batch['uv_static'][0], batch['uv_body_posed'][0], batch['uv_mask'][0], nr_of_samples=nr_of_samples) - - ce_uv_loss = scce(tf.tile(batch['uv_curvature'][0][tf.newaxis,:,:], [nr_of_samples,1,1]), pred) - - - mesh_pred = uv2mesh(pred).numpy().argmax(axis=-1) - mesh_orig = batch['mesh_curvature'][0].numpy() - - F = np.load("custom_utils/smpl_faces.npy") - mask = batch['mesh_mask'].numpy().astype(bool)[0] - _, faces = _maskFaces(np.ones((14475, 3)), F, mask) - mesh_pred = [mesh_pred[i, mask] for i in range(mesh_pred.shape[0])] - curv_color = [np.zeros((mesh_pred[i].shape[0], 3)) for i in range(len(mesh_pred))] - mesh_orig = mesh_orig[mask] + 1 + # pred = model.sample_single(batch['uv_static'][0], batch['uv_body_posed'][0], batch['uv_mask'][0], nr_of_samples=nr_of_samples) + pred = model.sample(tf.tile(batch['uv_static'][0][None,:,:,:], [nr_of_samples,1,1,1]), tf.tile(batch['uv_body_posed'][0][None,:,:,:], [nr_of_samples,1,1,1]), tf.tile(batch['uv_mask'][0][None,:,:], [nr_of_samples,1,1])) + # pred,_,_ = model([tf.tile(batch['uv_static'][0][None,:,:,:], [nr_of_samples,1,1,1]), tf.tile(batch['uv_body_posed'][0][None,:,:,:], [nr_of_samples,1,1,1]), tf.tile(batch['uv_mask'][0][None,:,:], [nr_of_samples,1,1])], training=False) + + orig_img = np.argmax(batch['uv_curvature'][0].numpy(), axis=-1) + pred_img = np.argmax(pred.numpy(), axis=-1) + img = np.concatenate((orig_img, np.concatenate(pred_img, axis=1)), axis=1) colors = np.array([cm.color('jet', 1 - i) for i in np.linspace(0, 1, 6+1)]) - curv_color_gt = np.zeros((mesh_pred[0].shape[0], 3)) - for i in range(6+1): - for j in range(len(mesh_pred)): - curv_color[j][mesh_pred[j] == i, :] = colors[i] - curv_color_gt[mesh_orig == i, :] = colors[i] - - mesh_base = batch['mesh_posed'][0].numpy()[mask, :] - meshes = [] - meshes.append(go.Mesh3d( - # 8 vertices of a cube - x=mesh_base[:,0], - y=mesh_base[:,1], - z=mesh_base[:,2], - # i, j and k give the vertices of triangles - i = faces[:,0], - j = faces[:,1], - k = faces[:,2], - vertexcolor=curv_color_gt, - text='gt' - )) - - for i in range(nr_of_samples): - x = mesh_base.copy() - x[:, 1] += 1 * (i + 1) - meshes.append(go.Mesh3d( - # 8 vertices of a cube - x=x[:,0], - y=x[:,1], - z=x[:,2], - # i, j and k give the vertices of triangles - i = faces[:,0], - j = faces[:,1], - k = faces[:,2], - vertexcolor=curv_color[i] - )) - - - - - fig = go.Figure(data=meshes) - - fig.update_layout(scene_aspectmode='manual', scene_aspectratio=dict(x=1, y=nr_of_samples-1, z=1)) - fig.update_layout( - scene = dict( - xaxis = dict(nticks=4, range=[-1,1],), - yaxis = dict(nticks=4, range=[-1,nr_of_samples + 1],), - zaxis = dict(nticks=4, range=[-1,1],),) - ) - - # fig.show() - - pred = pred.numpy().argmax(-1) - frames = [Image.fromarray(pred[i]/6*255) for i in range(pred.shape[0])] - frames[0].save("temp/curv2.gif", format="GIF", append_images=frames[1:], - save_all=True, duration=500, loop=0) + color_img = np.zeros((img.shape[0], img.shape[1], 3), np.uint8) + for i in range(7): + color_img[img == i, :] = colors[i] print() if __name__ == '__main__': - init_wandb() + # init_wandb() parser = argparse.ArgumentParser(description='') parser.add_argument('--name', type=str) args = vars(parser.parse_args()) @@ -372,6 +312,8 @@ if __name__ == '__main__': model = CVAE(config) + sample() + # lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(0.0001, decay_steps=30000, decay_rate=0.1, staircase=False) optimizer = tf.optimizers.Adam(learning_rate=config['lr']) #0.0001 g_balancing_coeff = config['starting_balancing_coeff'] diff --git a/cvae_pyramid.py b/cvae_pyramid.py index 7dec104..801f702 100644 --- a/cvae_pyramid.py +++ b/cvae_pyramid.py @@ -1,6 +1,6 @@ import os import sys -from configs.iccv.config_abl_pyr_32_64_128_reg import config +from configs.iccv.config_abl_pyr_32_64_128_256_512_curv import config os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu'] import tensorflow as tf @@ -826,7 +826,7 @@ if __name__ == '__main__': # model.levels[0].upscale_enhancer.trainable = False - for i in range(len(model.levels)): + for i in range(len(model.levels)-1): load_model(model.levels[i].upscale_enhancer, config['pyramid']['levels'][i]['upscale_enhancer']) model.levels[i].upscale_enhancer.trainable = False # if config['pyramid']['resolutions'][-1] != 512: diff --git a/evaluate_ae.py b/evaluate_ae.py index 28bb889..1b24cb6 100644 --- a/evaluate_ae.py +++ b/evaluate_ae.py @@ -1,6 +1,6 @@ import os import sys -from configs.config_abl_all_post import config +from configs.iccv.config_abl_all import config os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu'] import tensorflow as tf @@ -103,11 +103,13 @@ if __name__ == '__main__': ids = set(ids) iteration = '' - - load_model(model, 'checkpoints/post/' + checkpoint_name, iteration=iteration) + if iteration == '': + iteration = load_model(model, 'checkpoints/iccv/' + checkpoint_name, return_iteration=True) + else: + load_model(model, 'checkpoints/iccv/' + checkpoint_name, iteration=iteration) # load_model(model, 'checkpoints/' + 'abl_all_120k') - output_folder = '/home/workspace/data/results/post/' + checkpoint_name + '-' + iteration + output_folder = '/home/workspace/local-data_128/results/iccv/' + checkpoint_name + '-' + iteration os.makedirs(output_folder, exist_ok=True) diff --git a/evaluate_ae_pyramid.py b/evaluate_ae_pyramid.py index ab1a1bb..2031708 100644 --- a/evaluate_ae_pyramid.py +++ b/evaluate_ae_pyramid.py @@ -1,6 +1,6 @@ import os import sys -from configs.iccv.config_abl_pyr_64_128_cape_f import config +from configs.iccv.config_abl_pyr_32_64_128_256_512_skirt import config os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu'] import tensorflow as tf diff --git a/get_error.py b/get_error.py index 2ed3d76..93ebaff 100644 --- a/get_error.py +++ b/get_error.py @@ -7,10 +7,10 @@ if __name__ == '__main__': garment_type_table = np.load('custom_data/garment_type_table_test.npy', allow_pickle=True).item() folder = '/home/workspace/data/results/errors/iccv' - checkpoint_name = 'iccv_pyr_32_64_curv' - checkpoint_name_skirt = 'iccv_pyr_32_64_curv_skirt' - iteration = '100000' - iteration_skirt : str = '60000' + checkpoint_name = 'iccv_pyr_32_64_skin' + checkpoint_name_skirt = 'iccv_pyr_32_64_skin_skirt' + iteration = '130000' + iteration_skirt : str = '65000' # checkpoint_name = 'abl_skin' # checkpoint_name_skirt = checkpoint_name + '_skirt' diff --git a/models/cvae_curv_model.py b/models/cvae_curv_model.py index 7c533a1..38940ce 100644 --- a/models/cvae_curv_model.py +++ b/models/cvae_curv_model.py @@ -79,16 +79,17 @@ class CVAE(tf.keras.Model): return z_cond + def sample(self, uv_template, uv_body_posed, uv_mask, noise=None): if noise is None: - eps = tf.random.normal(shape=(uv_template.shape[0], self.latent_dim)) + eps = tf.random.normal(shape=(uv_template.shape[0], 8, 4, self.latent_dim)) else: eps = noise z_cond = self.encode_conds(uv_template, uv_body_posed, training=False) z = tf.concat([eps, z_cond], axis=-1) - x = self.decoder(z, training=False) + x = self.decoder([z, uv_mask], training=False) # x = x * uv_mask[:,:,:,tf.newaxis] diff --git a/models/cvae_model.py b/models/cvae_model.py index 3e25769..9a9036e 100644 --- a/models/cvae_model.py +++ b/models/cvae_model.py @@ -203,7 +203,7 @@ class CVAENew(tf.keras.Model): # @tf.function def sample(self, uv_template, uv_body_posed, uv_curv, uv_mask, noise=None, add_noise=False): if noise is None: - eps = tf.random.normal(shape=(uv_template.shape[0], self.latent_dim)) + eps = tf.random.normal(shape=(uv_template.shape[0], 8, 4, self.latent_dim)) else: eps = noise diff --git a/models/pyramid_model_optimized.py b/models/pyramid_model_optimized.py index cee812b..f3661e5 100644 --- a/models/pyramid_model_optimized.py +++ b/models/pyramid_model_optimized.py @@ -358,8 +358,9 @@ class PyramidNew(tf.keras.Model): else: # if self.upscale_enhancer is not None: # pred = self.enhance(pred, levels_input[-1][-2], training=training) - pred = self.levels[-1].enhance(pred, levels_input[-1][-2], training=training) - pred = tf.image.resize(pred, (512, 256), tf.image.ResizeMethod.BILINEAR) + if len(self.levels) != 5: + pred = self.levels[-1].enhance(pred, levels_input[-1][-2], training=training) + pred = tf.image.resize(pred, (512, 256), tf.image.ResizeMethod.BILINEAR) pred = pred * levels_input[-1][-1][:,:,:,tf.newaxis] # full res uv mask out_levels.append([pred, mean, logvar]) diff --git a/plot_examples.py b/plot_examples.py index 1ed6b89..ab6c573 100644 --- a/plot_examples.py +++ b/plot_examples.py @@ -11,10 +11,11 @@ import tensorflow as tf import cmapy as cm import plotly.graph_objects as go import plotly.express as ex +import scipy.io as sio from plotly.subplots import make_subplots from dataset import DatasetFactory, StaticDataset -from custom_utils.custom_utils import batch_to_dict, UV2Mesh, _maskFaces, load_model +from custom_utils.custom_utils import batch_to_dict, UV2Mesh, _maskFaces, load_model, save_stl from custom_utils.smpl import SMPL from convert_to_uv_api import convert_to_uv_api from models.upscaler import UpscalerBasicConv as Upscaler @@ -121,6 +122,69 @@ def uv_mapping_example(mesh, faces, colors, mask): print() +def faces2graph(F, v=None): + if v: v = set(v) # Only this verts + G = {} + for f in F: + for i in f: + if v and i not in v: continue + if not i in G: + G[i] = {} + for j in f: + if v and j not in v: continue + if i == j: continue + G[i][j] = 1 + return G + +SMOOTH_IT = 100 +SMOOTH_EXHAUST_IT = 100 +def smooth(M, F, segm): + f_skirt = [] + for f in F: + f_skirt.append(f[0]) + + G = faces2graph(f_skirt) + # Segmentation for skirt smoothing + + # Laplacian smoothing + for _ in range(SMOOTH_EXHAUST_IT): + for v in segm['exhaustive'].reshape(-1): + M[v] = M[list(G[v].keys())].mean(0) + for _ in range(SMOOTH_IT): + # aux = M.copy() + # FRONT + for v in segm['front'].reshape(-1): + M[v] = M[list(G[v].keys())].mean(0) + for v in segm['frontBoundary'].reshape(-1): + M[v,:2] = M[list(G[v].keys()),:2].mean(0) # No z-smoothing + # BACK + for v in segm['back'].reshape(-1): + M[v] = M[list(G[v].keys())].mean(0) + for v in segm['backBoundary'].reshape(-1): + M[v,:2] = M[list(G[v].keys()),:2].mean(0) # No z-smoothing + # M = aux.copy() + + return M + + +def uv_mapping_example_skirt(mesh, faces, colors, mask): + segm = sio.loadmat('custom_utils/vg_skirt_smoothing') + F = sio.loadmat("custom_utils/faces_skirt.mat")['F'][0] + faces = np.load('custom_utils/smpl_faces_skirt.npy') + mesh = smooth(mesh, F, segm) + fig = plot_fixed(mesh, faces, colors) + fig.write_image('examples/' + type + '_' + id_str + '_' + frame_nr + '_body.png') + + # stop inbetween + uv = convert_to_uv_api(mesh, mask, is_skirt=True) + plot = custom_imshow((uv+1)/2) + # plot = custom_imshow(result) + # plot.write_image('examples/' + type + '_' + id_str + '_' + frame_nr + '_uv_body_pre.png') + plot.write_image('examples/' + type + '_' + id_str + '_' + frame_nr + '_uv_body_inpainted.png') + + print() + + def curvature_example(mesh_curvature, uv_curvature, posed, faces, mask): colors = np.array([cm.color('jet', 1 - i) for i in np.linspace(0, 1, mesh_curvature.max()+1)]) / 255.0 color_mesh = np.zeros((mesh_curvature.shape[0], 3), np.float32) @@ -172,7 +236,7 @@ def plot_upscaling(uv_low, uv_high, uv_mask_low, uv_mask_high, faces, color, mas print() - if __name__ == '__main__': +if __name__ == '__main__': uv2mesh = UV2Mesh() smpl = SMPL() @@ -209,8 +273,9 @@ def plot_upscaling(uv_low, uv_high, uv_mask_low, uv_mask_high, faces, color, mas do_repeat=False, resolutions=[512, 32], # frames_file='/home/workspace/data/dataset/test_ready/frames_pose_cluster_20_sample_10.txt', - # frames_file='/home/workspace/data/dataset/test_ready/frames_00438_146.txt', - frames_file='/home/workspace/data/dataset/test_ready/frames_00228_137.txt', + frames_file='/home/workspace/data/dataset/test_ready/frames_00438_146.txt', + # frames_file='/home/workspace/data/dataset/test_ready/frames_00228_137.txt', + # frames_file='/home/workspace/data/dataset/test_ready/frames_02572_1.txt', ) static_dataset = StaticDataset(folder='/home/workspace/data/dataset/test_ready', resolutions=[512, 32], @@ -302,7 +367,8 @@ def plot_upscaling(uv_low, uv_high, uv_mask_low, uv_mask_high, faces, color, mas # fig.write_image('examples/' + type + '_' + id_str + '_' + frame_nr + '_unposed_shaped.svg') # uv_mapping_example(body, F, colors[:14475, :], np.ones((14475), bool)) + uv_mapping_example_skirt(body, F, colors[:14475, :], np.ones((14475), bool)) # curvature_example(batch['mesh_curvature'][0].numpy(), uv_curvature, posed, faces_garment, mask) - plot_upscaling(batch['uv_unposed_32'].numpy()[0], batch['uv_unposed'].numpy()[0], batch['uv_mask_32'].numpy()[0], batch['uv_mask'].numpy()[0], faces_garment, colors_garment, mask) + # plot_upscaling(batch['uv_unposed_32'].numpy()[0], batch['uv_unposed'].numpy()[0], batch['uv_mask_32'].numpy()[0], batch['uv_mask'].numpy()[0], faces_garment, colors_garment, mask) print() \ No newline at end of file diff --git a/sample_pro_2.py b/sample_pro_2.py index 8512f14..1a28a2e 100644 --- a/sample_pro_2.py +++ b/sample_pro_2.py @@ -1,5 +1,5 @@ import os -os.environ["CUDA_VISIBLE_DEVICES"] = "6" +os.environ["CUDA_VISIBLE_DEVICES"] = "4" import tensorflow as tf gpus = tf.config.experimental.list_physical_devices('GPU') @@ -31,7 +31,7 @@ from PIL import Image from plotly.subplots import make_subplots from custom_utils.smpl import SMPL -from custom_utils.custom_utils import load_model +from custom_utils.custom_utils import load_model, save_stl from plotly.subplots import make_subplots from scipy.spatial.transform import Rotation @@ -44,10 +44,12 @@ from postprocessing import fix_collision from models.pyramid_model_optimized import Pyramid # from configs.config_abl_overfit_dress_var_3 import config as config_main -from configs.config_abl_overfit_jumpsuit_2 import config as config_main -from configs.config_cvae_curv import config as config_curv +# from configs.config_abl_overfit_jumpsuit_2 import config as config_main +# from configs.config_cvae_curv import config as config_curv +from configs.iccv.config_abl_skin_var import config as config_main +from configs.iccv.config_cvae_curv import config as config_curv # from models.cvae_model_overfit_jumpsuit import CVAE -from models.cvae_model import CVAE +from models.cvae_model import CVAENew as CVAE from models.cvae_curv_model import CVAE as CVAECurv from convert_to_uv_api import convert_to_uv_api from tensorflow_graphics.geometry.representation.mesh.normals import vertex_normals @@ -293,17 +295,18 @@ def sampling_example(frame, camera, nr=10): mask = batch['mesh_mask'][0].numpy().astype(bool) _, faces = _maskFaces(np.zeros((14475, 3)), F, mask) - noise = tf.random.normal(shape=(nr, 128)) + noise = tf.random.normal(shape=(nr, 8, 4, 128)) out = model.sample(tf.tile(batch['uv_static'], [nr,1,1,1]), tf.tile(batch['uv_body_posed'], [nr,1,1,1]), tf.tile(batch['uv_curvature'], [nr,1,1,1]), tf.tile(batch['uv_mask'], [nr,1,1]), noise) # out,_,_ = model([tf.tile(batch['uv_unposed'], [nr,1,1,1]), tf.tile(batch['uv_static'], [nr,1,1,1]), tf.tile(batch['uv_body_posed'], [nr,1,1,1]), tf.tile(batch['uv_curvature'], [nr,1,1,1]), tf.tile(batch['uv_mask'], [nr,1,1])], training=False) - - posed_mesh = [get_posed_mesh(uv, batch['pose_shape'], batch['mesh_body_posed'], mask) for uv in tf.unstack(out)] - # posed_mesh = [uv2mesh(uv[tf.newaxis,:,:,:]) for uv in tf.unstack(out)] + if config_main['use_skinning']: + posed_mesh = [get_posed_mesh(uv, batch['pose_shape'], batch['mesh_body_posed'], mask) for uv in tf.unstack(out)] + else: + posed_mesh = [uv2mesh(uv[tf.newaxis,:,:,:]) for uv in tf.unstack(out)] gt_mesh = batch['mesh_posed'][0].numpy()[mask, :] body = batch['mesh_body_posed'][0].numpy() - posed_mesh_fixed = [postprocess(mesh, body, faces, mask, do_smoothing=False) for mesh in posed_mesh] + posed_mesh_fixed = [postprocess(mesh, body, faces, mask, do_smoothing=True) for mesh in posed_mesh] # posed_mesh_fixed = [mesh[0].numpy()[mask, :] for mesh in posed_mesh] # error = [np.sqrt(((gt_mesh-m) ** 2).sum(-1)).mean() for m in posed_mesh_fixed] @@ -321,11 +324,18 @@ def sampling_example(frame, camera, nr=10): # custom_imshow(np.concatenate(row_sampling, axis=1)).show() + os.makedirs(os.path.join(out_folder, frame), exist_ok=True) - plot_fixed(np.zeros_like(gt_mesh), body, faces, camera).write_image(os.path.join(out_folder, frame + '_body.png')) - plot_fixed(gt_mesh, body, faces, camera).write_image(os.path.join(out_folder, frame + '_gt.png')) + plot_fixed(np.zeros_like(gt_mesh), body, faces, camera).write_image(os.path.join(out_folder, frame, frame + '_body.png')) + plot_fixed(gt_mesh, body, faces, camera).write_image(os.path.join(out_folder, frame, frame + '_gt.png')) for i in range(nr): - plot_fixed(posed_mesh_fixed[i], body, faces, camera).write_image(os.path.join(out_folder, frame + '_' + str(i) + '.png')) + plot_fixed(posed_mesh_fixed[i], body, faces, camera).write_image(os.path.join(out_folder, frame, frame + '_' + str(i) + '.png')) + + save_stl(os.path.join(out_folder, frame, frame + '_body.stl'), body, F_body) + save_stl(os.path.join(out_folder, frame, frame + '_gt.stl'), gt_mesh, faces.astype(np.int32)) + for i in range(nr): + save_stl(os.path.join(out_folder, frame, frame + '_' + str(i) + '.stl'), posed_mesh_fixed[i], faces.astype(np.int32)) + # custom_imshow(np.concatenate(row_sampling, axis=1)).write_image(os.path.join(out_folder, frame + '_sampling.png')) print() @@ -418,8 +428,8 @@ if __name__ == '__main__': model = CVAE(config_main) curv_model = CVAECurv(config_curv) - load_model(model, 'checkpoints/' + config_main['name']) - load_model(curv_model, 'checkpoints/' + config_curv['name']) + load_model(model, 'checkpoints/iccv/' + config_main['name']) + load_model(curv_model, 'checkpoints/iccv/' + config_curv['name']) camera_1 = dict(up=dict(x=0, y=0, z=1), center=dict(x=0, y=0, z=-0.05), eye=dict(x=0.3, y=1.0, z=0.05)) # faces_folder = '/home/workspace/data/results/support/faces' @@ -432,12 +442,12 @@ if __name__ == '__main__': curv_frames = ['01763_259' , '007292_282'] static_frames = ['01763_259' , '007292_282'] - with open('/home/workspace/local-data/train_skirt/frames_dress_30k.txt') as f: - frames = f.readlines() + # with open('/home/workspace/local-data/train_skirt/frames_dress_30k.txt') as f: + # frames = f.readlines() - random.shuffle(frames) - frames = [frame.strip() for frame in frames] - frames = frames[:150] + # random.shuffle(frames) + # frames = [frame.strip() for frame in frames] + # frames = frames[:150] # input_batch = get_temp_batch(frame, config_main) # _, faces = _maskFaces(np.zeros((14475, 3)), F, input_batch['mesh_mask'][0].numpy().astype(bool)) @@ -453,11 +463,11 @@ if __name__ == '__main__': # camera_01082_109 = dict(up=dict(x=0.0, y=0, z=1), center=dict(x=-0.15, y=0, z=-0.05), eye=dict(x=0.9, y=0.8, z=-0.1)) # frame = '04925_272' - frames = ['01070_13'] - out_folder = '/home/workspace/local-data/results/sampling_plots_jumpsuits' - os.makedirs(out_folder, exist_ok=True) - for frame in tqdm.tqdm(frames): - sampling_example(frame, camera_1) + # frames = ['01070_13', '02276_232', '02978_242', '04008_295', '04173_193'] + # out_folder = 'examples/sampling' + # os.makedirs(out_folder, exist_ok=True) + # for frame in tqdm.tqdm(frames): + # sampling_example(frame, camera_1) # sampling_poses(frame, camera_01082_109) # sampling_garment(frame, camera_1)