首页 > Ai资讯 > Ai知识库 > OCR的终极解法——传统算法VS多模态大模型

OCR的终极解法——传统算法VS多模态大模型

发布时间:2024年06月06日

OCR 后处理一直是麻烦的事情,如果用传统的算法会有训练需要准备大量的数据,迭代更新效果差的问题,不过速度确实快。

我在做的 OCR 识别商务名片这个项目上也积累了些经验,大家可以根据我的经验选择合适的算法。

传统算法

一般情况 OCR 识别商务名片会分为两步:

·        

OCR 算法识别出文字和坐标。

·        

文字后处理。

·        

第一步大家可以参考百度 PaddleOCR ,其对中文的准确率是非常高的,截止目前,我使用上没遇到识别文字错误的问题:https://github.com/PaddlePaddle/PaddleOCR

本文重点讨论的是文字的后处理问题。
文字的后处理手段主要分为两种:

·        

规则匹配,提取出文字

·        

命名实体识别

·        

规则匹配提取文字

这个不用我多说,之前有发文讲过电话号码的匹配。如

1[3-9]\\d{1}[\\s\\-\\.\\)]?[\\s]?\\d{4}[\\s\\-\\.]?\\d{4}

匹配出各种类型的电话号码。
同样的如果是身份证这些有固定格式类型的,确实通过规则匹配抽取出我们想要的关键信息。
这种方式的优点是:准、快。不管怎么样现在的 AI 算法很少有用响应速度作为指标的,特别是大模型,响应速度惨不忍睹。

命名实体识别

命名实体识别(Named Entity
Recognition, NER)是自然语言处理(Natural Language Processing,
NLP)的一个分支,它的任务是识别文本中具有特定意义的实体,例如人名、地名、组织名、时间表达、数值表达等。这些实体通常是信息检索、问答系统、内容分析、客户关系管理等领域的关键元素。

在命名实体识别中,算法会分析文本,并将每个单词或短语标记为预定义的类别之一。例如,文本“苹果公司发布了新的iPhone”中,“苹果公司”可能被标记为组织名,而“iPhone”可能被标记为产品名。

命名实体识别通常涉及以下步骤:

1.       

分词(Tokenization):将连续文本分割为单词或词汇单元。

2.       

词性标注(Part-of-Speech tagging):为每个单词指定词性,如名词、动词等。

3.       

实体识别(Entity Detection):确定哪些词汇单元属于感兴趣的实体类别。

4.       

实体分类(Entity Classification):将识别出的实体分配到预定义的类别,如人名、地点等。

5.       

命名实体识别技术可以基于规则、基于统计或使用机器学习模型,包括最近流行的深度学习模型,如循环神经网络(RNNs)、长短时记忆网络(LSTMs)、和 Transformers 等。随着技术的进步,命名实体识别系统的准确性和复杂性都有了显著提升,能够在多种语言和领域中有效地识别和分类实体。

上面是理论,我自己的命名实体识别的实践,发现:还是别人已经训练好的模型好用,自己曾使用 HanLP 来训练 NER,效果并不是很好。我试过效果比较好的模型有:https://www.modelscope.cn/models/iic/nlp_deberta_rex-uninlu_chinese-base/summary
RexUniNLU 零样本通用自然语言理解-中文-base 模型,这是在魔塔上面开源的一个模型。
这个模型包含命名实体识别的功能。

from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
semantic_cls = pipeline('rex-uninlu', model='damo/nlp_deberta_rex-uninlu_chinese-base', model_revision='v1.2.1')
# 命名实体识别 {实体类型: None}
semantic_cls(
    input='1944年毕业于北大的名古屋铁道会长谷口清太郎等人在日本积极筹资,共筹款2.7亿日元,参加捐款的日本企业有69家。', 
    schema={
        '人物': None,
        '地理位置': None,
        '组织机构': None
    }
) 

另外如果你不想部署这个模型,可以直接在魔塔上面体验效果。

image.png

我们可以直接看看效果:

# 我的输入
schema:{"人物": null, "公司": null, "地址": null, "职位":null, "电话号码":null, "邮件":null}
识别的目标:
阿里巴巴 广州阿里游戏科技有限公司  李雪冬  高级销售经理  +8618224004747  lixuedong@ones.ai  深圳市南山区科技南路金地威新中心A座20F  深圳·北京·上海·成都·广州
输出结果:
[ [ { "offset": [ 0, 17 ], "span": "阿里巴巴 广州阿里游戏科技有限公司", "type": "公司" } ], { "offset": [ 11, 14 ], "span": "李雪冬", "type": "人物" } ], [ { "offset": [ 16, 22 ], "span": "高级销售经理", "type": "职位" } ], [ { "offset": [ 59, 80 ], "span": "深圳市南山区科技南路金地威新中心A座20F", "type": "地址" } ] ]

虽然没把我想要的所有信息抽取出来,可能做完训练之后效果更好。但是规则匹配不好匹配的信息都抽取出来了,如姓名、职位、地址、公司。至于电话号码、邮件使用规则匹配或者我们单独训练一下,能抽取出来难度应该不大。

大模型做命名实体识别

使用大模型做命名实体识别就是写 prompt 了,之前的有发文讲过就不细说了。

多模态大模型做 OCR

上面介绍了传统的大模型分两步处理才能获取识别后的名片信息,那么有没有可能一步识别出结果呢?

多模态的大模型确实能做到。

多模态大模型是一类采用深度学习技术构建的人工智能模型,它能够处理和理解多种类型的数据模态,如文本、图像、声音等。这些模型通常是大型的神经网络,它们经过大量数据的训练,能够捕捉不同模态之间的关联,并执行跨模态的任务。

特点:

1.       

数据模态: 多模态模型能够同时处理多种类型的输入数据,例如,它可以分析文本信息和相关的图像信息,以获得更全面的理解。

2.       

大规模: 这些模型通常很大,含有大量的参数,需要大量的计算资源来训练和运行。它们通常使用了成千上万个处理单元(比如GPU或TPU)进行训练。

3.       

预训练和微调: 多模态大模型通常采用预训练加微调的范式。它们首先在大规模的数据集上进行预训练,学习通用的特征和跨模态的关系,然后可以针对特定任务或领域进行微调。

4.       

跨模态理解: 通过捕捉不同模态之间的内在联系,这些模型能够在一个模态中获取信息,并用于理解或生成另一个模态的数据。例如,它们可以从文本描述生成图像,或者从图像中回答关于所见内容的问题。

应用:

·        

图像标注: 从图像内容生成描述性文本。

·        

视觉问答: 回答关于图像内容的问题。

·        

多模态翻译: 在翻译文本的同时考虑与文本对应的图像或声音信息。

·        

情感分析: 分析文本和语音中的情感表达。

·        

交互式机器人: 结合视觉、听觉和语言信息,与人类自然交互。

技术示例:

·        

OpenAI 的 GPT-4:大名顶顶,业界遥遥领先。

·        

Google的BERT: 虽然BERT本身是文本处理模型,但它的变种可以扩展到多模态任务。

·        

OpenAI的CLIP: 能够理解图像和与之关联的文本描述。

·        

Facebook 的 BART: 一个多模态模型,可以同时处理文本和图像数据。

·        

智普的 VisualGLM:多模态大模型,只支持英文。

·        

阿里的 Qwen-VL-Plus:完全开源,业界良心,支持中文,强烈推荐。

多模态大模型的研究和开发是人工智能领域的前沿方向,它在提高机器对世界的理解和提升人机交互体验方面具有重要作用。随着技术的进步,这些模型将在更多实际应用中发挥作用。

这里使用阿里的 Qwen-VL-Plus 给大家做个案例。

体验地址是:Qwen-VL-Plus · 创空间 (modelscope.cn)

输入:

image.pngimage.png

prompt 如下:

名片上的人物,公司,地址,职位,电话号码,邮件分别是什么?不需要解释,返回格式为json:{"name":"aaaa","company":"bbbb","title":"cccc","address":"ddddd","phone":"eeeeee","email":"fff@ggg"},其中任务是name,公司是company,地址是address,职位是title,电话号码是phone,邮件是email

大模型返回:

image.png

非常精准,效果非常好。响应速度也很快。可以说是目前最好的选择。

当然大模型有的时候返回结果并不是这么标准,这个时候需要用户多
run 几次。下次我也可以分享如何处理大模型返回结果不标准的问题。

另外阿里 Qwen 私有化需要 24GB 显存,资源消耗还是比较大的,如果量不大可以调用云端 API 接口:https://help.aliyun.com/zh/dashscope/developer-reference/vl-plus-quick-start

这样也少了PaddleOCR的模型显存,但是PaddleOCR显存需要很少,我使用的是P40显卡8GB显存,可以运行Paddle Serving OCR 2个定位进程,1个识别进程,并发10+没问题。多模态的并发没进行测试验证,有测试验证的朋友请告诉我结果。

总结

然后我们需要做一下比较

解决方案

优点

缺点

PaddleOCR+规则匹配

快、准

很多场景如姓名、地址这些自然语言类型的关键词提取不了

PaddleOCR+命名实体识别+规则匹配

快、准

泛化能力差,加一个识别的字段可能就需要重新训练

PaddleOCR+大模型做命名实体识别

相对上面两种方案,更加准确,泛化能力更好,能识别的关键信息更多

私有化多模态大模型如Qwen-VL-Plus 

较快、准、泛化能力强

以 Qwen 为例子,需要 24GB 显存,并发低。

多模态大模型 API 调用

较快、准、泛化能力强,资源消耗低

图片需要上传到云端服务商如阿里那里。

PaddleOCR的显存大概需要6GB左右,RexUniNLU模型大概需要2G显存,Qwen-VL-Plus需要24GB显存,大家可以根据自己的情况选择自己需要的解决方案。

出自:https://mp.weixin.qq.com/s/wlxhPBjqlgreJlOrq9yZmQ