mirror of
https://github.com/open-mmlab/mmengine.git
synced 2025-06-03 21:54:44 +08:00
* [WIP] add inline * refactor vis module * [Refactor] according review * [Fix] fix comment * fix some error * Get sub visualizer be Visualizer.get_instance * fix conflict * fix lint * fix unit test * fix mypy * fix comment * fix lint * update docstr * update * update instancedata * remove replace __mro__ with issubclass Co-authored-by: PJLAB\huanghaian <1286304229@qq.com> Co-authored-by: HAOCHENYE <21724054@zju.edu.cn>
201 lines
6.8 KiB
Python
201 lines
6.8 KiB
Python
# Copyright (c) OpenMMLab. All rights reserved.
|
|
import os
|
|
import shutil
|
|
import sys
|
|
from unittest.mock import MagicMock
|
|
|
|
import numpy as np
|
|
import pytest
|
|
|
|
from mmengine.fileio import load
|
|
from mmengine.registry import VISBACKENDS
|
|
from mmengine.visualization import (LocalVisBackend, TensorboardVisBackend,
|
|
WandbVisBackend)
|
|
|
|
|
|
class TestLocalVisBackend:
|
|
|
|
def test_init(self):
|
|
|
|
# 'config_save_file' format must be py
|
|
with pytest.raises(AssertionError):
|
|
LocalVisBackend('temp_dir', config_save_file='a.txt')
|
|
|
|
# 'scalar_save_file' format must be json
|
|
with pytest.raises(AssertionError):
|
|
LocalVisBackend('temp_dir', scalar_save_file='a.yaml')
|
|
|
|
local_vis_backend = LocalVisBackend('temp_dir')
|
|
assert os.path.exists(local_vis_backend._save_dir)
|
|
shutil.rmtree('temp_dir')
|
|
|
|
local_vis_backend = VISBACKENDS.build(
|
|
dict(type='LocalVisBackend', save_dir='temp_dir'))
|
|
assert os.path.exists(local_vis_backend._save_dir)
|
|
shutil.rmtree('temp_dir')
|
|
|
|
def test_experiment(self):
|
|
local_vis_backend = LocalVisBackend('temp_dir')
|
|
assert local_vis_backend.experiment == local_vis_backend
|
|
shutil.rmtree('temp_dir')
|
|
|
|
def test_add_config(self):
|
|
local_vis_backend = LocalVisBackend('temp_dir')
|
|
|
|
# 'params_dict' must be dict
|
|
with pytest.raises(AssertionError):
|
|
local_vis_backend.add_config(['lr', 0])
|
|
|
|
# TODO
|
|
|
|
shutil.rmtree('temp_dir')
|
|
|
|
def test_add_image(self):
|
|
image = np.random.randint(0, 256, size=(10, 10, 3)).astype(np.uint8)
|
|
local_vis_backend = LocalVisBackend('temp_dir')
|
|
local_vis_backend.add_image('img', image)
|
|
assert os.path.exists(
|
|
os.path.join(local_vis_backend._img_save_dir, 'img_0.png'))
|
|
|
|
local_vis_backend.add_image('img', image, step=2)
|
|
assert os.path.exists(
|
|
os.path.join(local_vis_backend._img_save_dir, 'img_2.png'))
|
|
|
|
shutil.rmtree('temp_dir')
|
|
|
|
def test_add_scalar(self):
|
|
local_vis_backend = LocalVisBackend('temp_dir')
|
|
local_vis_backend.add_scalar('map', 0.9)
|
|
out_dict = load(local_vis_backend._scalar_save_file, 'json')
|
|
assert out_dict == {'map': 0.9, 'step': 0}
|
|
shutil.rmtree('temp_dir')
|
|
|
|
# test append mode
|
|
local_vis_backend = LocalVisBackend('temp_dir')
|
|
local_vis_backend.add_scalar('map', 0.9, step=0)
|
|
local_vis_backend.add_scalar('map', 0.95, step=1)
|
|
with open(local_vis_backend._scalar_save_file) as f:
|
|
out_dict = f.read()
|
|
assert out_dict == '{"map": 0.9, "step": 0}\n{"map": ' \
|
|
'0.95, "step": 1}\n'
|
|
shutil.rmtree('temp_dir')
|
|
|
|
def test_add_scalars(self):
|
|
local_vis_backend = LocalVisBackend('temp_dir')
|
|
input_dict = {'map': 0.7, 'acc': 0.9}
|
|
local_vis_backend.add_scalars(input_dict)
|
|
out_dict = load(local_vis_backend._scalar_save_file, 'json')
|
|
assert out_dict == {'map': 0.7, 'acc': 0.9, 'step': 0}
|
|
|
|
# test append mode
|
|
local_vis_backend.add_scalars({'map': 0.8, 'acc': 0.8}, step=1)
|
|
with open(local_vis_backend._scalar_save_file) as f:
|
|
out_dict = f.read()
|
|
assert out_dict == '{"map": 0.7, "acc": 0.9, ' \
|
|
'"step": 0}\n{"map": 0.8, "acc": 0.8, "step": 1}\n'
|
|
|
|
# test file_path
|
|
local_vis_backend = LocalVisBackend('temp_dir')
|
|
local_vis_backend.add_scalars(input_dict, file_path='temp.json')
|
|
assert os.path.exists(local_vis_backend._scalar_save_file)
|
|
assert os.path.exists(
|
|
os.path.join(local_vis_backend._save_dir, 'temp.json'))
|
|
|
|
# file_path and scalar_save_file cannot be the same
|
|
with pytest.raises(AssertionError):
|
|
local_vis_backend.add_scalars(input_dict, file_path='scalars.json')
|
|
|
|
shutil.rmtree('temp_dir')
|
|
|
|
|
|
class TestTensorboardVisBackend:
|
|
sys.modules['torch.utils.tensorboard'] = MagicMock()
|
|
sys.modules['tensorboardX'] = MagicMock()
|
|
|
|
def test_init(self):
|
|
|
|
TensorboardVisBackend('temp_dir')
|
|
VISBACKENDS.build(
|
|
dict(type='TensorboardVisBackend', save_dir='temp_dir'))
|
|
|
|
def test_experiment(self):
|
|
tensorboard_vis_backend = TensorboardVisBackend('temp_dir')
|
|
assert (tensorboard_vis_backend.experiment ==
|
|
tensorboard_vis_backend._tensorboard)
|
|
|
|
def test_add_graph(self):
|
|
# TODO
|
|
pass
|
|
|
|
def test_add_config(self):
|
|
# TODO
|
|
pass
|
|
|
|
def test_add_image(self):
|
|
image = np.random.randint(0, 256, size=(10, 10, 3)).astype(np.uint8)
|
|
|
|
tensorboard_vis_backend = TensorboardVisBackend('temp_dir')
|
|
tensorboard_vis_backend.add_image('img', image)
|
|
|
|
tensorboard_vis_backend.add_image('img', image, step=2)
|
|
|
|
def test_add_scalar(self):
|
|
tensorboard_vis_backend = TensorboardVisBackend('temp_dir')
|
|
tensorboard_vis_backend.add_scalar('map', 0.9)
|
|
# test append mode
|
|
tensorboard_vis_backend.add_scalar('map', 0.9, step=0)
|
|
tensorboard_vis_backend.add_scalar('map', 0.95, step=1)
|
|
|
|
def test_add_scalars(self):
|
|
tensorboard_vis_backend = TensorboardVisBackend('temp_dir')
|
|
# The step value must be passed through the parameter
|
|
with pytest.raises(AssertionError):
|
|
tensorboard_vis_backend.add_scalars({
|
|
'map': 0.7,
|
|
'acc': 0.9,
|
|
'step': 1
|
|
})
|
|
|
|
input_dict = {'map': 0.7, 'acc': 0.9}
|
|
tensorboard_vis_backend.add_scalars(input_dict)
|
|
# test append mode
|
|
tensorboard_vis_backend.add_scalars({'map': 0.8, 'acc': 0.8}, step=1)
|
|
|
|
|
|
class TestWandbVisBackend:
|
|
sys.modules['wandb'] = MagicMock()
|
|
|
|
def test_init(self):
|
|
WandbVisBackend()
|
|
VISBACKENDS.build(dict(type='WandbVisBackend', save_dir='temp_dir'))
|
|
|
|
def test_experiment(self):
|
|
wandb_vis_backend = WandbVisBackend()
|
|
assert wandb_vis_backend.experiment == wandb_vis_backend._wandb
|
|
|
|
def test_add_config(self):
|
|
# TODO
|
|
pass
|
|
|
|
def test_add_image(self):
|
|
image = np.random.randint(0, 256, size=(10, 10, 3)).astype(np.uint8)
|
|
|
|
wandb_vis_backend = WandbVisBackend()
|
|
wandb_vis_backend.add_image('img', image)
|
|
|
|
wandb_vis_backend.add_image('img', image, step=2)
|
|
|
|
def test_add_scalar(self):
|
|
wandb_vis_backend = WandbVisBackend()
|
|
wandb_vis_backend.add_scalar('map', 0.9)
|
|
# test append mode
|
|
wandb_vis_backend.add_scalar('map', 0.9, step=0)
|
|
wandb_vis_backend.add_scalar('map', 0.95, step=1)
|
|
|
|
def test_add_scalars(self):
|
|
wandb_vis_backend = WandbVisBackend()
|
|
input_dict = {'map': 0.7, 'acc': 0.9}
|
|
wandb_vis_backend.add_scalars(input_dict)
|
|
# test append mode
|
|
wandb_vis_backend.add_scalars({'map': 0.8, 'acc': 0.8}, step=1)
|