print("Opening", args.base_dir) sl_npz = np.load(args.base_dir + '/recording.npz') cloud = sl_npz['events'] idx = sl_npz['index'] discretization = sl_npz['discretization'] K = None D = None slice_width = args.nbins * discretization first_ts = cloud[0][0] last_ts = cloud[-1][0] vis_dir = os.path.join(args.base_dir, 'vis') pydvs.replace_dir(vis_dir) print("The recording range:", first_ts, "-", last_ts) print("Discretization resolution:", discretization) import matplotlib.pyplot as plt ebins = [] for i in range(len(idx) - args.nbins): nevents = idx[i + args.nbins] - idx[i] ebins.append(nevents) median = np.median(ebins) cutoff = [median for b in ebins] for i, b in enumerate(ebins): lo = max(0, i - args.nbins * 10) hi = min(len(ebins), i + args.nbins * 10)
def data_creator(sequence: str): print(f"{pydvs.okb('STARTING DATASET CREATION')} for sequence: {sequence}") dataset_txt = eval(open(os.path.join(sequence, 'meta.txt')).read()) K = np.array([[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 1.0]]) D = np.array([0.0, 0.0, 0.0, 0.0]) K[0][0] = dataset_txt['meta']['fx'] K[1][1] = dataset_txt['meta']['fy'] K[0][2] = dataset_txt['meta']['cx'] K[1][2] = dataset_txt['meta']['cy'] D[0] = dataset_txt['meta']['k1'] D[1] = dataset_txt['meta']['k2'] D[2] = dataset_txt['meta']['k3'] D[3] = dataset_txt['meta']['k4'] RES_X = dataset_txt['meta']['res_x'] RES_Y = dataset_txt['meta']['res_y'] NUM_FRAMES = len(dataset_txt['frames']) frames_meta = dataset_txt['frames'] oids = [] for key in frames_meta[0]: if (key == 'cam'): continue if (type(frames_meta[0][key]) == type(dict()) and 'pos' in frames_meta[0][key]): oids.append(key) print(pydvs.okb("Resolution:"), RES_X, 'x', RES_Y) print(pydvs.okb("Frames:"), NUM_FRAMES) print(pydvs.okb("Object ids:"), oids) print(pydvs.okb("Calibration:")) print(K) print(D) # Create a plot #save_plot(frames_meta, oids, os.path.join(args.base_dir, 'position_plots.pdf'), tp='pos') #save_plot(dataset_txt['full_trajectory'], oids, os.path.join(args.base_dir, 'position_plots.pdf'), tp='pos') # Read depth / masks print(pydvs.bld("Reading the depth and masks:")) depths = np.zeros((NUM_FRAMES, ) + (RES_X, RES_Y), dtype=np.uint16) masks = np.zeros((NUM_FRAMES, ) + (RES_X, RES_Y), dtype=np.uint16) classical = np.zeros((NUM_FRAMES, ) + (RES_X, RES_Y, 3), dtype=np.uint8) classical_read = 0 for i, frame in enumerate(frames_meta): print("frame\t", i + 1, "/", NUM_FRAMES, "\t", end='\r') gt_frame_name = os.path.join(sequence, f"img/{frame['gt_frame']}") gt_img = cv2.imread(gt_frame_name, cv2.IMREAD_UNCHANGED) if (gt_img.dtype != depths.dtype or gt_img.dtype != masks.dtype): print("\tType mismatch! Expected", depths.dtype, " but have", gt_img.dtype) sys.exit(-1) depths[i, :, :] = gt_img[:, :, 0] # depth is in mm masks[i, :, :] = gt_img[:, :, 2] # mask is object ids * 1000 if ('classical_frame' in frame.keys()): classical_frame_name = os.path.join( sequence, f"img/{frame['classical_frame']}") classical_img = cv2.imread(classical_frame_name, cv2.IMREAD_UNCHANGED) classical[i, :, :, :] = classical_img if (gt_img.dtype != depths.dtype or gt_img.dtype != masks.dtype): print("\tType mismatch! Expected", classical.dtype, " but have", classical_img.dtype) sys.exit(-1) classical_read += 1 print("\n") if (classical_read > 0): print(pydvs.okb("Read "), classical_read, "/", NUM_FRAMES, pydvs.okb(" classical frames")) else: classical = None # Read event cloud cloud, idx = pydvs.read_event_file_txt( os.path.join(sequence, 'events.txt'), args.discretization) tmin = frames_meta[0]['ts'] tmax = frames_meta[-1]['ts'] if (cloud.shape[0] > 0): tmin = cloud[0][0] tmax = cloud[-1][0] print(pydvs.okb("The recording range:"), tmin, "-", tmax) print(pydvs.okb("The gt range:"), frames_meta[0]['ts'], "-", frames_meta[-1]['ts']) print(pydvs.okb("Discretization resolution:"), args.discretization) """ # Save .npz file print (pydvs.bld("Saving...")) np.savez_compressed(os.path.join(args.base_dir, 'dataset.npz'), events=cloud, index=idx, classical=classical, discretization=args.discretization, K=K, D=D, depth=depths, mask=masks, meta=dataset_txt) print ("\n") """ # Generate images: slice_dir = os.path.join(sequence, 'slices') #vis_dir = os.path.join(args.base_dir, 'vis') pydvs.replace_dir(slice_dir) #pydvs.replace_dir(vis_dir) for i, frame in enumerate(frames_meta): print("Saving sanity check frames\t", i + 1, "/", NUM_FRAMES, "\t", end='\r') time = frame['ts'] if (time > tmax or time < tmin): continue cv2.imwrite( os.path.join(slice_dir, 'mask_' + str(i).rjust(10, '0') + '.png'), masks[i].astype(np.uint16)) if (cloud.shape[0] > 0): sl, _ = pydvs.get_slice(cloud, idx, time, args.slice_width, 1, args.discretization) eimg = dvs_img(sl, (RES_X, RES_Y), None, None, args.slice_width, mode=1) cv2.imwrite( os.path.join(slice_dir, 'frame_' + str(i).rjust(10, '0') + '.png'), eimg) depth = depths[i].astype(np.float) mask = masks[i].astype(np.float) col_mask = mask_to_color(mask) """ # normalize for visualization mask = (255 * (mask.astype(np.float) - np.nanmin(mask)) / (np.nanmax(mask) - np.nanmin(mask))).astype(np.uint8) depth = (255 * (depth.astype(np.float) - np.nanmin(depth)) / (np.nanmax(depth) - np.nanmin(depth))).astype(np.uint8) if ((classical_read > 0) and (classical is not None)): grayscale_img = cv2.cvtColor(classical[i], cv2.COLOR_BGR2GRAY).astype(np.float) rgb_img = np.dstack((grayscale_img, grayscale_img, grayscale_img)) rgb_img[mask > 0] = rgb_img[mask > 0] * 0.2 + col_mask[mask > 0] * 0.8 #rgb_img = np.rot90(rgb_img, k=2) #depth = np.rot90(depth, k=2) eimg = np.hstack((rgb_img.astype(np.uint8), np.dstack((depth,depth,depth)))) else: eimg = dvs_img(sl, (RES_X, RES_Y), None, None, args.slice_width, mode=0) eimg[mask > 0] = eimg[mask > 0] * 0.5 + col_mask[mask > 0] * 0.5 eimg = np.hstack((eimg.astype(np.uint8), np.dstack((depth,depth,depth)))) #footer = gen_text_stub(eimg.shape[1], frame) #eimg = np.vstack((eimg, footer)) cv2.imwrite(os.path.join(vis_dir, 'frame_' + str(i).rjust(10, '0') + '.png'), eimg) """ print(F"{pydvs.okg('FINISHED DATASET CREATION')} for sequence {sequence}")