问题描述
该报错来自tensorrt官方给的例子:yolov3_onnx。
按照README.md
指引,运行python2 yolov3_to_onnx.py
成功,但运行python3 onnx_to_tensorrt.py
时报如下错误:
xiaor@xiaor-desktop:/usr/src/tensorrt/samples/python/yolov3_onnx$ sudo python3 onnx_to_tensorrt.py
Reading engine from file yolov3.trt
Running inference on image dog.jpg...
Traceback (most recent call last):
File "onnx_to_tensorrt.py", line 179, in <module>
main()
File "onnx_to_tensorrt.py", line 156, in main
trt_outputs = common.do_inference(context, bindings=bindings, inputs=inputs, outputs=outputs, stream=stream)
File "/usr/src/tensorrt/samples/python/yolov3_onnx/../common.py", line 143, in do_inference
[cuda.memcpy_htod_async(inp.device, inp.host, stream) for inp in inputs]
File "/usr/src/tensorrt/samples/python/yolov3_onnx/../common.py", line 143, in <listcomp>
[cuda.memcpy_htod_async(inp.device, inp.host, stream) for inp in inputs]
pycuda._driver.LogicError: cuMemcpyHtoDAsync failed: invalid argument
解决过程
网上很多文章(比如这篇)给出的原因是:
tensorrt推理引擎输入推理数据的维度不对,请仔细检查输入数据的类型和维度信息是否正确!!!
但对新手如我并不太友好,怎么检查?类型和维度信息具体指什么?这些都没清楚。一个月过去了,我三天打鱼两天晒网地去学了一些相关的内容,再次尝试解决这个问题,算是成功了吧(至少不报这个错了)。
解决方法
在yolov3_to_onnx.py
这份文件里会需要下载一份名为yolov3.cfg
的文件,估计链接被墙了我是自己找资源下载了放到文件夹下的。打开这个.cfg文件,看看输入的长宽数据(大概在第8、9行的样子),我的是320×320(不出意外大家的应该都一样)。
再打开onnx_to_tensorrt.py
,找到input_resolution_yolov3_HW
这个参数定义,原本是(608,608)(忘记是不是自己一个月前乱改的了,反正不是这个数也你不用慌hhhhh) ,我把它改成和我cfg文件一致的(320,320).
再次运行python3 onnx_to_tensorrt.py
,这一行不报错啦~ 虽然后面还有错误,一步步来吧害= =
更新于半小时后,小伙伴们我太激动了啊啊啊啊!上面那张图片的错误也解决了,运行成功!原地起飞!!!需要出这个reshape错误的解决方法的可以私聊我或者评论~ (感觉我这么一会儿就能解决的话大家也可以解决的亚子)