Spaces:
Configuration error
Configuration error
| import numpy as np | |
| import torch | |
| import cv2 | |
| import matplotlib.pyplot as plt | |
| from mpl_toolkits.mplot3d import Axes3D | |
| import os | |
| import matplotlib.patches as patches | |
| from sklearn.manifold import TSNE | |
| import open3d as o3d | |
| kintree = { | |
| 'kintree': [[1, 0], [2, 1], [3, 2], [4, 3], [5, 1], [6, 5], [7, 6], [8, 1], | |
| [9, 8], [10, 9], [11, 10], [12, 8], [13, 12], [14, 13], | |
| [15, 0], [16, 0], [17, 15], [18, 16], [19, 14], [20, 19], | |
| [21, 14], [22, 11], [23, 22], [24, 11]], | |
| 'color': [ | |
| 'k', 'r', 'r', 'r', 'b', 'b', 'b', 'k', 'r', 'r', 'r', 'b', 'b', 'b', | |
| 'y', 'y', 'y', 'y', 'b', 'b', 'b', 'r', 'r', 'r' | |
| ] | |
| } | |
| def plotSkel3D(pts, | |
| config=kintree, | |
| ax=None, | |
| phi=0, | |
| theta=0, | |
| max_range=1, | |
| linewidth=4, | |
| color=None): | |
| multi = False | |
| if torch.is_tensor(pts): | |
| if len(pts.shape) == 3: | |
| print(">>> Visualize multiperson ...") | |
| multi = True | |
| if pts.shape[1] != 3: | |
| pts = pts.transpose(1, 2) | |
| elif len(pts.shape) == 2: | |
| if pts.shape[0] != 3: | |
| pts = pts.transpose(0, 1) | |
| else: | |
| raise RuntimeError('The dimension of the points is wrong!') | |
| pts = pts.detach().cpu().numpy() | |
| else: | |
| if pts.shape[0] != 3: | |
| pts = pts.T | |
| # pts : bn, 3, NumOfPoints or (3, N) | |
| if ax is None: | |
| print('>>> create figure ...') | |
| fig = plt.figure(figsize=[5, 5]) | |
| ax = fig.add_subplot(111, projection='3d') | |
| for idx, (i, j) in enumerate(config['kintree']): | |
| if multi: | |
| for b in range(pts.shape[0]): | |
| ax.plot([pts[b][0][i], pts[b][0][j]], | |
| [pts[b][1][i], pts[b][1][j]], | |
| [pts[b][2][i], pts[b][2][j]], | |
| lw=linewidth, | |
| color=config['color'][idx] if color is None else color, | |
| alpha=1) | |
| else: | |
| ax.plot([pts[0][i], pts[0][j]], [pts[1][i], pts[1][j]], | |
| [pts[2][i], pts[2][j]], | |
| lw=linewidth, | |
| color=config['color'][idx], | |
| alpha=1) | |
| if multi: | |
| for b in range(pts.shape[0]): | |
| ax.scatter(pts[b][0], pts[b][1], pts[b][2], color='r', alpha=1) | |
| else: | |
| ax.scatter(pts[0], pts[1], pts[2], color='r', alpha=1, s=0.5) | |
| ax.view_init(phi, theta) | |
| ax.set_xlim(-max_range, max_range) | |
| ax.set_ylim(-max_range, max_range) | |
| ax.set_zlim(-0.05, 2) | |
| # ax.axis('equal') | |
| plt.xlabel('x') | |
| plt.ylabel('y') | |
| # plt.zlabel('z') | |
| return ax | |
| def plotSkel2D(pts, | |
| config=kintree, | |
| ax=None, | |
| linewidth=2, | |
| alpha=1, | |
| max_range=1, | |
| imgshape=None, | |
| thres=0.1): | |
| if len(pts.shape) == 2: | |
| pts = pts[None, :, :] #(nP, nJ, 2/3) | |
| elif len(pts.shape) == 3: | |
| pass | |
| else: | |
| raise RuntimeError('The dimension of the points is wrong!') | |
| if torch.is_tensor(pts): | |
| pts = pts.detach().cpu().numpy() | |
| if pts.shape[2] == 3 or pts.shape[2] == 2: | |
| pts = pts.transpose((0, 2, 1)) | |
| # pts : bn, 2/3, NumOfPoints or (2/3, N) | |
| if ax is None: | |
| fig = plt.figure(figsize=[5, 5]) | |
| ax = fig.add_subplot(111) | |
| if 'color' in config.keys(): | |
| colors = config['color'] | |
| else: | |
| colors = ['b' for _ in range(len(config['kintree']))] | |
| def inrange(imgshape, pts): | |
| if pts[0] < 5 or \ | |
| pts[0] > imgshape[1] - 5 or \ | |
| pts[1] < 5 or \ | |
| pts[1] > imgshape[0] - 5: | |
| return False | |
| else: | |
| return True | |
| for nP in range(pts.shape[0]): | |
| for idx, (i, j) in enumerate(config['kintree']): | |
| if pts.shape[1] == 3: # with confidence | |
| if np.min(pts[nP][2][[i, j]]) < thres: | |
| continue | |
| lw = linewidth * 2 * np.min(pts[nP][2][[i, j]]) | |
| else: | |
| lw = linewidth | |
| if imgshape is not None: | |
| if inrange(imgshape, pts[nP, :, i]) and \ | |
| inrange(imgshape, pts[nP, :, j]): | |
| pass | |
| else: | |
| continue | |
| ax.plot([pts[nP][0][i], pts[nP][0][j]], | |
| [pts[nP][1][i], pts[nP][1][j]], | |
| lw=lw, | |
| color=colors[idx], | |
| alpha=1) | |
| # if pts.shape[1] > 2: | |
| # ax.scatter(pts[nP][0], pts[nP][1], s=10*(pts[nP][2]-thres), c='r') | |
| if False: | |
| ax.axis('equal') | |
| plt.xlabel('x') | |
| plt.ylabel('y') | |
| else: | |
| ax.axis('off') | |
| return ax | |
| def draw_skeleton(img, kpts2d): | |
| cv_img = img.copy() | |
| for kp in kpts2d: | |
| if kp.shape[-1] == 2 or (kp.shape[-1] == 3 and kp[-1] > 0): | |
| cv_img = cv2.circle(cv_img, tuple(kp[:2].astype(int)), 10, | |
| (255, 0, 0)) | |
| return cv_img | |
| def vis_frame(data_root, im_data, camera): | |
| from external.SMPL_CPP.build.python import pysmplceres | |
| from .smpl_renderer import Renderer | |
| imgs = [ | |
| cv2.imread(os.path.join(data_root, im_path)) | |
| for im_path in im_data['ims'] | |
| ] | |
| imgs = [cv2.resize(img, (1024, 1024)) for img in imgs] | |
| Ks = np.array(camera['K']) | |
| Rs = np.array(camera['R']) | |
| Ts = np.array(camera['T']).transpose(0, 2, 1) / 1000 | |
| faces = np.loadtxt('data/smpl/faces.txt').astype(np.int32) | |
| render = Renderer(height=1024, width=1024, faces=faces) | |
| vertices = pysmplceres.getVertices(im_data['smpl_result']) | |
| imgsrender = render.render_multiview(vertices[0], Ks, Rs, Ts, imgs) | |
| for img in imgsrender: | |
| plt.imshow(img[..., ::-1]) | |
| plt.show() | |
| def vis_skeleton_frame(data_root, im_data, camera): | |
| from external.SMPL_CPP.build.python import pysmplceres | |
| from .smpl_renderer import Renderer | |
| imgs = [ | |
| cv2.imread(os.path.join(data_root, im_path)) | |
| for im_path in im_data['ims'] | |
| ] | |
| imgs = [cv2.resize(img, (1024, 1024)) for img in imgs] | |
| kpts2d = np.array(im_data['kpts2d']) | |
| for img, kpts in zip(imgs, kpts2d): | |
| _, ax = plt.subplots(1, 1) | |
| ax.imshow(img[..., ::-1]) | |
| plotSkel2D(kpts, ax=ax) | |
| plt.show() | |
| def vis_bbox(img, corners_2d, coord): | |
| _, ax = plt.subplots(1) | |
| ax.imshow(img) | |
| ax.add_patch( | |
| patches.Polygon(xy=corners_2d[[0, 1, 3, 2, 0, 4, 6, 2]], | |
| fill=False, | |
| linewidth=1, | |
| edgecolor='g')) | |
| ax.add_patch( | |
| patches.Polygon(xy=corners_2d[[5, 4, 6, 7, 5, 1, 3, 7]], | |
| fill=False, | |
| linewidth=1, | |
| edgecolor='g')) | |
| ax.plot(coord[:, 1], coord[:, 0], '.') | |
| plt.show() | |
| def tsne_colors(data): | |
| """ | |
| N x D np.array data | |
| """ | |
| tsne = TSNE(n_components=1, | |
| verbose=1, | |
| perplexity=40, | |
| n_iter=300, | |
| random_state=0) | |
| tsne_results = tsne.fit_transform(data) | |
| tsne_results = np.squeeze(tsne_results) | |
| tsne_min = np.min(tsne_results) | |
| tsne_max = np.max(tsne_results) | |
| tsne_results = (tsne_results - tsne_min) / (tsne_max - tsne_min) | |
| colors = plt.cm.Spectral(tsne_results)[:, :3] | |
| return colors | |
| def get_colored_pc(pts, rgb): | |
| pc = o3d.geometry.PointCloud() | |
| pc.points = o3d.utility.Vector3dVector(pts) | |
| colors = np.zeros_like(pts) | |
| colors += rgb | |
| pc.colors = o3d.utility.Vector3dVector(colors) | |
| return pc | |