Source code for motrackers.iou_tracker

from motrackers.utils.misc import iou_xywh as iou
from motrackers.tracker import Tracker


[docs]class IOUTracker(Tracker): """ Intersection over Union Tracker. References ---------- * Implementation of this algorithm is heavily based on https://github.com/bochinski/iou-tracker Args: max_lost (int): Maximum number of consecutive frames object was not detected. tracker_output_format (str): Output format of the tracker. min_detection_confidence (float): Threshold for minimum detection confidence. max_detection_confidence (float): Threshold for max. detection confidence. iou_threshold (float): Intersection over union minimum value. """ def __init__( self, max_lost=2, iou_threshold=0.5, min_detection_confidence=0.4, max_detection_confidence=0.7, tracker_output_format='mot_challenge' ): self.iou_threshold = iou_threshold self.max_detection_confidence = max_detection_confidence self.min_detection_confidence = min_detection_confidence super(IOUTracker, self).__init__(max_lost=max_lost, tracker_output_format=tracker_output_format)
[docs] def update(self, bboxes, detection_scores, class_ids): detections = Tracker.preprocess_input(bboxes, class_ids, detection_scores) self.frame_count += 1 track_ids = list(self.tracks.keys()) updated_tracks = [] for track_id in track_ids: if len(detections) > 0: idx, best_match = max(enumerate(detections), key=lambda x: iou(self.tracks[track_id].bbox, x[1][0])) (bb, cid, scr) = best_match if iou(self.tracks[track_id].bbox, bb) > self.iou_threshold: self._update_track(track_id, self.frame_count, bb, scr, class_id=cid, iou_score=iou(self.tracks[track_id].bbox, bb)) updated_tracks.append(track_id) del detections[idx] if len(updated_tracks) == 0 or track_id is not updated_tracks[-1]: self.tracks[track_id].lost += 1 if self.tracks[track_id].lost > self.max_lost: self._remove_track(track_id) for bb, cid, scr in detections: self._add_track(self.frame_count, bb, scr, class_id=cid) outputs = self._get_tracks(self.tracks) return outputs