| |
| |
| |
| |
| |
| |
|
|
| import sys |
|
|
| sys.path.append(".") |
|
|
| import os |
| import pdb |
| import time |
| import traceback |
|
|
| import ipdb |
| import numpy as np |
| from tqdm import tqdm |
|
|
| from engine.MVSRecon.mvs_recon import MVSRec |
|
|
|
|
| def basename(path): |
| pre_name = os.path.basename(path).split(".")[0] |
|
|
| return pre_name |
|
|
|
|
| def multi_process(worker, items, **kwargs): |
| """ |
| worker worker function to process items |
| """ |
|
|
| nodes = kwargs["nodes"] |
| dirs = kwargs["dirs"] |
|
|
| bucket = int( |
| np.ceil(len(items) / nodes) |
| ) |
|
|
| print("Total Nodes:", nodes) |
| print("Save Path:", dirs) |
| rank = int(os.environ.get("RANK", 0)) |
|
|
| print("Current Rank:", rank) |
|
|
| kwargs["RANK"] = rank |
|
|
| if rank == nodes - 1: |
| output_dir = worker(items[bucket * rank :], **kwargs) |
| else: |
| output_dir = worker(items[bucket * rank : bucket * (rank + 1)], **kwargs) |
|
|
| if rank == 0 and nodes > 1: |
| timesleep = kwargs.get("timesleep", 3600) |
| time.sleep(timesleep) |
|
|
|
|
| def run_mvsrecon(items, **params): |
| """run_mvsrecon""" |
| output_dir = params["dirs"] |
| debug = params["debug"] |
| os.makedirs(output_dir, exist_ok=True) |
|
|
| if debug: |
| items = items[:20] |
|
|
| process_valid = [] |
|
|
| for item in tqdm(items, desc="Processing..."): |
| if ".ply" not in item: |
| continue |
| gs_ply = item |
| baseid = basename(gs_ply) |
|
|
| gs_ply = f"./exps/output_gs/{baseid}.ply" |
| data_root = f"./exps/mvs_render/{baseid}" |
| mask_root = f"./exps/mvs_sam/{baseid}" |
| normal_root = f"./exps/mvs_normal/{baseid}" |
| mesh_root = f"./exps/smplx_output/{baseid}.obj" |
|
|
| |
|
|
| |
| |
|
|
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| try: |
| stereo = MVSRec( |
| gs_ply, data_root, mask_root, normal_root, mesh_root, radius=2.5 |
| ) |
| stereo.fitting( |
| output_dir, |
| save_name=f"{baseid}" + ".obj", |
| Niter=200, |
| vis_data_root=f"./exps/mvs_recvis/{baseid}", |
| ) |
| except: |
| traceback.print_exc() |
|
|
| return output_dir |
|
|
|
|
| def get_parse(): |
| import argparse |
|
|
| parser = argparse.ArgumentParser(description="") |
| parser.add_argument("-i", "--input", required=True, help="input path") |
| parser.add_argument("-o", "--output", required=True, help="output path") |
| parser.add_argument("--nodes", default=1, type=int, help="how many workload?") |
| parser.add_argument("--debug", action="store_true", help="debug tag") |
| parser.add_argument("--txt", default=None, type=str) |
| args = parser.parse_args() |
| return args |
|
|
|
|
| if __name__ == "__main__": |
| opt = get_parse() |
|
|
| |
| if opt.txt == None: |
| available_items = os.listdir(opt.input) |
| available_items = [os.path.join(opt.input, item) for item in available_items] |
| else: |
| available_items = [] |
| with open(opt.txt) as reader: |
| for line in reader: |
| available_items.append(line.strip()) |
|
|
| available_items = [ |
| os.path.join(opt.input, item) for item in available_items |
| ] |
|
|
| multi_process( |
| worker=run_mvsrecon, |
| items=available_items, |
| dirs=opt.output, |
| nodes=opt.nodes, |
| debug=opt.debug, |
| ) |
|
|