如何加载一个ONNX文件并使用它在PyTorch中进行ML预测?

brgchamk  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(217)

下面是源代码,我用它加载一个.pth文件并做一个多类图像分类预测。

model = Classifier()    # The Model Class.
model.load_state_dict(torch.load('<PTH-FILE-HERE>.pth'))
model = model.to(device)
model.eval()
# prediction function to test images
def predict(img_path):
    image = Image.open(img_path)
    resize = transforms.Compose(
                    [ transforms.Resize((256,256)), transforms.ToTensor()])             
    image = resize(image)
    image = image.to(device)
    y_result = model(image.unsqueeze(0))
    result_idx = y_result.argmax(dim=1)
    print(result_idx)

我使用torch.onnx.export.pth文件转换为ONNX文件。
现在,我怎样才能写一个预测脚本类似于上面的一个单独使用ONNX文件,而不使用.pth文件。?有可能这样做吗?

w8f9ii69

w8f9ii691#

您可以使用ONNX运行时。

# !pip install onnx onnxruntime-gpu 
import onnx, onnxruntime

model_name = 'model.onnx'
onnx_model = onnx.load(model_name)
onnx.checker.check_model(onnx_model)

image = Image.open(img_path)
resize = transforms.Compose(
                [ transforms.Resize((256,256)), transforms.ToTensor()])             
image = resize(image)
image = image.unsqueeze(0) # add fake batch dimension
image = image.to(device)

EP_list = ['CUDAExecutionProvider', 'CPUExecutionProvider']

ort_session = onnxruntime.InferenceSession(model_name, providers=EP_list)

def to_numpy(tensor):
      return tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy()

# compute ONNX Runtime output prediction
ort_inputs = {ort_session.get_inputs()[0].name: to_numpy(image)}
ort_outs = ort_session.run(None, ort_inputs)

max = float('-inf')
max_index = -1
for i in range(0, len(ort_outs[0][0])):       
   if(ort_outs[0][0][i] > max):    
       max = ort_outs[0][0][i]
       max_index = i
print(max_index)

您可以按照tutorial了解详细说明。
通常,使用onnx的目的是在不同的框架中加载模型并运行推理,例如PyTorch -〉ONNX -〉TensorRT。

相关问题