Esempio n. 1
0
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)
Esempio n. 2
0
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)
Esempio n. 3
0
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)
Esempio n. 4
0
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)
Esempio n. 5
0
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)
Esempio n. 6
0
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)
Esempio n. 7
0
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)
Esempio n. 8
0
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)
Esempio n. 9
0
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}')
Esempio n. 10
0
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))
Esempio n. 11
0
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))