import torch import trimesh import numpy as np import skimage.io as io from PIL import Image from smplx import SMPL from matplotlib import cm as mpl_cm, colors as mpl_colors from trimesh.visual.color import face_to_vertex_color, vertex_to_face_color, to_rgba from common import constants from .colorwheel import make_color_wheel_image def get_smpl_uv(): uv_obj = 'data/body_models/smpl_uv_20200910/smpl_uv.obj' uv_map = [] with open(uv_obj) as f: for line in f.readlines(): if line.startswith('vt'): coords = [float(x) for x in line.split(' ')[1:]] uv_map.append(coords) uv_map = np.array(uv_map) return uv_map def show_uv_texture(): # image = io.imread('data/body_models/smpl_uv_20200910/smpl_uv_20200910.png') image = make_color_wheel_image(1024, 1024) image = Image.fromarray(image) uv = np.load('data/body_models/smpl_uv_20200910/uv_table.npy') # get_smpl_uv() material = trimesh.visual.texture.SimpleMaterial(image=image) tex_visuals = trimesh.visual.TextureVisuals(uv=uv, image=image, material=material) smpl = SMPL(constants.SMPL_MODEL_DIR) faces = smpl.faces verts = smpl().vertices[0].detach().numpy() # assert(len(uv) == len(verts)) print(uv.shape) vc = tex_visuals.to_color().vertex_colors fc = trimesh.visual.color.vertex_to_face_color(vc, faces) face_colors = fc.copy() fc = fc.astype(float) vc = vc.astype(float) fc[:,:3] = fc[:,:3] / 255. vc[:,:3] = vc[:,:3] / 255. print(fc[:,:3].max(), fc[:,:3].min(), fc[:,:3].mean()) print(vc[:, :3].max(), vc[:, :3].min(), vc[:, :3].mean()) np.save('data/body_models/smpl/color_wheel_face_colors.npy', fc) np.save('data/body_models/smpl/color_wheel_vertex_colors.npy', vc) print(fc.shape) mesh = trimesh.Trimesh(verts, faces, validate=True, process=False, face_colors=face_colors) # mesh = trimesh.load('data/body_models/smpl_uv_20200910/smpl_uv.obj', process=False) # mesh.visual = tex_visuals # import ipdb; ipdb.set_trace() # print(vc.shape) mesh.show() def show_colored_mesh(): cm = mpl_cm.get_cmap('jet') norm_gt = mpl_colors.Normalize() smpl = SMPL(constants.SMPL_MODEL_DIR) faces = smpl.faces verts = smpl().vertices[0].detach().numpy() m = trimesh.Trimesh(verts, faces, process=False) mode = 1 if mode == 0: # mano_segm_labels = m.triangles_center face_labels = m.triangles_center face_colors = (face_labels - face_labels.min()) / np.ptp(face_labels) elif mode == 1: # print(face_labels.shape) face_labels = m.triangles_center face_labels = np.argsort(np.linalg.norm(face_labels, axis=-1)) face_colors = np.ones((13776, 4)) face_colors[:, 3] = 1.0 face_colors[:, :3] = cm(norm_gt(face_labels))[:, :3] elif mode == 2: # breakpoint() fc = np.load('data/body_models/smpl_uv_20200910/data/vertex_texture.npy')[0, :, 0, 0, 0, :] face_colors = np.ones((13776, 4)) face_colors[:, :3] = fc mesh = trimesh.Trimesh(verts, faces, process=False, face_colors=face_colors) mesh.show() def get_tenet_texture(mode='smplpix'): # mode = 'smplpix', 'decomr' smpl = SMPL(constants.SMPL_MODEL_DIR) faces = smpl.faces verts = smpl().vertices[0].detach().numpy() m = trimesh.Trimesh(verts, faces, process=False) if mode == 'smplpix': # mano_segm_labels = m.triangles_center face_labels = m.triangles_center face_colors = (face_labels - face_labels.min()) / np.ptp(face_labels) texture = np.zeros((1, faces.shape[0], 1, 1, 1, 3), dtype=np.float32) texture[0, :, 0, 0, 0, :] = face_colors[:, :3] texture = torch.from_numpy(texture).float() elif mode == 'decomr': texture = np.load('data/body_models/smpl_uv_20200910/data/vertex_texture.npy') texture = torch.from_numpy(texture).float() elif mode == 'colorwheel': face_colors = np.load('data/body_models/smpl/color_wheel_face_colors.npy') texture = np.zeros((1, faces.shape[0], 1, 1, 1, 3), dtype=np.float32) texture[0, :, 0, 0, 0, :] = face_colors[:, :3] texture = torch.from_numpy(texture).float() else: raise ValueError(f'{mode} is not defined!') return texture def save_tenet_textures(mode='smplpix'): # mode = 'smplpix', 'decomr' smpl = SMPL(constants.SMPL_MODEL_DIR) faces = smpl.faces verts = smpl().vertices[0].detach().numpy() m = trimesh.Trimesh(verts, faces, process=False) if mode == 'smplpix': # mano_segm_labels = m.triangles_center face_labels = m.triangles_center face_colors = (face_labels - face_labels.min()) / np.ptp(face_labels) texture = np.zeros((1, faces.shape[0], 1, 1, 1, 3), dtype=np.float32) texture[0, :, 0, 0, 0, :] = face_colors[:, :3] texture = torch.from_numpy(texture).float() vert_colors = face_to_vertex_color(m, face_colors).astype(float) / 255.0 elif mode == 'decomr': texture = np.load('data/body_models/smpl_uv_20200910/data/vertex_texture.npy') texture = torch.from_numpy(texture).float() face_colors = texture[0, :, 0, 0, 0, :] vert_colors = face_to_vertex_color(m, face_colors).astype(float) / 255.0 elif mode == 'colorwheel': face_colors = np.load('data/body_models/smpl/color_wheel_face_colors.npy') texture = np.zeros((1, faces.shape[0], 1, 1, 1, 3), dtype=np.float32) texture[0, :, 0, 0, 0, :] = face_colors[:, :3] texture = torch.from_numpy(texture).float() face_colors[:, :3] *= 255 vert_colors = face_to_vertex_color(m, face_colors).astype(float) / 255.0 else: raise ValueError(f'{mode} is not defined!') print(vert_colors.shape, vert_colors.max()) np.save(f'data/body_models/smpl/{mode}_vertex_colors.npy', vert_colors) return texture