[PaddlePaddle/PaddleOCR]方向分类器在python上验证准确,然而转换为推理模型后,在cpp上部署,输出却有误

2024-07-08 273 views
4

请提供下述完整信息以便快速定位问题/Please provide the following information to quickly locate the problem

  • 系统环境/System Environment:
  • 版本号/Version:Paddle: PaddleOCR: 问题相关组件/Related components:
  • 运行指令/Command Code:
  • 完整报错/Complete Error Message:

增加了90°和270°两个角度并对模型进行训练,在python上验证无误,可以输出90°和270°结果,但在cpp部署的官方样例程序上,该模型经过推理后的推理模型准确度却下降了,请问为什么方向分类器推理后在cpp上的准确度不如训练模型在python上的准确度呢? 1666144706607 1666144229641

回答

6

先确保导出后的inference模型是否能正常进行python推理,看你的结果score貌似也很低

9

先确保导出后的inference模型是否能正常进行python推理,看你的结果score貌似也很低

验证了一下,导出后的inference模型可以python推理,但是score和cpp部署的分数一样,请问问题是出在export_model.py上吗? 我的导出模型参数为-c configs/cls/cls_mv3.yml -o Global.pretrained_model=./output/cls/mv3 Global.save_inference_dir=./output/cls/inferencemodel

4

导出后的inference模型可以python推理,但是score和cpp部署的分数一样

导出后python推理结果正确吗

8

导出后python推理结果正确吗

不正确,结果有错误,分数也很低

8

那应该就是导出模型的问题了

4

那应该就是导出模型的问题了

感谢解答!

2

Global.pretrained_model=./output/cls/mv3

这块应该要有个best_accuracy吧,应该是训练权重加载不对

1

这块应该要有个best_accuracy吧,应该是训练权重加载不对

这个是我修改后的参数设置: save_model_dir: ./output/cls/mv3/ pretrained_model: ./pretrainmodel/ch_ppocr_mobile_v2.0_cls_train/best_accuracy ./output/cls/inferencemodel 修改后,结果和Score还是没有改变,请问是参数设置错误吗,训练好的模型是由哪个参数读取的呢?

3

完整导出命令是啥,导出指定你训练的配置,指定好模型权重和保存路径就可以了

6

pretrained_model: ./pretrainmodel/ch_ppocr_mobile_v2.0_cls_train/best_accuracy

导出时要用你训好的模型,这里的pretrained_model写你训好的./output/cls/mv3/best_accuracy

7

导出时要用你训好的模型,这里的pretrained_model写你训好的./output/cls/mv3/best_accuracy

我是在pycharm的parameter里指定了完整命令为-c configs/cls/cls_mv3.yml -o Global.pretrained_model=./output/cls/mv3/latest Global.save_inference_dir=./output/cls/inferencemodel,配置文件cls_mv3.yml中的几个参数也是这样指定的,我训练好的模型命名就是latest

6

直接用命令行运行,指定好模型和配置文件就行

2

直接用命令行运行,指定好模型和配置文件就行

用命令行运行,结果还是如前,在infer_cls.py用配置文件参数验证图片,结果却是非常准确的,但同样配置不管是命令行还是配置文件,导出为inference再用predict_cls.py推理,就是准确度下降很多,部分结果还有错,请问是我这个操作过程不对吗,还是export_model.py这边有什么问题呀?

9

我是说导出模型先确保正确

1

我是说导出模型先确保正确

模型导出前是正确的,导出后就不对了

7

所以可能就是你导出模型的时候出错了

0

所以可能就是你导出模型的时候出错了

导出模型的错误已经解决,发现并非是导出模型错误了,而是验证导出模型的predict_cls.py的默认参数cls_label只有0,180两类,现修改后发现导出模型是没有问题的,但CPP上更新导出模型后,结果还是很有误,cls_Score依然很低,请问这个是什么情况呢?

1

那应该是cpp上也需要对应改下输出类别

4

那应该是cpp上也需要对应改下输出类别

请问这个在哪里改呢?

1

可以debug看下输出,这块目前只支持2类的,还没适配4类的

3

这的label是根据模型输出的softmax值进行取最大概率值对应的label,如果模型输出类别是4的话,应该会得到0-3的类别值

6

这的label是根据模型输出的softmax值进行取最大概率值对应的label,如果模型输出类别是4的话,应该会得到0-3的类别值

这里确实可以取到4类的值

查阅了过往的issue,尝试更换模型,发现问题依旧,python端的结果和c++端结果完全不同,请问在C++端如何增加四类方向的适配呢,或者说在c++上和 类别的数量 有关的参数都有哪些呢?

2

这的label是根据模型输出的softmax值进行取最大概率值对应的label,如果模型输出类别是4的话,应该会得到0-3的类别值

c++端,0°和180°的结果都是对的,Score也很高,但一到90°和180°的情况,就会出错,Score很低

8

有修改过预处理的代码吗

9

有修改过预处理的代码吗

没有修改,请问需要修改吗?

3

就是你修改为4分类的时候,预处理有改吗

5

就是你修改为4分类的时候,预处理有改吗

没有修改。下载的官网的2分类的推理模型文件,相同的图片在python中与C++中结果也完全不一致。这个是哪里问题呢

9

哪个版本的代码,dygraph吗

2

哪个版本的代码,dygraph吗

2.5的

8

你好,经过排查,属于代码的bug,已在此处修复https://github.com/PaddlePaddle/PaddleOCR/pull/8091 ,感谢反馈

4

你好,经过排查,属于代码的bug,已在此处修复#8091 ,感谢反馈

你好,谢谢解答!

5

所以可能就是你导出模型的时候出错了

导出模型的错误已经解决,发现并非是导出模型错误了,而是验证导出模型的predict_cls.py的默认参数cls_label只有0,180两类,现修改后发现导出模型是没有问题的,但CPP上更新导出模型后,结果还是很有误,cls_Score依然很低,请问这个是什么情况呢?

跟你一模一样的情况,我这边增加了90和270分类,训练完后infer_cls.py预测很准,导出模型后predict_cls.py推理不了90和270的图片,打印调试label_list只有['0','180'],手动改成['0','90','180','270']是可以的,但是这肯定不是解决办法。请问你后面这个问题解决了吗? image