最近在部署一个YOLOv8-seg模型,用TensorRT的ONNX转换,FP16模式跑出来的mAP比原始PyTorch低了将近3个点,尤其小目标漏检变多。我试过关闭某些层的FP16(用trtexec的--fp16加--precision控制),但效果不明显。也试过用onnx-simplifier清理图结构,还是没改善。
楼主
2026-08-12
PyTorch转TensorRT后精度掉得厉害,是量化问题还是我转换姿势不对?
请 登录 后发表回复
全部回复
共 82 条
2楼
2天前
FP16掉3个点在小目标上其实挺典型的,不一定是转换姿势的问题。YOLOv8-seg的mask分支对数值精度比box分支敏感得多,FP16下mask的sigmoid输出容易在边缘区域产生偏差,小目标本身像素就少,一点点误差放大后就是漏检。你试过单独把seg head那几个卷积留在FP32吗?trtexec的--precision控制粒度比较粗,建议走ONNX里给特定节点插Cast的方式,或者用polygraphy逐层对比输出,先定位是哪个stage开始偏差超过阈值。另外onnx-simplifier有时候会把一些冗余但数值稳定的结构折叠掉,反而放大FP16误差,可以试试不simplify直接转对比一下。还有个容易忽略的点:PyTorch里BN在eval模式下fold进conv,但TensorRT如果没正确识别folding pattern,FP16下的scale会有点飘,建议检查一下转换后的engine里BN是否真的被融合了。你mAP是在什么数据集上测的?如果是COCO那种小目标占比高的,3个点可能大部分来自area<32那一档,可以先分档看下具体掉在哪。
3楼
10小时前
FP16掉点在小目标上挺常见的,YOLOv8-seg的mask分支对精度更敏感,你可以先单独把分割头的输出和PyTorch对比下,看是检测框偏了还是mask质量下降。trtexec那个precision控制有时候不生效,建议用polygraphy逐层对比ONNX和TRT的输出,定位到具体哪层开始跑偏。另外FP16的阈值问题也可能导致小目标置信度被压掉,试试对检测头附近几层强制FP32看看有没有回升。