from collections import OrderedDict
import numpy as np
from ..base import (
labeller_func,
validate_input,
connectivity_from_array,
pcloud_and_lgroup_from_ranges,
)
[docs]@labeller_func(group_label="pose_stickmen_12")
def pose_stickmen_12_to_pose_stickmen_12(pcloud):
r"""
Apply the 'stickmen' 12-point semantic labels.
The semantic labels applied are as follows:
- torso
- right_upper_arm
- left_upper_arm
- right_lower_arm
- left_lower_arm
- head
References
----------
.. [1] http://www.robots.ox.ac.uk/~vgg/data/stickmen/
"""
n_expected_points = 12
validate_input(pcloud, n_expected_points)
labels = OrderedDict(
[
("torso", (0, 2, False)),
("right_upper arm", (2, 4, False)),
("left_upper arm", (4, 6, False)),
("right_lower_arm", (6, 8, False)),
("left_lower_arm", (8, 10, False)),
("head", (10, 12, False)),
]
)
return pcloud_and_lgroup_from_ranges(pcloud, labels)
[docs]@labeller_func(group_label="pose_lsp_14")
def pose_lsp_14_to_pose_lsp_14(pcloud):
r"""
Apply the lsp 14-point semantic labels.
The semantic labels applied are as follows:
- left_leg
- right_leg
- left_arm
- right_arm
- head
References
----------
.. [1] http://www.comp.leeds.ac.uk/mat4saj/lsp.html
"""
from menpo.shape import LabelledPointUndirectedGraph
n_expected_points = 14
validate_input(pcloud, n_expected_points)
left_leg_indices = np.arange(0, 3)
right_leg_indices = np.arange(3, 6)
left_arm_indices = np.arange(6, 9)
right_arm_indices = np.arange(9, 12)
head_indices = np.arange(12, 14)
left_leg_connectivity = connectivity_from_array(left_leg_indices)
right_leg_connectivity = connectivity_from_array(right_leg_indices)
left_arm_connectivity = connectivity_from_array(left_arm_indices)
right_arm_connectivity = connectivity_from_array(right_arm_indices)
head_connectivity = connectivity_from_array(head_indices)
all_connectivity = np.vstack(
[
left_leg_connectivity,
right_leg_connectivity,
left_arm_connectivity,
right_arm_connectivity,
head_connectivity,
]
)
mapping = OrderedDict()
mapping["left_leg"] = left_leg_indices
mapping["right_leg"] = right_leg_indices
mapping["left_arm"] = left_arm_indices
mapping["right_arm"] = right_arm_indices
mapping["head"] = head_indices
new_pcloud = LabelledPointUndirectedGraph.init_from_indices_mapping(
pcloud.points, all_connectivity, mapping
)
return new_pcloud, mapping
[docs]@labeller_func(group_label="pose_flic_11")
def pose_flic_11_to_pose_flic_11(pcloud):
r"""
Apply the flic 11-point semantic labels.
The semantic labels applied are as follows:
- left_arm
- right_arm
- hips
- face
References
----------
.. [1] http://vision.grasp.upenn.edu/cgi-bin/index.php?n=VideoLearning.FLIC
"""
n_expected_points = 11
validate_input(pcloud, n_expected_points)
labels = OrderedDict(
[
("left_arm", (0, 3, False)),
("right_arm", (3, 6, False)),
("hips", (6, 8, False)),
("face", (8, 11, True)),
]
)
return pcloud_and_lgroup_from_ranges(pcloud, labels)
[docs]@labeller_func(group_label="pose_human36M_32")
def pose_human36M_32_to_pose_human36M_32(pcloud):
r"""
Apply the human3.6M 32-point semantic labels.
The semantic labels applied are as follows:
- pelvis
- right_leg
- left_leg
- spine
- head
- left_arm
- left_hand
- right_arm
- right_hand
- torso
References
----------
.. [1] http://vision.imar.ro/human3.6m/
"""
from menpo.shape import LabelledPointUndirectedGraph
n_expected_points = 32
validate_input(pcloud, n_expected_points)
pelvis_indices = np.array([1, 0, 6])
right_leg_indices = np.array(range(1, 6))
left_leg_indices = np.array(range(6, 11))
spine_indices = np.array([11, 12, 13])
head_indices = np.array([13, 14, 15])
left_arm_indices = np.array([16, 17, 18, 19, 23])
left_hand_indices = np.array([20, 21, 22])
right_arm_indices = np.array([24, 25, 26, 27, 29, 31])
right_hand_indices = np.array([28, 29, 30])
torso_indices = np.array([0, 1, 25, 13, 17, 6])
pelvis_connectivity = connectivity_from_array(pelvis_indices)
right_leg_connectivity = connectivity_from_array(right_leg_indices)
left_leg_connectivity = connectivity_from_array(left_leg_indices)
spine_connectivity = connectivity_from_array(spine_indices)
head_connectivity = connectivity_from_array(head_indices)
left_arm_connectivity = connectivity_from_array(left_arm_indices)
left_hand_connectivity = connectivity_from_array(left_hand_indices)
right_arm_connectivity = connectivity_from_array(right_arm_indices)
right_hand_connectivity = connectivity_from_array(right_hand_indices)
torso_connectivity = connectivity_from_array(torso_indices, close_loop=True)
all_connectivity = np.vstack(
[
pelvis_connectivity,
right_leg_connectivity,
left_leg_connectivity,
spine_connectivity,
head_connectivity,
left_arm_connectivity,
left_hand_connectivity,
right_arm_connectivity,
right_hand_connectivity,
torso_connectivity,
]
)
mapping = OrderedDict()
mapping["pelvis"] = pelvis_indices
mapping["right_leg"] = right_leg_indices
mapping["left_leg"] = left_leg_indices
mapping["spine"] = spine_indices
mapping["head"] = head_indices
mapping["left_arm"] = left_arm_indices
mapping["left_hand"] = left_hand_indices
mapping["right_arm"] = right_arm_indices
mapping["right_hand"] = right_hand_indices
mapping["torso"] = torso_indices
new_pcloud = LabelledPointUndirectedGraph.init_from_indices_mapping(
pcloud.points, all_connectivity, mapping
)
return new_pcloud, mapping
[docs]@labeller_func(group_label="pose_human36M_17")
def pose_human36M_32_to_pose_human36M_17(pcloud):
r"""
Apply the human3.6M 17-point semantic labels (based on the
original semantic labels of Human3.6 but removing the annotations
corresponding to duplicate points, soles and palms), originally 32-points.
The semantic labels applied are as follows:
- pelvis
- right_leg
- left_leg
- spine
- head
- left_arm
- right_arm
- torso
References
----------
.. [1] http://vision.imar.ro/human3.6m/
"""
from menpo.shape import LabelledPointUndirectedGraph
n_expected_points = 32
validate_input(pcloud, n_expected_points)
pelvis_indices = np.array([1, 0, 4])
right_leg_indices = np.arange(1, 4)
left_leg_indices = np.arange(4, 7)
spine_indices = np.array([0, 7, 8])
head_indices = np.array([8, 9, 10])
left_arm_indices = np.array([8, 11, 12, 13])
right_arm_indices = np.array([8, 14, 15, 16])
torso_indices = np.array([0, 1, 14, 8, 11, 4])
pelvis_connectivity = connectivity_from_array(pelvis_indices)
right_leg_connectivity = connectivity_from_array(right_leg_indices)
left_leg_connectivity = connectivity_from_array(left_leg_indices)
spine_connectivity = connectivity_from_array(spine_indices)
head_connectivity = connectivity_from_array(head_indices)
left_arm_connectivity = connectivity_from_array(left_arm_indices)
right_arm_connectivity = connectivity_from_array(right_arm_indices)
torso_connectivity = connectivity_from_array(torso_indices, close_loop=True)
all_connectivity = np.vstack(
[
pelvis_connectivity,
right_leg_connectivity,
left_leg_connectivity,
spine_connectivity,
head_connectivity,
left_arm_connectivity,
right_arm_connectivity,
torso_connectivity,
]
)
mapping = OrderedDict()
mapping["pelvis"] = pelvis_indices
mapping["right_leg"] = right_leg_indices
mapping["left_leg"] = left_leg_indices
mapping["spine"] = spine_indices
mapping["head"] = head_indices
mapping["left_arm"] = left_arm_indices
mapping["right_arm"] = right_arm_indices
mapping["torso"] = torso_indices
# Ignore duplicate points, sole and palms
ind = np.hstack(
[
np.arange(0, 4),
np.arange(6, 9),
np.arange(12, 16),
np.arange(17, 20),
np.arange(25, 28),
]
)
new_pcloud = LabelledPointUndirectedGraph.init_from_indices_mapping(
pcloud.points[ind], all_connectivity, mapping
)
return new_pcloud, mapping