From ea61bf6bb70e141ae437fc52f45717f23fdf43ba Mon Sep 17 00:00:00 2001 From: Mashiro <57566630+HAOCHENYE@users.noreply.github.com> Date: Wed, 20 Jul 2022 16:03:01 +0800 Subject: [PATCH] Fix: avoid modification of scalar_dict in LocalVisBackend (#377) --- mmengine/visualization/vis_backend.py | 5 ++++- tests/test_visualizer/test_vis_backend.py | 15 ++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/mmengine/visualization/vis_backend.py b/mmengine/visualization/vis_backend.py index 2c1dedc9..daa0d0b1 100644 --- a/mmengine/visualization/vis_backend.py +++ b/mmengine/visualization/vis_backend.py @@ -1,4 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. +import copy import functools import os import os.path as osp @@ -291,6 +292,7 @@ class LocalVisBackend(BaseVisBackend): Default to None. """ assert isinstance(scalar_dict, dict) + scalar_dict = copy.deepcopy(scalar_dict) scalar_dict.setdefault('step', step) if file_path is not None: @@ -542,7 +544,8 @@ class TensorboardVisBackend(BaseVisBackend): value (int, float, torch.Tensor, np.ndarray): Value to save. step (int): Global step value to record. Default to 0. """ - if isinstance(value, (int, float, torch.Tensor, np.ndarray)): + if isinstance(value, + (int, float, torch.Tensor, np.ndarray, np.number)): self._tensorboard.add_scalar(name, value, step) else: warnings.warn(f'Got {type(value)}, but numpy array, torch tensor, ' diff --git a/tests/test_visualizer/test_vis_backend.py b/tests/test_visualizer/test_vis_backend.py index 1ac5a1bf..c9908246 100644 --- a/tests/test_visualizer/test_vis_backend.py +++ b/tests/test_visualizer/test_vis_backend.py @@ -86,6 +86,7 @@ class TestLocalVisBackend: input_dict = {'map': 0.7, 'acc': 0.9} local_vis_backend = LocalVisBackend('temp_dir') local_vis_backend.add_scalars(input_dict) + assert input_dict == {'map': 0.7, 'acc': 0.9} out_dict = load(local_vis_backend._scalar_save_file, 'json') assert out_dict == {'map': 0.7, 'acc': 0.9, 'step': 0} @@ -143,7 +144,19 @@ class TestTensorboardVisBackend: # test append mode tensorboard_vis_backend.add_scalar('map', 0.9, step=0) tensorboard_vis_backend.add_scalar('map', 0.95, step=1) - + # test with numpy + with pytest.warns(None) as record: + tensorboard_vis_backend.add_scalar('map', np.array(0.9), step=0) + tensorboard_vis_backend.add_scalar('map', np.array(0.95), step=1) + tensorboard_vis_backend.add_scalar('map', np.array(9), step=0) + tensorboard_vis_backend.add_scalar('map', np.array(95), step=1) + tensorboard_vis_backend.add_scalar('map', np.array([9])[0], step=0) + tensorboard_vis_backend.add_scalar( + 'map', np.array([95])[0], step=1) + assert len(record) == 0 + # test with tensor + tensorboard_vis_backend.add_scalar('map', torch.tensor(0.9), step=0) + tensorboard_vis_backend.add_scalar('map', torch.tensor(0.95), step=1) # Unprocessable data will output a warning message with pytest.warns(Warning): tensorboard_vis_backend.add_scalar('map', [0.95]) -- GitLab