def _eval_seq_sde(self, dataloader, save_dir=None, show_image=False, frame_rate=30, det_file='', draw_threshold=0): if save_dir: if not os.path.exists(save_dir): os.makedirs(save_dir) tracker = self.model.tracker use_detector = False if not self.model.detector else True timer = Timer() results = [] frame_id = 0 self.status['mode'] = 'track' self.model.eval() self.model.reid.eval() if not use_detector: dets_list = load_det_results(det_file, len(dataloader)) logger.info( 'Finish loading detection results file {}.'.format(det_file)) for step_id, data in enumerate(dataloader): self.status['step_id'] = step_id if frame_id % 40 == 0: logger.info('Processing frame {} ({:.2f} fps)'.format( frame_id, 1. / max(1e-5, timer.average_time))) ori_image = data['ori_image'] input_shape = data['image'].shape[2:] im_shape = data['im_shape'] scale_factor = data['scale_factor'] timer.tic() if not use_detector: dets = dets_list[frame_id] bbox_tlwh = paddle.to_tensor(dets['bbox'], dtype='float32') pred_scores = paddle.to_tensor(dets['score'], dtype='float32') if pred_scores < draw_threshold: continue if bbox_tlwh.shape[0] > 0: pred_bboxes = paddle.concat( (bbox_tlwh[:, 0:2], bbox_tlwh[:, 2:4] + bbox_tlwh[:, 0:2]), axis=1) else: pred_bboxes = [] pred_scores = [] else: outs = self.model.detector(data) if outs['bbox_num'] > 0: pred_bboxes = scale_coords(outs['bbox'][:, 2:], input_shape, im_shape, scale_factor) pred_scores = outs['bbox'][:, 1:2] else: pred_bboxes = [] pred_scores = [] pred_bboxes = clip_box(pred_bboxes, input_shape, im_shape, scale_factor) bbox_tlwh = paddle.concat( (pred_bboxes[:, 0:2], pred_bboxes[:, 2:4] - pred_bboxes[:, 0:2] + 1), axis=1) crops, pred_scores = get_crops(pred_bboxes, ori_image, pred_scores, w=64, h=192) crops = paddle.to_tensor(crops) pred_scores = paddle.to_tensor(pred_scores) data.update({'crops': crops}) features = self.model(data) features = features.numpy() detections = [ Detection(tlwh, score, feat) for tlwh, score, feat in zip(bbox_tlwh, pred_scores, features) ] self.model.tracker.predict() online_targets = self.model.tracker.update(detections) online_tlwhs = [] online_scores = [] online_ids = [] for track in online_targets: if not track.is_confirmed() or track.time_since_update > 1: continue online_tlwhs.append(track.to_tlwh()) online_scores.append(1.0) online_ids.append(track.track_id) timer.toc() # save results results.append( (frame_id + 1, online_tlwhs, online_scores, online_ids)) self.save_results(data, frame_id, online_ids, online_tlwhs, online_scores, timer.average_time, show_image, save_dir) frame_id += 1 return results, frame_id, timer.average_time, timer.calls
def _eval_seq_sde(self, dataloader, save_dir=None, show_image=False, frame_rate=30, det_file=''): if save_dir: if not os.path.exists(save_dir): os.makedirs(save_dir) tracker = self.model.tracker use_detector = False if not self.model.detector else True timer = Timer() results = [] frame_id = 0 self.status['mode'] = 'track' self.model.eval() self.model.reid.eval() if not use_detector: dets_list = load_det_results(det_file, len(dataloader)) logger.info( 'Finish loading detection results file {}.'.format(det_file)) for step_id, data in enumerate(dataloader): self.status['step_id'] = step_id if frame_id % 40 == 0: logger.info('Processing frame {} ({:.2f} fps)'.format( frame_id, 1. / max(1e-5, timer.average_time))) timer.tic() if not use_detector: timer.tic() dets = dets_list[frame_id] bbox_tlwh = paddle.to_tensor(dets['bbox'], dtype='float32') pred_scores = paddle.to_tensor(dets['score'], dtype='float32') if bbox_tlwh.shape[0] > 0: pred_bboxes = paddle.concat( (bbox_tlwh[:, 0:2], bbox_tlwh[:, 2:4] + bbox_tlwh[:, 0:2]), axis=1) else: pred_bboxes = [] pred_scores = [] data.update({ 'pred_bboxes': pred_bboxes, 'pred_scores': pred_scores }) # forward timer.tic() online_targets = self.model(data) online_tlwhs = [] online_ids = [] for track in online_targets: if not track.is_confirmed() or track.time_since_update > 1: continue tlwh = track.to_tlwh() track_id = track.track_id online_tlwhs.append(tlwh) online_ids.append(track_id) timer.toc() # save results results.append((frame_id + 1, online_tlwhs, online_ids)) self.save_results(data, frame_id, online_ids, online_tlwhs, timer.average_time, show_image, save_dir) frame_id += 1 return results, frame_id, timer.average_time, timer.calls
def mot_keypoint_unite_predict_video(mot_model, keypoint_model, camera_id, keypoint_batch_size=1): if camera_id != -1: capture = cv2.VideoCapture(camera_id) video_name = 'output.mp4' else: capture = cv2.VideoCapture(FLAGS.video_file) video_name = os.path.split(FLAGS.video_file)[-1] fps = 30 frame_count = int(capture.get(cv2.CAP_PROP_FRAME_COUNT)) print('frame_count', frame_count) width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)) # yapf: disable fourcc = cv2.VideoWriter_fourcc(*'mp4v') # yapf: enable if not os.path.exists(FLAGS.output_dir): os.makedirs(FLAGS.output_dir) out_path = os.path.join(FLAGS.output_dir, video_name) if not FLAGS.save_images: writer = cv2.VideoWriter(out_path, fourcc, fps, (width, height)) frame_id = 0 timer_mot = FPSTimer() timer_kp = FPSTimer() timer_mot_kp = FPSTimer() mot_results = [] while (1): ret, frame = capture.read() if not ret: break timer_mot_kp.tic() timer_mot.tic() online_tlwhs, online_scores, online_ids = mot_model.predict( [frame], FLAGS.mot_threshold) timer_mot.toc() mot_results.append( (frame_id + 1, online_tlwhs, online_scores, online_ids)) mot_fps = 1. / timer_mot.average_time timer_kp.tic() keypoint_arch = keypoint_model.pred_config.arch if KEYPOINT_SUPPORT_MODELS[keypoint_arch] == 'keypoint_topdown': results = convert_mot_to_det(online_tlwhs, online_scores) keypoint_results = predict_with_given_det(frame, results, keypoint_model, keypoint_batch_size, FLAGS.mot_threshold, FLAGS.keypoint_threshold, FLAGS.run_benchmark) else: keypoint_results = keypoint_model.predict([frame], FLAGS.keypoint_threshold) timer_kp.toc() timer_mot_kp.toc() kp_fps = 1. / timer_kp.average_time mot_kp_fps = 1. / timer_mot_kp.average_time im = draw_pose(frame, keypoint_results, visual_thread=FLAGS.keypoint_threshold, returnimg=True, ids=online_ids if KEYPOINT_SUPPORT_MODELS[keypoint_arch] == 'keypoint_topdown' else None) online_im = mot_vis.plot_tracking(im, online_tlwhs, online_ids, online_scores, frame_id=frame_id, fps=mot_kp_fps) im = np.array(online_im) frame_id += 1 print('detect frame:%d' % (frame_id)) if FLAGS.save_images: save_dir = os.path.join(FLAGS.output_dir, video_name.split('.')[-2]) if not os.path.exists(save_dir): os.makedirs(save_dir) cv2.imwrite(os.path.join(save_dir, '{:05d}.jpg'.format(frame_id)), im) else: writer.write(im) if camera_id != -1: cv2.imshow('Tracking and keypoint results', im) if cv2.waitKey(1) & 0xFF == ord('q'): break if FLAGS.save_mot_txts: result_filename = os.path.join(FLAGS.output_dir, video_name.split('.')[-2] + '.txt') write_mot_results(result_filename, mot_results) if FLAGS.save_images: save_dir = os.path.join(FLAGS.output_dir, video_name.split('.')[-2]) cmd_str = 'ffmpeg -f image2 -i {}/%05d.jpg {}'.format( save_dir, out_path) os.system(cmd_str) print('Save video in {}.'.format(out_path)) else: writer.release()