(self, poses)
| 548 | return mat |
| 549 | |
| 550 | def track(self, poses): |
| 551 | self.n_frames += 1 |
| 552 | |
| 553 | if not len(self.trackers): |
| 554 | for pose in poses: |
| 555 | tracker = SkeletonTracker(self.n_bodyparts) |
| 556 | tracker.state = pose |
| 557 | self.trackers.append(tracker) |
| 558 | |
| 559 | poses_ref = [] |
| 560 | for _, tracker in enumerate(self.trackers): |
| 561 | pose_ref = tracker.predict() |
| 562 | poses_ref.append(pose_ref.reshape((-1, 2))) |
| 563 | |
| 564 | # mat = self.calc_pairwise_oks(poses, poses_ref) |
| 565 | mat = self.calc_pairwise_hausdorff_dist(poses, poses_ref) |
| 566 | row_indices, col_indices = linear_sum_assignment(mat, maximize=False) |
| 567 | |
| 568 | unmatched_poses = [p for p, _ in enumerate(poses) if p not in row_indices] |
| 569 | unmatched_trackers = [t for t, _ in enumerate(poses_ref) if t not in col_indices] |
| 570 | # Remove matched detections with low OKS |
| 571 | # matches = [] |
| 572 | # for row, col in zip(row_indices, col_indices): |
| 573 | # if mat[row, col] < self.oks_threshold: |
| 574 | # unmatched_poses.append(row) |
| 575 | # unmatched_trackers.append(col) |
| 576 | # else: |
| 577 | # matches.append([row, col]) |
| 578 | # if not len(matches): |
| 579 | # matches = np.empty((0, 2), dtype=int) |
| 580 | # else: |
| 581 | # matches = np.stack(matches) |
| 582 | matches = np.c_[row_indices, col_indices] |
| 583 | |
| 584 | animalindex = [] |
| 585 | for t, tracker in enumerate(self.trackers): |
| 586 | if t not in unmatched_trackers: |
| 587 | ind = matches[matches[:, 1] == t, 0][0] |
| 588 | animalindex.append(ind) |
| 589 | tracker.update(poses[ind]) |
| 590 | else: |
| 591 | animalindex.append(-1) |
| 592 | |
| 593 | for i in unmatched_poses: |
| 594 | tracker = SkeletonTracker(self.n_bodyparts) |
| 595 | tracker.state = poses[i] |
| 596 | self.trackers.append(tracker) |
| 597 | animalindex.append(i) |
| 598 | |
| 599 | states = [] |
| 600 | i = len(self.trackers) |
| 601 | for tracker in reversed(self.trackers): |
| 602 | i -= 1 |
| 603 | if tracker.time_since_update > self.max_age: |
| 604 | self.trackers.pop() |
| 605 | continue |
| 606 | state = tracker.predict() |
| 607 | states.append(np.r_[state, [tracker.id, int(animalindex[i])]]) |
no test coverage detected