def main(): # Use first line of file docstring as description if it exists. parser = argparse.ArgumentParser( description=__doc__.split('\n')[0] if __doc__ else '', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('--config', default=Path('./release/config.yaml')) args = parser.parse_args() with open(args.config, 'r') as f: config = yaml.load(f) output_dir = Path(config['davis17']['output_dir']) / 'tracks' output_dir.mkdir(exist_ok=True, parents=True) common_setup(__file__, output_dir, args) split_dirs = link_splits(config) for split in config['davis17']['splits']: image_dir = split_dirs[split][0] init_detections = (Path(config['davis17']['output_dir']) / 'detections' / split) output_split = Path(output_dir) / split args = [ '--images-dir', image_dir, '--init-detections-dir', init_detections, '--output-dir', output_split, '--save-numpy', True, '--save-images', False, '--bidirectional', '--score-init-min', 0.9, '--remove-continue-overlap', 0.1, '--fps', 30, '--filename-format', 'frame', '--save-video', config['tracker']['visualize'], '--recursive' ] cmd = ['python', 'tracker/two_detector_track.py'] + args msg(f'Running tracker on DAVIS {split}') subprocess_call(cmd)
def evaluate_official(config): track_output = Path(config['fbms']['output_dir'] / 'tracks') check_tracks(track_output) for split in config['fbms']['splits']: np_dir = track_output / split dat_dir = np_dir / 'dat' if not check_dat(track_output, split): cmd = [ 'python', 'fbms/numpy_to_dat.py', '--numpy-dir', np_dir, '--output-dir', dat_dir, '--fbms-groundtruth', Path(config['fbms']['root']) / split ] msg(f'Converting {split} numpy predictions to .dat') logging.info('This may take a few minutes...') subprocess_call(cmd) assert check_dat(track_output, split) eval_binary = Path(config['fbms']['eval_dir']) / 'MoSegEvalAllPR' cmd = [ 'python', 'fbms/eval_official.py', '--eval-binary', eval_binary, '--predictions-dir', dat_dir, '--split', 'all' ] msg(f'Evaluating {split}') subprocess_call(cmd)
def main(): # Use first line of file docstring as description if it exists. parser = argparse.ArgumentParser( description=__doc__.split('\n')[0] if __doc__ else '', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('--config', default=Path('./release/config.yaml')) parser.add_argument('--frames-dir', required=True, type=Path) parser.add_argument('--detections-dir', required=True, type=Path) parser.add_argument('--output-dir', required=True, type=Path) parser.add_argument('--save-numpy', type=parse_bool, default=True) parser.add_argument('--save-images', type=parse_bool, default=False) parser.add_argument('--save-video', type=parse_bool, default=True) parser.add_argument('--fps', default=30, type=float) parser.add_argument('--model', choices=['joint', 'appearance', 'motion'], default='joint') parser.add_argument( '--filename-format', choices=[ 'frame', 'frameN', 'sequence_frame', 'sequence-frame', 'fbms' ], required=True, help=('Specifies how to get frame number from the filename. ' '"frame": the filename is the frame number, ' '"frameN": format <frame><number>, ' '"sequence_frame": frame number is separated by an underscore, ' '"sequence-frame": frame number is separated by a dash, ' '"fbms": assume fbms style frame numbers')) args = parser.parse_args() with open(args.config, 'r') as f: config = yaml.load(f) args.output_dir.mkdir(exist_ok=True, parents=True) common_setup(__file__, args.output_dir) logging.debug('Args:\n%s', pprint.pformat(vars(args))) if args.model == 'joint': detections_args = ['--init-detections-dir', args.detections_dir] script = 'tracker/two_detector_track.py' extra_args = ['--remove-continue-overlap', 0.1, '--recursive'] else: detections_args = ['--detections-dir', args.detections_dir] script = 'tracker/track_multiple.py' extra_args = [] args = ['--images-dir', args.frames_dir] + detections_args + [ '--output-dir', args.output_dir, '--save-numpy', args.save_numpy, '--save-images', args.save_images, '--save-video', args.save_video, '--bidirectional', '--score-init-min', 0.9, '--fps', args.fps, '--filename-format', args.filename_format, '--quiet' ] + extra_args cmd = ['python', script] + args msg(f'Running tracker') subprocess_call(cmd)
def main(): # Use first line of file docstring as description if it exists. parser = argparse.ArgumentParser( description=__doc__.split('\n')[0] if __doc__ else '', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('--config', default=Path('./release/config.yaml')) args = parser.parse_args() with open(args.config, 'r') as f: config = yaml.load(f) args = parser.parse_args() output_dir = Path(config['davis16']['output_dir']) / 'detections' output_dir.mkdir(exist_ok=True, parents=True) common_setup(__file__, output_dir, args) detectron_dir = ( Path(__file__).resolve().parent.parent.parent / 'detectron_pytorch') split_dirs = link_splits(config) for split in config['davis16']['splits']: image_dir = split_dirs[split][0] flow_dir = Path(config['davis16']['output_dir']) / 'flow' / split joint_config, joint_model = get_config_ckpt( config['model']['joint']['dir'], config['model']['joint']['step']) appearance_config, appearance_model = get_config_ckpt( config['model']['appearance']['dir'], config['model']['appearance']['step']) cmd = ['python', 'tools/infer_simple.py'] args = [ '--cfg', joint_config, '--num_classes', 2, '--load_ckpt', joint_model, '--load_appearance_ckpt', appearance_model, '--set', 'MODEL.MERGE_WITH_APPEARANCE.ENABLED', 'True', '--image_dirs', image_dir, flow_dir, '--input_type', 'rgb', 'flow', '--save_images', False, '--output_dir', output_dir / split, '--quiet', '--recursive' ] subprocess_call(cmd + args, cwd=str(detectron_dir)) cmd = ['python', 'detectron_to_fgbg_masks.py'] args = [ '--detections-root', output_dir / split, '--images-dir', image_dir, '--output-dir', output_dir / split, '--recursive', '--extension', '.jpg', '--threshold', '0.7' ] subprocess_call(cmd + args)
def evaluate_proposed(config, output_stage): if output_stage == 'detection': input_dir = (Path(config['davis16']['output_dir']) / 'detections') elif output_stage == 'tracking': input_dir = (Path(config['davis16']['output_dir']) / 'tracks') else: raise ValueError(f'Unknown output stage: {output_stage}') for split in config['davis16']['splits']: masks_dir = input_dir / split / 'masks' / 'masks' cmd = ['python', 'davis/eval_fgbg.py', '--masks-dir', masks_dir] msg(f'Evaluating {split}') subprocess_call(cmd)
def evaluate_proposed(config): track_output = Path(config['fbms']['output_dir']) / 'tracks' check_tracks(track_output, config['fbms']['splits']) for split in config['fbms']['splits']: np_dir = track_output / split cmd = [ 'python', 'fbms/eval_custom.py', '--npy-extension', '.npz', '--eval-type', 'fbms', '--background-id', 0, '--groundtruth-dir', Path(config['fbms']['root']) / split, '--predictions-dir', np_dir ] msg(f'Evaluating {split}') subprocess_call(cmd)
def evaluate_proposed(config): track_output = Path(config['davis17']['output_dir']) / 'tracks' check_tracks(track_output, config['davis17']['splits']) split_dirs = link_splits(config) for split in config['davis17']['splits']: np_dir = track_output / split annotations_dir = split_dirs[split][1] cmd = [ 'python', 'fbms/eval_custom.py', '--npy-extension', '.npz', '--eval-type', 'davis', '--background-id', 0, '--groundtruth-dir', annotations_dir, '--predictions-dir', np_dir ] msg(f'Evaluating {split}') subprocess_call(cmd)
def compute_flow_helper(config, input_dir, output_dir, extensions=None, recursive=True): flownet2_dir = Path(config['flow']['flownet2_dir']) if isinstance(extensions, str): extensions = [extensions] maybe_recursive = ['--recursive'] if recursive else [] maybe_extensions = (['--extensions'] + extensions) if extensions else [] args = ['--input-dir', input_dir] + maybe_recursive + [ '--convert-to-angle-magnitude-png', 'on' ] + maybe_extensions + ['--gpus'] + config['general']['gpus'] + [ '--num-workers', config['general']['num_workers'], '--output-dir', output_dir, '--flow-type', 'flownet2', '--flownet2-dir', flownet2_dir, '--flownet2-model', 'kitti', '--quiet' ] cmd = ['python', 'flow/compute_flow_sequences.py'] + args subprocess_call(cmd)
def main(): # Use first line of file docstring as description if it exists. parser = argparse.ArgumentParser( description=__doc__.split('\n')[0] if __doc__ else '', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('--frames-dir', type=Path, required=True) parser.add_argument('--output-dir', type=Path, required=True) parser.add_argument('--model', default='joint', choices=['joint', 'appearance', 'motion']) parser.add_argument( '--filename-format', choices=[ 'frame', 'frameN', 'sequence_frame', 'sequence-frame', 'fbms' ], required=True, help=('Specifies how to get frame number from the filename. ' '"frame": the filename is the frame number, ' '"frameN": format "frame<number>", ' '"sequence_frame": frame number is separated by an underscore, ' '"sequence-frame": frame number is separated by a dash, ' '"fbms": assume fbms style frame numbers')) parser.add_argument('--config', default=Path('./release/config.yaml')) args = parser.parse_args() args.output_dir.mkdir(exist_ok=True, parents=True) common_setup(__file__, args.output_dir, args) flow_dir = args.output_dir / 'flow' if args.model != 'appearance': subprocess_call([ 'python', 'release/custom/compute_flow.py', '--frames-dir', args.frames_dir, '--config', args.config, '--output-dir', flow_dir ]) output_dir = args.output_dir / args.model detections_dir = output_dir / 'detections' subprocess_call([ 'python', 'release/custom/infer.py', '--frames-dir', args.frames_dir, '--flow-dir', flow_dir, '--model', args.model, '--config', args.config, '--output-dir', detections_dir ]) tracks_dir = output_dir / 'tracks' subprocess_call([ 'python', 'release/custom/track.py', '--frames-dir', args.frames_dir, '--detections-dir', detections_dir, '--filename-format', args.filename_format, '--config', args.config, '--model', args.model, '--output-dir', tracks_dir ]) msg(f'Output results to: {tracks_dir}')
def main(): # Use first line of file docstring as description if it exists. parser = argparse.ArgumentParser( description=__doc__.split('\n')[0] if __doc__ else '', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('--config', default=Path('./release/config.yaml')) parser.add_argument( '--without-ytvos-train', action='store_true', help=("By default, we infer with model that was trained on YTVOS. " "For fair evaluation of generalization, we use a model without " "YTVOS training in our manuscript. Set this to True to use " "the model without YTVOS training.")) args = parser.parse_args() with open(args.config, 'r') as f: config = yaml.load(f) args = parser.parse_args() output_dir = Path(config['ytvos']['output_dir']) / 'detections' if args.without_ytvos_train: output_dir = output_dir / 'without_ytvos' else: output_dir = output_dir / 'with_ytvos' output_dir.mkdir(exist_ok=True, parents=True) common_setup(__file__, output_dir, args) detectron_dir = ( Path(__file__).resolve().parent.parent.parent / 'detectron_pytorch') split_dirs = link_splits(config) for split in config['ytvos']['splits']: image_dir = split_dirs[split][0] flow_dir = Path(config['ytvos']['output_dir']) / 'flow' / split if args.with_ytvos_train: joint_config, joint_model = get_config_ckpt( config['model']['joint']['dir'], config['model']['joint']['step']) else: joint_config, joint_model = get_config_ckpt( config['model']['joint_no_ytvos']['dir'], config['model']['joint_no_ytvos']['step']) appearance_config, appearance_model = get_config_ckpt( config['model']['appearance']['dir'], config['model']['appearance']['step']) cmd = ['python', 'tools/infer_simple.py'] args = [ '--cfg', joint_config, '--num_classes', 2, '--load_ckpt', joint_model, '--load_appearance_ckpt', appearance_model, '--set', 'MODEL.MERGE_WITH_APPEARANCE.ENABLED', 'True', '--image_dirs', image_dir, flow_dir, '--input_type', 'rgb', 'flow', '--save_images', False, '--output_dir', output_dir / split, '--quiet', '--recursive' ] subprocess_call(cmd + args, cwd=str(detectron_dir))
def main(): # Use first line of file docstring as description if it exists. parser = argparse.ArgumentParser( description=__doc__.split('\n')[0] if __doc__ else '', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('--config', default=Path('./release/config.yaml')) parser.add_argument('--frames-dir', type=Path, help='Required unless --model set to "motion"') parser.add_argument('--flow-dir', type=Path, help='Required unless --model set to "appearance".') parser.add_argument('--output-dir', type=Path, required=True) parser.add_argument('--visualize', action='store_true') parser.add_argument('--model', choices=['joint', 'appearance', 'motion'], default='joint') args = parser.parse_args() if args.model != 'appearance': assert args.flow_dir and args.flow_dir.exists(), ( f'--flow-dir must be specified for --model {args.model}') if args.model != 'motion': assert args.frames_dir and args.frames_dir.exists(), ( f'--frames-dir must be specified for --model {args.model}') with open(args.config, 'r') as f: config = yaml.load(f) args = parser.parse_args() args.output_dir.mkdir(exist_ok=True, parents=True) common_setup(__file__, args.output_dir) logging.debug('Args:\n%s', pprint.pformat(vars(args))) detectron_dir = (Path(__file__).resolve().parent.parent.parent / 'detectron_pytorch') model_config, model = get_config_ckpt(config['model'][args.model]['dir'], config['model'][args.model]['step']) maybe_combine_appearance = [] if args.model == 'joint': appearance_config, appearance_model = get_config_ckpt( config['model']['appearance']['dir'], config['model']['appearance']['step']) maybe_combine_appearance = [ '--load_appearance_ckpt', appearance_model, '--set', 'MODEL.MERGE_WITH_APPEARANCE.ENABLED', 'True' ] image_dirs = ['--image_dirs', args.frames_dir, args.flow_dir] input_type = ['--input_type', 'rgb', 'flow'] elif args.model == 'appearance': maybe_combine_appearance = [] image_dirs = ['--image_dirs', args.frames_dir] input_type = ['--input_type', 'rgb'] elif args.model == 'motion': maybe_combine_appearance = [] image_dirs = ['--image_dirs', args.flow_dir] input_type = ['--input_type', 'flow'] msg(f'Running {args.model} model on {image_dirs[1].resolve()}') cmd = ['python', 'tools/infer_simple.py'] args = (['--cfg', model_config, '--num_classes', 2, '--load_ckpt', model] + maybe_combine_appearance + image_dirs + input_type + [ '--save_images', args.visualize, '--output_dir', args.output_dir, '--quiet', '--recursive' ]) subprocess_call(cmd + args, cwd=str(detectron_dir))