Модель обнаружения объекта (PyTorch) для ONNX: пустой вывод с помощью вывода ONNX - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь преобразовать мою модель обнаружения объектов PyTorch (Faster R-CNN) в ONNX. У меня есть две установки. Первый работает правильно, но я хочу использовать второй по причинам развертывания. Разница заключается в примере изображения, которое я использую для экспорта функции torch.onnx.export () .

В первой настройке я использую реальное изображение в качестве входных данных для ONNX. экспорт. Но в официальном учебнике говорится, что я могу использовать фиктивный ввод, который должен иметь тот же размер, что и модель, ожидающая ввода. Поэтому я создал тензор с той же формой, но со случайными значениями. Экспорт в обеих настройках работает правильно. Но вторая установка не дает желаемых результатов после вывода из среды выполнения ONNX. Код и примерный вывод можно найти ниже.

Настройка 1

model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained = True)
...
checkpoint = torch.load(model_state_dict_path)
model.load_state_dict(checkpoint['model_state_dict'])
model.eval()

to_tensor = transforms.ToTensor()
img_rgb = Image.open(image_path_model).convert('RGB')
img_rgb = to_tensor(img_rgb)
img_rgb.unsqueeze_(0)    

torch.onnx.export(model, img_rgb, "detection.onnx", opset_version=11) 

Я не получаю ошибки, и экспорт работает. После этого я запускаю модель со средой выполнения ONNX и получаю следующий вывод:

[array([[704.0696  , 535.19556 , 944.8986  , 786.1619  ],
         ...], dtype=float32),
array([2, 2, 2, 2, 2, 1, 1], dtype=int64),
array([0.9994363 , 0.9984769 , 0.99816966, ...], dtype=float32)]

Вывод такой, какой я ожидаю (ограничивающие рамки, классы объектов и вероятности).

Настройка 2

model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained = True)
...
checkpoint = torch.load(model_state_dict_path)
model.load_state_dict(checkpoint['model_state_dict'])
model.eval()

img_rgb = torch.randn(1, 3, 1024, 1024)   

torch.onnx.export(model, img_rgb, "detection.onnx", opset_version=11) 

Как и в настройке 1, я не получаю ошибки, и экспорт работает. После этого я запускаю модель со средой выполнения ONNX и тем же образом, что и в настройке 1, и получаю следующий вывод:

[array([], shape=(0, 4), dtype=float32),
array([], dtype=int64),
array([], dtype=float32)]

Это просто пустой массив.

Что не так со второй настройкой? Я новичок в ONNX. Экспорт запускает модель. Нужно ли предоставлять вход, на котором модель также распознает объекты, и поэтому фиктивный ввод со случайными значениями не работает? Является ли утверждение «Значения в этом поле могут быть случайными, если они имеют правильный тип и размер.» действительно только для предоставленного учебного пособия?

1 Ответ

0 голосов
/ 31 марта 2020

Во 2-й настройке у вас есть случайный тензор, поэтому не был выбран ограничивающий прямоугольник с достаточно высоким показателем обнаружения. Убедитесь, что у вас есть изображение с обнаруживаемыми объектами для ввода.

Я предполагаю, что фраза о случайных входах правильна в большинстве случаев (классификация, сегментация и т. Д. c.), Но модели обнаружения используют NonMaxSuppression и подавление обнаружений с низкими баллами.

...