Spaces:
Running
on
Zero
Running
on
Zero
import sys | |
import json | |
from os import path as osp | |
import os | |
import numpy as np | |
from PIL import Image, ImageDraw | |
from tqdm import tqdm | |
input_path = sys.argv[1] | |
output_path = sys.argv[2] | |
def get_img_agnostic(img, parse, pose_data): | |
parse_array = np.array(parse) | |
parse_head = ((parse_array == 4 ).astype(np.float32) + | |
(parse_array == 13).astype(np.float32)) | |
parse_lower = ((parse_array == 9 ).astype(np.float32) + | |
(parse_array == 12).astype(np.float32) + | |
(parse_array == 16).astype(np.float32) + | |
(parse_array == 17).astype(np.float32) + | |
(parse_array == 18).astype(np.float32) + | |
(parse_array == 19).astype(np.float32)) | |
agnostic = img.copy() | |
agnostic_draw = ImageDraw.Draw(agnostic) | |
length_a = np.linalg.norm(pose_data[5] - pose_data[2]) | |
length_b = np.linalg.norm(pose_data[12] - pose_data[9]) | |
point = (pose_data[9] + pose_data[12]) / 2 | |
pose_data[9] = point + (pose_data[9] - point) / length_b * length_a | |
pose_data[12] = point + (pose_data[12] - point) / length_b * length_a | |
r = int(length_a / 16) + 1 | |
# mask arms | |
agnostic_draw.line([tuple(pose_data[i]) for i in [2, 5]], 'white', width=r*10) | |
for i in [2, 5]: | |
pointx, pointy = pose_data[i] | |
agnostic_draw.ellipse((pointx-r*5, pointy-r*5, pointx+r*5, pointy+r*5), 'white', 'white') | |
for i in [3, 4, 6, 7]: | |
if (pose_data[i - 1, 0] == 0.0 and pose_data[i - 1, 1] == 0.0) or (pose_data[i, 0] == 0.0 and pose_data[i, 1] == 0.0): | |
continue | |
agnostic_draw.line([tuple(pose_data[j]) for j in [i - 1, i]], 'white', width=r*10) | |
pointx, pointy = pose_data[i] | |
agnostic_draw.ellipse((pointx-r*5, pointy-r*5, pointx+r*5, pointy+r*5), 'white', 'white') | |
# mask torso | |
for i in [9, 12]: | |
pointx, pointy = pose_data[i] | |
agnostic_draw.ellipse((pointx-r*3, pointy-r*6, pointx+r*3, pointy+r*6), 'white', 'white') | |
agnostic_draw.line([tuple(pose_data[i]) for i in [2, 9]], 'white', width=r*6) | |
agnostic_draw.line([tuple(pose_data[i]) for i in [5, 12]], 'white', width=r*6) | |
agnostic_draw.line([tuple(pose_data[i]) for i in [9, 12]], 'white', width=r*12) | |
agnostic_draw.polygon([tuple(pose_data[i]) for i in [2, 5, 12, 9]], 'white', 'white') | |
# mask neck | |
pointx, pointy = pose_data[1] | |
agnostic_draw.rectangle((pointx-r*7, pointy-r*7, pointx+r*7, pointy+r*7), 'white', 'white') | |
agnostic.paste(img, None, Image.fromarray(np.uint8(parse_head * 255), 'L')) | |
agnostic.paste(img, None, Image.fromarray(np.uint8(parse_lower * 255), 'L')) | |
return agnostic | |
os.makedirs(output_path, exist_ok=True) | |
for im_name in tqdm(os.listdir(osp.join(input_path, 'image'))): | |
# Load pose image | |
pose_name = im_name.replace('.jpg', '_keypoints.json') | |
try: | |
with open(osp.join(input_path, 'openpose_json', pose_name), 'r') as f: | |
pose_label = json.load(f) | |
pose_data = pose_label['people'][0]['pose_keypoints_2d'] | |
pose_data = np.array(pose_data) | |
pose_data = pose_data.reshape((-1, 3))[:, :2] | |
except IndexError: | |
print(pose_name) | |
continue | |
# Load parsing image | |
label_name = im_name.replace('.jpg', '.png') | |
im_label = Image.open(osp.join(input_path, 'image-parse-v3', label_name)) | |
# Generate agnostic image and save | |
agnostic = get_img_agnostic(Image.new("RGB", (768, 1024), (0, 0, 0)), im_label, pose_data) | |
agnostic.save(osp.join(output_path, im_name.replace('.jpg', '.png'))) | |
print("Done") |