1
1
import os .path as osp
2
2
3
- from mmcv .runner import Hook
4
- from torch . utils . data import DataLoader
3
+ from mmcv .runner import DistEvalHook as _DistEvalHook
4
+ from mmcv . runner import EvalHook as _EvalHook
5
5
6
6
7
- class EvalHook (Hook ):
8
- """Evaluation hook .
7
+ class EvalHook (_EvalHook ):
8
+ """Single GPU EvalHook, with efficient test support .
9
9
10
- Attributes:
11
- dataloader (DataLoader): A PyTorch dataloader.
12
- interval (int): Evaluation interval (by epochs). Default: 1.
10
+ Args:
11
+ by_epoch (bool): Determine perform evaluation by epoch or by iteration.
12
+ If set to True, it will perform by epoch. Otherwise, by iteration.
13
+ Default: False.
14
+ efficient_test (bool): Whether save the results as local numpy files to
15
+ save CPU memory during evaluation. Default: False.
16
+ Returns:
17
+ list: The prediction results.
13
18
"""
14
19
15
- def __init__ (self , dataloader , interval = 1 , by_epoch = False , ** eval_kwargs ):
16
- if not isinstance (dataloader , DataLoader ):
17
- raise TypeError ('dataloader must be a pytorch DataLoader, but got '
18
- f'{ type (dataloader )} ' )
19
- self .dataloader = dataloader
20
- self .interval = interval
21
- self .by_epoch = by_epoch
22
- self .eval_kwargs = eval_kwargs
20
+ greater_keys = ['mIoU' , 'mAcc' , 'aAcc' ]
21
+
22
+ def __init__ (self , * args , by_epoch = False , efficient_test = False , ** kwargs ):
23
+ super ().__init__ (* args , by_epoch = by_epoch , ** kwargs )
24
+ self .efficient_test = efficient_test
23
25
24
26
def after_train_iter (self , runner ):
25
- """After train epoch hook."""
27
+ """After train epoch hook.
28
+
29
+ Override default ``single_gpu_test``.
30
+ """
26
31
if self .by_epoch or not self .every_n_iters (runner , self .interval ):
27
32
return
28
33
from mmseg .apis import single_gpu_test
29
34
runner .log_buffer .clear ()
30
- results = single_gpu_test (runner .model , self .dataloader , show = False )
35
+ results = single_gpu_test (
36
+ runner .model ,
37
+ self .dataloader ,
38
+ show = False ,
39
+ efficient_test = self .efficient_test )
31
40
self .evaluate (runner , results )
32
41
33
42
def after_train_epoch (self , runner ):
34
- """After train epoch hook."""
43
+ """After train epoch hook.
44
+
45
+ Override default ``single_gpu_test``.
46
+ """
35
47
if not self .by_epoch or not self .every_n_epochs (runner , self .interval ):
36
48
return
37
49
from mmseg .apis import single_gpu_test
38
50
runner .log_buffer .clear ()
39
51
results = single_gpu_test (runner .model , self .dataloader , show = False )
40
52
self .evaluate (runner , results )
41
53
42
- def evaluate (self , runner , results ):
43
- """Call evaluate function of dataset."""
44
- eval_res = self .dataloader .dataset .evaluate (
45
- results , logger = runner .logger , ** self .eval_kwargs )
46
- for name , val in eval_res .items ():
47
- runner .log_buffer .output [name ] = val
48
- runner .log_buffer .ready = True
49
-
50
54
51
- class DistEvalHook (EvalHook ):
52
- """Distributed evaluation hook .
55
+ class DistEvalHook (_DistEvalHook ):
56
+ """Distributed EvalHook, with efficient test support .
53
57
54
- Attributes:
55
- dataloader (DataLoader): A PyTorch dataloader.
56
- interval (int): Evaluation interval (by epochs). Default: 1.
57
- tmpdir (str | None): Temporary directory to save the results of all
58
- processes. Default: None.
59
- gpu_collect (bool): Whether to use gpu or cpu to collect results.
58
+ Args:
59
+ by_epoch (bool): Determine perform evaluation by epoch or by iteration.
60
+ If set to True, it will perform by epoch. Otherwise, by iteration.
60
61
Default: False.
62
+ efficient_test (bool): Whether save the results as local numpy files to
63
+ save CPU memory during evaluation. Default: False.
64
+ Returns:
65
+ list: The prediction results.
61
66
"""
62
67
63
- def __init__ (self ,
64
- dataloader ,
65
- interval = 1 ,
66
- gpu_collect = False ,
67
- by_epoch = False ,
68
- ** eval_kwargs ):
69
- if not isinstance (dataloader , DataLoader ):
70
- raise TypeError (
71
- 'dataloader must be a pytorch DataLoader, but got {}' .format (
72
- type (dataloader )))
73
- self .dataloader = dataloader
74
- self .interval = interval
75
- self .gpu_collect = gpu_collect
76
- self .by_epoch = by_epoch
77
- self .eval_kwargs = eval_kwargs
68
+ greater_keys = ['mIoU' , 'mAcc' , 'aAcc' ]
69
+
70
+ def __init__ (self , * args , by_epoch = False , efficient_test = False , ** kwargs ):
71
+ super ().__init__ (* args , by_epoch = by_epoch , ** kwargs )
72
+ self .efficient_test = efficient_test
78
73
79
74
def after_train_iter (self , runner ):
80
- """After train epoch hook."""
75
+ """After train epoch hook.
76
+
77
+ Override default ``multi_gpu_test``.
78
+ """
81
79
if self .by_epoch or not self .every_n_iters (runner , self .interval ):
82
80
return
83
81
from mmseg .apis import multi_gpu_test
@@ -86,13 +84,17 @@ def after_train_iter(self, runner):
86
84
runner .model ,
87
85
self .dataloader ,
88
86
tmpdir = osp .join (runner .work_dir , '.eval_hook' ),
89
- gpu_collect = self .gpu_collect )
87
+ gpu_collect = self .gpu_collect ,
88
+ efficient_test = self .efficient_test )
90
89
if runner .rank == 0 :
91
90
print ('\n ' )
92
91
self .evaluate (runner , results )
93
92
94
93
def after_train_epoch (self , runner ):
95
- """After train epoch hook."""
94
+ """After train epoch hook.
95
+
96
+ Override default ``multi_gpu_test``.
97
+ """
96
98
if not self .by_epoch or not self .every_n_epochs (runner , self .interval ):
97
99
return
98
100
from mmseg .apis import multi_gpu_test
0 commit comments