关于torch.jit.trace在yolov8中出现的问题
疑问:
1)为什么yolov8不能直接torch.jit.trace,需要经过图像检测后才能,且检测后self.net发生变化;而2中的第一版yolov5可以直接torch.jit.trace
2)3中的第二版yolov5初始不能直接torch.jit.trace,用了两种方式后,都能了,但两种方式却不是相同的,那他们哪一点共同点,导致都能转模型了呢
1.yolov8
self.net
此时,直接torch.jit.trace会报错
torch.jit.trace(self.net, torch.rand((1, 3, 640, 640)), strict=False)
但增加一步检测图片后,可以实现
self.net(torch.rand((1, 3, 640, 640)))
torch.jit.trace(self.net, torch.rand((1, 3, 640, 640)), strict=False)
此时的self.net发生变化,如shape从none变为torch.size([1,128,80,80])
2.对比yolov5
self.net
此时,直接torch.jit.trace不会报错
torch.jit.trace(self.net, torch.rand((1, 3, 640, 640)), strict=False)
先增加一步检测图片,在看self.net,无变化
3.对比另一版yolov5的export
直接torch.jit.trace(model, img)会报错
torch.jit.trace(model, img)
此时的model
1)运行一步
model.model[-1].export = True # set Detect() layer export=True
之后就可以torch.jit.trace
此时的model.model[-1]中的export有False变为True
2)或者增加一步检测
model(img)
接着torch.jit.trace成功
但此时model.model[-1]中的export还是False