GarmentCode / GarmentCode /pattern_data_sim.py
qbhf2's picture
added NvidiaWarp and GarmentCode repos
66c9c8a
raw
history blame
4.43 kB
"""
Run or Resume simulation of a pattern dataset with MayaPy standalone mode
Note that this module is executed in Maya (or by mayapy)
How to use:
* fill out system.json with approppriate paths
Running itself:
./datasim.py --data <dataset folder name> --minibatch <size> --config <simulation_rendering_configuration.json>
"""
import argparse
import sys
import shutil
from pathlib import Path
# My modules
import pygarment.data_config as data_config
import pygarment.meshgen.datasim_utils as sim
def get_command_args():
"""command line arguments to control the run"""
# https://stackoverflow.com/questions/40001892/reading-named-command-arguments
parser = argparse.ArgumentParser()
parser.add_argument('--data', '-d', help='name of dataset folder', type=str)
parser.add_argument('--config', '-c', help='name of .json file with desired simulation&rendering config', type=str,
default=None)
parser.add_argument('--minibatch', '-b', help='number of examples to simulate in this run', type=int, default=None)
parser.add_argument('--default_body', action='store_true', help='run dataset on default body')
parser.add_argument('--caching', action='store_true', help='cache intermediate simulation')
parser.add_argument('--rewrite_config', action='store_true', help='cache intermediate simulation')
args = parser.parse_args()
print(args)
return args
def gather_renders(out_data_path: Path, verbose=False):
renders_path = out_data_path / 'renders'
renders_path.mkdir(exist_ok=True)
render_files = list(out_data_path.glob('**/*render*.png'))
for file in render_files:
try:
shutil.copy(str(file), str(renders_path))
except shutil.SameFileError:
if verbose:
print(f'File {file} already exists')
pass
if __name__ == "__main__":
command_args = get_command_args()
system_config = data_config.Properties('./system.json')
# ------ Dataset ------
dataset = command_args.data
datapath = Path(system_config['datasets_path']) / dataset
init_dataset_file = datapath / 'dataset_properties.yaml'
# Create dataset_file in correct folder (default_body or random_body)
body_type = 'default_body' if command_args.default_body else 'random_body'
datapath = datapath / body_type / 'data' # Overwrite datapath to specific body type
output_path = Path(system_config['datasets_sim']) / dataset / body_type
output_path.mkdir(parents=True, exist_ok=True)
dataset_file_body = output_path / f'dataset_properties_{body_type}.yaml'
if not dataset_file_body.exists():
shutil.copy(str(init_dataset_file), str(dataset_file_body))
dataset_file = dataset_file_body
props = data_config.Properties(dataset_file_body)
if 'frozen' in props and props['frozen']: #Where is this set?
# avoid accidential re-runs of data
print('Warning: dataset is frozen, processing is skipped')
sys.exit(0)
# ------- Defining sim props -----
props.set_basic(data_folder=dataset) # in case data properties are from other dataset/folder, update info
if command_args.config is not None:
props.merge(
Path(system_config['sim_configs_path']) / command_args.config,
re_write=command_args.rewrite_config) # Re-write sim config only explicitly
# ----- Main loop ----------
finished = sim.batch_sim(
datapath,
output_path,
props,
run_default_body=command_args.default_body,
num_samples=command_args.minibatch, # run in mini-batch if requested
caching=command_args.caching, force_restart=False)
# ----- Try and resim fails once -----
if finished:
# NOTE: Could be larger than a regular batch
finished = sim.resim_fails(
datapath,
output_path,
props,
run_default_body=command_args.default_body,
caching=command_args.caching)
props.add_sys_info() # Save system information
props.serialize(dataset_file)
# ------ Gather renders -------
gather_renders(output_path)
# -------- fin --------
if finished:
# finished processing the dataset
print('Dataset processing finished')
sys.exit(0)
else:
sys.exit(1) # not finished dataset processing