import os import sys import json import cv2 import glob as gb import numpy as np def colormap(rgb=False): color_list = np.array( [ 0.000, 0.447, 0.741, 0.850, 0.325, 0.098, 0.929, 0.694, 0.125, 0.494, 0.184, 0.556, 0.466, 0.674, 0.188, 0.301, 0.745, 0.933, 0.635, 0.078, 0.184, 0.300, 0.300, 0.300, 0.600, 0.600, 0.600, 1.000, 0.000, 0.000, 1.000, 0.500, 0.000, 0.749, 0.749, 0.000, 0.000, 1.000, 0.000, 0.000, 0.000, 1.000, 0.667, 0.000, 1.000, 0.333, 0.333, 0.000, 0.333, 0.667, 0.000, 0.333, 1.000, 0.000, 0.667, 0.333, 0.000, 0.667, 0.667, 0.000, 0.667, 1.000, 0.000, 1.000, 0.333, 0.000, 1.000, 0.667, 0.000, 1.000, 1.000, 0.000, 0.000, 0.333, 0.500, 0.000, 0.667, 0.500, 0.000, 1.000, 0.500, 0.333, 0.000, 0.500, 0.333, 0.333, 0.500, 0.333, 0.667, 0.500, 0.333, 1.000, 0.500, 0.667, 0.000, 0.500, 0.667, 0.333, 0.500, 0.667, 0.667, 0.500, 0.667, 1.000, 0.500, 1.000, 0.000, 0.500, 1.000, 0.333, 0.500, 1.000, 0.667, 0.500, 1.000, 1.000, 0.500, 0.000, 0.333, 1.000, 0.000, 0.667, 1.000, 0.000, 1.000, 1.000, 0.333, 0.000, 1.000, 0.333, 0.333, 1.000, 0.333, 0.667, 1.000, 0.333, 1.000, 1.000, 0.667, 0.000, 1.000, 0.667, 0.333, 1.000, 0.667, 0.667, 1.000, 0.667, 1.000, 1.000, 1.000, 0.000, 1.000, 1.000, 0.333, 1.000, 1.000, 0.667, 1.000, 0.167, 0.000, 0.000, 0.333, 0.000, 0.000, 0.500, 0.000, 0.000, 0.667, 0.000, 0.000, 0.833, 0.000, 0.000, 1.000, 0.000, 0.000, 0.000, 0.167, 0.000, 0.000, 0.333, 0.000, 0.000, 0.500, 0.000, 0.000, 0.667, 0.000, 0.000, 0.833, 0.000, 0.000, 1.000, 0.000, 0.000, 0.000, 0.167, 0.000, 0.000, 0.333, 0.000, 0.000, 0.500, 0.000, 0.000, 0.667, 0.000, 0.000, 0.833, 0.000, 0.000, 1.000, 0.000, 0.000, 0.000, 0.143, 0.143, 0.143, 0.286, 0.286, 0.286, 0.429, 0.429, 0.429, 0.571, 0.571, 0.571, 0.714, 0.714, 0.714, 0.857, 0.857, 0.857, 1.000, 1.000, 1.000 ] ).astype(np.float32) color_list = color_list.reshape((-1, 3)) * 255 if not rgb: color_list = color_list[:, ::-1] return color_list def txt2img(visual_path="visual_val_gt"): print("Starting txt2img") valid_labels = {1} ignore_labels = {2, 7, 8, 12} if not os.path.exists(visual_path): os.makedirs(visual_path) color_list = colormap() gt_json_path = 'datasets/mot/annotations/val_half.json' img_path = 'datasets/mot/train/' show_video_names = ['MOT17-02-FRCNN', 'MOT17-04-FRCNN', 'MOT17-05-FRCNN', 'MOT17-09-FRCNN', 'MOT17-10-FRCNN', 'MOT17-11-FRCNN', 'MOT17-13-FRCNN'] test_json_path = 'datasets/mot/annotations/test.json' test_img_path = 'datasets/mot/test/' test_show_video_names = ['MOT17-01-FRCNN', 'MOT17-03-FRCNN', 'MOT17-06-FRCNN', 'MOT17-07-FRCNN', 'MOT17-08-FRCNN', 'MOT17-12-FRCNN', 'MOT17-14-FRCNN'] if visual_path == "visual_test_predict": show_video_names = test_show_video_names img_path = test_img_path gt_json_path = test_json_path for show_video_name in show_video_names: img_dict = dict() if visual_path == "visual_val_gt": txt_path = 'datasets/mot/train/' + show_video_name + '/gt/gt_val_half.txt' elif visual_path == "visual_yolox_x": txt_path = 'YOLOX_outputs/yolox_mot_x_1088/track_results/'+ show_video_name + '.txt' elif visual_path == "visual_test_predict": txt_path = 'test/tracks/'+ show_video_name + '.txt' else: raise NotImplementedError with open(gt_json_path, 'r') as f: gt_json = json.load(f) for ann in gt_json["images"]: file_name = ann['file_name'] video_name = file_name.split('/')[0] if video_name == show_video_name: img_dict[ann['frame_id']] = img_path + file_name txt_dict = dict() with open(txt_path, 'r') as f: for line in f.readlines(): linelist = line.split(',') mark = int(float(linelist[6])) label = int(float(linelist[7])) vis_ratio = float(linelist[8]) if visual_path == "visual_val_gt": if mark == 0 or label not in valid_labels or label in ignore_labels or vis_ratio <= 0: continue img_id = linelist[0] obj_id = linelist[1] bbox = [float(linelist[2]), float(linelist[3]), float(linelist[2]) + float(linelist[4]), float(linelist[3]) + float(linelist[5]), int(obj_id)] if int(img_id) in txt_dict: txt_dict[int(img_id)].append(bbox) else: txt_dict[int(img_id)] = list() txt_dict[int(img_id)].append(bbox) for img_id in sorted(txt_dict.keys()): img = cv2.imread(img_dict[img_id]) for bbox in txt_dict[img_id]: cv2.rectangle(img, (int(bbox[0]), int(bbox[1])), (int(bbox[2]), int(bbox[3])), color_list[bbox[4]%79].tolist(), thickness=2) cv2.putText(img, "{}".format(int(bbox[4])), (int(bbox[0]), int(bbox[1])), cv2.FONT_HERSHEY_SIMPLEX, 0.8, color_list[bbox[4]%79].tolist(), 2) cv2.imwrite(visual_path + "/" + show_video_name + "{:0>6d}.png".format(img_id), img) print(show_video_name, "Done") print("txt2img Done") def img2video(visual_path="visual_val_gt"): print("Starting img2video") img_paths = gb.glob(visual_path + "/*.png") fps = 16 size = (1920,1080) videowriter = cv2.VideoWriter(visual_path + "_video.avi",cv2.VideoWriter_fourcc('M','J','P','G'), fps, size) for img_path in sorted(img_paths): img = cv2.imread(img_path) img = cv2.resize(img, size) videowriter.write(img) videowriter.release() print("img2video Done") if __name__ == '__main__': visual_path="visual_yolox_x" if len(sys.argv) > 1: visual_path =sys.argv[1] txt2img(visual_path) #img2video(visual_path)