bubbliiiing / segformer-pytorch

这是一个segformer-pytorch的源码,可以用于训练自己的模型。
MIT License
282 stars 36 forks source link

如何导出ScriptModule? #7

Open lindadamama opened 1 year ago

lindadamama commented 1 year ago

调用torch.jit.script(self.net).save("model.pt"),程序一直报错TypeError: cannot create weak reference to 'numpy.ufunc' object 调用toch.jit.trace(self.net,torch.rand(1,3,256,320)).save("model.pt")可以正常导出模型,但是测试结果和原来的模型(self.net)不一致 捕获 左边是直接预测的,右边是用toch.jit.trace(self.net,torch.rand(1,3,256,320)).save("model.pt")导出的模型预测的

bubbliiiing commented 1 year ago

什么意思那,右边看起来似乎没有和原图进行blend呀

lindadamama commented 1 year ago

如上图:左边是python直接加载模型,预测的结果,右边是调用toch.jit.trace导出的模型在c#平台上预测的结果 这个文档上说这种方法导出的模型,可以在c#平台或者c++平台上直接部署 https://github.com/dotnet/TorchSharp/wiki/TorchScript https://pytorch.org/docs/stable/jit.html torch.jit.trace与torch.jit.script的区别,这两种方法导出的模型是有差异的,没想到差异会这么大 https://cloud.tencent.com/developer/article/2067810

bubbliiiing commented 1 year ago

一个是静态的一个是动态的,差别是很大 但是我不理解的是,右图看起来都没做混合呀,你咋判断的呢

lindadamama commented 1 year ago

我没有进行混合,识别出区域后用opencv画的区域轮廓,因为混合后会覆盖原图,看不出是否识别准确

bubbliiiing commented 1 year ago

哦哦哦理解了看出来了 你的输入图片一样大吗

lindadamama commented 1 year ago

是同一张图片

lindadamama commented 1 year ago

导出onnx好像也不行,完全找不到区域

bubbliiiing commented 1 year ago

归一化啥的一样?

lindadamama commented 1 year ago

一样的,我测试了您的deeplabV3plus,完全没问题,不过对比了一下准确度,和训练时间,发现segformer收敛速度更快,准确度更高,但是导出的模型一直有问题,deeplabV3plus的c#输出和python输出基本一致

bubbliiiing commented 1 year ago

难道是因为segformer是self attention的问题吗

bubbliiiing commented 1 year ago

onnx都错的话,会不会是导出代码写错了

lindadamama commented 1 year ago

那就不清楚了,我尝试替换了Sgeformer里面的for循环和判断语句,问题依然没有解决

lindadamama commented 1 year ago

我这边对backbones进行了修改,导出的模型还是不正常, backbone.zip

bubbliiiing commented 1 year ago

我点开看看 主要trace是静态的,不应该出问题

lindadamama commented 1 year ago

那有可能是我用的Torchsharp解析模型的问题,但是deeplabV3Plus又没问题,有点想不通了

bubbliiiing commented 1 year ago

这个看不出问题,可能要看导出的代码

lindadamama commented 1 year ago
123

我是这样导出的,担心随机生成的Tensor会出问题,特意加载了一张图片运行,结果还是一样的,python和c#输出结果不一样