| import os |
| import numpy as np |
| import torch |
| from PIL import Image |
| import os |
| from .model.inference_pipeline import reconstruction_pipe |
|
|
| def reconstruction( |
| normal_pils, |
| masks, |
| weights, |
| fov, |
| radius, |
| camera_angles_azi, |
| camera_angles_ele, |
| expansion_weight_stage1=0.1, |
| init_type="ball", |
| init_verts=None, |
| init_faces=None, |
| init_mesh_from_file="", |
| stage1_steps=200, |
| stage2_steps=200, |
| projection_type="perspective", |
| need_normal_rotation=False, |
| rotation_angles_azi=None, |
| rotation_angles_ele=None, |
| normal_rotation_R=None, |
| rm_bkg=False, |
| rm_bkg_with_rembg=True, |
| start_edge_len_stage1=0.1, |
| end_edge_len_stage1=0.02, |
| start_edge_len_stage2=0.02, |
| end_edge_len_stage2=0.005, |
| expansion_weight_stage2=0.0, |
| ): |
| |
| if init_type == "file": |
| assert ((init_verts is not None and init_faces is not None) or init_mesh_from_file), f'init_mesh_from_file or (init_verts and init_faces) must be provided if init_type=="file"' |
|
|
| if not need_normal_rotation: |
| rotation_angles_azi = None |
| rotation_angles_ele = None |
| normal_rotation_R = None |
|
|
| bs = len(normal_pils) |
|
|
| assert len(camera_angles_azi) == bs, f'len(camera_angles_azi) ({len(camera_angles_azi)} != batchsize ({bs}))' |
| assert len(camera_angles_ele) == bs, f'len(camera_angles_ele) ({len(camera_angles_ele)} != batchsize ({bs}))' |
|
|
| normal_pils_rgba = torch.cat([normal_pils[:,:,:,:3], masks.unsqueeze(-1)], dim=-1) |
|
|
| assert normal_pils_rgba.shape[-1] == 4, f'normal_pils_rgba.shape is {normal_pils_rgba.shape}' |
|
|
|
|
| normal_pils = [Image.fromarray((normal_pil.cpu()*255).numpy().astype(np.uint8)) for normal_pil in normal_pils_rgba] |
|
|
|
|
| meshes = reconstruction_pipe( |
| normal_pils=normal_pils, |
| rotation_angles_azi=rotation_angles_azi, |
| rotation_angles_ele=rotation_angles_ele, |
| weights=weights, |
| expansion_weight=expansion_weight_stage1, |
| init_type=init_type, |
| stage1_steps=stage1_steps, |
| stage2_steps=stage2_steps, |
| projection_type=projection_type, |
| fovy=fov, |
| radius=radius, |
| camera_angles_azi=camera_angles_azi, |
| camera_angles_ele=camera_angles_ele, |
| rm_bkg=rm_bkg, rm_bkg_with_rembg=rm_bkg_with_rembg, |
| normal_rotation_R=normal_rotation_R, |
| init_mesh_from_file=init_mesh_from_file, |
| start_edge_len_stage1=start_edge_len_stage1, |
| end_edge_len_stage1=end_edge_len_stage1, |
| start_edge_len_stage2=start_edge_len_stage2, |
| end_edge_len_stage2=end_edge_len_stage2, |
| expansion_weight_stage2=expansion_weight_stage2, |
| init_verts=init_verts, |
| init_faces=init_faces, |
|
|
| ) |
|
|
|
|
| return meshes |
|
|
|
|
|
|