(individuals, min_hits=1, max_age=5, similarity_threshold=0.6, track_method="ellipse")
| 787 | |
| 788 | |
| 789 | def _track_individuals(individuals, min_hits=1, max_age=5, similarity_threshold=0.6, track_method="ellipse"): |
| 790 | if track_method not in TRACK_METHODS: |
| 791 | raise ValueError(f"Unknown {track_method} tracker.") |
| 792 | |
| 793 | if track_method == "ellipse": |
| 794 | tracker = SORTEllipse(max_age, min_hits, similarity_threshold) |
| 795 | elif track_method == "box": |
| 796 | tracker = SORTBox(max_age, min_hits, similarity_threshold) |
| 797 | else: |
| 798 | n_bodyparts = individuals[0][0].shape[0] |
| 799 | tracker = SORTSkeleton(n_bodyparts, max_age, min_hits, similarity_threshold) |
| 800 | |
| 801 | tracklets = defaultdict(dict) |
| 802 | all_hyps = dict() |
| 803 | for i, (multi, single) in enumerate(tqdm(individuals)): |
| 804 | if single is not None: |
| 805 | tracklets["single"][i] = single |
| 806 | if multi is None: |
| 807 | continue |
| 808 | if track_method == "box": |
| 809 | # TODO: get cropping parameters and utilize! |
| 810 | xy = calc_bboxes_from_keypoints(multi) |
| 811 | else: |
| 812 | xy = multi[..., :2] |
| 813 | hyps = tracker.track(xy) |
| 814 | all_hyps[i] = hyps |
| 815 | for hyp in hyps: |
| 816 | tracklet_id, pred_id = hyp[-2:].astype(int) |
| 817 | if pred_id != -1: |
| 818 | tracklets[tracklet_id][i] = multi[pred_id] |
| 819 | return tracklets, all_hyps |
nothing calls this directly
no test coverage detected