[PaddlePaddle/PaddleOCR]基于VI-LayoutXLM的发票关键信息抽取

2024-05-13 552 views
6

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

  • 执行过程/Implementation: 根据【基于VI-LayoutXLM的发票关键信息抽取】的案例,进行关系识别(re),训练出了inferrence模型,通过tools包下的infer_kie_token_ser_re.py执行推理可得到比较不错的结果,部署hub时,替换了deploy包下的hubServing里的kie_ser和kie_ser_re的config.json替换为自己的模型。部署执行后,访问的结果和推理执行的完全不一致。查看源码,发现hub部署后调用的是ppstructure/kie包下的predict_kie_token_ser_re.py和predict_kie_token_ser.py,查看内部实现存在一些差异,但无法定位问题是出在模型上,还是某些步骤存在问题。

回答

9

./tools/infer_kie_token_ser_re.py 是使用训练引擎推理,推理时需要配置文件、训练参数。 部署hub时需要首先将训练参数转换为推理模型,使用预测引擎推理(predict_kie_token_ser_re.py),因此两种方式使用的脚本不同。 如果出现转推理后结果不一致,可能是训练时修改了默认参数,与默认推理参数有diff。 可以优先排除是否存在上述情况,如果仍难以定位,可以提供一个可复现单元(配置文件、训练参数、测试图片 预测命令等)我们一起看下。

1

已查看源码实现,infer_kie_token_ser_re 参数infer_mode为False会将文件夹图片标注的val.json 的标注框信息 原样返回,请问这样设计的目的是什么? image val.json内容如下 b33.jpg [{"transcription": "No", "label": "question", "points": [[2882, 472], [3026, 472], [3026, 588], [2882, 588]], "id": 0, "linking": [[0, 1]]}, {"transcription": "12269563", "label": "answer", "points": [[3066, 448], [3598, 448], [3598, 576], [3066, 576]], "id": 1, "linking": [[0, 1]]}, {"transcription": "开票日期", "label": "question", "points": [[3014, 660], [3290, 660], [3290, 744], [3014, 744]], "id": 2, "linking": [[2, 3]]}, {"transcription": "2016年06月12日", "label": "answer", "points": [[3390, 680], [3882, 680], [3882, 748], [3390, 748]], "id": 3, "linking": [[2, 3]]}, {"transcription": "名称", "label": "question", "points": [[550, 868], [946, 868], [946, 928], [550, 928]], "id": 4, "linking": [[4, 5]]}, {"transcription": "深圳市购机汇网络有限公司", "label": "answer", "points": [[1046, 887], [1778, 887], [1778, 947], [1046, 947]], "id": 5, "linking": [[4, 5]]}, {"transcription": "纳税人识别号", "label": "question", "points": [[558, 960], [938, 960], [938, 1024], [558, 1024]], "id": 6, "linking": [[6, 7]]}, {"transcription": "440300083885931", "label": "answer", "points": [[1102, 976], [1878, 976], [1878, 1036], [1102, 1036]], "id": 7, "linking": [[6, 7]]}, {"transcription": "地址、电话", "label": "question", "points": [[550, 1056], [946, 1056], [946, 1112], [550, 1112]], "id": 8, "linking": [[8, 9]]}, {"transcription": "深圳市龙华新区民治街道民治大道展消科技大厦A12070755-23806606", "label": "answer", "points": [[1054, 1060], [2394, 1060], [2394, 1124], [1054, 1124]], "id": 9, "linking": [[8, 9]]}, {"transcription": "开户行及账号", "label": "question", "points": [[546, 1152], [938, 1152], [938, 1208], [546, 1208]], "id": 10, "linking": [[10, 11]]}, {"transcription": "中国工商银行股份有限公司深圳园岭支行4000024709200172809", "label": "answer", "points": [[1058, 1152], [2438, 1152], [2438, 1216], [1058, 1216]], "id": 11, "linking": [[10, 11]]}, {"transcription": "金额", "label": "question", "points": [[2882, 1204], [3138, 1204], [3138, 1272], [2882, 1272]], "id": 12, "linking": [[12, 13]]}, {"transcription": "¥2987.18", "label": "answer", "points": [[2966, 1884], [3326, 1884], [3326, 1976], [2966, 1976]], "id": 13, "linking": [[12, 13]]}, {"transcription": "税率", "label": "question", "points": [[3294, 1188], [3454, 1188], [3454, 1252], [3294, 1252]], "id": 14, "linking": [[14, 15]]}, {"transcription": "17%", "label": "answer", "points": [[3350, 1284], [3466, 1284], [3466, 1372], [3350, 1372]], "id": 15, "linking": [[14, 15]]}, {"transcription": "税颜", "label": "question", "points": [[3610, 1176], [3862, 1176], [3862, 1248], [3610, 1248]], "id": 16, "linking": [[16, 17]]}, {"transcription": "¥507.82", "label": "answer", "points": [[3710, 1864], [4030, 1864], [4030, 1956], [3710, 1956]], "id": 17, "linking": [[16, 17]]}, {"transcription": "价税合计", "label": "question", "points": [[562, 2060], [894, 2060], [894, 2148], [562, 2148]], "id": 18, "linking": [[18, 19]]}, {"transcription": "¥3495.00", "label": "answer", "points": [[3350, 1992], [3766, 1992], [3766, 2088], [3350, 2088]], "id": 19, "linking": [[18, 19]]}]

当我将infer_mode改为true时,发生了另外一个错误: FatalError: Segmentation fault is detected by the operating system. [TimeInfo: Aborted at 1684757213 (unix time) try "date -d @1684757213" if you are using GNU date ] [SignalInfo: SIGSEGV (@0x0) received by PID 145099 (TID 0x7fb5630082c0) from PID 0 ]

我打断点查看到我传入参数为use_gpu出现该错,初步判断为我的cunn版本与cuda不对应,该问题由我先自行排错后,我再次询问您。

我深入查看源码label_ops.py的_load_ocr_info方法中infer_mode为true时 会调用paddleocr.ocr方法 使用ch_PP-OCRv3_rec_infer和ch_PP-OCRv3_det_infer模型 识别后 效果不佳 图片的每一段落文字或者文字中有间隔 它的识别率非常低,我已经基于发票案例识别出了语义实体识别和关系抽取的模型,是否还需要将文字检测和文字识别模型一同训练呢??

最后paddle-ocr在gitee的案例中: https://gitee.com/paddlepaddle/PaddleOCR/blob/release/2.6/applications/%E5%8F%91%E7%A5%A8%E5%85%B3%E9%94%AE%E4%BF%A1%E6%81%AF%E6%8A%BD%E5%8F%96.md#43-%E8%AF%AD%E4%B9%89%E5%AE%9E%E4%BD%93%E8%AF%86%E5%88%AB-semantic-entity-recognition 4.4.4 模型预测 infer_mode是不是应该为true 模型推理infer_mode是不是应该为false,另外可否基于本案例或其他案例增加一个完整的服务化部署的文档案例 paddleHub或paddleServing都可以,十分期待您的回复,我困在这个问题已经一个星期了。

5

已查看源码实现,infer_kie_token_ser_re 参数infer_mode为False会将文件夹图片标注的val.json 的标注框信息 原样返回,请问这样设计的目的是什么?

val.json内容如下 b33.jpg [{"transcription": "No", "label": "question", "points": [[2882, 472], [3026, 472], [3026, 588], [2882, 588]], "id": 0, "linking": [[0, 1]]}, {"transcription": "12269563", "label": "answer", "points": [[3066, 448], [3598, 448], [3598, 576], [3066, 576]], "id": 1, "linking": [[0, 1]]}, {"transcription": "开票日期", "label": "question", "points": [[3014, 660], [3290, 660], [3290, 744], [3014, 744]], "id": 2, "linking": [[2, 3]]}, {"transcription": "2016年06月12日", "label": "answer", "points": [[3390, 680], [3882, 680], [3882, 748], [3390, 748]], "id": 3, "linking": [[2, 3]]}, {"transcription": "名称", "label": "question", "points": [[550, 868], [946, 868], [946, 928], [550, 928]], "id": 4, "linking": [[4, 5]]}, {"transcription": "深圳市购机汇网络有限公司", "label": "answer", "points": [[1046, 887], [1778, 887], [1778, 947], [1046, 947]], "id": 5, "linking": [[4, 5]]}, {"transcription": "纳税人识别号", "label": "question", "points": [[558, 960], [938, 960], [938, 1024], [558, 1024]], "id": 6, "linking": [[6, 7]]}, {"transcription": "440300083885931", "label": "answer", "points": [[1102, 976], [1878, 976], [1878, 1036], [1102, 1036]], "id": 7, "linking": [[6, 7]]}, {"transcription": "地址、电话", "label": "question", "points": [[550, 1056], [946, 1056], [946, 1112], [550, 1112]], "id": 8, "linking": [[8, 9]]}, {"transcription": "深圳市龙华新区民治街道民治大道展消科技大厦A12070755-23806606", "label": "answer", "points": [[1054, 1060], [2394, 1060], [2394, 1124], [1054, 1124]], "id": 9, "linking": [[8, 9]]}, {"transcription": "开户行及账号", "label": "question", "points": [[546, 1152], [938, 1152], [938, 1208], [546, 1208]], "id": 10, "linking": [[10, 11]]}, {"transcription": "中国工商银行股份有限公司深圳园岭支行4000024709200172809", "label": "answer", "points": [[1058, 1152], [2438, 1152], [2438, 1216], [1058, 1216]], "id": 11, "linking": [[10, 11]]}, {"transcription": "金额", "label": "question", "points": [[2882, 1204], [3138, 1204], [3138, 1272], [2882, 1272]], "id": 12, "linking": [[12, 13]]}, {"transcription": "¥2987.18", "label": "answer", "points": [[2966, 1884], [3326, 1884], [3326, 1976], [2966, 1976]], "id": 13, "linking": [[12, 13]]}, {"transcription": "税率", "label": "question", "points": [[3294, 1188], [3454, 1188], [3454, 1252], [3294, 1252]], "id": 14, "linking": [[14, 15]]}, {"transcription": "17%", "label": "answer", "points": [[3350, 1284], [3466, 1284], [3466, 1372], [3350, 1372]], "id": 15, "linking": [[14, 15]]}, {"transcription": "税颜", "label": "question", "points": [[3610, 1176], [3862, 1176], [3862, 1248], [3610, 1248]], "id": 16, "linking": [[16, 17]]}, {"transcription": "¥507.82", "label": "answer", "points": [[3710, 1864], [4030, 1864], [4030, 1956], [3710, 1956]], "id": 17, "linking": [[16, 17]]}, {"transcription": "价税合计", "label": "question", "points": [[562, 2060], [894, 2060], [894, 2148], [562, 2148]], "id": 18, "linking": [[18, 19]]}, {"transcription": "¥3495.00", "label": "answer", "points": [[3350, 1992], [3766, 1992], [3766, 2088], [3350, 2088]], "id": 19, "linking": [[18, 19]]}]

当我将infer_mode改为true时,发生了另外一个错误: FatalError: Segmentation fault is detected by the operating system. [TimeInfo: Aborted at 1684757213 (unix time) try "date -d @1684757213" if you are using GNU date ] [SignalInfo: SIGSEGV @.) received by PID 145099 (TID 0x7fb5630082c0) from PID 0 ***]

我打断点查看到我传入参数为use_gpu出现该错,初步判断为我的cunn版本与cuda不对应,该问题由我先自行排错后,我再次询问您。

我深入查看源码label_ops.py的_load_ocr_info方法中infer_mode为true时 会调用paddleocr.ocr方法 使用ch_PP-OCRv3_rec_infer和ch_PP-OCRv3_det_infer模型 识别后 效果不佳 图片的每一段落文字或者文字中有间隔 它的识别率非常低,我已经基于发票案例识别出了语义实体识别和关系抽取的模型,是否还需要将文字检测和文字识别模型一同训练呢??

最后paddle-ocr在gitee的案例中: https://gitee.com/paddlepaddle/PaddleOCR/blob/release/2.6/applications/%E5%8F%91%E7%A5%A8%E5%85%B3%E9%94%AE%E4%BF%A1%E6%81%AF%E6%8A%BD%E5%8F%96.md#43-%E8%AF%AD%E4%B9%89%E5%AE%9E%E4%BD%93%E8%AF%86%E5%88%AB-semantic-entity-recognition 4.4.4 模型预测 infer_mode是不是应该为true 模型推理infer_mode是不是应该为false,另外可否基于本案例或其他案例增加一个完整的服务化部署的文档案例 paddleHub或paddleServing都可以,十分期待您的回复,我困在这个问题已经一个星期了。

5

infer_kie_token_ser_re 参数infer_mode为False会将文件夹图片标注的val.json 的标注框信息 原样返回,请问这样设计的目的是什么?

训练或评估时,主要关注的是文字中间的信息,因此图片中的检测和识别框使用gt的标注信息,而推理时不存在gt,则使用ocr引擎进行文本内容的预测

传入参数为use_gpu出现该错,初步判断为我的cunn版本与cuda不对应

可以使用 python 进入 python 解释器,输入 import paddle ,再输入 paddle.utils.run_check()。如果出现 PaddlePaddle is installed successfully!,说明您已成功安装。

图片的每一段落文字或者文字中有间隔 它的识别率非常低,我已经基于发票案例识别出了语义实体识别和关系抽取的模型,是否还需要将文字检测和文字识别模型一同训练呢??

是的,如果文本检测识别的效果比较差,需要先重新训练检测识别模型

6
  1. gt是什么意思请问?以及上一个问题中的最后paddle-ocr在gitee的案例中: https://gitee.com/paddlepaddle/PaddleOCR/blob/release/2.6/applications/%E5%8F%91%E7%A5%A8%E5%85%B3%E9%94%AE%E4%BF%A1%E6%81%AF%E6%8A%BD%E5%8F%96.md#43-%E8%AF%AD%E4%B9%89%E5%AE%9E%E4%BD%93%E8%AF%86%E5%88%AB-semantic-entity-recognition 4.4.4 模型预测 infer_mode是不是应该为true 模型推理infer_mode是不是应该为false,另外可否基于本案例或其他案例增加一个完整的服务化部署的文档案例 paddleHub或paddleServing都可以,该问题暂时未回复呢。
  2. 使用过你这样的方式 是successful的 但是infer_kie_token_ser_re.py 参数为user_gpu=true的时候会报FatalError: Segmentation fault is detected by the operating system. 这个暂时不知如何排查。 paddle为10.2 cudnn为7.6.5 cuda为11.4
  3. 如何针对换行的文本或文本间距较大的文本做识别呢,是数据标注的是将文字标注在一起就行还是需要做其他方案?
6

我需要OCR识别的场景是PDF密集型文字,这种需要怎么做文本识别的数据集标注呢,是一页Pdf拆成不同的段落数据还是一页PDF作为一个item的数据?

9

gt是什么意思

是真实标注的意思,也就是指你的json文件

模型预测 infer_mode是不是应该为true 模型推理infer_mode是不是应该为false

根据实际情况,当提供了正确的json文件时, infer_mode=False。 当无法提供json文件,需要使用OCR引擎预测框和文本时,infer_mode=True。

另外可否基于本案例或其他案例增加一个完整的服务化部署的文档案例 paddleHub或paddleServing都可以,该问题暂时未回复呢

暂时没有人力提供案例,可以看下AIstudio上是否有用户创建过类似项目

如何针对换行的文本或文本间距较大的文本做识别呢,是数据标注的是将文字标注在一起就行还是需要做其他方案?

是指表格识别中,一个单元格内包含换行的文本? 可以试下借助表格识别,将同一个区域的文本进行聚合。文本识别和文本检测标注时还是建议按单行标注。

我需要OCR识别的场景是PDF密集型文字,这种需要怎么做文本识别的数据集标注呢,是一页Pdf拆成不同的段落数据还是一页PDF作为一个item的数据?

可以按页标注

6

tools下和ppstructure/kie包下的前后处理应该不一致,我也在这个坑里花了好多时间,

2

已查看源码包 最后调用是一致的,但是infer_model=fasle的逻辑 我还是不理解 为啥要传正确的JSON关系 那这样 我看源码 是直接将传的json 返回 这样的话 我就不知道为啥gitee 叫预测脚本 , image

预测不应该是基于模型去预测传入数据最后的结果吗?

6

您好,能详细说说吗?我也遇到了同样的问题,训练模型预测效果较好,推理模型效果很差,不知道该如何进行调整了

4

我是export出推理模型,在命令行下 python .\ppstructure\kie\predict_kie_token_ser.py预测正常,但部署到接口里面预测效果就很差

4

issues/10149 你可以看下这个,对你有帮助没。部署到接口里边,看下是不是用的自己导出的模型,仔细检查一下模型路径是不是对着呢,另外,您是使用什么进行部署的呢