示例#1
0
def main(args):
    # Use fixed random seed if requested.
    if args.seed is not None:
        print("USING FIX SEED: {}".format(args.seed))
        ensure_reproducibility(seed=args.seed)

    # Append timestamp to output directory.
    args.output_dir = timestamp_path(args.output_dir)
    args.output_dir.mkdir(parents=True)

    # Development mode overrides.
    args.log_interval = 1 if args.dev_mode else args.log_interval
    args.max_epochs = 2 if args.dev_mode else args.max_epochs
    args.backbone_epochs = 1 if args.dev_mode else args.backbone_epochs

    image_mean, image_std = dataset_moments(args)

    # Only use a subset of data in dev mode.
    subset_indices = range(DEV_MODE_BATCHES) if args.dev_mode else None

    train_dataloader, test_dataloader, num_classes = detection_dataloaders(
        args.data_dir,
        subset_indices=subset_indices,
        no_augmentation=args.no_augmentation,
        num_workers=args.num_workers,
    )

    with redirect_output():
        coco_gt = convert_to_coco_api(test_dataloader.dataset)

    model = initialize_detector(
        num_classes,
        args.dropout_rate,
        trainable_backbone_layers=args.trainable_backbone_layers,
        image_mean=image_mean,
        image_std=image_std,
    )

    model = model.to(device=args.device)
    optimizer, lr_scheduler = initialize_optimizer(model, args)

    trainer = create_trainer(model, optimizer, args)
    evaluator = create_evaluator(model, args)

    wandb_mode = "offline" if args.dev_mode else None
    wandb_logger = setup_wandb_logging(
        trainer=trainer,
        optimizers=optimizer,
        evaluators=evaluator,
        log_every_iters=args.log_interval,
        # kwargs...
        dir=args.output_dir,
        mode=wandb_mode,
        config=args,
        config_exclude_keys=["dev_mode"],
        group="detector",
    )

    if lr_scheduler is not None:
        trainer.add_event_handler(
            Events.EPOCH_COMPLETED,
            lambda: lr_scheduler.step(),
        )

    if args.backbone_epochs is not None:
        trainer.add_event_handler(
            Events.EPOCH_COMPLETED(once=args.backbone_epochs),
            freeze_backbone,
            model,
        )

    @trainer.on(
        Events.EPOCH_COMPLETED(every=args.checkpoint_interval)
        | Events.COMPLETED)
    def save_model(engine: Engine):
        slug = f"{engine.state.epoch:02d}"
        if engine.last_event_name is Events.COMPLETED:
            slug = "final"
        file = args.output_dir / f"ckpt-{slug}.pt"
        torch.save(
            {
                "epoch": engine.state.epoch,
                "model": model.state_dict(),
                "optimizer": optimizer.state_dict(),
                "dropout_rate": args.dropout_rate,
                "num_classes": num_classes,
            }, file)

    @trainer.on(Events.EPOCH_STARTED)
    def log_epoch(engine: Engine):
        wandb_logger.log({"epoch": engine.state.epoch}, commit=False)

    @trainer.on(Events.ITERATION_COMPLETED(every=args.log_interval))
    def log_training_step(engine: Engine):
        engine.logger.info(engine.state.metrics)

    @trainer.on(Events.EPOCH_COMPLETED)
    def run_evaluator(engine: Engine):
        evaluator.run(test_dataloader)

    # COCO evaluation scores.
    # -----------------------
    @evaluator.on(Events.STARTED)
    def prepare_coco_evaluator(engine: Engine):
        iou_types = ["bbox", "segm"]
        engine.state.coco_evaluator = CocoEvaluator(coco_gt, iou_types)

    @evaluator.on(Events.ITERATION_COMPLETED)
    def update_coco_evaluator(engine: Engine):
        engine.state.coco_evaluator.update(engine.state.result)

    @evaluator.on(Events.COMPLETED)
    def log_coco_evaluator(engine: Engine):
        with redirect_output():
            engine.state.coco_evaluator.synchronize_between_processes()
            engine.state.coco_evaluator.accumulate()
            engine.state.coco_evaluator.summarize()
        coco_scores = prepare_coco_scores(engine.state.coco_evaluator)
        wandb_logger.log(coco_scores, step=trainer.state.iteration)
        del engine.state.coco_evaluator

    # Mask image visualization.
    # -------------------------
    @evaluator.on(Events.STARTED)
    def prepare_mask_images(engine: Engine):
        engine.state.result_images = []

    @evaluator.on(Events.ITERATION_COMPLETED)
    def visualize_masks(engine: Engine):
        if len(engine.state.result_images) < MAX_MASK_IMAGES:
            image = engine.state.batch[0][0]  # Grab first image
            result_image, *_ = predict(image, model, args)
            engine.state.result_images.append(result_image)

    @evaluator.on(Events.COMPLETED)
    def log_masked_images(engine: Engine):
        images = engine.state.result_images[:MAX_MASK_IMAGES]
        wandb_logger.log({"images": [wandb.Image(img) for img in images]},
                         step=trainer.state.iteration)
        del engine.state.result_images

    # Start training procedure...
    trainer.run(train_dataloader, max_epochs=args.max_epochs)
示例#2
0
def test_setup_wandb_logging(dirname):

    from unittest.mock import patch

    with patch("ignite.contrib.engines.common.WandBLogger") as _:
        setup_wandb_logging(MagicMock())
def get_logger(
    config: Any,
    trainer: Engine,
    evaluator: Optional[Union[Engine, Dict[str, Engine]]] = None,
    optimizers: Optional[Union[Optimizer, Dict[str, Optimizer]]] = None,
    **kwargs: Any,
) -> Optional[BaseLogger]:
    """Get Ignite provided logger.

    Parameters
    ----------
    config
        Config object for setting up loggers

    `config` has to contain
    - `filepath`: logging path to output file
    - `logger_log_every_iters`: logging iteration interval for loggers

    trainer
        trainer engine
    evaluator
        evaluator engine
    optimizers
        optimizers to log optimizer parameters
    kwargs
        optional keyword arguments passed to the logger

    Returns
    -------
    logger_handler
        Ignite provided logger instance
    """

    {% if logger_deps == 'clearml' %}
    logger_handler = common.setup_clearml_logging(
        trainer=trainer,
        optimizers=optimizers,
        evaluators=evaluator,
        log_every_iters=config.logger_log_every_iters,
        **kwargs,
    )
    {% elif logger_deps == 'mlflow' %}
    logger_handler = common.setup_mlflow_logging(
        trainer=trainer,
        optimizers=optimizers,
        evaluators=evaluator,
        log_every_iters=config.logger_log_every_iters,
        **kwargs,
    )
    {% elif logger_deps == 'neptune-client' %}
    logger_handler = common.setup_neptune_logging(
        trainer=trainer,
        optimizers=optimizers,
        evaluators=evaluator,
        log_every_iters=config.logger_log_every_iters,
        **kwargs,
    )
    {% elif logger_deps == 'polyaxon-client' %}
    logger_handler = common.setup_plx_logging(
        trainer=trainer,
        optimizers=optimizers,
        evaluators=evaluator,
        log_every_iters=config.logger_log_every_iters,
        **kwargs,
    )
    {% elif logger_deps == 'tensorboard' %}
    logger_handler = common.setup_tb_logging(
        output_path=config.output_dir,
        trainer=trainer,
        optimizers=optimizers,
        evaluators=evaluator,
        log_every_iters=config.logger_log_every_iters,
        **kwargs,
    )
    {% elif logger_deps == 'visdom' %}
    logger_handler = common.setup_visdom_logging(
        trainer=trainer,
        optimizers=optimizers,
        evaluators=evaluator,
        log_every_iters=config.logger_log_every_iters,
        **kwargs,
    )
    {% elif logger_deps == 'wandb' %}
    logger_handler = common.setup_wandb_logging(
        trainer=trainer,
        optimizers=optimizers,
        evaluators=evaluator,
        log_every_iters=config.logger_log_every_iters,
        **kwargs,
    )
    {% else %}
    logger_handler = None
    {% endif %}
    return logger_handler