Spaces:
Running on Zero
Running on Zero
File size: 4,806 Bytes
1b2e96f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | """Minimal MHR70/Goliath40 conditioning schema.
The exact keypoint names/order and no-finger link closure were extracted from
``facebookresearch/sapiens2`` revision
``0e51c12d7c7257d88431b2d50e523a7b03004854`` and remain subject to the
Sapiens2 License. A copy is kept at
``third_party/licenses/SAPIENS2_LICENSE.md``. The RGB palette, per-keypoint
color policy, and renderer implementation are original 4DAnyone material
licensed under Apache-2.0.
"""
from __future__ import annotations
# The exact names/order below are derived from Sapiens2, Copyright (c) Meta
# Platforms, Inc. and affiliates, under the Sapiens2 License noted above.
KEYPOINT_NAMES = (
"nose",
"left-eye",
"right-eye",
"left-ear",
"right-ear",
"left-shoulder",
"right-shoulder",
"left-elbow",
"right-elbow",
"left-hip",
"right-hip",
"left-knee",
"right-knee",
"left-ankle",
"right-ankle",
"left-big-toe-tip",
"left-small-toe-tip",
"left-heel",
"right-big-toe-tip",
"right-small-toe-tip",
"right-heel",
"right-thumb-tip",
"right-thumb-first-joint",
"right-thumb-second-joint",
"right-thumb-third-joint",
"right-index-tip",
"right-index-first-joint",
"right-index-second-joint",
"right-index-third-joint",
"right-middle-tip",
"right-middle-first-joint",
"right-middle-second-joint",
"right-middle-third-joint",
"right-ring-tip",
"right-ring-first-joint",
"right-ring-second-joint",
"right-ring-third-joint",
"right-pinky-tip",
"right-pinky-first-joint",
"right-pinky-second-joint",
"right-pinky-third-joint",
"right-wrist",
"left-thumb-tip",
"left-thumb-first-joint",
"left-thumb-second-joint",
"left-thumb-third-joint",
"left-index-tip",
"left-index-first-joint",
"left-index-second-joint",
"left-index-third-joint",
"left-middle-tip",
"left-middle-first-joint",
"left-middle-second-joint",
"left-middle-third-joint",
"left-ring-tip",
"left-ring-first-joint",
"left-ring-second-joint",
"left-ring-third-joint",
"left-pinky-tip",
"left-pinky-first-joint",
"left-pinky-second-joint",
"left-pinky-third-joint",
"left-wrist",
"left-olecranon",
"right-olecranon",
"left-cubital-fossa",
"right-cubital-fossa",
"left-acromion",
"right-acromion",
"neck",
)
# First-party 4DAnyone color palette, licensed under Apache-2.0.
BLUE = (116, 192, 252)
GREEN = (130, 186, 129)
ORANGE = (248, 129, 81)
TEAL = (99, 230, 190)
YELLOW = (255, 212, 59)
PINK = (229, 153, 247)
PURPLE = (177, 151, 252)
RED = (255, 135, 135)
# The schema ids and link endpoints are Sapiens2-derived. The RGB assignments
# are first-party 4DAnyone material.
# (schema id, first keypoint, second keypoint, RGB, major)
LINKS = (
(0, 13, 11, TEAL, True),
(1, 11, 9, TEAL, True),
(2, 14, 12, YELLOW, True),
(3, 12, 10, YELLOW, True),
(4, 9, 10, BLUE, True),
(5, 5, 9, GREEN, True),
(6, 6, 10, ORANGE, True),
(7, 5, 6, BLUE, True),
(8, 5, 7, TEAL, True),
(9, 6, 8, YELLOW, True),
(10, 7, 62, TEAL, True),
(11, 8, 41, YELLOW, True),
(12, 1, 2, BLUE, True),
(13, 0, 1, GREEN, True),
(14, 0, 2, ORANGE, True),
(15, 1, 3, GREEN, True),
(16, 2, 4, ORANGE, True),
(17, 3, 5, GREEN, True),
(18, 4, 6, ORANGE, True),
(19, 13, 15, TEAL, True),
(20, 13, 16, TEAL, True),
(21, 13, 17, TEAL, True),
(22, 14, 18, YELLOW, True),
(23, 14, 19, YELLOW, True),
(24, 14, 20, YELLOW, True),
(25, 62, 45, YELLOW, False),
(29, 62, 49, PINK, False),
(33, 62, 53, PURPLE, False),
(37, 62, 57, RED, False),
(41, 62, 61, TEAL, False),
(45, 41, 24, YELLOW, False),
(49, 41, 28, PINK, False),
(53, 41, 32, PURPLE, False),
(57, 41, 36, RED, False),
(61, 41, 40, TEAL, False),
(65, 5, 10, PURPLE, True),
(66, 6, 9, PURPLE, True),
(67, 3, 4, PURPLE, True),
)
EXTRA_KEYPOINT_IDS = frozenset(range(63, 70))
def keypoint_color(keypoint_id: int) -> tuple[int, int, int]:
name = KEYPOINT_NAMES[keypoint_id]
if name == "nose" or name == "neck":
return BLUE
if name in {"left-eye", "left-ear"}:
return GREEN
if name in {"right-eye", "right-ear"}:
return ORANGE
if "thumb" in name:
return YELLOW
if "forefinger" in name or "index" in name:
return PINK
if "middle" in name:
return PURPLE
if "ring" in name:
return RED
if "pinky" in name:
return TEAL
return TEAL if name.startswith("left-") else YELLOW if name.startswith("right-") else BLUE
VISIBLE_KEYPOINT_IDS = (
frozenset({index for _, first, second, _, _ in LINKS for index in (first, second)}) | EXTRA_KEYPOINT_IDS
)
|