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.

0 ответов

Другие вопросы по тегам