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

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

На самом деле я создал свой собственный экстрактор функций, который принимает изображение в качестве входных данных и выводит карту функций (в основном система кодировщика-декодера, где конечный результат декодера совпадает с размером изображения и имеет 3 канала). Теперь я хочу передать эту карту функций в качестве входных данных в модель FasterRCNN для обнаружения вместо исходного изображения. Я использую следующий код для добавления карты функций (используя RTFNet для создания карты функций - код на этом ссылка) в верхней части модуля обнаружения 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)

ошибки нет и все работает нормально

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


person Jitesh Malipeddi    schedule 03.03.2020    source источник


Ответы (1)


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

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

person ccl    schedule 04.03.2020
comment
Хорошо, но как и где мне пройти мимо мишеней? - person Jitesh Malipeddi; 04.03.2020
comment
Подумайте об этом, предсказания модели никогда не зависят от реальных аннотаций. Следовательно, цели передаются только при оценке точности прогнозов и передаются в вашу функцию потерь. - person ccl; 04.03.2020
comment
Да, это определенно имеет смысл. Спасибо за разъяснения. Однако, когда я передаю только изображение, а не метки обучения, я получаю ошибку значения, в которой говорится, что цели должны быть переданы во время обучения. ValueError: в режиме обучения цели должны передаваться. Вся трассировка находится по адресу ссылка. Какое-либо обходное решение для этого? - person Jitesh Malipeddi; 04.03.2020
comment
Кажется, у меня нет доступа к ссылке? - person ccl; 04.03.2020
comment
colab.research.google.com/drive/ - person Jitesh Malipeddi; 04.03.2020
comment
Извините за это, я отправил обновленную ссылку в приведенном выше комментарии. Ошибка находится во второй последней ячейке - person Jitesh Malipeddi; 04.03.2020
comment
Я думаю, это потому, что вы используете две модели: RTFNet и предварительно обученную модель fast-rcnn. Первый принимает 2 входных аргумента, а второй - 3. - person ccl; 04.03.2020
comment
Да, я подумал, что это была проблема после того, как вы опубликовали ответ. Есть идеи, как это решить? - person Jitesh Malipeddi; 04.03.2020
comment
Вы можете разрешить передачу целевого аргумента в RTFNet, но не выполнять с ним операции, для легкого исправления. - person ccl; 04.03.2020
comment
Я пробовал то, что вы сказали, но получаю еще одну ошибку (о том, что объект списка не может быть вызван) при передаче целей. Вот ссылка. - person Jitesh Malipeddi; 04.03.2020
comment
Вы также должны изменить некоторый соответствующий код в RTFNet ... Это очень тривиально, вам просто нужно переопределить изображения из списка в 1 переменную, используя что-то вроде self.images, self.targets = input. Это просто общий код, вам придется настроить его в соответствии с вашей программой. - person ccl; 04.03.2020