TypeError: преобразование должно быть вызываемым или dict mmdet #mmdetection
Я работаю над проектом по настройке счетов-фактур на поезда для обнаружения таблиц и использую модель cascade_mask_rcnn_hrnetv2p_w32_20e_coco. Я слежу за https://colab.research.google.com/github/Tony607/mmdetection_object_detection_demo/blob/master/mmdetection_train_custom_data.ipynb для индивидуального обучения.
Ниже приведен код, в котором вызов функции LoadImage() выполняется в inference.py.
def inference_detector(model, img):
"""Inference image(s) with the detector.
Args:
model (nn.Module): The loaded detector.
imgs (str/ndarray or list[str/ndarray]): Either image files or loaded
images.
Returns:
If imgs is a str, a generator will be returned, otherwise return the
detection results directly.
"""
cfg = model.cfg
device = next(model.parameters()).device # model device
# build the data pipeline
test_pipeline = [LoadImage()] + cfg.data.test.pipeline[1:]
test_pipeline = Compose(test_pipeline)
# prepare data
data = dict(img=img)
data = test_pipeline(data)
data = collate([data], samples_per_gpu=1)
if next(model.parameters()).is_cuda:
# scatter to specified GPU
data = scatter(data, [device])[0]
else:
# Use torchvision ops for CPU mode instead
for m in model.modules():
if isinstance(m, (RoIPool, RoIAlign)):
if not m.aligned:
# aligned=False is not implemented on CPU
# set use_torchvision on-the-fly
m.use_torchvision = True
warnings.warn('We set use_torchvision=True in CPU mode.')
# just get the actual data from DataContainer
data['img_metas'] = data['img_metas'][0].data
# forward the model
with torch.no_grad():
result = model(return_loss=False, rescale=True, **data)
return result
"test_pipeline = [LoadImage()] + cfg.data.test.pipeline[1:]" здесь LoadImage() требует, чтобы аргумент был передан в вызове def, но ничего не передается, и поскольку это стандартный код i не знаю, как он передает данные вызову def
Ниже представлена функция LoadImage
class LoadImage(object):
"""A simple pipeline to load image."""
def __call__(self, results):
"""Call function to load images into results.
Args:
results (dict): A result dict contains the file name
of the image to be read.
Returns:
dict: ``results`` will be returned containing loaded image.
"""
if isinstance(results['img'], str):
results['filename'] = results['img']
results['ori_filename'] = results['img']
else:
results['filename'] = None
results['ori_filename'] = None
img = mmcv.imread(results['img'])
results['img'] = img
results['img_fields'] = ['img']
results['img_shape'] = img.shape
results['ori_shape'] = img.shape
return results
test_pipeline = [LoadImage()] + cfg.data.test.pipeline[1:], поскольку LoadImage() не является dict или вызываемым, я столкнулся с проблемой в Compose.py, которая заключается в следующем
import collections
из mmcv.utils import build_from_cfg
from..builder import PIPELINES
@PIPELINES.register_module()class Compose(object): "" "Последовательное создание нескольких преобразований.
Args:
transforms (Sequence[dict | callable]): Sequence of transform object or
config dict to be composed.
"""
def __init__(self, transforms):
assert isinstance(transforms, collections.abc.Sequence)
self.transforms = []
for transform in transforms:
if isinstance(transform, dict):
transform = build_from_cfg(transform, PIPELINES)
self.transforms.append(transform)
elif callable(transform):
self.transforms.append(transform)
----->else:
raise TypeError('transform must be callable or a dict')
def __call__(self, data):
"""Call function to apply transforms sequentially.
Args:
data (dict): A result dict contains the data to transform.
Returns:
dict: Transformed data.
"""
for t in self.transforms:
data = t(data)
if data is None:
return None
return data
def __repr__(self):
format_string = self.__class__.__name__ + '('
for t in self.transforms:
format_string += '\n'
format_string += f' {t}'
format_string += '\n)'
return format_string
Он переходит в другую часть напрямую из-за LoadImage(). Я уверен, что это из-за функции LoadImage(), но мне нужны сведения о том, как исправить проблему аргумента результатов для вызова def в классе LoadImage.