norfair-demo / demo_utils /distance_function.py
Diego Fernandez
chore: improve code
210ae8c
raw
history blame
1.97 kB
import numpy as np
import torch
import torchvision.ops.boxes as bops
from demo_utils.configuration import MAX_DISTANCE
def euclidean_distance(detection, tracked_object):
return np.linalg.norm(detection.points - tracked_object.estimate)
def iou_pytorch(detection, tracked_object):
# Slower but simplier version of iou
detection_points = np.concatenate([detection.points[0], detection.points[1]])
tracked_object_points = np.concatenate([tracked_object.estimate[0], tracked_object.estimate[1]])
box_a = torch.tensor([detection_points], dtype=torch.float)
box_b = torch.tensor([tracked_object_points], dtype=torch.float)
iou = bops.box_iou(box_a, box_b)
# Since 0 <= IoU <= 1, we define 1/IoU as a distance.
# Distance values will be in [1, inf)
return np.float(1 / iou if iou else MAX_DISTANCE)
def iou(detection, tracked_object):
# Detection points will be box A
# Tracked objects point will be box B.
box_a = np.concatenate([detection.points[0], detection.points[1]])
box_b = np.concatenate([tracked_object.estimate[0], tracked_object.estimate[1]])
x_a = max(box_a[0], box_b[0])
y_a = max(box_a[1], box_b[1])
x_b = min(box_a[2], box_b[2])
y_b = min(box_a[3], box_b[3])
# Compute the area of intersection rectangle
inter_area = max(0, x_b - x_a + 1) * max(0, y_b - y_a + 1)
# Compute the area of both the prediction and tracker
# rectangles
box_a_area = (box_a[2] - box_a[0] + 1) * (box_a[3] - box_a[1] + 1)
box_b_area = (box_b[2] - box_b[0] + 1) * (box_b[3] - box_b[1] + 1)
# Compute the intersection over union by taking the intersection
# area and dividing it by the sum of prediction + tracker
# areas - the interesection area
iou = inter_area / float(box_a_area + box_b_area - inter_area)
# Since 0 <= IoU <= 1, we define 1/IoU as a distance.
# Distance values will be in [1, inf)
return 1 / iou if iou else (MAX_DISTANCE)