PaddlePaddle / Paddle2ONNX

ONNX Model Exporter for PaddlePaddle
Apache License 2.0
723 stars 171 forks source link

ppclas 语言分类模型,转出onnx. #881

Closed sssssshf closed 2 years ago

sssssshf commented 2 years ago

转出onnx正常,但怎么推理呢,没看到数据处理的过程 怎么样的前处理喂进网络

jiangjiajun commented 2 years ago

语言分类,还是图像分类?

sssssshf commented 2 years ago

语言分类,还是图像分类?

语言分类!给出的demo如下: import paddleclas if name == 'main': model = paddleclas.PaddleClas(model_name="language_classification") result = model.predict(input_data="pulc_demo_imgs/language_classification/word_20.png") print(next(result))

转成onnx后该怎么跑呢

yeliang2258 commented 2 years ago

可以看看PaddleClas中这个模型的predict是怎么封装的,提取出前后处理,将推理引擎改为读取onnx模型的,就可以用了

sssssshf commented 2 years ago

可以看看 PaddleClas 的预测是如何在这个模型中预测的,提取出前后处理的模型,就可以用模型来读取模型了

语言分类模型转onnx之后,验证输入到onnx的图片与paddle送入网络前的图一致,为什么两个推理结果会不一致. 这是demo给出的结果: {'class_ids': [0, 4], 'scores': [0.90685, 0.01525], 'label_names': ['arabic', 'japan'], 'filename': 'pulc_demo_imgs/language_classification/word_20.png'}] [[0.90684664 0.00845139 0.00979555 0.00974936 0.01525124 0.01050841 0.01025008 0.01024754 0.01009605 0.00880358]]  这是我转onnx跑出来的结果: outputs 0.8517078 0.00980616 0.01587173 0.01225313 0.04719041 0.01292864 0.01291773 0.01338265 0.01218982 0.01175191 虽然分类结果是对的 但是这个置信度值怎么会有这么大偏差

jiangjiajun commented 2 years ago

根据之前的经验,往往都是在预处理时没有一致导致,即输入给模型的数据不一致

sssssshf commented 2 years ago

根据的经验,都是在发生时没有一致的结果,即输入给之前的数据

已经核验过了,在送入网络前图片的shape 值都没有问题..您那边有onnxdemo可以分享吗 就这个语言分类或者人体属性的这一块

jiangjiajun commented 2 years ago

shape没问题,但值可能有问题。建议直接dump你认为预测正确的那个数据到本地,然后加载后,传输给onnx模型进行测试

sssssshf commented 2 years ago

形状没有问题,但值可能有问题。

不是说了值输出看过没问题吗,具体数字 类型 都一样的

jiangjiajun commented 2 years ago

那麻烦在这里上传Paddle模型、ONNX模型,以及一个可以直接输入到模型中的numpy数据(dump成.npy文件),我们分析看下

sssssshf commented 2 years ago

那麻烦在这里上传Paddle模型、ONNX模型,以及一个可以直接输入到模型中的numpy数据(dump成.npy文件),我们分析看下

这里怎么上传? 项目源码https://github.com/PaddlePaddle/PaddleClas.里面的语言分类模型

sssssshf commented 2 years ago

那麻烦在这里上传Paddle模型、ONNX模型,以及一个可以直接输入到模型中的numpy数据(dump成.npy文件),我们分析看下

输入的图片数据检查没问题,是不是onnx转的时候出现误差了...

jiangjiajun commented 2 years ago

将paddle, onnx模型,以及numpy数据打包成.tgz文件,直接github回复上传即可

sssssshf commented 2 years ago

paddle2onnx.zip

jiangjiajun commented 2 years ago

由于上传的文件中,npy并不是直接输入的文件,我随机生成了一个数据,验证如下,onnx模型与paddle模型输出结果diff均在1e-07级别,即输出结果无diff

image

sssssshf commented 2 years ago

上传的文件中,npy 变成自己直接输入的文件,我随时生成一个数据,验证,onnx 模型输出结果均在 1e-07 级,即输出结果无差异

图片

与paddle给的demo输出结果一致吗,在这里我没看到paddle的结果. img_path = 'pulc_demo_imgs/language_classification/word_35404.png'

img_path = 'pulc_demo_imgs/person_attribute/090004.jpg'

model_name = img_path.split('/')[-2]
model = paddleclas.PaddleClas(model_name=model_name)
result = model.predict(input_data=img_path)
print(next(result))

我自己的实验差异 语言模型转为 onnx 之后,验证输入到 onn 的分类“得分”:[ 0.90685,0.01525 ],'label_names':['abaric','japan'],'fileName':'pulc_demo_imgs/ landaging_classification /word_20.png' } 0.00880358]]  这是我转onnx跑出来的结果: outputs 0.8517078 0.00980616 0.01587173 0.01225313 0.04719041 0.01292864 0.01291773 0.01338265 0.01218982 0.01175191 虽然分类结果是对的 但是这个置信度值怎么会有这么大偏差. 可以看到最大值paddle模型输出的置信度为0.9 而onnx输出结果为0.85

jiangjiajun commented 2 years ago
image

第一个红框为Paddle结果,第二个红框为ONNX结果,两者作差值, diff的最大值和最小值都接近0,即表示预测结果一致。

你可以再使用其它数据按上面的方式验证,如若diff仍然接近于0,则表明模型一致,差异来源于模型推理前后的代码