mind3d-trellis2 / code /mind3d /gen_testset_mind3d.py
jamie33's picture
MinD-3D + TRELLIS.2 sub-01 experiments: code, metrics, logs, report
87e9895 verified
Raw History Blame Contribute Delete
2.3 kB
import os
import time
import argparse
import numpy as np
import torch
from src.utils import load_config
from src.mind3d import MinD3D
from src.utils import torch_init_model, set_random_seed
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--config', type=str, default="./configs/mind3d.yaml")
parser.add_argument('--check_point_path', type=str, default="ckpt/mind3d_sub01.pt")
parser.add_argument('--fmri_dir', type=str, default="/home/hubin/data/fMRI-Shape/sub-0001/npy_data")
parser.add_argument('--test_list', type=str, default="/home/hubin/data/fMRI-Shape/annotations/core_test_list.txt")
parser.add_argument('--out_dir', type=str, default="/home/hubin/trellis_work/outputs/mind3d_sub01")
parser.add_argument('--topk', type=int, default=250)
parser.add_argument('--seed', type=int, default=100)
parser.add_argument('--shard', type=int, default=0)
parser.add_argument('--num_shards', type=int, default=1)
args = parser.parse_args()
cfg = load_config(args.config, 'configs/default.yaml')
device = torch.device("cuda")
os.makedirs(os.path.join(args.out_dir, "meshes"), exist_ok=True)
model_full = MinD3D(cfg, device=device)
state_dict = torch.load(args.check_point_path, map_location='cpu', weights_only=False)
torch_init_model(model_full, state_dict)
del state_dict
model_full.eval()
ids = [l.strip() for l in open(args.test_list) if l.strip()][args.shard::args.num_shards]
for i, obj in enumerate(ids):
out_path = os.path.join(args.out_dir, "meshes", obj.replace("/", "_") + ".obj")
if os.path.exists(out_path):
continue
set_random_seed(args.seed)
t0 = time.time()
fmri_data = np.load(os.path.join(args.fmri_dir, obj + ".npy"))
fmri_data = torch.from_numpy(fmri_data[2:8]).unsqueeze(0).cuda()
with torch.no_grad():
fmri_embedding = model_full.get_fmri_embedding_batch(fmri_data, diffusion_bs=128, decoder_bs=1)
mesh_list = model_full.generate_mesh_from_embedding(fmri_embedding, bs=1, top_k=args.topk)
if mesh_list and mesh_list[0].vertices.shape[0]:
mesh_list[0].export(out_path)
print(f"[{i + 1}/{len(ids)}] {obj} {time.time() - t0:.1f}s", flush=True)