Получение результатов Nan из магистрали ResNet101 с изображениями Kitti

Я использую следующее:

  • CUDA 10.0
  • PyTorch 1.2
  • https://github.com/ruotianluo/pytorch-faster-rcnn
  • Набор веса для тестирования не совпадает с набором веса для тренировок.
  • Тренировочный набор веса из предтренированного Cafe ResNet101 позвоночника

Я взял этот репо и преобразовал его, чтобы использовать данные Китти. При этом я добавил новый класс Kitti в наборы данных и сделал необходимое преобразование. И тестирование, и оценка работают со следующим набором классов из POSCAL VOC:

self._classes = (
    '__background__',  # always index 0
    'aeroplane',
    'bicycle',
    'bird',
    'boat',
    'bottle',
    'bus',
    'car',
    'cat',
    'chair',
    'cow',
    'diningtable',
    'dog',
    'horse',
    'motorbike',
    'person',
    'pottedplant',
    'sheep',
    'sofa',
    'train',
    'tvmonitor')

Я изменил набор классов:

self._classes = (
    'dontcare',  # always index 0
    'pedestrian',
    'car',
    'truck',
    'cyclist')

#-----------------------------
N.B.: Classes should NOT matter here, as the result out of the backbone is simply a featureset, not a classification
#-----------------------------

На случайных, казалось бы, изображениях (извлечение этих "проблемных" изображений из обучающего набора, по-видимому, меняет образ, на котором происходит сбой программы), обучающий код, по-видимому, создает NaN из сети региональных предложений. Я немного застрял в том, почему.

  • Попробовал изменить нормализацию на специфичные для Китти значения нормализации
  • Попробовал изменить размер изображения до 224x224
  • Попытка деления нормализованных чисел на усредненное стандартное отклонение

    -----------------

    Определение сети

    -----------------

    self.conv1 = conv3x3 (в плоскостях, плоскостях, шагах) self.bn1 = norm_layer(плоскости) self.relu = nn.ReLU(inplace=True) self.conv2 = conv3x3(плоскости, плоскости) self.bn2 = norm_layer(плоскости) self.downsample = downsample self.stride = stride

    self._layers ['head'] = nn.Sequential (self.resnet.conv1, self.resnet.bn1, self.resnet.relu, self.resnet.maxpool, self.resnet.layer1, self.resnet.layer2, self.resnet.layer3)

    self.rpn_net = nn.Conv2d (self._net_conv_channels, cfg.RPN_CHANNELS, [3, 3], padding = 1)

    -----------------

    Подготовка изображения

    -----------------

    self._image = torch.from_numpy (image.transpose ([0, 3, 1, 2])). to (self._device) self.net.train_step (blobs, self.optimizer)

    -----------------

    Компьютерная графика

    -----------------

    (1) self.forward (blob ['data'], blobs ['im_info'], blobs ['gt_boxes']) (2) rois, cls_prob, bbox_pred = self._predict () (3) net_conv = self._image_to_head () (4) net_conv = self._layers'head '(5) rpn = F.relu (self.rpn_net (net_conv))

    -------------------

    Полезные функции для решения проблемы

    -------------------

    def conv3x3 (in_planes, out_planes, stride = 1, groups = 1, dilation = 1): "" "Свертка 3x3 с отступом""" return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stepde, padding = дилатация, группы = группы, смещение = ложь, расширение = расширение)

    def conv1x1 (in_planes, out_planes, stride = 1): "" "свертка 1x1""" return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stepde, bias=False)

Я не знаю, почему это происходит, но, очевидно, я ожидаю реальных цифр от магистрали ResNet101. Возможно, придется переключиться на vgg16.

ВЫХОД (3)

tensor([[[[nan, nan, nan,  ..., nan, nan, nan],
[nan, nan, nan,  ..., nan, nan, nan],
[nan, nan, nan,  ..., nan, nan, nan],
...,
[nan, nan, nan,  ..., nan, nan, nan],
[nan, nan, nan,  ..., nan, nan, nan],
[nan, nan, nan,  ..., nan, nan, nan]],

...,

[[nan, nan, nan,  ..., nan, nan, nan],
[nan, nan, nan,  ..., nan, nan, nan],
[nan, nan, nan,  ..., nan, nan, nan],
...,
[nan, nan, nan,  ..., nan, nan, nan],
[nan, nan, nan,  ..., nan, nan, nan],
[nan, nan, nan,  ..., nan, nan, nan]],

[[nan, nan, nan,  ..., nan, nan, nan],
[nan, nan, nan,  ..., nan, nan, nan],
[nan, nan, nan,  ..., nan, nan, nan],
...,
[nan, nan, nan,  ..., nan, nan, nan],
[nan, nan, nan,  ..., nan, nan, nan],
[nan, nan, nan,  ..., nan, nan, nan]]]], device='cuda:0'

У кого-нибудь есть представление о том, что здесь происходит?

1 ответ

Решил это. VOC Pascal (исходный набор данных, используемый с этим репозиторием GitHub) имеет значение индекса начала расположения пикселей 1[от 1 до ymax], где у Kitti пиксели начинаются с 0[0 до ymax-1].

Необходимо удалить -1 из ограничивающего поколения целевого поколения.

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