1
- from pathlib import Path
2
1
from typing import Tuple , Literal , List , Union
3
2
import copy
4
3
import numpy as np
5
- from numpy import ma
4
+ import numpy . ma as ma
6
5
from pose_format .pose import Pose
7
6
from pose_format .numpy import NumPyPoseBody
8
7
from pose_format .pose_header import PoseHeader , PoseHeaderDimensions , PoseHeaderComponent , PoseNormalizationInfo
9
8
from pose_format .utils .normalization_3d import PoseNormalizer
10
9
from pose_format .utils .openpose import OpenPose_Components
10
+ from pose_format .utils .openpose import BODY_POINTS as OPENPOSE_BODY_POINTS
11
11
from pose_format .utils .openpose_135 import OpenPose_Components as OpenPose135_Components
12
12
13
13
# from pose_format.utils.holistic import holistic_components
@@ -62,31 +62,55 @@ def normalize_pose_size(pose: Pose, target_width: int = 512):
62
62
pose .header .dimensions .height = pose .header .dimensions .width = target_width
63
63
64
64
65
- def pose_hide_legs (pose : Pose ):
65
+ def pose_hide_legs (pose : Pose , remove : bool = False ) -> Pose :
66
+ """
67
+ Hide or remove leg components from a pose.
68
+
69
+ If `remove` is True, the leg components are removed; otherwise, they are hidden (zeroed out).
70
+ """
66
71
known_pose_format = detect_known_pose_format (pose )
72
+
67
73
if known_pose_format == "holistic" :
68
- point_names = ["KNEE" , "ANKLE" , "HEEL" , "FOOT_INDEX" ]
69
- # pylint: disable=protected-access
70
- points = [
71
- pose .header ._get_point_index ("POSE_LANDMARKS" , side + "_" + n )
72
- for n in point_names
73
- for side in ["LEFT" , "RIGHT" ]
74
- ]
75
- pose .body .data [:, :, points , :] = 0
76
- pose .body .confidence [:, :, points ] = 0
74
+ point_names = ["KNEE" , "ANKLE" , "HEEL" , "FOOT_INDEX" , "HIP" ]
75
+ sides = ["LEFT" , "RIGHT" ]
76
+ point_names_to_remove = [f"{ side } _{ name } " for side in sides for name in point_names ]
77
+ points_to_remove_dict = {
78
+ "POSE_LANDMARKS" : point_names_to_remove ,
79
+ "POSE_WORLD_LANDMARKS" : point_names_to_remove ,
80
+ }
81
+
77
82
elif known_pose_format == "openpose" :
78
- point_names = ["Hip" , "Knee" , "Ankle" , "BigToe" , "SmallToe" , "Heel" ]
79
- # pylint: disable=protected-access
80
- points = [
81
- pose . header . _get_point_index ( "pose_keypoints_2d" , side + n ) for n in point_names for side in [ "L" , "R" ]
82
- ]
83
- pose . body . data [:, :, points , :] = 0
84
- pose . body . confidence [:, :, points ] = 0
83
+ words_to_look_for = ["Hip" , "Knee" , "Ankle" , "BigToe" , "SmallToe" , "Heel" ]
84
+ point_names_to_remove = [ point for point in OPENPOSE_BODY_POINTS
85
+ if any ( word in point for word in words_to_look_for )]
86
+
87
+ # if any of the items in point_
88
+ points_to_remove_dict = { "pose_keypoints_2d" : point_names_to_remove }
89
+
85
90
else :
86
91
raise NotImplementedError (
87
92
f"Unsupported pose header schema { known_pose_format } for { pose_hide_legs .__name__ } : { pose .header } "
88
93
)
89
94
95
+ if remove :
96
+ return pose .remove_components ([], points_to_remove_dict )
97
+
98
+ # Hide the points instead of removing them
99
+ point_indices = []
100
+ for component , points in points_to_remove_dict .items ():
101
+ for point_name in points :
102
+ try :
103
+ point_index = pose .header .get_point_index (component , point_name )
104
+ point_indices .append (point_index )
105
+ except ValueError : # point not found, maybe removed earlier in other preprocessing steps
106
+ pass
107
+
108
+
109
+ pose .body .data [:, :, point_indices , :] = 0
110
+ pose .body .confidence [:, :, point_indices ] = 0
111
+
112
+ return pose
113
+
90
114
91
115
def pose_shoulders (pose_header : PoseHeader ) -> Tuple [Tuple [str , str ], Tuple [str , str ]]:
92
116
known_pose_format = detect_known_pose_format (pose_header )
@@ -109,14 +133,14 @@ def hands_indexes(pose_header: PoseHeader)-> List[int]:
109
133
known_pose_format = detect_known_pose_format (pose_header )
110
134
if known_pose_format == "holistic" :
111
135
return [
112
- pose_header ._get_point_index ("LEFT_HAND_LANDMARKS" , "MIDDLE_FINGER_MCP" ),
113
- pose_header ._get_point_index ("RIGHT_HAND_LANDMARKS" , "MIDDLE_FINGER_MCP" ),
136
+ pose_header .get_point_index ("LEFT_HAND_LANDMARKS" , "MIDDLE_FINGER_MCP" ),
137
+ pose_header .get_point_index ("RIGHT_HAND_LANDMARKS" , "MIDDLE_FINGER_MCP" ),
114
138
]
115
139
116
140
if known_pose_format == "openpose" :
117
141
return [
118
- pose_header ._get_point_index ("hand_left_keypoints_2d" , "M_CMC" ),
119
- pose_header ._get_point_index ("hand_right_keypoints_2d" , "M_CMC" ),
142
+ pose_header .get_point_index ("hand_left_keypoints_2d" , "M_CMC" ),
143
+ pose_header .get_point_index ("hand_right_keypoints_2d" , "M_CMC" ),
120
144
]
121
145
raise NotImplementedError (
122
146
f"Unsupported pose header schema { known_pose_format } for { hands_indexes .__name__ } : { pose_header } "
@@ -148,12 +172,12 @@ def hands_components(pose_header: PoseHeader)-> Tuple[Tuple[str, str], Tuple[str
148
172
def normalize_component_3d (pose , component_name : str , plane : Tuple [str , str , str ], line : Tuple [str , str ]):
149
173
hand_pose = pose .get_components ([component_name ])
150
174
plane_info = hand_pose .header .normalization_info (
151
- p1 = (component_name , plane [0 ]),
152
- p2 = (component_name , plane [1 ]),
175
+ p1 = (component_name , plane [0 ]),
176
+ p2 = (component_name , plane [1 ]),
153
177
p3 = (component_name , plane [2 ])
154
178
)
155
179
line_info = hand_pose .header .normalization_info (
156
- p1 = (component_name , line [0 ]),
180
+ p1 = (component_name , line [0 ]),
157
181
p2 = (component_name , line [1 ])
158
182
)
159
183
@@ -176,10 +200,11 @@ def normalize_hands_3d(pose: Pose, left_hand=True, right_hand=True):
176
200
def get_standard_components_for_known_format (known_pose_format : KnownPoseFormat ) -> List [PoseHeaderComponent ]:
177
201
if known_pose_format == "holistic" :
178
202
try :
203
+ # pylint: disable=import-outside-toplevel
179
204
import pose_format .utils .holistic as holistic_utils
180
205
return holistic_utils .holistic_components ()
181
206
except ImportError as e :
182
- raise e
207
+ raise e
183
208
if known_pose_format == "openpose" :
184
209
return OpenPose_Components
185
210
if known_pose_format == "openpose_135" :
@@ -191,7 +216,7 @@ def get_standard_components_for_known_format(known_pose_format: KnownPoseFormat)
191
216
def fake_pose (num_frames : int , fps : int = 25 , components : Union [List [PoseHeaderComponent ],None ]= None )-> Pose :
192
217
if components is None :
193
218
components = copy .deepcopy (OpenPose_Components ) # fixes W0102, dangerous default value
194
-
219
+
195
220
if components [0 ].format == "XYZC" :
196
221
dimensions = PoseHeaderDimensions (width = 1 , height = 1 , depth = 1 )
197
222
elif components [0 ].format == "XYC" :
@@ -204,7 +229,6 @@ def fake_pose(num_frames: int, fps: int=25, components: Union[List[PoseHeaderCom
204
229
data = np .random .randn (num_frames , 1 , total_points , header .num_dims ())
205
230
confidence = np .random .randn (num_frames , 1 , total_points )
206
231
masked_data = ma .masked_array (data )
207
-
208
232
209
233
body = NumPyPoseBody (fps = int (fps ), data = masked_data , confidence = confidence )
210
234
@@ -214,9 +238,9 @@ def fake_pose(num_frames: int, fps: int=25, components: Union[List[PoseHeaderCom
214
238
def get_hand_wrist_index (pose : Pose , hand : str )-> int :
215
239
known_pose_format = detect_known_pose_format (pose )
216
240
if known_pose_format == "holistic" :
217
- return pose .header ._get_point_index (f"{ hand .upper ()} _HAND_LANDMARKS" , "WRIST" )
241
+ return pose .header .get_point_index (f"{ hand .upper ()} _HAND_LANDMARKS" , "WRIST" )
218
242
if known_pose_format == "openpose" :
219
- return pose .header ._get_point_index (f"hand_{ hand .lower ()} _keypoints_2d" , "BASE" )
243
+ return pose .header .get_point_index (f"hand_{ hand .lower ()} _keypoints_2d" , "BASE" )
220
244
raise NotImplementedError (
221
245
f"Unsupported pose header schema { known_pose_format } for { get_hand_wrist_index .__name__ } : { pose .header } "
222
246
)
@@ -225,9 +249,9 @@ def get_hand_wrist_index(pose: Pose, hand: str)-> int:
225
249
def get_body_hand_wrist_index (pose : Pose , hand : str )-> int :
226
250
known_pose_format = detect_known_pose_format (pose )
227
251
if known_pose_format == "holistic" :
228
- return pose .header ._get_point_index ("POSE_LANDMARKS" , f"{ hand .upper ()} _WRIST" )
252
+ return pose .header .get_point_index ("POSE_LANDMARKS" , f"{ hand .upper ()} _WRIST" )
229
253
if known_pose_format == "openpose" :
230
- return pose .header ._get_point_index ("pose_keypoints_2d" , f"{ hand .upper ()[0 ]} Wrist" )
254
+ return pose .header .get_point_index ("pose_keypoints_2d" , f"{ hand .upper ()[0 ]} Wrist" )
231
255
raise NotImplementedError (
232
256
f"Unsupported pose header schema { known_pose_format } for { get_body_hand_wrist_index .__name__ } : { pose .header } "
233
257
)
@@ -244,7 +268,7 @@ def correct_wrist(pose: Pose, hand: str) -> Pose:
244
268
body_wrist_conf = pose .body .confidence [:, :, body_wrist_index ]
245
269
246
270
point_coordinate_count = wrist .shape [- 1 ]
247
- stacked_conf = np .stack ([wrist_conf ] * point_coordinate_count , axis = - 1 )
271
+ stacked_conf = np .stack ([wrist_conf ] * point_coordinate_count , axis = - 1 )
248
272
new_wrist_data = ma .where (stacked_conf == 0 , body_wrist , wrist )
249
273
new_wrist_conf = ma .where (wrist_conf == 0 , body_wrist_conf , wrist_conf )
250
274
@@ -263,7 +287,7 @@ def reduce_holistic(pose: Pose) -> Pose:
263
287
known_pose_format = detect_known_pose_format (pose )
264
288
if known_pose_format != "holistic" :
265
289
return pose
266
-
290
+ # pylint: disable=pointless-string-statement
267
291
"""
268
292
# from mediapipe.python.solutions.face_mesh_connections import FACEMESH_CONTOURS
269
293
# points_set = set([p for p_tup in list(FACEMESH_CONTOURS) for p in p_tup])
0 commit comments