import os import torch import numpy as np import torch.nn.functional as F from skimage.transform import resize # Use a non-interactive backend import matplotlib matplotlib.use('Agg') from .renderer import OpenDRenderer, PyRenderer def iuv_map2img(U_uv, V_uv, Index_UV, AnnIndex=None, uv_rois=None, ind_mapping=None): device_id = U_uv.get_device() batch_size = U_uv.size(0) K = U_uv.size(1) heatmap_size = U_uv.size(2) Index_UV_max = torch.argmax(Index_UV, dim=1) if AnnIndex is None: Index_UV_max = Index_UV_max.to(torch.int64) else: AnnIndex_max = torch.argmax(AnnIndex, dim=1) Index_UV_max = Index_UV_max * (AnnIndex_max > 0).to(torch.int64) outputs = [] for batch_id in range(batch_size): output = torch.zeros([3, U_uv.size(2), U_uv.size(3)], dtype=torch.float32).cuda(device_id) output[0] = Index_UV_max[batch_id].to(torch.float32) if ind_mapping is None: output[0] /= float(K - 1) else: for ind in range(len(ind_mapping)): output[0][output[0] == ind] = ind_mapping[ind] * (1. / 24.) for part_id in range(1, K): CurrentU = U_uv[batch_id, part_id] CurrentV = V_uv[batch_id, part_id] output[1, Index_UV_max[batch_id] == part_id] = CurrentU[Index_UV_max[batch_id] == part_id] output[2, Index_UV_max[batch_id] == part_id] = CurrentV[Index_UV_max[batch_id] == part_id] if uv_rois is None: outputs.append(output.unsqueeze(0)) else: roi_fg = uv_rois[batch_id][1:] w = roi_fg[2] - roi_fg[0] h = roi_fg[3] - roi_fg[1] aspect_ratio = float(w) / h if aspect_ratio < 1: new_size = [heatmap_size, max(int(heatmap_size * aspect_ratio), 1)] output = F.interpolate(output.unsqueeze(0), size=new_size, mode='nearest') paddingleft = int(0.5 * (heatmap_size - new_size[1])) output = F.pad( output, pad=(paddingleft, heatmap_size - new_size[1] - paddingleft, 0, 0) ) else: new_size = [max(int(heatmap_size / aspect_ratio), 1), heatmap_size] output = F.interpolate(output.unsqueeze(0), size=new_size, mode='nearest') paddingtop = int(0.5 * (heatmap_size - new_size[0])) output = F.pad( output, pad=(0, 0, paddingtop, heatmap_size - new_size[0] - paddingtop) ) outputs.append(output) return torch.cat(outputs, dim=0) def vis_smpl_iuv( image, cam_pred, vert_pred, face, pred_uv, vert_errors_batch, image_name, save_path, opt, ratio=1 ): # save_path = os.path.join('./notebooks/output/demo_results-wild', ids[f_id][0]) if not os.path.exists(save_path): os.makedirs(save_path) # dr_render = OpenDRenderer(ratio=ratio) dr_render = PyRenderer() focal_length = 5000. orig_size = 224. if pred_uv is not None: iuv_img = iuv_map2img(*pred_uv) for draw_i in range(len(cam_pred)): err_val = '{:06d}_'.format(int(10 * vert_errors_batch[draw_i])) draw_name = err_val + image_name[draw_i] K = np.array( [[focal_length, 0., orig_size / 2.], [0., focal_length, orig_size / 2.], [0., 0., 1.]] ) # img_orig, img_resized, img_smpl, render_smpl_rgba = dr_render( # image[draw_i], # cam_pred[draw_i], # vert_pred[draw_i], # face, # draw_name[:-4] # ) if opt.save_obj: os.makedirs(os.path.join(save_path, 'mesh'), exist_ok=True) mesh_filename = os.path.join(save_path, 'mesh', draw_name[:-4] + '.obj') else: mesh_filename = None img_orig = np.moveaxis(image[draw_i], 0, -1) img_smpl, img_resized = dr_render( vert_pred[draw_i], img=img_orig, cam=cam_pred[draw_i], iwp_mode=True, scale_ratio=4., mesh_filename=mesh_filename, ) ones_img = np.ones(img_smpl.shape[:2]) * 255 ones_img = ones_img[:, :, None] img_smpl_rgba = np.concatenate((img_smpl, ones_img), axis=2) img_resized_rgba = np.concatenate((img_resized, ones_img), axis=2) # render_img = np.concatenate((img_resized_rgba, img_smpl_rgba, render_smpl_rgba * 255), axis=1) render_img = np.concatenate((img_resized_rgba, img_smpl_rgba), axis=1) render_img[render_img < 0] = 0 render_img[render_img > 255] = 255 matplotlib.image.imsave( os.path.join(save_path, draw_name[:-4] + '.png'), render_img.astype(np.uint8) ) if pred_uv is not None: # estimated global IUV global_iuv = iuv_img[draw_i].cpu().numpy() global_iuv = np.transpose(global_iuv, (1, 2, 0)) global_iuv = resize(global_iuv, img_resized.shape[:2]) global_iuv[global_iuv > 1] = 1 global_iuv[global_iuv < 0] = 0 matplotlib.image.imsave( os.path.join(save_path, 'pred_uv_' + draw_name[:-4] + '.png'), global_iuv )