Spaces:
Runtime error
Runtime error
# vim: expandtab:ts=4:sw=4 | |
from __future__ import absolute_import | |
import numpy as np | |
from yolox.deepsort_tracker import linear_assignment | |
def iou(bbox, candidates): | |
"""Computer intersection over union. | |
Parameters | |
---------- | |
bbox : ndarray | |
A bounding box in format `(top left x, top left y, width, height)`. | |
candidates : ndarray | |
A matrix of candidate bounding boxes (one per row) in the same format | |
as `bbox`. | |
Returns | |
------- | |
ndarray | |
The intersection over union in [0, 1] between the `bbox` and each | |
candidate. A higher score means a larger fraction of the `bbox` is | |
occluded by the candidate. | |
""" | |
bbox_tl, bbox_br = bbox[:2], bbox[:2] + bbox[2:] | |
candidates_tl = candidates[:, :2] | |
candidates_br = candidates[:, :2] + candidates[:, 2:] | |
tl = np.c_[np.maximum(bbox_tl[0], candidates_tl[:, 0])[:, np.newaxis], | |
np.maximum(bbox_tl[1], candidates_tl[:, 1])[:, np.newaxis]] | |
br = np.c_[np.minimum(bbox_br[0], candidates_br[:, 0])[:, np.newaxis], | |
np.minimum(bbox_br[1], candidates_br[:, 1])[:, np.newaxis]] | |
wh = np.maximum(0., br - tl) | |
area_intersection = wh.prod(axis=1) | |
area_bbox = bbox[2:].prod() | |
area_candidates = candidates[:, 2:].prod(axis=1) | |
return area_intersection / (area_bbox + area_candidates - area_intersection) | |
def iou_cost(tracks, detections, track_indices=None, | |
detection_indices=None): | |
"""An intersection over union distance metric. | |
Parameters | |
---------- | |
tracks : List[deep_sort.track.Track] | |
A list of tracks. | |
detections : List[deep_sort.detection.Detection] | |
A list of detections. | |
track_indices : Optional[List[int]] | |
A list of indices to tracks that should be matched. Defaults to | |
all `tracks`. | |
detection_indices : Optional[List[int]] | |
A list of indices to detections that should be matched. Defaults | |
to all `detections`. | |
Returns | |
------- | |
ndarray | |
Returns a cost matrix of shape | |
len(track_indices), len(detection_indices) where entry (i, j) is | |
`1 - iou(tracks[track_indices[i]], detections[detection_indices[j]])`. | |
""" | |
if track_indices is None: | |
track_indices = np.arange(len(tracks)) | |
if detection_indices is None: | |
detection_indices = np.arange(len(detections)) | |
cost_matrix = np.zeros((len(track_indices), len(detection_indices))) | |
for row, track_idx in enumerate(track_indices): | |
if tracks[track_idx].time_since_update > 1: | |
cost_matrix[row, :] = linear_assignment.INFTY_COST | |
continue | |
bbox = tracks[track_idx].to_tlwh() | |
candidates = np.asarray( | |
[detections[i].tlwh for i in detection_indices]) | |
cost_matrix[row, :] = 1. - iou(bbox, candidates) | |
return cost_matrix |