#!/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