pytorch 为什么当我使用不同格式的相同权重的模型时会得到不同的结果- \(.pt)\.onnx \(.bin,.xml)?

oalqel3c  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(139)

我有一个在YOLOv 5上训练的模型,工作得很好。
这是一个输入图像:x1c 0d1x
我可以在做一个推断后使用pytorch得到一个预期的结果:


的数据
这是一个输出图像:



问题是,我在Openvino中需要它,无论我使用.onnx或.bin和.xml(对于openvino)中的模型进行推理,我都不会得到预期的推理结果。
我得到的是一个形状为(1,25200,6)的向量。我知道:

  1. 25200等于1x 3x 80 x80 + 1x 3x 40 x40 + 1x 3x 20 x20;
  2. 6 = 1类+4(x,y,w,h)+1(score);
  3. batch_size = 1
    为了导出它,我使用:
!python export.py --data models/custom_yolov5s.yaml --weights /content/bucket_11_03_2022.pt --batch-size 1 --device cpu --include openvino --imgsz 640

字符串
我用两种方法来重现这个问题:
1..onnx:

import cv2
image = cv2.imread('data/cropped.png')

# Resize image to meet network expected input sizes
resized_image = cv2.resize(image, (640, 640))

# Reshape to network input shape
input_image = np.expand_dims(resized_image.transpose(2, 0, 1), 0)

import onnxruntime as onnxrt

onnx_session= onnxrt.InferenceSession("models/bucket_11_03_2022.onnx")
onnx_inputs= {onnx_session.get_inputs()[0].name:input_image.astype(np.float32)}
onnx_output = onnx_session.run(None, onnx_inputs)
img_label = onnx_output[0]
print(onnx_output[0].shape)

  1. Openvino:
import cv2
import matplotlib.pyplot as plt
import numpy as np
from openvino.inference_engine import IECore

ie = IECore()

net = ie.read_network(
    model="bucket_11_03_2022.xml",
    weights="bucket_11_03_2022.bin",
)
exec_net = ie.load_network(net, "CPU")

output_layer_ir = next(iter(exec_net.outputs))
input_layer_ir = next(iter(exec_net.input_info))

# Text detection models expects image in BGR format
image = cv2.imread("data/cropped.png")

# N,C,H,W = batch size, number of channels, height, width
N, C, H, W = net.input_info[input_layer_ir].tensor_desc.dims

# Resize image to meet network expected input sizes
resized_image = cv2.resize(image, (W, H))

# Reshape to network input shape
input_image = np.expand_dims(resized_image.transpose(2, 0, 1), 0)

plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB));

result = exec_net.infer(inputs={input_layer_ir: input_image})

result['output'].shape


你们能帮助我使用.onnx或IE格式(openvino - .bin,.xml)获得正确的推断(带有分数的边界框)吗?
模型文件是here

qc6wkl3g

qc6wkl3g1#

根据我的复制,这个问题的发生是由于从PyTorch到ONNX的错误转换。我发现从PyTorch模型转换的ONNX能够检测到对象(bucket),但没有反映正确的标签,因为它从coco128.yaml中获取了一个类名。
你可能需要按照Train Custom Data重新训练你的模型。但是我不能保证这个方法会成功,因为它没有经过OpenVINO的验证。
我建议你在ultralytics GitHub论坛上发布这个问题。供你参考,ultralytics不是OpenVINO Toolkit的一部分。

相关问题