Table of Contents
Shortcuts

# Source code for mmseg.core.evaluation.eval_hooks

    import os.path as osp

    from mmcv.runner import Hook
    from torch.utils.data import DataLoader

    class EvalHook(Hook):
        """Evaluation hook.

        Attributes:
            dataloader (DataLoader): A PyTorch dataloader.
            interval (int): Evaluation interval (by epochs). Default: 1.
        """

        def __init__(self, dataloader, interval=1, by_epoch=False, **eval_kwargs):
            if not isinstance(dataloader, DataLoader):
                raise TypeError('dataloader must be a pytorch DataLoader, but got '
                                f'{type(dataloader)}')
            self.dataloader = dataloader
            self.interval = interval
            self.by_epoch = by_epoch
            self.eval_kwargs = eval_kwargs

        def after_train_iter(self, runner):
            """After train epoch hook."""
            if self.by_epoch or not self.every_n_iters(runner, self.interval):
                return
            from mmseg.apis import single_gpu_test
            runner.log_buffer.clear()
            results = single_gpu_test(runner.model, self.dataloader, show=False)
            self.evaluate(runner, results)

        def after_train_epoch(self, runner):
            """After train epoch hook."""
            if not self.by_epoch or not self.every_n_epochs(runner, self.interval):
                return
            from mmseg.apis import single_gpu_test
            runner.log_buffer.clear()
            results = single_gpu_test(runner.model, self.dataloader, show=False)
            self.evaluate(runner, results)

        def evaluate(self, runner, results):
            """Call evaluate function of dataset."""
            eval_res = self.dataloader.dataset.evaluate(
                results, logger=runner.logger, **self.eval_kwargs)
            for name, val in eval_res.items():
                runner.log_buffer.output[name] = val
            runner.log_buffer.ready = True

    class DistEvalHook(EvalHook):
        """Distributed evaluation hook.

        Attributes:
            dataloader (DataLoader): A PyTorch dataloader.
            interval (int): Evaluation interval (by epochs). Default: 1.
            tmpdir (str | None): Temporary directory to save the results of all
                processes. Default: None.
            gpu_collect (bool): Whether to use gpu or cpu to collect results.
                Default: False.
        """

        def __init__(self,
                     dataloader,
                     interval=1,
                     gpu_collect=False,
                     by_epoch=False,
                     **eval_kwargs):
            if not isinstance(dataloader, DataLoader):
                raise TypeError(
                    'dataloader must be a pytorch DataLoader, but got {}'.format(
                        type(dataloader)))
            self.dataloader = dataloader
            self.interval = interval
            self.gpu_collect = gpu_collect
            self.by_epoch = by_epoch
            self.eval_kwargs = eval_kwargs

        def after_train_iter(self, runner):
            """After train epoch hook."""
            if self.by_epoch or not self.every_n_iters(runner, self.interval):
                return
            from mmseg.apis import multi_gpu_test
            runner.log_buffer.clear()
            results = multi_gpu_test(
                runner.model,
                self.dataloader,
                tmpdir=osp.join(runner.work_dir, '.eval_hook'),
                gpu_collect=self.gpu_collect)
            if runner.rank == 0:
                print('\n')
                self.evaluate(runner, results)

        def after_train_epoch(self, runner):
            """After train epoch hook."""
            if not self.by_epoch or not self.every_n_epochs(runner, self.interval):
                return
            from mmseg.apis import multi_gpu_test
            runner.log_buffer.clear()
            results = multi_gpu_test(
                runner.model,
                self.dataloader,
                tmpdir=osp.join(runner.work_dir, '.eval_hook'),
                gpu_collect=self.gpu_collect)
            if runner.rank == 0:
                print('\n')
                self.evaluate(runner, results)