|
|
import os.path as osp |
|
|
import numpy as np |
|
|
import numpy.random as npr |
|
|
import PIL |
|
|
import cv2 |
|
|
|
|
|
import torch |
|
|
import torchvision |
|
|
import xml.etree.ElementTree as ET |
|
|
import json |
|
|
import copy |
|
|
|
|
|
from ...cfg_holder import cfg_unique_holder as cfguh |
|
|
|
|
|
def singleton(class_): |
|
|
instances = {} |
|
|
def getinstance(*args, **kwargs): |
|
|
if class_ not in instances: |
|
|
instances[class_] = class_(*args, **kwargs) |
|
|
return instances[class_] |
|
|
return getinstance |
|
|
|
|
|
@singleton |
|
|
class get_loader(object): |
|
|
def __init__(self): |
|
|
self.loader = {} |
|
|
|
|
|
def register(self, loadf): |
|
|
self.loader[loadf.__name__] = loadf |
|
|
|
|
|
def __call__(self, cfg): |
|
|
if cfg is None: |
|
|
return None |
|
|
if isinstance(cfg, list): |
|
|
loader = [] |
|
|
for ci in cfg: |
|
|
t = ci.type |
|
|
loader.append(self.loader[t](**ci.args)) |
|
|
return compose(loader) |
|
|
t = cfg.type |
|
|
return self.loader[t](**cfg.args) |
|
|
|
|
|
class compose(object): |
|
|
def __init__(self, loaders): |
|
|
self.loaders = loaders |
|
|
|
|
|
def __call__(self, element): |
|
|
for l in self.loaders: |
|
|
element = l(element) |
|
|
return element |
|
|
|
|
|
def __getitem__(self, idx): |
|
|
return self.loaders[idx] |
|
|
|
|
|
def register(): |
|
|
def wrapper(class_): |
|
|
get_loader().register(class_) |
|
|
return class_ |
|
|
return wrapper |
|
|
|
|
|
def pre_loader_checkings(ltype): |
|
|
lpath = ltype+'_path' |
|
|
|
|
|
lcache = ltype+'_cache' |
|
|
def wrapper(func): |
|
|
def inner(self, element): |
|
|
if lcache in element: |
|
|
|
|
|
data = element[lcache] |
|
|
else: |
|
|
if ltype in element: |
|
|
raise ValueError |
|
|
if lpath not in element: |
|
|
raise ValueError |
|
|
|
|
|
if element[lpath] is None: |
|
|
data = None |
|
|
else: |
|
|
data = func(self, element[lpath], element) |
|
|
element[ltype] = data |
|
|
|
|
|
if ltype == 'image': |
|
|
if isinstance(data, np.ndarray): |
|
|
imsize = data.shape[-2:] |
|
|
elif isinstance(data, PIL.Image.Image): |
|
|
imsize = data.size[::-1] |
|
|
elif isinstance(data, torch.Tensor): |
|
|
imsize = [data.size(-2), data.size(-1)] |
|
|
elif data is None: |
|
|
imsize = None |
|
|
else: |
|
|
raise ValueError |
|
|
element['imsize'] = imsize |
|
|
element['imsize_current'] = copy.deepcopy(imsize) |
|
|
return element |
|
|
return inner |
|
|
return wrapper |
|
|
|