Spaces:
Runtime error
Runtime error
| import numpy as np | |
| import imageio | |
| import os | |
| import argparse | |
| from tqdm import tqdm | |
| from .renderer import get_renderer | |
| def get_rotation(theta=np.pi / 3): | |
| import mGPT.utils.rotation_conversions as geometry | |
| import torch | |
| axis = torch.tensor([0, 1, 0], dtype=torch.float) | |
| axisangle = theta * axis | |
| matrix = geometry.axis_angle_to_matrix(axisangle) | |
| return matrix.numpy() | |
| def render_video(meshes, | |
| key, | |
| action, | |
| renderer, | |
| savepath, | |
| backgrounds, | |
| cam_pose, | |
| cams=(0.75, 0.75, 0, 0.10), | |
| color=[0.11, 0.53, 0.8]): | |
| # cams=(0.75, 0.75, 0, 0.10), color=[165.0/255,112/255,140/255]): | |
| # center the first frame | |
| if key not in ["real", "ntf", "side"]: | |
| w = int(key) / 6.0 | |
| # purpole to green | |
| # color = w*np.array([0.9,102/255,120/255]) + (1-w)*np.array([0.11, 0.9, 0.11]) | |
| # color = (1-w)*np.array([165.0/255,112/255,140/255]) + w*np.array([0.11, 0.8, 0.11]) | |
| color = (1 - w) * np.array([0.75, 0.13, 0.7]) + w * np.array( | |
| [0.12, 0.7, 0.14]) | |
| meshes = meshes - meshes[0].mean(axis=0) | |
| imgs = [] | |
| idx = 0 | |
| # for mesh in meshes: | |
| for mesh in tqdm(meshes, desc=f"Visualize {key}, action {action}"): | |
| # file_name = '3dpw_rot-90_glob_trimesh.ply' mesh_filename=file_name, | |
| # prepare background | |
| if len(backgrounds.shape) == 3: | |
| background = backgrounds | |
| cam = cams | |
| elif len(backgrounds.shape) == 4: | |
| background = backgrounds[idx] | |
| cam = cams[idx] | |
| idx += 1 | |
| # prepare cams | |
| img = renderer.render(background, | |
| mesh, | |
| cam, | |
| color=color, | |
| cam_pose=cam_pose) | |
| imgs.append(img) | |
| # show(img) | |
| imgs = np.array(imgs) | |
| # masks = ~(imgs/255. > 0.96).all(-1) | |
| # coords = np.argwhere(masks.sum(axis=0)) | |
| # y1, x1 = coords.min(axis=0) | |
| # y2, x2 = coords.max(axis=0) | |
| # writer = imageio.get_writer(savepath, fps=30) | |
| # for cimg in imgs[:, y1:y2, x1:x2]: | |
| # writer.append_data(cimg) | |
| # writer.close() | |
| # from mld.utils.uicap_utils import write_rgba_seqs | |
| # write_rgba_seqs(imgs, savepath) | |
| writer = imageio.get_writer(savepath, fps=30) | |
| for cimg in imgs: | |
| writer.append_data(cimg) | |
| writer.close() | |
| def main(): | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument("filename") | |
| opt = parser.parse_args() | |
| filename = opt.filename | |
| savefolder = os.path.splitext(filename)[0] | |
| os.makedirs(savefolder, exist_ok=True) | |
| output = np.load(filename) | |
| if output.shape[0] == 3: | |
| visualization, generation, reconstruction = output | |
| output = { | |
| "visualization": visualization, | |
| "generation": generation, | |
| "reconstruction": reconstruction | |
| } | |
| else: | |
| # output = {f"generation_{key}": output[key] for key in range(2)} # len(output))} | |
| # output = {f"generation_{key}": output[key] for key in range(len(output))} | |
| output = { | |
| f"generation_{key}": output[key] | |
| for key in range(len(output)) | |
| } | |
| width = 1024 | |
| height = 1024 | |
| background = np.zeros((height, width, 3)) | |
| renderer = get_renderer(width, height) | |
| # if duration mode, put back durations | |
| if output["generation_3"].shape[-1] == 100: | |
| output["generation_0"] = output["generation_0"][:, :, :, :40] | |
| output["generation_1"] = output["generation_1"][:, :, :, :60] | |
| output["generation_2"] = output["generation_2"][:, :, :, :80] | |
| output["generation_3"] = output["generation_3"][:, :, :, :100] | |
| elif output["generation_3"].shape[-1] == 160: | |
| print("160 mode") | |
| output["generation_0"] = output["generation_0"][:, :, :, :100] | |
| output["generation_1"] = output["generation_1"][:, :, :, :120] | |
| output["generation_2"] = output["generation_2"][:, :, :, :140] | |
| output["generation_3"] = output["generation_3"][:, :, :, :160] | |
| # if str(action) == str(1) and str(key) == "generation_4": | |
| for key in output: | |
| vidmeshes = output[key] | |
| for action in range(len(vidmeshes)): | |
| meshes = vidmeshes[action].transpose(2, 0, 1) | |
| path = os.path.join(savefolder, | |
| "action{}_{}.mp4".format(action, key)) | |
| render_video(meshes, key, action, renderer, path, background) | |
| if __name__ == "__main__": | |
| main() | |