Spaces:
Configuration error
Configuration error
import glob | |
import os | |
from PIL import Image | |
import numpy as np | |
from matplotlib import pyplot as plt | |
from io import BytesIO | |
def visualize_hand(all_joints, img, side=["right", "left"], n_avail_joints=21): | |
# Define the connections between joints for drawing lines and their corresponding colors | |
connections = [ | |
((0, 1), "red"), | |
((1, 2), "green"), | |
((2, 3), "blue"), | |
((3, 4), "purple"), | |
((0, 5), "orange"), | |
((5, 6), "pink"), | |
((6, 7), "brown"), | |
((7, 8), "cyan"), | |
((0, 9), "yellow"), | |
((9, 10), "magenta"), | |
((10, 11), "lime"), | |
((11, 12), "indigo"), | |
((0, 13), "olive"), | |
((13, 14), "teal"), | |
((14, 15), "navy"), | |
((15, 16), "gray"), | |
((0, 17), "lavender"), | |
((17, 18), "silver"), | |
((18, 19), "maroon"), | |
((19, 20), "fuchsia"), | |
] | |
H, W, C = img.shape | |
# Create a figure and axis | |
plt.figure() | |
ax = plt.gca() | |
# Plot joints as points | |
ax.imshow(img) | |
start_is = [] | |
if "right" in side: | |
start_is.append(0) | |
if "left" in side: | |
start_is.append(21) | |
for start_i in start_is: | |
joints = all_joints[start_i : start_i + n_avail_joints] | |
if len(joints) == 1: | |
ax.scatter(joints[0][0], joints[0][1], color="red", s=10) | |
else: | |
for connection, color in connections[: len(joints) - 1]: | |
joint1 = joints[connection[0]] | |
joint2 = joints[connection[1]] | |
ax.plot([joint1[0], joint2[0]], [joint1[1], joint2[1]], color=color, linewidth=4) | |
ax.set_xlim([0, W]) | |
ax.set_ylim([0, H]) | |
ax.grid(False) | |
ax.set_axis_off() | |
ax.invert_yaxis() | |
# plt.subplots_adjust(wspace=0.01) | |
# plt.show() | |
buf = BytesIO() | |
plt.savefig(buf, format="png", bbox_inches="tight", pad_inches=0) | |
plt.close() | |
# Convert BytesIO object to numpy array | |
buf.seek(0) | |
img_pil = Image.open(buf) | |
img_pil = img_pil.resize((W, H)) | |
numpy_img = np.array(img_pil) | |
return numpy_img | |
'''put brush example at alpha channel''' | |
# img_dir = "bad_hands" | |
# masked_paths = sorted(glob.glob(os.path.join(img_dir, "*_mask.jpg"))) | |
# for masked_pth in masked_paths: | |
# img_path = masked_pth.replace("_mask.jpg", ".jpg") | |
# assert os.path.exists(img_path), f"Image path {img_path} does not exist." | |
# masked = np.array(Image.open(masked_pth)) | |
# mask = (np.all(masked > 245, axis=-1)).astype(np.uint8)*128 + 64 | |
# img = np.array(Image.open(img_path)) | |
# composite = np.concatenate((img, mask[..., None]), axis=-1) | |
# composite = Image.fromarray(composite) | |
# composite.save(masked_pth.replace("_mask.jpg", "_composite.png")) | |
# print(f"Saved composite image {masked_pth.replace('_mask.jpg', '_composite.png')}") | |
'''visualize keypoint example''' | |
data_dir = "bad_hands" | |
kpts_paths = sorted(glob.glob(os.path.join(data_dir, "*.npy"))) | |
for kpts_pth in kpts_paths: | |
img_pth = kpts_pth.replace(".npy", ".jpg") | |
kpts = np.load(kpts_pth) | |
img = np.array(Image.open(img_pth)) | |
h, w = img.shape[:2] | |
kpts = kpts / np.array([256,256]) * np.array([w, h]) | |
kpts_vis = visualize_hand(kpts, img) | |
save_path = kpts_pth.replace(".npy", "_kpts.png") | |
kpts_vis = Image.fromarray(kpts_vis).save(save_path) | |
print(f"Saved {save_path}") |