| 2 | |
| 3 | |
| 4 | class MotionPreprocessor: |
| 5 | def __init__(self, skeletons, mean_pose): |
| 6 | self.skeletons = np.array(skeletons) |
| 7 | self.mean_pose = np.array(mean_pose).reshape(-1, 3) |
| 8 | self.filtering_message = "PASS" |
| 9 | |
| 10 | def get(self): |
| 11 | assert (self.skeletons is not None) |
| 12 | |
| 13 | # filtering |
| 14 | if self.skeletons != []: |
| 15 | if self.check_pose_diff(): |
| 16 | self.skeletons = [] |
| 17 | self.filtering_message = "pose" |
| 18 | elif self.check_spine_angle(): |
| 19 | self.skeletons = [] |
| 20 | self.filtering_message = "spine angle" |
| 21 | elif self.check_static_motion(): |
| 22 | self.skeletons = [] |
| 23 | self.filtering_message = "motion" |
| 24 | |
| 25 | if self.skeletons != []: |
| 26 | self.skeletons = self.skeletons.tolist() |
| 27 | for i, frame in enumerate(self.skeletons): |
| 28 | assert not np.isnan(self.skeletons[i]).any() # missing joints |
| 29 | |
| 30 | return self.skeletons, self.filtering_message |
| 31 | |
| 32 | def check_static_motion(self, verbose=False): |
| 33 | def get_variance(skeleton, joint_idx): |
| 34 | wrist_pos = skeleton[:, joint_idx] |
| 35 | variance = np.sum(np.var(wrist_pos, axis=0)) |
| 36 | return variance |
| 37 | |
| 38 | left_arm_var = get_variance(self.skeletons, 6) |
| 39 | right_arm_var = get_variance(self.skeletons, 9) |
| 40 | |
| 41 | th = 0.0014 # exclude 13110 |
| 42 | # th = 0.002 # exclude 16905 |
| 43 | if left_arm_var < th and right_arm_var < th: |
| 44 | if verbose: |
| 45 | print('skip - check_static_motion left var {}, right var {}'.format(left_arm_var, right_arm_var)) |
| 46 | return True |
| 47 | else: |
| 48 | if verbose: |
| 49 | print('pass - check_static_motion left var {}, right var {}'.format(left_arm_var, right_arm_var)) |
| 50 | return False |
| 51 | |
| 52 | def check_pose_diff(self, verbose=False): |
| 53 | diff = np.abs(self.skeletons - self.mean_pose) |
| 54 | diff = np.mean(diff) |
| 55 | |
| 56 | # th = 0.017 |
| 57 | th = 0.02 # exclude 3594 |
| 58 | if diff < th: |
| 59 | if verbose: |
| 60 | print('skip - check_pose_diff {:.5f}'.format(diff)) |
| 61 | return True |