Files
design2garmentcode-impl/test_garmentcode.py
2025-07-03 17:03:00 +08:00

97 lines
3.7 KiB
Python

import os
from glob import glob
from datetime import datetime
import random
from tqdm import tqdm
from pathlib import Path
import yaml
import json
import argparse
from assets.garment_programs.meta_garment import MetaGarment
from assets.bodies.body_params import BodyParameters
from pygarment.data_config import Properties
_BODY_MEASUREMENTS = {
# Our model
'neutral': './assets/bodies/mean_all.yaml',
'mean_female': './assets/bodies/mean_female.yaml',
'mean_male': './assets/bodies/mean_male.yaml',
# SMPL
'f_smpl': './assets/bodies/f_smpl_average_A40.yaml',
'm_smpl': './assets/bodies/m_smpl_average_A40.yaml',
}
def _parse_file_path(filepath, fmt='*.yaml'):
if os.path.isfile(filepath): return [filepath]
elif os.path.isdir(filepath):
return glob(os.path.join(filepath, '**', fmt), recursive=True)
else:
return [x for x in filepath.split(',') if os.path.exists(x)]
if __name__ == '__main__':
parser = argparse.ArgumentParser(description="Convert GarmentCode spec to pattern.json")
parser.add_argument("-f", "--files", default="design_yamls", type=str, help="Path to design files.") # The folder where the design data is stored
parser.add_argument("-b", "--body", type=str, choices=['avg', 'thin', 'full-bodied', 'man','neutral'], default='neutral', help="Body to use.")
parser.add_argument("-o", "--output", default='./Logs', type=str, help="Output file path.")
parser.add_argument("-n", "--num_samples", default=-1, type=int, help="Number of samples to generate.")
parser.add_argument('--fmt', default="*_params.yaml", type=str, help="Design file name format, used in glob.")
args, cfg_cmd = parser.parse_known_args()
body = BodyParameters(_BODY_MEASUREMENTS[args.body])
design_files = _parse_file_path(args.files, args.fmt)
print("Found %d design files: \n"%(len(design_files)), '\n'.join(design_files))
if args.num_samples > 0 and len(design_files) > args.num_samples:
# design_files = design_files[:args.num_samples]
design_files = random.sample(design_files, args.num_samples)
succeed_cnt = 0
for design_file in tqdm(design_files):
try:
with open(design_file, 'rb') as f:
design_data = yaml.safe_load(f)['design']
piece = MetaGarment(os.path.basename(design_file).split('.')[0], body, design_data)
pattern = piece.assembly()
if piece.is_self_intersecting():
print(f'{piece.name} is Self-intersecting')
pattern_tag = '_' + datetime.now().strftime("%y%m%d-%H-%M-%S")
folder = pattern.serialize(
args.output,
tag=pattern_tag,
to_subfolder=True,
with_3d=False, with_text=False, view_ids=False)
print(f"\n[SUCCEED] Saved to {folder}.")
# # [OPTIONAL] copy original render views to the output folder
# shutil.copyfile(
# design_file.replace('_design_params.yaml', '_render_front.png'),
# os.path.join(folder, 'render_front.png'))
# shutil.copyfile(
# design_file.replace('_design_params.yaml', '_render_back.png'),
# os.path.join(folder, 'render_back.png'))
# # [OPTIONAL] save body measurements
# body.save(folder)
# # [OPTIONAL] save design parameters
# shutil.copy(design_file, folder)
except Exception as e:
print(f'[ERROR] {design_file}: {e}')
succeed_cnt += 1
print(f"Processing {len(design_files)} design files, {succeed_cnt} succeed.")