| | |
| | |
| | """ |
| | Created on Fri May 20 15:15:11 2022 |
| | |
| | @author: dinesh |
| | """ |
| |
|
| | from collections import OrderedDict |
| | from matplotlib import pyplot as plt |
| | from .utils import * |
| | import scipy.interpolate |
| |
|
| | from scipy import interpolate |
| | from .clustering_utils import * |
| | import glob |
| | import cv2 |
| | from PIL import Image |
| |
|
| |
|
| | import json |
| | import cv2 |
| |
|
| | import numpy as np |
| | from tqdm import tqdm |
| |
|
| |
|
| | def ignore_indexes(tracks_all, labels_all): |
| | |
| | get_indexes = lambda x, xs: [i for (y, i) in zip(xs, range(len(xs))) if x == y] |
| | ignore_ind = [] |
| | for index, track in enumerate(tracks_all): |
| | print('in ignore', index, len(tracks_all)) |
| | if index in ignore_ind: |
| | continue |
| |
|
| | if labels_all[index] < 1 or labels_all[index] > 3: |
| | ignore_ind.extend([index]) |
| | |
| | ind = get_indexes(track, tracks_all) |
| | if len(ind) > 30: |
| | ignore_ind.extend(ind) |
| |
|
| | return ignore_ind |
| | |
| | def repeated_indexes_old(tracks_all,ignore_ind, unoccluded_indexes=None): |
| | |
| | get_indexes = lambda x, xs: [i for (y, i) in zip(xs, range(len(xs))) if bb_intersection_over_union(x, y) > 0.8 and i not in ignore_ind] |
| | repeat_ind = [] |
| | repeat_inds =[] |
| | if unoccluded_indexes == None: |
| | for index, track in enumerate(tracks_all): |
| | if index in repeat_ind or index in ignore_ind: |
| | continue |
| | ind = get_indexes(track, tracks_all) |
| | if len(ind) > 20: |
| | repeat_ind.extend(ind) |
| | repeat_inds.append([ind,track]) |
| | else: |
| | for index in unoccluded_indexes: |
| | if index in repeat_ind or index in ignore_ind: |
| | continue |
| | ind = get_indexes(tracks_all[index], tracks_all) |
| | if len(ind) > 3: |
| | repeat_ind.extend(ind) |
| | repeat_inds.append([ind,tracks_all[index]]) |
| | return repeat_inds |
| |
|
| | def get_unoccluded_instances(timestamps_final, tracks_all, ignore_ind=[], threshold = 0.01): |
| | get_indexes = lambda x, xs: [i for (y, i) in zip(xs, range(len(xs))) if x==y] |
| | unoccluded_indexes = [] |
| | time_checked = [] |
| | stationary_obj = [] |
| | count =0 |
| | |
| | for time in tqdm(np.unique(timestamps_final), desc="Detecting Unocclued objects in Image "): |
| | count += 1 |
| | if [time.year,time.month, time.day, time.hour, time.minute, time.second, time.microsecond] in time_checked: |
| | analyze_bb = [] |
| | for ind in unoccluded_indexes_time: |
| | for ind_compare in same_time_instances: |
| | iou = bb_intersection_over_union(tracks_all[ind], tracks_all[ind_compare]) |
| | if iou < 0.5 and iou > 0: |
| | analyze_bb.extend([ind_compare]) |
| | if iou > 0.99: |
| | stationary_obj.extend([str(ind_compare)+'+'+str(ind)]) |
| | |
| | for ind in analyze_bb: |
| | occ = False |
| | for ind_compare in same_time_instances: |
| | if bb_intersection_over_union_unoccluded(tracks_all[ind], tracks_all[ind_compare], threshold=threshold) > threshold and ind_compare != ind: |
| | occ = True |
| | break |
| | if occ == False: |
| | unoccluded_indexes.extend([ind]) |
| | continue |
| | |
| | same_time_instances = get_indexes(time,timestamps_final) |
| | unoccluded_indexes_time = [] |
| |
|
| | for ind in same_time_instances: |
| | if tracks_all[ind][4] < 0.9 or ind in ignore_ind: |
| | continue |
| | occ = False |
| | for ind_compare in same_time_instances: |
| | if bb_intersection_over_union_unoccluded(tracks_all[ind], tracks_all[ind_compare], threshold=threshold) > threshold and ind_compare != ind and tracks_all[ind_compare][4] < 0.5: |
| | occ = True |
| | break |
| | if occ==False: |
| | unoccluded_indexes.extend([ind]) |
| | unoccluded_indexes_time.extend([ind]) |
| | time_checked.append([time.year,time.month, time.day, time.hour, time.minute, time.second, time.microsecond]) |
| | return unoccluded_indexes,stationary_obj |
| | |
| | def visualize_unoccluded_detection(timestamps_final,tracks_all,segmentation_all, unoccluded_indexes, cwalt_data_path, camera_name, ignore_ind=[]): |
| | tracks_final = [] |
| | tracks_final.append([]) |
| | try: |
| | os.mkdir(cwalt_data_path + '/' + camera_name+'_unoccluded_car_detection/') |
| | except: |
| | print('Unoccluded debugging exists') |
| | |
| | for time in tqdm(np.unique(timestamps_final), desc="Visualizing Unocclued objects in Image "): |
| | get_indexes = lambda x, xs: [i for (y, i) in zip(xs, range(len(xs))) if x==y] |
| | ind = get_indexes(time, timestamps_final) |
| | image_unocc = False |
| | for index in ind: |
| | if index not in unoccluded_indexes: |
| | continue |
| | else: |
| | image_unocc = True |
| | break |
| | if image_unocc == False: |
| | continue |
| | |
| | for week_loop in range(5): |
| | try: |
| | image = np.array(Image.open(cwalt_data_path+'/week' +str(week_loop)+'/'+ str(time).replace(' ','T').replace(':','-').split('+')[0] + '.jpg')) |
| | break |
| | except: |
| | continue |
| | |
| | try: |
| | mask = image*0 |
| | except: |
| | print('image not found for ' + str(time).replace(' ','T').replace(':','-').split('+')[0] + '.jpg' ) |
| | continue |
| | image_original = image.copy() |
| | |
| | for index in ind: |
| | track = tracks_all[index] |
| |
|
| | if index in ignore_ind: |
| | continue |
| | if index not in unoccluded_indexes: |
| | continue |
| | try: |
| | bb_left, bb_top, bb_width, bb_height, confidence, id = track |
| | except: |
| | bb_left, bb_top, bb_width, bb_height, confidence = track |
| |
|
| | if confidence > 0.6: |
| | mask = poly_seg(image, segmentation_all[index]) |
| | cv2.imwrite(cwalt_data_path + '/' + camera_name+'_unoccluded_car_detection/' + str(index)+'.png', mask[:, :, ::-1]) |
| |
|
| | def repeated_indexes(tracks_all,ignore_ind, repeat_count = 10, unoccluded_indexes=None): |
| | get_indexes = lambda x, xs: [i for (y, i) in zip(xs, range(len(xs))) if bb_intersection_over_union(x, y) > 0.8 and i not in ignore_ind] |
| | repeat_ind = [] |
| | repeat_inds =[] |
| | if unoccluded_indexes == None: |
| | for index, track in enumerate(tracks_all): |
| | if index in repeat_ind or index in ignore_ind: |
| | continue |
| |
|
| | ind = get_indexes(track, tracks_all) |
| | if len(ind) > repeat_count: |
| | repeat_ind.extend(ind) |
| | repeat_inds.append([ind,track]) |
| | else: |
| | for index in unoccluded_indexes: |
| | if index in repeat_ind or index in ignore_ind: |
| | continue |
| | ind = get_indexes(tracks_all[index], tracks_all) |
| | if len(ind) > repeat_count: |
| | repeat_ind.extend(ind) |
| | repeat_inds.append([ind,tracks_all[index]]) |
| | |
| |
|
| | return repeat_inds |
| |
|
| | def poly_seg(image, segm): |
| | poly = np.array(segm).reshape((int(len(segm)/2), 2)) |
| | overlay = image.copy() |
| | alpha = 0.5 |
| | cv2.fillPoly(overlay, [poly], color=(255, 255, 0)) |
| | cv2.addWeighted(overlay, alpha, image, 1 - alpha, 0, image) |
| | return image |
| |
|
| | def visualize_unoccuded_clusters(repeat_inds, tracks, segmentation_all, timestamps_final, cwalt_data_path): |
| | for index_, repeat_ind in enumerate(repeat_inds): |
| | image = np.array(Image.open(cwalt_data_path+'/'+'T18-median_image.jpg')) |
| | try: |
| | os.mkdir(cwalt_data_path+ '/Cwalt_database/') |
| | except: |
| | print('folder exists') |
| | try: |
| | os.mkdir(cwalt_data_path+ '/Cwalt_database/' + str(index_) +'/') |
| | except: |
| | print(cwalt_data_path+ '/Cwalt_database/' + str(index_) +'/') |
| | |
| | for i in repeat_ind[0]: |
| | try: |
| | bb_left, bb_top, bb_width, bb_height, confidence = tracks[i] |
| | except: |
| | bb_left, bb_top, bb_width, bb_height, confidence, track_id = tracks[i] |
| | |
| | cv2.rectangle(image,(int(bb_left), int(bb_top)),(int(bb_left+bb_width), int(bb_top+bb_height)),(0, 0, 255), 2) |
| | time = timestamps_final[i] |
| | for week_loop in range(5): |
| | try: |
| | image1 = np.array(Image.open(cwalt_data_path+'/week' +str(week_loop)+'/'+ str(time).replace(' ','T').replace(':','-').split('+')[0] + '.jpg')) |
| | break |
| | except: |
| | continue |
| | |
| | crop = image1[int(bb_top): int(bb_top + bb_height), int(bb_left):int(bb_left + bb_width)] |
| | cv2.imwrite(cwalt_data_path+ '/Cwalt_database/' + str(index_) +'/o_' + str(i) +'.jpg', crop[:, :, ::-1]) |
| | image1 = poly_seg(image1,segmentation_all[i]) |
| | crop = image1[int(bb_top): int(bb_top + bb_height), int(bb_left):int(bb_left + bb_width)] |
| | cv2.imwrite(cwalt_data_path+ '/Cwalt_database/' + str(index_) +'/' + str(i)+'.jpg', crop[:, :, ::-1]) |
| | if index_ > 100: |
| | break |
| |
|
| | cv2.imwrite(cwalt_data_path+ '/Cwalt_database/' + str(index_) +'.jpg', image[:, :, ::-1]) |
| | |
| | def Get_unoccluded_objects(camera_name, debug = False, scale=True): |
| | cwalt_data_path = 'data/' + camera_name |
| | data_folder = cwalt_data_path |
| | json_file_path = cwalt_data_path + '/' + camera_name + '.json' |
| | |
| | with open(json_file_path, 'r') as j: |
| | annotations = json.loads(j.read()) |
| |
|
| | tracks_all = [parse_bbox(anno['bbox']) for anno in annotations] |
| | segmentation_all = [parse_bbox(anno['segmentation']) for anno in annotations] |
| | labels_all = [anno['label_id'] for anno in annotations] |
| | timestamps_final = [parse(anno['time']) for anno in annotations] |
| | |
| | if scale ==True: |
| | scale_factor = 2 |
| | tracks_all_numpy = np.array(tracks_all) |
| | tracks_all_numpy[:,:4] = np.array(tracks_all)[:,:4]/scale_factor |
| | tracks_all = tracks_all_numpy.tolist() |
| | |
| | segmentation_all_scaled = [] |
| | for list_loop in segmentation_all: |
| | segmentation_all_scaled.append((np.floor_divide(np.array(list_loop),scale_factor)).tolist()) |
| | segmentation_all = segmentation_all_scaled |
| | |
| | if debug == True: |
| | timestamps_final = timestamps_final[:1000] |
| | labels_all = labels_all[:1000] |
| | segmentation_all = segmentation_all[:1000] |
| | tracks_all = tracks_all[:1000] |
| |
|
| | unoccluded_indexes, stationary = get_unoccluded_instances(timestamps_final, tracks_all, threshold = 0.05) |
| | if debug == True: |
| | visualize_unoccluded_detection(timestamps_final, tracks_all, segmentation_all, unoccluded_indexes, cwalt_data_path, camera_name) |
| | |
| | tracks_all_unoccluded = [tracks_all[i] for i in unoccluded_indexes] |
| | segmentation_all_unoccluded = [segmentation_all[i] for i in unoccluded_indexes] |
| | labels_all_unoccluded = [labels_all[i] for i in unoccluded_indexes] |
| | timestamps_final_unoccluded = [timestamps_final[i] for i in unoccluded_indexes] |
| | np.savez(json_file_path,tracks_all_unoccluded=tracks_all_unoccluded, segmentation_all_unoccluded=segmentation_all_unoccluded, labels_all_unoccluded=labels_all_unoccluded, timestamps_final_unoccluded=timestamps_final_unoccluded ) |
| |
|
| | if debug == True: |
| | repeat_inds_clusters = repeated_indexes(tracks_all_unoccluded,[], repeat_count=1) |
| | visualize_unoccuded_clusters(repeat_inds_clusters, tracks_all_unoccluded, segmentation_all_unoccluded, timestamps_final_unoccluded, cwalt_data_path) |
| | else: |
| | repeat_inds_clusters = repeated_indexes(tracks_all_unoccluded,[], repeat_count=10) |
| |
|
| | np.savez(json_file_path + '_clubbed', repeat_inds=repeat_inds_clusters) |
| | np.savez(json_file_path + '_stationary', stationary=stationary) |
| |
|
| |
|