【bug】解决yolov5模型转换后,模型推理结果不一致问题

博客探讨了在将YOLOv5模型从PT转换为ONNX格式时遇到的推理结果不一致问题。作者指出,问题源于数据预处理中的resize操作和padding方式差异。解决方案是在detect.py脚本中固定特定参数以保持一致性。通过调整预处理步骤,可以确保转换后的模型输出与原始PT模型保持一致。
摘要由CSDN通过智能技术生成

yolov5模型转换问题随笔

pt转onnx出现推理结果不一致问题

因为yolov5提供了很便捷的模型转换流程,所以很多时候使用者并没有测试转换后的模型是否与原模型输出结果一致,导致有时使用效果与训练效果相差很大,给后续使用带来很多不便与隐患。

对于一些尺寸不是很“规范”的图片,输出结果会出现bbox位置有些许偏差,且score相差的可能会非常大。
举例我训练的一个模型,对同一张图pt模型输出结果:

0 0.505093 0.513194 0.980556 0.973611 0.788908

转onnx后输出结果:

0 0.510185 0.513542 0.97963 0.972917 0.738651

另一张图,pt模型输出结果:

0 0.0636364 0.506814 0.113636 0.076661 0.819145

onnx模型数据结果:

0 0.0715909 0.506814 0.0931818 0.0732538 0.922734

这评分结果相差的就很大了,但是bbox不是很明显,更增加了问题暴露发现的难度。

仔细观察推理代码不难发现,问题出在数据预处理上面,因为pt模型和其他格式的模型,在resize时的padding方式是不同的,所以导致模型输出结果有问题。
那么解决方式也很简单,只需在detect.py脚本中,图片变换前插入固定参数值即可:

    stride, names, pt = model.stride, model.names, model.pt
    imgsz = check_img_size(imgsz, s=stride)  # check image size
    pt=True # pt参数在处理图片时会影响padding规则,所以锁死则不会出现偏差
    stride=32		# 别问,问就是天意
    # Dataloader
    if webcam:
        view_img = check_imshow()
        cudnn.benchmark = True  # set True to speed up constant image size inference
        dataset = LoadStreams(source, img_size=imgsz, stride=stride, auto=pt)
        bs = len(dataset)  # batch_size
    else:
        dataset = LoadImages(source, img_size=imgsz, stride=stride, auto=pt)
        bs = 1  # batch_size
    vid_path, vid_writer = [None] * bs, [None] * bs
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值