Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

paddleseg一但使用argmax就无法使用fastdeploy #3286

Closed
2 of 3 tasks
kkpssr opened this issue May 24, 2023 · 13 comments
Closed
2 of 3 tasks

paddleseg一但使用argmax就无法使用fastdeploy #3286

kkpssr opened this issue May 24, 2023 · 13 comments
Assignees
Labels
bug Something isn't working

Comments

@kkpssr
Copy link

kkpssr commented May 24, 2023

问题确认 Search before asking

Bug描述 Describe the Bug

graphShapeAnalyzer.cpp::analyzeShapes::1872] Error Code 4: Miscellaneous (IShuffleLayer arg_max (Output: argmax_0.tmp_01928): reshape dimension with more than one -1 wildcard. Reshaping [1,1,(# 2 (SHAPE x)),(# 3 (SHAPE x))] to [1,-1,-1].)
似乎是动态尺寸的问题,但是如果设置成none则输出根本不对,边缘处会出现多重ID,导出的模型本身就有错误,模型是deeplabv3

复现环境 Environment

paddleseg 2.4
fastdeploy最新

Bug描述确认 Bug description confirmation

  • 我确认已经提供了Bug复现步骤、代码改动说明、以及环境信息,确认问题是可以复现的。I confirm that the bug replication steps, code change instructions, and environment information have been provided, and the problem can be reproduced.

是否愿意提交PR? Are you willing to submit a PR?

  • 我愿意提交PR!I'd like to help by submitting a PR!
@kkpssr kkpssr added the bug Something isn't working label May 24, 2023
@Bobholamovic Bobholamovic self-assigned this May 25, 2023
@Bobholamovic
Copy link
Member

你好,请提供最小可复现例子以便我们排查这个问题,比如,给出导出模型执行的指令、使用的参数并说明模型权重来源。

@kkpssr
Copy link
Author

kkpssr commented May 25, 2023

你好,请提供最小可复现例子以便我们排查这个问题,比如,给出导出模型执行的指令、使用的参数并说明模型权重来源。

您好,使用的权重就是configs/quick_start/deeplabv3p_resnet50_os8_optic_disc_512x512_1k_teacher.yml指向的权重,使用tools/export.py 导出,以下是fd代码
option = fd.RuntimeOption()
option.use_gpu()
option.use_paddle_infer_backend()
option.enable_paddle_to_trt()
option.paddle_infer_option.enable_trt = True
option.enable_paddle_trt_collect_shape()
option.set_trt_input_shape("x", [1, 3, 256, 256], [1, 3, 512, 512],[1, 3, 1024, 1024])
model_file = os.path.join(args.model, "model.pdmodel")
params_file = os.path.join(args.model, "model.pdiparams")
config_file = os.path.join(args.model, "deploy.yaml")
model = fd.vision.segmentation.PaddleSegModel( model_file, params_file, config_file, runtime_option=runtime_option)
im = cv2.imread(args.image)
result = model.predict(im)
当导出outpu指定是argmax会出问题,指定是none和softmax则不会有事,但切割结果有误
以下是deploy.yml
1 Deploy:
2 input_shape:
3 - 1
4 - 3
5 - 512
6 - 512
7 model: model.pdmodel
8 output_dtype: int32
9 output_op: argmax
10 params: model.pdiparams
11 transforms:
12 - target_size:
13 ¦ - 512
14 ¦ - 512
15 ¦ type: Resize
16 - type: Normalize
input_size指定了512,另外通过visualDL看网络结果会发现输入确实是1,-1-1和bilinearr_intergra_v2类似,但是我查到paddle专门对之前的算子好像添加了转换支持所以不会报错
如下链接PaddlePaddle/Paddle#43618

@Bobholamovic
Copy link
Member

使用tools/export.py 导出

请问导出时命令行参数--input_shape的指定情况是什么样的呀?

@kkpssr
Copy link
Author

kkpssr commented May 25, 2023

使用tools/export.py 导出

请问导出时命令行参数--input_shape的指定情况是什么样的呀?
这是xia相关网络结构图
image

@Bobholamovic
Copy link
Member

看起来是FastDeploy并不支持PaddleSeg导出output_op为argmax的模型。

我尝试在模型导出时关闭argmax(根据你使用的PaddleSeg版本,可能需要使用不同的命令行选项,例如PaddleSeg 2.4使用--without_argmax),然后根据FD官方教程可以得到正确的可视化结果。我使用的配置文件为configs/quick_start/deeplabv3p_resnet50_os8_optic_disc_512x512_1k_teacher.yml,模型是按照quick start教程从头训练的。不过,我在上述实验使用的是PaddleSeg最新的2.8版本,如果在2.4版本按照上述步骤仍然无法解决问题,建议更新到2.8版本。

希望上述建议对你有帮助~

@kkpssr
Copy link
Author

kkpssr commented May 25, 2023

看起来是FastDeploy并不支持PaddleSeg导出output_op为argmax的模型。

我尝试在模型导出时关闭argmax(根据你使用的PaddleSeg版本,可能需要使用不同的命令行选项,例如PaddleSeg 2.4使用--without_argmax),然后根据FD官方教程可以得到正确的可视化结果。我使用的配置文件为configs/quick_start/deeplabv3p_resnet50_os8_optic_disc_512x512_1k_teacher.yml,模型是按照quick start教程从头训练的。不过,我在上述实验使用的是PaddleSeg最新的2.8版本,如果在2.4版本按照上述步骤仍然无法解决问题,建议更新到2.8版本。

希望上述建议对你有帮助~

您好,我使用的是最新版本的paddleseg,只有ouput_ops,没有without_argmax,我不知道是由于训练原因还是什么,output_ops选none或softmax导出后,使用fd.runtime.segemt官方教程,推理后整体大致是对的,但是很多切割图边缘会出现其他标签的轮廓,看起来像一种bug,而使用fd.runtime,再自己进行argmax则不会出现此问题

@kkpssr
Copy link
Author

kkpssr commented May 25, 2023

比如这种
vis_img

@Bobholamovic
Copy link
Member

看起来会不会和图像的上下采样有关?请问测试图像的尺寸和模型的输入张量尺寸差异大吗?

@kkpssr
Copy link
Author

kkpssr commented May 25, 2023

看起来会不会和图像的上下采样有关?请问测试图像的尺寸和模型的输入张量尺寸差异大吗?

输入尺寸是512x512,侧视图是3000x3000,但是这种错误和图片大小无关,都会出现这种情况,而且非常有规律,比如序号是0,1,2,3,4类,第0类会出现他本身的切割图,和围绕其他3类的轮廓,第1类会出现它本身的切割图和围绕其他两类的轮廓,第4类则表现正常没有任何问题,同时不使用fd.segement,使用fd.runtime,或者paddleseg本身的tools/infer则不会有任何问题

@Bobholamovic
Copy link
Member

但是这种错误和图片大小无关,都会出现这种情况,而且非常有规律,比如序号是0,1,2,3,4类,第0类会出现他本身的切割图,和围绕其他3类的轮廓,第1类会出现它本身的切割图和围绕其他两类的轮廓,第4类则表现正常没有任何问题

请问这里所说的错误结果是指result=model.predict(im)这里的result嘛?我在实验中发现这个result好像并不是简单的numpy数组,而是FD定义的特殊的数据结构,所以也不一定按照我们的理解,其中的像素就表示『类别』(像PaddleSeg的输出那样)。我建议可以查阅FastDeploy的文档,看看有没有关于这个结果的介绍~ 从fd.runtimetools/infer.py结果符合预期这一点来看,我觉得是PaddleSeg侧bug导致这一结果的可能性比较小。

@kkpssr
Copy link
Author

kkpssr commented May 25, 2023

但是这种错误和图片大小无关,都会出现这种情况,而且非常有规律,比如序号是0,1,2,3,4类,第0类会出现他本身的切割图,和围绕其他3类的轮廓,第1类会出现它本身的切割图和围绕其他两类的轮廓,第4类则表现正常没有任何问题

请问这里所说的错误结果是指result=model.predict(im)这里的result嘛?我在实验中发现这个result好像并不是简单的numpy数组,而是FD定义的特殊的数据结构,所以也不一定按照我们的理解,其中的像素就表示『类别』(像PaddleSeg的输出那样)。我建议可以查阅FastDeploy的文档,看看有没有关于这个结果的介绍~ 从fd.runtimetools/infer.py结果符合预期这一点来看,我觉得是PaddleSeg侧bug导致这一结果的可能性比较小。

我刚才发现问题所在了,是因为后处理resize插值导致的问题。。。

@Bobholamovic
Copy link
Member

好的呀(请问是对离散的类别使用了线性插值嘛?),如果问题解决了的话,我们是不是可以关闭这个issue了哦?

@kkpssr
Copy link
Author

kkpssr commented May 25, 2023

好的呀(请问是对离散的类别使用了线性插值嘛?),如果问题解决了的话,我们是不是可以关闭这个issue了哦?

可以了谢谢

@kkpssr kkpssr closed this as completed May 25, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants