Получение результатов 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 из ограничивающего поколения целевого поколения.