Spaces:
Runtime error
Runtime error
| #!/usr/bin/env python3 | |
| # -*- coding: utf-8 -*- | |
| """ | |
| Created on Fri May 20 15:16:56 2022 | |
| @author: dinesh | |
| """ | |
| import json | |
| import cv2 | |
| from PIL import Image | |
| import numpy as np | |
| from dateutil.parser import parse | |
| def bb_intersection_over_union(box1, box2): | |
| #print(box1, box2) | |
| boxA = box1.copy() | |
| boxB = box2.copy() | |
| boxA[2] = boxA[0]+boxA[2] | |
| boxA[3] = boxA[1]+boxA[3] | |
| boxB[2] = boxB[0]+boxB[2] | |
| boxB[3] = boxB[1]+boxB[3] | |
| # determine the (x, y)-coordinates of the intersection rectangle | |
| xA = max(boxA[0], boxB[0]) | |
| yA = max(boxA[1], boxB[1]) | |
| xB = min(boxA[2], boxB[2]) | |
| yB = min(boxA[3], boxB[3]) | |
| # compute the area of intersection rectangle | |
| interArea = abs(max((xB - xA, 0)) * max((yB - yA), 0)) | |
| if interArea == 0: | |
| return 0 | |
| # compute the area of both the prediction and ground-truth | |
| # rectangles | |
| boxAArea = abs((boxA[2] - boxA[0]) * (boxA[3] - boxA[1])) | |
| boxBArea = abs((boxB[2] - boxB[0]) * (boxB[3] - boxB[1])) | |
| # 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 = interArea / float(boxAArea + boxBArea - interArea) | |
| return iou | |
| def bb_intersection_over_union_unoccluded(box1, box2, threshold=0.01): | |
| #print(box1, box2) | |
| boxA = box1.copy() | |
| boxB = box2.copy() | |
| boxA[2] = boxA[0]+boxA[2] | |
| boxA[3] = boxA[1]+boxA[3] | |
| boxB[2] = boxB[0]+boxB[2] | |
| boxB[3] = boxB[1]+boxB[3] | |
| # determine the (x, y)-coordinates of the intersection rectangle | |
| xA = max(boxA[0], boxB[0]) | |
| yA = max(boxA[1], boxB[1]) | |
| xB = min(boxA[2], boxB[2]) | |
| yB = min(boxA[3], boxB[3]) | |
| # compute the area of intersection rectangle | |
| interArea = abs(max((xB - xA, 0)) * max((yB - yA), 0)) | |
| if interArea == 0: | |
| return 0 | |
| # compute the area of both the prediction and ground-truth | |
| # rectangles | |
| boxAArea = abs((boxA[2] - boxA[0]) * (boxA[3] - boxA[1])) | |
| boxBArea = abs((boxB[2] - boxB[0]) * (boxB[3] - boxB[1])) | |
| # 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 = interArea / float(boxAArea + boxBArea - interArea) | |
| #print(iou) | |
| # return the intersection over union value | |
| occlusion = False | |
| if iou > threshold and iou < 1: | |
| #print(boxA[3], boxB[3], boxB[1]) | |
| if boxA[3] < boxB[3]:# and boxA[3] > boxB[1]: | |
| if boxB[2] > boxA[0]:# and boxB[2] < boxA[2]: | |
| #print('first', (boxB[2] - boxA[0])/(boxA[2] - boxA[0])) | |
| if (min(boxB[2],boxA[2]) - boxA[0])/(boxA[2] - boxA[0]) > threshold: | |
| occlusion = True | |
| if boxB[0] < boxA[2]: # boxB[0] > boxA[0] and | |
| #print('second', (boxA[2] - boxB[0])/(boxA[2] - boxA[0])) | |
| if (boxA[2] - max(boxB[0],boxA[0]))/(boxA[2] - boxA[0]) > threshold: | |
| occlusion = True | |
| if occlusion == False: | |
| iou = iou*0 | |
| #asas | |
| # asas | |
| #iou = 0.9 #iou*0 | |
| #print(box1, box2, iou, occlusion) | |
| return iou | |
| def draw_tracks(image, tracks): | |
| """ | |
| Draw on input image. | |
| Args: | |
| image (numpy.ndarray): image | |
| tracks (list): list of tracks to be drawn on the image. | |
| Returns: | |
| numpy.ndarray: image with the track-ids drawn on it. | |
| """ | |
| for trk in tracks: | |
| trk_id = trk[1] | |
| xmin = trk[2] | |
| ymin = trk[3] | |
| width = trk[4] | |
| height = trk[5] | |
| xcentroid, ycentroid = int(xmin + 0.5*width), int(ymin + 0.5*height) | |
| text = "ID {}".format(trk_id) | |
| cv2.putText(image, text, (xcentroid - 10, ycentroid - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) | |
| cv2.circle(image, (xcentroid, ycentroid), 4, (0, 255, 0), -1) | |
| return image | |
| def draw_bboxes(image, tracks): | |
| """ | |
| Draw the bounding boxes about detected objects in the image. | |
| Args: | |
| image (numpy.ndarray): Image or video frame. | |
| bboxes (numpy.ndarray): Bounding boxes pixel coordinates as (xmin, ymin, width, height) | |
| confidences (numpy.ndarray): Detection confidence or detection probability. | |
| class_ids (numpy.ndarray): Array containing class ids (aka label ids) of each detected object. | |
| Returns: | |
| numpy.ndarray: image with the bounding boxes drawn on it. | |
| """ | |
| for trk in tracks: | |
| xmin = int(trk[2]) | |
| ymin = int(trk[3]) | |
| width = int(trk[4]) | |
| height = int(trk[5]) | |
| clr = (np.random.randint(0, 255), np.random.randint(0, 255), np.random.randint(0, 255)) | |
| cv2.rectangle(image, (xmin, ymin), (xmin + width, ymin + height), clr, 2) | |
| return image | |
| def num(v): | |
| number_as_float = float(v) | |
| number_as_int = int(number_as_float) | |
| return number_as_int if number_as_float == number_as_int else number_as_float | |
| def parse_bbox(bbox_str): | |
| bbox_list = bbox_str.strip('{').strip('}').split(',') | |
| bbox_list = [num(elem) for elem in bbox_list] | |
| return bbox_list | |
| def parse_seg(bbox_str): | |
| bbox_list = bbox_str.strip('{').strip('}').split(',') | |
| bbox_list = [num(elem) for elem in bbox_list] | |
| ret = bbox_list # [] | |
| # for i in range(0, len(bbox_list) - 1, 2): | |
| # ret.append((bbox_list[i], bbox_list[i + 1])) | |
| return ret | |