对象检测模型(PyTorch)到ONNX:ONNX推理的空输出

对象检测模型(PyTorch)到ONNX:ONNX推理的空输出,pytorch,faster-rcnn,onnx,Pytorch,Faster Rcnn,Onnx,我尝试将我的PyTorch对象检测模型(更快的R-CNN)转换为ONNX。我有两种设置。第一个工作正常,但出于部署原因,我想使用第二个。区别在于我用于导出函数torch.onnx.export()的示例图像 在第一个设置中,我使用真实图像作为ONNX导出的输入。但是在一个官方网站上,他们说我可以使用一个虚拟输入,它应该与模型期望的输入大小相同。所以我创建了一个形状相同但随机值的张量。两种设置中的导出都正常工作。但是,第二个设置在使用ONNX运行时进行推断之后并没有提供所需的结果。下面可以找到代码

我尝试将我的PyTorch对象检测模型(更快的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)]
[array([], shape=(0, 4), dtype=float32),
array([], dtype=int64),
array([], 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([[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)]
[array([], shape=(0, 4), dtype=float32),
array([], dtype=int64),
array([], dtype=float32)]
它只是一个空数组


第二个设置有什么问题?我是新来的。导出将运行模型。我是否必须提供一个模型也能识别对象的输入,因此带有随机值的虚拟输入不起作用?语句“只要类型和大小正确,其中的值可以是随机的。”仅对提供的教程有效吗?

在第二个设置中,您有一个随机张量,因此没有选择具有足够高检测分数的边界框。检查您是否有可检测对象的图像作为输入


我假设关于随机输入的短语在大多数情况下(分类、分段等)是正确的,但检测模型使用非最大抑制和低分数抑制检测。

在第二个设置中,您有一个随机张量,因此没有选择检测分数足够高的边界框。检查您是否有可检测对象的图像作为输入


我假设关于随机输入的短语在大多数情况下(分类、分段等)都是正确的,但检测模型使用的是非最大值抑制和低分数抑制检测。

但是ONNX对导出做了什么?我只是使用函数torch.onnx.export()的随机输入。导出之后,我使用ONNX运行时和一个真实的映像运行我的ONNX模型,得到空输出。那么导出在内部对模型做了什么呢?抱歉,我没有注意到您使用相同的图像运行。我不确定您的情况,但是如果您在不同于用于导出的映像上运行第一个安装程序,输出是否会更改?但是ONNX对导出做什么?我只是使用函数torch.onnx.export()的随机输入。导出之后,我使用ONNX运行时和一个真实的映像运行我的ONNX模型,得到空输出。那么导出在内部对模型做了什么呢?抱歉,我没有注意到您使用相同的图像运行。我不确定您的情况,但是如果您在不同于用于导出的映像上运行第一个设置,输出是否会更改?