使用yolov9源码自带export.py函数将pt转为onnx和engine。在写部署代码时,发现使用python写推理代码,无论是fp32还是fp16的engine,最后结果都可以正常输出,但是在使用c++写同样的推理代码时发现使用fp32的engine作为引擎,推理结果正常。而使用fp16的engine作为推理引擎时,输出结果全为nan和0值。已知的是TensorRT版本一致。c++上fp32的engine正常输出,说明代码中预处理没问题,问题肯定就出在转出的engine上。
基于上述问题,我尝试以下几种方式:(1) 使用开源的基于yolov9的c++版推理代码,进行测试,发现结果认为nan值;(2) 使用预训练模型转为fp16-engine进行推理,发现结果仍为nan;(3) 尝试换用trtexec命令直接转fp16-engine,发现结果认为nan;(4) 最后我发现在使用export.py转onnx和engine时,因为要转为fp6格式,故参数里设置half为True,它会先将加载的pt模型截断到fp16范围内,再进行后续操作。这让我想起之前在转其他模型时这个地方同样出过错,故这里使用export.py转onnx,并将half设为False。转为onnx后再使用trtexec转为fp16范围内的engine。再次推理发现,结果正常输出。
问题是解决了,但是我目前还不知道为什么,有知道的友友吗?