Spaces:
Running
on
L40S
Running
on
L40S
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 | |
) | |