PaddlePaddle / PaddleNLP

👑 Easy-to-use and powerful NLP and LLM library with 🤗 Awesome model zoo, supporting wide-range of NLP tasks from research to industrial applications, including 🗂Text Classification, 🔍 Neural Search, ❓ Question Answering, ℹ️ Information Extraction, 📄 Document Intelligence, 💌 Sentiment Analysis etc.
https://paddlenlp.readthedocs.io
Apache License 2.0
12.11k stars 2.94k forks source link

[Question]: UIE-X 模型在预测的时候,预测结果box位置是正确的,但是box中的字符不全,存在缺失的情况 #6325

Closed liangxinxin closed 6 months ago

liangxinxin commented 1 year ago

请提出你的问题

当输入图片,输出预测结果时,会出现某个字段的预测box是正确的,但是box中包含的字符存在缺失的情况

在确定预测的box包含的字符这一步,会用到计算字符宽度的逻辑,这个字符宽度目前是用的平均宽度,实际上 一行文本同时包含 中文、数字、字母时,每个字符宽度是不一样的,那么此处使用平均宽度来计算当前字符box是否在预测的box中, 会判断错误

代码中计算字符宽度代码如下: if len(segment) == 2 or (len(segment) == 3 and segment[2] != "table"): char_w = (sbox[2] - sbox[0]) * 1.0 / text_len

遍历每个字符box,判断是否在标注的box的io1

                flag = False
                for i in range(text_len):
                    cbox = [sbox[0] + i * char_w, sbox[1], sbox[0] + (i + 1) * char_w, sbox[3]]
                    c_covered = _io1(cbox, box)
                    if c_covered >= threshold:
                         positions.append(global_offset)
                    elif (
                            cbox[2] == min(cbox[2], box[2])
                            and cbox[0] == max(cbox[0], box[0])
                            and cbox[1] < box[1]
                            and cbox[3] > box[3]
                    ):
                        if c_covered > 0.5:
                            positions.append(global_offset)
                    global_offset += 1

请问如何改进这一步,准确的定位预测box中包含的字符?谢谢

PappeSister commented 1 year ago

你好,我也遇到了这样的问题。请问你现在有解决思路了吗?可否交流一下

liangxinxin commented 1 year ago

我打算在返回的box上加一个OCR过程,识别 box的内容

tianchiguaixia commented 1 year ago

完全不用啊,你传参时候,使用合合ocr或者百度付费ocr,就可以全识别了

liangxinxin commented 1 year ago

完全不用啊,你传参时候,使用合合ocr或者百度付费ocr,就可以全识别了

那你不微调模型吗

tianchiguaixia commented 1 year ago

你不读源码?在源码里面把self.ocr_result换成你自己的ocr就行了啊。因为付费的提供每个字的box。所以这样打的框,100%准

stormcoral commented 3 months ago

请提出你的问题

当输入图片,输出预测结果时,会出现某个字段的预测box是正确的,但是box中包含的字符存在缺失的情况

在确定预测的box包含的字符这一步,会用到计算字符宽度的逻辑,这个字符宽度目前是用的平均宽度,实际上 一行文本同时包含 中文、数字、字母时,每个字符宽度是不一样的,那么此处使用平均宽度来计算当前字符box是否在预测的box中, 会判断错误

代码中计算字符宽度代码如下: if len(segment) == 2 or (len(segment) == 3 and segment[2] != "table"): char_w = (sbox[2] - sbox[0]) 1.0 / text_len # 遍历每个字符box,判断是否在标注的box的io1 flag = False for i in range(text_len): cbox = [sbox[0] + i char_w, sbox[1], sbox[0] + (i + 1) * char_w, sbox[3]] c_covered = _io1(cbox, box) if c_covered >= threshold: positions.append(global_offset) elif ( cbox[2] == min(cbox[2], box[2]) and cbox[0] == max(cbox[0], box[0]) and cbox[1] < box[1] and cbox[3] > box[3] ): if c_covered > 0.5: positions.append(global_offset) global_offset += 1

请问如何改进这一步,准确的定位预测box中包含的字符?谢谢

我也遇到了这个问题,定位么也是宽度计算问题,想问下后来有从代码层面解决么

tianchiguaixia commented 3 months ago

数字和大小写字母,汉字分别给不同宽度