import torch try: from detrsmpl.core.renderer.mpr_renderer.cuda.rasterizer import \ estimate_normals as estimate_normals_cuda # noqa: E501 from detrsmpl.core.renderer.mpr_renderer.cuda.rasterizer import \ project_mesh as project_mesh_cuda # noqa: E501 except (ImportError, ModuleNotFoundError): print('Please reinstall MMHuman3D to build mpr_renderer.') raise def estimate_normals(vertices, faces, pinhole, vertices_filter=None): """Estimate the vertices normals with the specified faces and camera. Args: vertices (torch.tensor): Shape should be (num_verts, 3). faces (torch.tensor): The faces of the vertices. pinhole (object): The object of the camera. Returns: coords (torch.tensor): The estimated coordinates. normals (torch.tensor): The estimated normals. """ if vertices_filter is None: assert torch.is_tensor(vertices) assert vertices.is_cuda assert len(vertices.shape) == 2 n = vertices.shape[0] vertices_filter = torch.ones((n), dtype=torch.uint8, device=vertices.device) vertices = vertices.contiguous() vertices_ndc = pinhole.project_ndc(vertices) coords, normals = estimate_normals_cuda(vertices_ndc, faces, vertices, vertices_filter, pinhole.h, pinhole.w) return coords, normals def project_mesh(vertices, faces, vertice_values, pinhole, vertices_filter=None): """Project mesh to the image plane with the specified faces and camera. Args: vertices (torch.tensor): Shape should be (num_verts, 3). faces (torch.tensor): The faces of the vertices. vertice_values (torch.tensor): The depth of the each vertex. pinhole (object): The object of the camera. Returns: torch.tensor: The projected mesh. """ if vertices_filter is None: assert torch.is_tensor(vertices) assert vertices.is_cuda assert len(vertices.shape) == 2 n = vertices.shape[0] vertices_filter = torch.ones((n), dtype=torch.uint8, device=vertices.device) vertices = vertices.contiguous() vertices_ndc = pinhole.project_ndc(vertices) return project_mesh_cuda(vertices_ndc, faces, vertice_values, vertices_filter, pinhole.h, pinhole.w)