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