117 lines
4.3 KiB
Python
117 lines
4.3 KiB
Python
"""
|
|
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 |