yolov5 onnx推理报错

运行yolov5推理onnx文件时报错:

onnxruntime.capi.onnxruntime_pybind11_state.InvalidArgument: [ONNXRuntimeError] : 2 : INVALID_ARGUMENT : Got invalid dimensions for input: images for the following indices
 index: 0 Got: 1 Expected: 16
 Please fix either the inputs or the model.

onnxruntime运行出错:

        预期获取16,实际获取1

yolov5 .pt文件转.onnx文件

解决方案:

        yolov5中export.py导出.onnx文件

  parser.add_argument('--include',

将输出模型改为ONNX即可运行export.py自动导出文件

### YOLOv5 ONNX推理报错解决方案 YOLOv5在进行ONNX推理时可能会遇到`onnxruntime.capi.onnxruntime_pybind11_state.InvalidArgument`错误,提示输入维度不匹配。具体表现为模型期望的输入尺寸与实际提供的输入尺寸不符[^1]。 #### 错误分析 该错误的核心在于模型定义中的输入张量形状与实际传入的数据形状存在差异。例如,在某些情况下,模型可能被配置为接受批量大小为16的输入数据,而推理过程中仅提供了一个样本作为输入(即批量大小为1)。这种不一致会引发上述错误。 #### 解决方法 以下是几种常见的解决策略: 1. **调整模型输入形状** 修改导出ONNX模型时指定的输入形状参数,使其更灵活地支持动态批量处理或单样本推理。可以通过设置`dynamic_axes`来实现这一点。例如: ```python import torch from models.experimental import attempt_load # 加载YOLOv5模型 model = attempt_load('yolov5s.pt', map_location=torch.device('cpu')) # 导出ONNX模型并启用动态轴 dummy_input = torch.zeros(1, 3, 640, 640) # 输入张量 (batch_size=1, channels=3, height=640, width=640) torch.onnx.export( model, dummy_input, "yolov5s_dynamic.onnx", opset_version=12, do_constant_folding=True, input_names=['images'], output_names=['output'], dynamic_axes={'images': {0: 'batch_size'}, # 动态批量大小 'output': {0: 'batch_size'}} ) ``` 2. **验证ONNX模型结构** 使用工具如`netron`可视化ONNX模型,确认其输入节点的确切名称和预期形状是否正确。如果发现模型输入层硬编码了特定批次大小,则需重新训练或转换模型以适应不同需求。 3. **修改推理脚本** 如果无法更改已有的ONNX文件,可以尝试调整推理代码中传递给模型的数据形式。比如将单一图片扩展成符合要求的多维数组后再送入网络计算。 ```python import numpy as np image = ... # 原始图像读取操作省略 resized_image = cv2.resize(image, (640, 640)) / 255.0 # 调整分辨率至640x640并归一化像素值范围到[0,1] # 构造满足批处理规格的四维Tensor batched_data = np.expand_dims(resized_image.transpose((2, 0, 1)), axis=0).astype(np.float32) session.run(["output"], {"images": batched_data}) ``` 通过以上措施之一或者组合应用它们通常能够有效缓解乃至彻底消除此类异常状况的发生概率。 ```python import onnxruntime as ort session = ort.InferenceSession("yolov5s_dynamic.onnx", providers=["CPUExecutionProvider"]) input_name = session.get_inputs()[0].name print(f"Input name: '{input_name}'") # 应打印出'images' ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值