PyTorch FasterRCNN TypeError: forward () принимает 2 позиционных аргумента, но 3 были заданы - PullRequest
1 голос
/ 03 марта 2020

Я работаю над обнаружением объектов, и у меня есть набор данных, содержащий изображения и соответствующие им ограничивающие рамки (значения истинности).

На самом деле я построил свой собственный экстрактор объектов, который принимает изображение в качестве входных и выходных данных. карта характеристик (в основном система кодер-декодер, где конечный выход декодера такой же, как размер изображения и имеет 3 канала). Теперь я хочу передать эту карту объектов в качестве входных данных для модели FasterRCNN для обнаружения вместо исходного изображения. Я использую следующий код для добавления карты объектов (используя RT FNet для создания карты объектов - код по этой ссылке ) поверх модуля обнаружения FRCNN

frcnn_model = fasterrcnn_resnet50_fpn(pretrained=True)
in_features = frcnn_model.roi_heads.box_predictor.cls_score.in_features
frcnn_model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)
fpn_block = frcnn_model.backbone.fpn
rpn_block = frcnn_model.rpn

backbone = RTFNet(num_classes) RTFNet is a feature extractor taking as input, an image having 4 channels(fused RGB and thermal image) , 
model = nn.Sequential(backbone, nn.ReLU(inplace=True))
model = nn.Sequential(model,fpn_block)
model = nn.Sequential(model,rpn_block)
model = nn.Sequential(model,FastRCNNPredictor(in_features, num_classes))

Я просто пытаюсь проверить и проверить, работает ли он, используя следующий код, который генерирует случайные изображения и ограничивающие рамки

images, boxes = torch.rand(1, 4, 512, 640), torch.rand(4, 11, 4)
labels = torch.randint(1, num_classes, (4, 11))
images = list(image for image in images)
targets = []
for i in range(len(images)):
  d = {}
  d['boxes'] = boxes[i]
  d['labels'] = labels[i]
  targets.append(d)
output = model(images, targets)

Запуск этого дает мне следующую ошибку

TypeError                                 Traceback (most recent call last)
<ipython-input-22-2637b8c27ad2> in <module>()
----> 1 output = model(images, targets)

/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
    530             result = self._slow_forward(*input, **kwargs)
    531         else:
--> 532             result = self.forward(*input, **kwargs)
    533         for hook in self._forward_hooks.values():
    534             hook_result = hook(self, input, result)

TypeError: forward() takes 2 positional arguments but 3 were given

Однако, когда Я заменяю свою модель обычной моделью FasterRCNN следующим образом:

model = fasterrcnn_resnet50_fpn(pretrained=True)
in_features = model.roi_heads.box_predictor.cls_score.in_features
model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)

ошибки нет, и она отлично работает

Может кто-нибудь сообщить мне, где я иду не так? Заранее спасибо

1 Ответ

1 голос
/ 04 марта 2020

Это связано с тем, что в модели должны передаваться только входные данные изображений, а не изображения и целевые объекты. Так что вместо output = model(images, targets) вы можете сделать output = model(images).

. Что касается того, почему в сообщении об ошибке говорится о предоставлении трех позиционных аргументов, то это потому, что forward инициируется с ключевым словом self по умолчанию, которое представляет экземпляр класса. Таким образом, в дополнение к self, вы должны дать только еще 1 аргумент, который будет входным изображением.

...