Spaces:
Build error
Build error
# Tencent HunyuanWorld-1.0 is licensed under TENCENT HUNYUANWORLD-1.0 COMMUNITY LICENSE AGREEMENT | |
# THIS LICENSE AGREEMENT DOES NOT APPLY IN THE EUROPEAN UNION, UNITED KINGDOM AND SOUTH KOREA AND | |
# IS EXPRESSLY LIMITED TO THE TERRITORY, AS DEFINED BELOW. | |
# By clicking to agree or by using, reproducing, modifying, distributing, performing or displaying | |
# any portion or element of the Tencent HunyuanWorld-1.0 Works, including via any Hosted Service, | |
# You will be deemed to have recognized and accepted the content of this Agreement, | |
# which is effective immediately. | |
# For avoidance of doubts, Tencent HunyuanWorld-1.0 means the 3D generation models | |
# and their software and algorithms, including trained model weights, parameters (including | |
# optimizer states), machine-learning model code, inference-enabling code, training-enabling code, | |
# fine-tuning enabling code and other elements of the foregoing made publicly available | |
# by Tencent at [https://github.com/Tencent-Hunyuan/HunyuanWorld-1.0]. | |
import os | |
import torch | |
import open3d as o3d | |
import argparse | |
# hunyuan3d sence generation | |
from hy3dworld import LayerDecomposition | |
from hy3dworld import WorldComposer, process_file | |
class HYworldDemo: | |
def __init__(self, seed=42): | |
target_size = 3840 | |
kernel_scale = max(1, int(target_size / 1920)) | |
self.LayerDecomposer = LayerDecomposition() | |
self.hy3d_world = WorldComposer( | |
device=torch.device( | |
"cuda" if torch.cuda.is_available() else "cpu"), | |
resolution=(target_size, target_size // 2), | |
seed=seed, | |
filter_mask=True, | |
kernel_scale=kernel_scale, | |
) | |
def run(self, image_path, labels_fg1, labels_fg2, classes="outdoor", output_dir='output_hyworld', export_drc=False): | |
# foreground layer information | |
fg1_infos = [ | |
{ | |
"image_path": image_path, | |
"output_path": output_dir, | |
"labels": labels_fg1, | |
"class": classes, | |
} | |
] | |
fg2_infos = [ | |
{ | |
"image_path": os.path.join(output_dir, 'remove_fg1_image.png'), | |
"output_path": output_dir, | |
"labels": labels_fg2, | |
"class": classes, | |
} | |
] | |
# layer decompose | |
self.LayerDecomposer(fg1_infos, layer=0) | |
self.LayerDecomposer(fg2_infos, layer=1) | |
self.LayerDecomposer(fg2_infos, layer=2) | |
separate_pano, fg_bboxes = self.hy3d_world._load_separate_pano_from_dir( | |
output_dir, sr=True | |
) | |
# layer-wise reconstruction | |
layered_world_mesh = self.hy3d_world.generate_world( | |
separate_pano=separate_pano, fg_bboxes=fg_bboxes, world_type='mesh' | |
) | |
# save results | |
for layer_idx, layer_info in enumerate(layered_world_mesh): | |
# export ply | |
output_path = os.path.join( | |
output_dir, f"mesh_layer{layer_idx}.ply" | |
) | |
o3d.io.write_triangle_mesh(output_path, layer_info['mesh']) | |
# export drc | |
if export_drc: | |
output_path_drc = os.path.join( | |
output_dir, f"mesh_layer{layer_idx}.drc" | |
) | |
process_file(output_path, output_path_drc) | |
if __name__ == "__main__": | |
parser = argparse.ArgumentParser(description="Hunyuan3D World Gen Demo") | |
parser.add_argument("--image_path", type=str, | |
default=None, help="Path to the Panorama image") | |
parser.add_argument("--labels_fg1", nargs='+', default=[], | |
help="Labels for foreground objects in layer 1") | |
parser.add_argument("--labels_fg2", nargs='+', default=[], | |
help="Labels for foreground objects in layer 2") | |
parser.add_argument("--classes", type=str, default="outdoor", | |
help="Classes for sence generation") | |
parser.add_argument("--seed", type=int, default=42, | |
help="Random seed for reproducibility") | |
parser.add_argument("--output_path", type=str, default="results", | |
help="Path to save the output results") | |
parser.add_argument("--export_drc", type=bool, default=False, | |
help="Whether to export Draco format") | |
args = parser.parse_args() | |
os.makedirs(args.output_path, exist_ok=True) | |
print(f"Output will be saved to: {args.output_path}") | |
demo_HYworld = HYworldDemo(seed=args.seed) | |
demo_HYworld.run( | |
image_path=args.image_path, | |
labels_fg1=args.labels_fg1, | |
labels_fg2=args.labels_fg2, | |
classes=args.classes, | |
output_dir=args.output_path, | |
export_drc=args.export_drc | |
) | |