Spaces:
Build error
Build error
from PIL import Image,ImageDraw, ImageFont, ImageOps | |
class Detection(object): | |
def __init__(self, id: int, xmin: int, ymin: int, xmax:int, ymax:int, conf: float, class_id:int, class_name:str, orig_img_sz: "tuple[int]") -> None: | |
self.id = id | |
self.xmin = xmin | |
self.ymin = ymin | |
self.xmax = xmax | |
self.ymax = ymax | |
self.w = self.xmax - self.xmin | |
self.h = self.ymax - self.ymin | |
self.conf = conf | |
self.class_id = class_id | |
self.class_name = class_name | |
self.orig_img_h = orig_img_sz[1] | |
self.orig_img_w = orig_img_sz[0] | |
def get_hw_ratio(self): | |
return self.h / self.w | |
def get_height_proportion(self): | |
return self.h / self.orig_img_h | |
def get_width_proportion(self): | |
return self.w / self.orig_img_w | |
def contains(self, detection2: "Detection"): | |
if self.xmin <= detection2.xmin and self.xmax >= detection2.xmax and \ | |
self.ymin <= detection2.ymin and self.ymax >= detection2.ymax: | |
return True | |
return False | |
def get_iou(self, detection2: "Detection"): | |
""" | |
Calculate the Intersection over Union (IoU) of two bounding boxes. | |
Returns | |
------- | |
float | |
in [0, 1] | |
""" | |
assert self.xmin < self.xmax | |
assert self.ymin < self.ymax | |
assert detection2.xmin < detection2.xmax | |
assert detection2.ymin < detection2.ymax | |
# determine the coordinates of the intersection rectangle | |
x_left = max(self.xmin, detection2.xmin) | |
y_top = max(self.ymin, detection2.ymin) | |
x_right = min(self.xmax, detection2.xmax) | |
y_bottom = min(self.ymax, detection2.ymax) | |
if x_right < x_left or y_bottom < y_top: | |
return 0.0 | |
# The intersection of two axis-aligned bounding boxes is always an | |
# axis-aligned bounding box | |
intersection_area = (x_right - x_left) * (y_bottom - y_top) | |
# compute the area of both AABBs | |
bb1_area = (self.xmax - self.xmin) * (self.ymax - self.ymin) | |
bb2_area = (detection2.xmax - detection2.xmin) * (detection2.ymax - detection2.ymin) | |
# compute the intersection over union by taking the intersection | |
# area and dividing it by the sum of prediction + ground-truth | |
# areas - the interesection area | |
iou = intersection_area / float(bb1_area + bb2_area - intersection_area) | |
return iou | |
def __str__(self) -> str: | |
return f"[{self.xmin}, {self.ymin}, {self.xmax}, {self.ymax}]" | |
def load_font(height_px = 20): | |
init_size = 12 | |
roboto_font = ImageFont.truetype("Roboto-Regular.ttf", size=init_size) | |
while roboto_font.getsize("20")[1] < height_px: | |
init_size += 1 | |
roboto_font = ImageFont.truetype("Roboto-Regular.ttf", size=init_size) | |
return roboto_font |