def vis_interp(movie, header, flow, bboxes, baseline=False, worst=False): if baseline and worst: raise "rendering mode could not be duplicated" if baseline: cap, out = open_video(movie, postfix="interp_w_baseline") elif worst: cap, out = open_video(movie, postfix="interp_w_worst") else: cap, out = open_video(movie, postfix="interp") count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) pos = 0 for i in trange(count): ret, frame = cap.read() if ret is False or i > bboxes.size: break if baseline: pos = i frame = draw_i_frame(frame, flow[i], bboxes[pos]) elif header["pict_type"][i] == "I": pos = i frame = draw_i_frame(frame, flow[i], bboxes[pos]) elif worst: frame = draw_i_frame(frame, flow[i], bboxes[pos]) else: # bboxes[pos] is updated by reference frame = draw_p_frame(frame, flow[i], bboxes[pos]) cv2.rectangle(frame, (width - 220, 20), (width - 20, 60), (0, 0, 0), -1) cv2.putText(frame, f"pict_type: {header['pict_type'][i]}", (width - 210, 50), cv2.FONT_HERSHEY_DUPLEX, 1, (255, 255, 255), 1) out.write(frame) cap.release() out.release()
def vis_flow(movie, flow, draw=draw_flow): cap, out = open_video(movie, postfix='flow') count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) for i in tqdm.trange(count): ret, frame = cap.read() if ret is False: break frame = draw(frame, flow[i]) out.write(frame) cap.release() out.release()
def vis_histogram(movie, header, flow, bboxes): graph_prefix = os.path.basename(movie) if not os.path.exists(os.path.join("graph", graph_prefix)): os.makedirs(os.path.join("graph", graph_prefix)) cap = open_video(movie, display=False) count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) for i in trange(count): ret, frame = cap.read() if ret is False or i > bboxes.size: break draw_histogram(i, frame, flow[i], bboxes[i], prefix=graph_prefix) cap.release()
def vis_annotate(movie, header, draw, onlyi=False): cap, out = open_video(movie, postfix='annotate') count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) pos = 0 for i in tqdm.trange(count): ret, frame = cap.read() if ret is False: break cv2.putText(frame, f"pict_type: {header['pict_type'][i]}", (10, height - 10), cv2.FONT_HERSHEY_DUPLEX, 1, (255, 255, 255), 1) if onlyi: if header["pict_type"][i] == "I": pos = i else: pos = i frame = draw(frame, i, pos) out.write(frame) cap.release() out.release()
def vis_composed(movie, header, flow, bboxes, baseline=False, worst=False): if baseline and worst: raise "rendering mode could not be duplicated" if baseline: cap, out = open_video(movie, postfix="kalman_w_base") elif worst: cap, out = open_video(movie, postfix="kalman_w_worst") else: cap, out = open_video(movie, postfix="kalman") count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) kalman_0 = KalmanInterpolator() kalman_clos_0 = lambda bboxes, flow, frame: \ interp_kalman(bboxes, flow, frame, kalman_0, calc=calc_flow_mean) kalman_1 = KalmanInterpolator() kalman_clos_1 = lambda bboxes, flow, frame: \ interp_kalman(bboxes, flow, frame, kalman_1, calc=calc_flow_mean_grad) color = (255, 0, 255) pos = 0 for i in trange(count): ret, frame = cap.read() if ret is False or i > bboxes.size: break # linear if baseline: pos = i bboxes_0 = bboxes[pos].copy() bboxes_1 = bboxes[pos].copy() frame = draw_i_frame(frame, flow[i], bboxes_0) frame = draw_i_frame(frame, flow[i], bboxes_1, color=color) elif header["pict_type"][i] == "I": pos = i bboxes_0 = bboxes[pos].copy() bboxes_1 = bboxes[pos].copy() frame = draw_i_frame(frame, flow[i], bboxes_0) frame = draw_i_frame(frame, flow[i], bboxes_1, color=color) kalman_0.reset(bboxes[pos]) kalman_1.reset(bboxes[pos]) elif worst: frame = draw_i_frame(frame, flow[i], bboxes_0) frame = draw_i_frame(frame, flow[i], bboxes_1, color=color) else: # bboxes_0 is updated by reference frame = draw_p_frame(frame, flow[i], bboxes_0, interp=kalman_clos_0) frame = draw_p_frame(frame, flow[i], bboxes_1, color=color, interp=kalman_clos_1) cv2.rectangle(frame, (width-220, 20), (width-20, 60), (0, 0, 0), -1) cv2.putText(frame, f"pict_type: {header['pict_type'][i]}", (width-210, 50), cv2.FONT_HERSHEY_DUPLEX, 1, (255, 255, 255), 1) out.write(frame) cap.release() out.release()
def eval_mot16(src_id, prefix="MOT16/train", MOT16=MOT16, thresh=0.0, baseline=False, worst=False, display=False, gop=12): mot = MOT16(src_id) bboxes = mot.pick_bboxes() movie = join(prefix, src_id) flow, header = get_flow(movie, prefix=".", gop=gop) if display: cap, out = open_video(movie, display=True) else: cap = open_video(movie, display=False) count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) kalman = KalmanInterpolator() interp_kalman_clos = lambda bboxes, flow, frame: \ interp_kalman(bboxes, flow, frame, kalman) for index, bbox in enumerate(bboxes): if not bbox.empty: bboxes[index] = bbox.query(f"prob >= {thresh}") start = time.perf_counter() for i in range(count): ret, frame = cap.read() if ret is False or i > bboxes.size: break if baseline: bbox = bboxes[i].copy() if display: frame = draw_i_frame(frame, flow[i], bbox) mot.eval_frame(bbox) kalman.reset(bbox) elif header["pict_type"][i] == "I": bbox = bboxes[i].copy() if display: frame = draw_i_frame(frame, flow[i], bbox) mot.eval_frame(bbox) kalman.reset(bbox) elif worst: if display: frame = draw_i_frame(frame, flow[i], bbox) mot.eval_frame(bbox) else: # bbox is updated by reference if display: frame = draw_p_frame(frame, flow[i], bbox, interp=interp_kalman_clos) else: interp_kalman_clos(bbox, flow[i], frame) mot.eval_frame(bbox) if display: cv2.rectangle(frame, (width - 220, 20), (width - 20, 60), (0, 0, 0), -1) cv2.putText(frame, f"pict_type: {header['pict_type'][i]}", (width - 210, 50), cv2.FONT_HERSHEY_DUPLEX, 1, (255, 255, 255), 1) out.write(frame) end = time.perf_counter() print(f"{src_id}: {count/(end-start):3.1f} FPS") # print(f"{end-start:5.2f}") cap.release() if display: out.release()
def eval_mot16_pred(src_id, model, prefix="MOT16/train", MOT16=MOT16, thresh=0.0, baseline=False, worst=False, display=False): mot = MOT16(src_id) movie = join(prefix, args.src_id) flow, header = get_flow(movie, prefix=".") if display: cap, out = open_video(movie, display=True) else: cap = open_video(movie, display=False) count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) start = time.perf_counter() for i in trange(count): ret, frame = cap.read() if ret is False: break if baseline: bbox = predict(model, frame, thresh=thresh) if display: frame = draw_i_frame(frame, flow[i], bbox) mot.eval_frame(bbox) elif header["pict_type"][i] == "I": bbox = predict(model, frame, thresh=thresh) if display: frame = draw_i_frame(frame, flow[i], bbox) mot.eval_frame(bbox) elif worst: if display: frame = draw_i_frame(frame, flow[i], bbox) mot.eval_frame(bbox) else: # bbox is updated by reference if display: frame = draw_p_frame(frame, flow[i], bbox) else: interp_linear(bbox, flow[i], frame) mot.eval_frame(bbox) if display: cv2.rectangle(frame, (width - 220, 20), (width - 20, 60), (0, 0, 0), -1) cv2.putText(frame, f"pict_type: {header['pict_type'][i]}", (width - 210, 50), cv2.FONT_HERSHEY_DUPLEX, 1, (255, 255, 255), 1) out.write(frame) end = time.perf_counter() print(f"{src_id}: {count/(end-start):3.1f} FPS") cap.release() if display: out.release()