OCR多模态大模型:视觉模型与LLM的结合之路

原文:https://zhuanlan.zhihu.com/p/7783443583

在使用多模态大模型(Visual Language Model, VLM)做视觉信息抽取时,常常出现错字的问题。为了解决这一问题,本文提出了一种名为Guidance OCR的方法。该方法在不额外训练模型的情况下,先利用OCR算法获取图片中的文字内容,再利用OCR识别出的文字对VLM的生成过程进行约束,从而一定程度上减少VLM做视觉信息抽取任务时出现错字的情况。

图片

图1:一张医疗发票,其中的敏感信息已被抹去

使用Qwen2-VL-2B模型抽取图1中的信息时,模型原生回答和使用GuidanceOCR后的回答见下表

图片

项目链接:

https://github.com/hzauzxb/guidance-ocr

一、项目背景

视觉信息抽取任务是给定一张单证图片,并从图片中抽取对应的关键字段,如从图1所示的医疗发票中抽取金额合计,住院时间和医保类型。传统的信息抽取模型先利用OCR算法获取图中的文字位置和文字内容,再利用规则引擎或模板匹配获取关键字段。VLM则可以将图片先输入给模型,再用提问题的方式要求模型给出需要抽取的字段。在开放场景的信息抽取中,由于单证板式太多,规则引擎难以维系,因此常常使用基于VLM的方案

图片

图2:传统信息抽取流程和多模态大模型(VLM)做视觉信息抽取任务的流程图(以抽取合计金额,医保类型为例)

在实际使用时,为了避免显存OOM,VLM常常会将输入的图像大小限制在一定范围。因此VLM在视觉信息抽取任务中,可能会由于文字太小,模糊不清而给出错误的答案。OCR模型分为检测和识别两部分,检测模型负责给出图中的文字位置,而识别模型会根据检测模型给出的文字位置,将图片中的文字一一裁剪下来,并缩放到指定大小,再去识别文字内容。因此传统OCR模型的识字能力通常是高于多模态大模型的识字能力的。

图片

图3:OCR模型的PipeLine

可以看到,同样是"票据代码",输入多模态大模型的分辨率是 16 * 48,而输入传统OCR识别模型的分辨率则为 48 * 320。该特性导致在视觉信息抽取任务中,若使用VLM抽取图中较小的字段,会出现错字的问题,而传统OCR模型则基本都能识别出正确的文字

图片

为了解决该问题,本文提出了名为Guidance OCR的算法,该算法在不额外训练模型的情况下,先利用OCR算法获取图片中的文字内容,再利用OCR识别出的文字对VLM的生成过程进行约束,从而一定程度上减少VLM做视觉信息抽取任务时出现错字的情况

二、算法流程

本节将先介绍GuidanceOCR的任务设定,再介绍单个字段信息抽取的算法流程(一次调用VLM只抽取图片中的一个关键字段),最后在介绍多个字段信息抽取的算法流程(一次调用VLM会抽取图片中的多个关键字段,并以Json格式返回结果)。

GuidanceOCR的任务设定

图片

图4:Guidance OCR的输入输出,以及视觉信息抽取任务中常见的三种Case

如图4左侧所示,Guidance OCR会将OCR识别出的文字,需要抽取的字段和对应的图片作为输入,并利用多模态大模型(VLM)获取信息抽取结果。Guidance OCR为测试时增强算法(Test Time Argument, TTA), 其并不要求对VLM进行额外的训练。

如图4右侧所示,视觉信息抽取任务有三种常见的情况即:

  • • 1.需抽取的字段为单个文本框,即为图4左侧OCR Text列表中的某个字符串

  • • 2.需抽取的字段横跨多个文本框,即为图4左侧OCR Text列表中的多个字符串,按特定顺序组合而成

  • • 3.需抽取的字段为文本框中的某一部分,即为图4左侧OCR Text列表中的某个字符串的子串

单个字段的信息抽取

在单个字段信息抽取的场景下,多模态大模型的Prompt和Response的要求如下

图片

图片

图5:Guidance OCR的算法流程,其本质为基于OCR的Token判别器

图5给出了Guidance OCR的算法流程:在VLM每次生成Token的时候,先将候选的token按logit从大到小进行排序(图5 左侧);再使用基于OCR的token判别器逐个判断候选Token是否合法(图五 中间);找到的第一个合法Token即为VLM该次生成的Token(图5 右侧);在进行下一次生成候选token前,Guidance OCR还会根据此次生成的Token更新基于OCR的Token判别器(图5 虚线部分)。

图片

图6:基于OCR的Token判断器,其结构为OCR识别出的字符串组成的字典树

图6给出了基于OCR的Token判别器中的数据结构。在该字典树中,每个被OCR识别出的字符串的开头节点和结尾节点都特殊标识了出来。在介绍如何根据该字典树判断Token是否合法前,我们需要先定义字典树上连续的一条边

字典树上连续的一条边

  • • 字典树中从上到下连续的字,如:湖南省,小区,南省长沙市;

  • • 若灰色节点后接橙色节点,则仍然连续,如:开福区幸福小区、湖南省幸福小区、襄樊湖南省。

被token判别器判定为合法的候选token必须满足

  • • 若为大模型首次生成的候选token,对应的文字必须是字典树上连续的一条边或生成结束标识符;

  • • 若不是大模型首次生成的候选token,大模型之前生成的文字 + 候选token对应的文字,是字典树上连续的一条边或生成结束标识符。

额外的top_k参数:为了节省时间并提高准确率,Guidance OCR会设置top_k参数,在使用图5所示的算法筛选token时,仅筛选logits为前top_k大的token。若前top_k token中无合法token,则直接输出生成结束标识符,结束生成过程。在实际使用中,通常将top_k设定在50到100之间的数值。

小结:在单个字段的信息抽取的场景下,GuidanceOCR会将OCR识别出的文字内容组合成一个字典树并保证大模型的输出内容为字典树上连续的一条边。在这里我们扩展了连续性的定义,这是为了兼容信息抽取时,需抽取的字段横跨多个文本框的情况。

多个字段的信息抽取

在多个字段信息抽取的场景下,多模态大模型的Prompt和Response的要求如下

图片

与上节的方法类似,多个字段的信息抽取仍然是使用图5所示的Token判别器实现的。与上节不同的是,token判别器有json,key和value三个状态

图片

当生成时,token判别器为json状态,随着生成的进行,token判别器会基于启发式的规则,进行状态转移,从而保证能生成json格式的结果。与2.2节一致,若输出生成结束标识符或top_k内没找到符合条件的候选token时,生成过程结束。

三、模型效果

在信息抽取数据集上,使用Qwen2VL-2B进行测试;输入图像进行等比例缩放,并将最长边固定为1024;使用Guidance OCR的多个字段信息抽取模式;使用transformers中AutoModel.from_pretrained()部署模型,进行infer

图片

四、讨论

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/492001.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++游记】string的使用和模拟实现

枫の个人主页 你不能改变过去,但你可以改变未来 算法/C/数据结构/C Hello,这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕,我们继续来学习C的内容呀。C是接近底层有比较经典的语言,因此学习起来注定枯燥无味&#xf…

飞牛 fnos 上用docker部署一款网页端办公系统

描述 一款高效的内网办公操作系统,内含word/excel/ppt/pdf/内网聊天/白板/思维导图等多个办公系统工具,支持原生文件存储。平台界面精仿windows风格,操作简便,同时保持低资源消耗和高性能运行。无需注册即可自动连接内网用户&…

【网络安全】网站常见安全漏洞—服务端漏洞介绍

文章目录 网站常见安全漏洞—服务端漏洞介绍引言1. 第三方组件漏洞什么是第三方组件漏洞?如何防范? 2. SQL 注入什么是SQL注入?如何防范? 3. 命令执行漏洞什么是命令执行漏洞?如何防范? 4. 越权漏洞什么是越…

单元测试-Unittest框架实践

文章目录 1.Unittest简介1.1 自动化测试用例编写步骤1.2 相关概念1.3 用例编写规则1.4 断言方法 2.示例2.1 业务代码2.2 编写测试用例2.3 生成报告2.3.1 方法12.3.2 方法2 1.Unittest简介 Unittest是Python自带的单元测试框架,适用于:单元测试、Web自动…

C++动态规划解决最长公共子序列

动规非常经典的一道题目,由于需要用到二维数组——姑且算为中等难度的题目,其实和01背包有着极高的相似度,无论是实现还是理论。 今天这篇博客不讲过多的DP理论,重在讲解题目本身。其实有一定经验的同志都清楚,DP的难点…

学习日志024--opencv中处理轮廓的函数

目录 前言​​​​​​​ 一、 梯度处理的sobel算子函数 功能 参数 返回值 代码演示 二、梯度处理拉普拉斯算子 功能 参数 返回值 代码演示 三、Canny算子 功能 参数 返回值 代码演示 四、findContours函数与drawContours函数 功能 参数 返回值 代码演示 …

《Modern CMake for C++》学习笔记

学习 Modern CMake for C - Second Edition 时的学习笔记,供大家参考。 相关资源: 原书链接: Modern CMake for C: Effortlessly build cutting-edge C code and deliver high-quality solutions , Second Edition 中文翻译链接&#xff1a…

实战 | 某院校小程序记录

更多大厂面试经验的视频分享看主页和专栏 目录: 前言: 渗透思路 1.绕过前端 2.信息泄露 3.爆破用户账号密码 4.信息泄露2 结束 前言: 遇到一个学校小程序的站点,只在前端登录口做了校验,后端没有任何校验&#x…

Visual studio的AI插件-通义灵码

通义灵码 TONGYI Lingma 兼容 Visual Studio、Visual Studio Code、JetBrains IDEs 等主流 IDE;支持 Java、Python、Go、C/C、C#、JavaScript、TypeScript、PHP、Ruby、Rust、Scala 等主流编程语言。 安装 打开扩展管理器,搜送“TONGYI Lingma”&…

【泛微系统】HR同步功能实例讲解

HR同步功能实例讲解\ 前言 HR同步是指ecology与专业的人事管理软件进行数据同步的功能,ecology中的组织结构和人员信息将完全取自HR软件。 官方HR同步功能解释 实例背景 客户本身有外购EHR系统用于员工的入转调离的基础信息管理,现又外购泛微的OA系统用于企业信息协同办…

【测试】Pytest

建议关注、收藏! 目录 功能pytest 自动化测试工具。 功能 单元测试:用于验证代码的最小功能单元(如函数、方法)的正确性。 简单的语法:不需要继承特定类或使用复杂的结构。断言语句简化。 自动发现测试:P…

实验12 socket网络编程

设计程序 1.阅读TCP、UDP数据通信的例子8-2、8-7,理解并运行查看其功能。 2. 编写程序,使用socket网络接口函数,实现同一网段的两台主机的聊天。注:使用多线程,实现实时聊天功能。(使用UDP或TCP…

【LeetCode】2406、将区间分为最少组数

【LeetCode】2406、将区间分为最少组数 文章目录 一、数据结构-堆、贪心1.1 数据结构-堆、贪心1.2 多语言解法 二、扫描线2.1 扫描线 一、数据结构-堆、贪心 1.1 数据结构-堆、贪心 题目已知一些区间, 需要尽量合并, 使 组 最少. 可以用图解画一下 因为尽量合并, 为了紧凑, …

【Python】利用函数模拟创建【栈】的数据结构操作

知识解读:来自:https://fishc.com.cn[#FwSB,M 9xKOA!^6fP)_EC(nsd什么是栈呢?Powered by https://fishc.com.cn3>A?5JXL#_}YBGD"FWdubKeyhQP栈是一种具有 FILO 特性的数据结构,即先放入的数据反而后取出。e&"%b…

JAVA入门:使用IDE开发

JAVA入门:使用IDE开发 什么是IDE IDE(Integrated Development Environment,集成开发环境)是一种软件应用程序,它为程序开发、软件设计、项目管理等提供全面的设施。 简单来说就是简化开发过程,让编程更加方便。 IDEA 业界公认最好用的JAVA IDE 安装IDEA 打开IDEA官…

机器学习《西瓜书》学习笔记《待续》

如果说,计算机科学是研究关于“算法”的学问,那么机器学习就是研究关于“学习算法”的学问。 目录 绪论引言基本术语 扩展向量的张成-span使用Markdown语法编写数学公式希腊字母的LaTex语法插入一些数学的结构插入定界符插入一些可变大小的符号插入一些函…

o1 Pro模型架构揭秘与 Scaling Law 深度解析 | Claude 3.5 Opus、草莓训练、推理成本剖析

引言 近期,Semianalysis 发布了一篇重磅万字长文,首次披露 OpenAI 的 o1 Pro 模型架构与推理训练方法,同时深入探讨了当前 AI 领域的重要话题: Claude 3.5 Opus 是否失败?Scaling Laws(扩展法则&#xff…

流程引擎Activiti性能优化方案

流程引擎Activiti性能优化方案 Activiti工作流引擎架构概述 Activiti工作流引擎架构大致分为6层。从上到下依次为工作流引擎层、部署层、业务接口层、命令拦截层、命令层和行为层。 基于关系型数据库层面优化 MySQL建表语句优化 Activiti在MySQL中创建默认字符集为utf8&…

labml.ai Deep Learning Paper Implementations (带注释的 PyTorch 版论文实现)

labml.ai Deep Learning Paper Implementations {带注释的 PyTorch 版论文实现} 1. labml.ai2. labml.ai Deep Learning Paper Implementations3. Sampling Techniques for Language Models (语言模型的采样技术)4. Multi-Headed Attention (MHA)References 1. labml.ai https…

qemu源码解析【04】qom实例

目录 qemu源码解析【04】qom实例1. type_init()宏2. type_register_static()宏3. arm_sbcon_i2c_init()何时被qemu系统调用 qemu源码解析【04】qom实例 qemu源码解析【总目录】 继续分析arm_sbcon_i2c实例,代码从行尾往上逐步分析 #include "qemu/osdep.h&q…