从github上clone最新的yolov5代码,使用onnx推理时报错:
python detect.py --weights yolov5s.onnx
Loading yolov5s.onnx for ONNX Runtime inference...
Traceback (most recent call last):
File "/home/workspace/yolov5/yolov5/detect.py", line 425, in <module>
main(opt)
File "/home/workspace/yolov5/yolov5/detect.py", line 420, in main
run(**vars(opt))
File "/home/workspace/miniconda3/envs/yolov5/lib/python3.9/site-packages/torch/utils/_contextlib.py", line 115, in decorate_context
return func(*args, **kwargs)
File "/home/workspace/yolov5/yolov5/detect.py", line 182, in run
model.warmup(imgsz=(1 if pt or model.triton else bs, 3, *imgsz)) # warmup
File "/home/workspace/yolov5/yolov5/models/common.py", line 749, in warmup
self.forward(im) # warmup
File "/home/workspace/yolov5/yolov5/models/common.py", line 675, in forward
y = self.session.run(self.output_names, {self.session.get_inputs()[0].name: im})
File "/home/workspace/miniconda3/envs/yolov5/lib/python3.9/site-packages/onnxruntime/capi/onnxruntime_inference_collection.py", line 220, in run
return self._sess.run(output_names, input_feed, run_options)
onnxruntime.capi.onnxruntime_pybind11_state.InvalidArgument: [ONNXRuntimeError] : 2 : INVALID_ARGUMENT : Unexpected input data type. Actual: (tensor(float)) , expected: (tensor(float16))
仔细查看报错位置,定位在/models/common.py文件,在674行发现问题,没有将numpy转为float16,修改如下后解决问题
elif self.onnx: # ONNX Runtime
im = im.cpu().numpy().astype(np.float16) # torch to numpy,注意数据类型需要float16
y = self.session.run(self.output_names, {self.session.get_inputs()[0].name: im})