diff --git a/mmengine/visualization/vis_backend.py b/mmengine/visualization/vis_backend.py index 2c1dedc924c0d4262ff09557cb4cd087a28e651c..daa0d0b1a70e4948b21764e451eb6f7da3886136 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 1ac5a1bfc925fcb7abe289df33b0f17c932fe1e6..c99082463a2a21a787bed549125819effc18b141 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])