|
""" |
|
Used to process keypoints generated from ControlNet extension. |
|
""" |
|
import json |
|
from typing import List, Tuple |
|
|
|
def process_keypoints(nums: List[float], width: int, height: int) -> List[List[float]]: |
|
if not nums: |
|
return [] |
|
|
|
assert len(nums) % 3 == 0 |
|
|
|
def find_min(nums: float): |
|
return min(num for num in nums if num > 0) |
|
|
|
base_x = find_min(nums[::3]) |
|
base_y = find_min(nums[1::3]) |
|
|
|
normalized = all(abs(num) <= 1.0 for num in nums) |
|
x_factor = width if normalized else 1.0 |
|
y_factor = height if normalized else 1.0 |
|
|
|
return [ |
|
[(x-base_x) * x_factor, (y-base_y) * y_factor, c] |
|
for x, y, c in zip(nums[::3], nums[1::3], nums[2::3]) |
|
] |
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
with open('pose_hand_fixed.json', 'r') as f: |
|
pose = json.load(f) |
|
person = pose["people"][0] |
|
|
|
with open('output_pose.json', 'w') as f: |
|
width = pose['canvas_width'] |
|
height = pose['canvas_height'] |
|
|
|
json.dump({ |
|
'left_hand': process_keypoints(person.get('hand_left_keypoints_2d'), width, height), |
|
'right_hand': process_keypoints(person.get('hand_right_keypoints_2d'), width, height), |
|
'face': process_keypoints(person.get('face_keypoints_2d'), width, height), |
|
}, f, indent=4) |
|
|