Spaces:
Runtime error
Runtime error
# Copyright (c) OpenMMLab. All rights reserved. | |
import copy | |
import json | |
import os | |
import os.path as osp | |
import tempfile | |
import mmcv | |
import numpy as np | |
import pytest | |
import torch | |
from mmcv import Config | |
from mmcv.parallel import MMDataParallel | |
from mmocr.apis.test import single_gpu_test | |
from mmocr.datasets import build_dataloader, build_dataset | |
from mmocr.models import build_detector | |
from mmocr.utils import check_argument, list_to_file, revert_sync_batchnorm | |
def build_model(cfg): | |
model = build_detector(cfg.model, test_cfg=cfg.get('test_cfg')) | |
model = revert_sync_batchnorm(model) | |
model = MMDataParallel(model) | |
return model | |
def generate_sample_dataloader(cfg, curr_dir, img_prefix='', ann_file=''): | |
must_keys = ['img_norm_cfg', 'ori_filename', 'img_shape', 'ori_shape'] | |
test_pipeline = cfg.data.test.pipeline | |
for key in must_keys: | |
if test_pipeline[1].type == 'MultiRotateAugOCR': | |
collect_pipeline = test_pipeline[1]['transforms'][-1] | |
else: | |
collect_pipeline = test_pipeline[-1] | |
if 'meta_keys' not in collect_pipeline: | |
continue | |
collect_pipeline['meta_keys'].append(key) | |
img_prefix = osp.join(curr_dir, img_prefix) | |
ann_file = osp.join(curr_dir, ann_file) | |
test = copy.deepcopy(cfg.data.test.datasets[0]) | |
test.img_prefix = img_prefix | |
test.ann_file = ann_file | |
cfg.data.workers_per_gpu = 0 | |
cfg.data.test.datasets = [test] | |
dataset = build_dataset(cfg.data.test) | |
loader_cfg = { | |
**dict((k, cfg.data[k]) for k in [ | |
'workers_per_gpu', 'samples_per_gpu' | |
] if k in cfg.data) | |
} | |
test_loader_cfg = { | |
**loader_cfg, | |
**dict(shuffle=False, drop_last=False), | |
**cfg.data.get('test_dataloader', {}) | |
} | |
data_loader = build_dataloader(dataset, **test_loader_cfg) | |
return data_loader | |
def test_single_gpu_test_recog(cfg_file): | |
curr_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) | |
config_file = os.path.join(curr_dir, cfg_file) | |
cfg = Config.fromfile(config_file) | |
model = build_model(cfg) | |
img_prefix = 'data/ocr_toy_dataset/imgs' | |
ann_file = 'data/ocr_toy_dataset/label.txt' | |
data_loader = generate_sample_dataloader(cfg, curr_dir, img_prefix, | |
ann_file) | |
with tempfile.TemporaryDirectory() as tmpdirname: | |
out_dir = osp.join(tmpdirname, 'tmp') | |
results = single_gpu_test(model, data_loader, out_dir=out_dir) | |
assert check_argument.is_type_list(results, dict) | |
def test_single_gpu_test_det(cfg_file): | |
curr_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) | |
config_file = os.path.join(curr_dir, cfg_file) | |
cfg = Config.fromfile(config_file) | |
model = build_model(cfg) | |
img_prefix = 'data/toy_dataset/imgs' | |
ann_file = 'data/toy_dataset/instances_test.json' | |
data_loader = generate_sample_dataloader(cfg, curr_dir, img_prefix, | |
ann_file) | |
with tempfile.TemporaryDirectory() as tmpdirname: | |
out_dir = osp.join(tmpdirname, 'tmp') | |
results = single_gpu_test(model, data_loader, out_dir=out_dir) | |
assert check_argument.is_type_list(results, dict) | |
def gene_sdmgr_model_dataloader(cfg, dirname, curr_dir, empty_img=False): | |
json_obj = { | |
'file_name': | |
'1.jpg', | |
'height': | |
348, | |
'width': | |
348, | |
'annotations': [{ | |
'box': [114.0, 19.0, 230.0, 19.0, 230.0, 1.0, 114.0, 1.0], | |
'text': | |
'CHOEUN', | |
'label': | |
1 | |
}] | |
} | |
ann_file = osp.join(dirname, 'test.txt') | |
list_to_file(ann_file, [json.dumps(json_obj, ensure_ascii=False)]) | |
if not empty_img: | |
img = np.ones((348, 348, 3), dtype=np.uint8) | |
img_file = osp.join(dirname, '1.jpg') | |
mmcv.imwrite(img, img_file) | |
test = copy.deepcopy(cfg.data.test) | |
test.ann_file = ann_file | |
test.img_prefix = dirname | |
test.dict_file = osp.join(curr_dir, 'data/kie_toy_dataset/dict.txt') | |
cfg.data.workers_per_gpu = 1 | |
cfg.data.test = test | |
cfg.model.class_list = osp.join(curr_dir, | |
'data/kie_toy_dataset/class_list.txt') | |
dataset = build_dataset(cfg.data.test) | |
loader_cfg = { | |
**dict((k, cfg.data[k]) for k in [ | |
'workers_per_gpu', 'samples_per_gpu' | |
] if k in cfg.data) | |
} | |
test_loader_cfg = { | |
**loader_cfg, | |
**dict(shuffle=False, drop_last=False), | |
**cfg.data.get('test_dataloader', {}) | |
} | |
data_loader = build_dataloader(dataset, **test_loader_cfg) | |
model = build_model(cfg) | |
return model, data_loader | |
def test_single_gpu_test_kie(cfg_file): | |
curr_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) | |
config_file = os.path.join(curr_dir, cfg_file) | |
cfg = Config.fromfile(config_file) | |
with tempfile.TemporaryDirectory() as tmpdirname: | |
out_dir = osp.join(tmpdirname, 'tmp') | |
model, data_loader = gene_sdmgr_model_dataloader( | |
cfg, out_dir, curr_dir) | |
results = single_gpu_test( | |
model, data_loader, out_dir=out_dir, is_kie=True) | |
assert check_argument.is_type_list(results, dict) | |
def test_single_gpu_test_kie_novisual(cfg_file): | |
curr_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) | |
config_file = os.path.join(curr_dir, cfg_file) | |
cfg = Config.fromfile(config_file) | |
meta_keys = list(cfg.data.test.pipeline[-1]['meta_keys']) | |
must_keys = ['img_norm_cfg', 'ori_filename', 'img_shape'] | |
for key in must_keys: | |
meta_keys.append(key) | |
cfg.data.test.pipeline[-1]['meta_keys'] = tuple(meta_keys) | |
with tempfile.TemporaryDirectory() as tmpdirname: | |
out_dir = osp.join(tmpdirname, 'tmp') | |
model, data_loader = gene_sdmgr_model_dataloader( | |
cfg, out_dir, curr_dir, empty_img=True) | |
results = single_gpu_test( | |
model, data_loader, out_dir=out_dir, is_kie=True) | |
assert check_argument.is_type_list(results, dict) | |
model, data_loader = gene_sdmgr_model_dataloader( | |
cfg, out_dir, curr_dir) | |
results = single_gpu_test( | |
model, data_loader, out_dir=out_dir, is_kie=True) | |
assert check_argument.is_type_list(results, dict) | |