inisis / brocolli

Everything in Torch Fx
MIT License
341 stars 63 forks source link

(Occurred when translating upsample_bilinear2d). #43

Closed hlcool closed 2 years ago

hlcool commented 2 years ago

hello,使用的是你提供的docker环境, 需要转换的模型是语义分割任务,上采样时使用的是:self.upsample = nn.Upsample(scale_factor=scale_factor, mode="bilinear", align_corners=False)。 在转caffe时使用下面的代码调用的你接口: runner = Runner("parsing_net", model, [1, 3, 480, 640], 13, fuse=True) runner.pyotrch_inference() runner.convert() runner.caffe_inference() runner.check_result()

会报下面的错误,是不是不支持双线性插值上采样呢? 1648814476(1)

inisis commented 2 years ago

你好,把opset改成9应该就可以了

inisis commented 2 years ago

hello,使用的是你提供的docker环境, 需要转换的模型是语义分割任务,上采样时使用的是:self.upsample = nn.Upsample(scale_factor=scale_factor, mode="bilinear", align_corners=False)。 在转caffe时使用下面的代码调用的你接口: runner = Runner("parsing_net", model, [1, 3, 480, 640], 13, fuse=True) runner.pyotrch_inference() runner.convert() runner.caffe_inference() runner.check_result()

会报下面的错误,是不是不支持双线性插值上采样呢? 1648814476(1)

不好意思,我确认了下,这个问题是个bug,你需要更新到最新版本的镜像即可。

hlcool commented 2 years ago

hello,最新版的镜像是不是还没有更新呢?我看dockerhub上面还是Last pushed 12 days ago by yaphets4desmond

inisis commented 2 years ago

hello,最新版的镜像是不是还没有更新呢?我看dockerhub上面还是Last pushed 12 days ago by yaphets4desmond

非常抱歉,最新版本已经推上过去了。谢谢指正。

hlcool commented 2 years ago

更新到最新镜像后可以顺利转换模型了,非常感谢。 但是还存在一个问题哦 pytorch里面的上采样层nn.Upsample(scale_factor=scale_factor, mode="bilinear", align_corners=False),当指定mode="bilinear"时使用的是双线性插值进行上采样,在导出onnx模型的过程中,当设置op_set version>=11时,其对应onnx里的op是resize,再对应到caffe里面应该是BilinearInterpolate,而不是Upsample,因为我看镜像caffe里面的upsample_layer.hpp实现的是最邻近插值,双线性插值的实现在bilinear_interpolate_layer.hpp里面。 因此如果nn.Upsample(scale_factor=scale_factor, mode="bilinear", align_corners=False)对应caffe的Upsample层时会出现结果不一致的问题。

inisis commented 2 years ago

更新到最新镜像后可以顺利转换模型了,非常感谢。

但是还存在一个问题哦

pytorch里面的上采样层nn.Upsample(scale_factor=scale_factor, mode="bilinear", align_corners=False),当指定mode="bilinear"时使用的是双线性插值进行上采样,在导出onnx模型的过程中,当设置op_set version>=11时,其对应onnx里的op是resize,再对应到caffe里面应该是BilinearInterpolate,而不是Upsample,因为我看镜像caffe里面的upsample_layer.hpp实现的是最邻近插值,双线性插值的实现在bilinear_interpolate_layer.hpp里面。

因此如果nn.Upsample(scale_factor=scale_factor, mode="bilinear", align_corners=False)对应caffe的Upsample层时会出现结果不一致的问题。

感谢你的仔细分析,如果想转成bilinear interpolate的话,需要把opset设置成9,如何在opset为13的时候也转成bilinear interpolate 这个我看下怎么解决。 如果你有好的想法也可以提pr。

hlcool commented 2 years ago

嗯嗯,是的,把opset设置成9,pytorch端和caffe的输出就可以对齐了。我先把这个issue关掉了。 你这个工程搞的使用起来还是很方便的。

inisis commented 2 years ago

嗯嗯,是的,把opset设置成9,pytorch端和caffe的输出就可以对齐了。我先把这个issue关掉了。 你这个工程搞的使用起来还是很方便的。

我更新了下代码 opset 为 13 的时候也能够对齐精度了。 欢迎加群597059928讨论~

hlcool commented 2 years ago

hello,还是关于upsample上采样的问题,我测试之后发现输出对不齐,主要原因是align_corners的问题。 https://github.com/inisis/brocolli/blob/ab26d118f590235ceb3cfe20b949fdad6f6d29ff/converter/pytorch/pytorch_caffe_parser.py#L948 上面这个句代码需要改一下: image

inisis commented 2 years ago

hello,还是关于upsample上采样的问题,我测试之后发现输出对不齐,主要原因是align_corners的问题。

https://github.com/inisis/brocolli/blob/ab26d118f590235ceb3cfe20b949fdad6f6d29ff/converter/pytorch/pytorch_caffe_parser.py#L948

上面这个句代码需要改一下: image

感谢指正,最新代码已经更新过来了。