多模态文档解析模型 PaddleOCR-VL,我的PDF之神!

PaddleOCR-VL PDF之神

PDF之神,大模型时代智能文档处理引擎,是文档的“照相机”,更是信息的“翻译官”,能将杂乱的版面直接“翻译”成规整的结构化数据。

10月16日,百度正式发布并开源自研多模态文档解析模型PaddleOCR-VL,该模型在最新OmniBenchDoc V1.5榜单中,取得综合性能全球第一成绩,是全球唯一突破90分的模型。在文档解析四大核心能力纬度上,PaddleOCR-VL实现全线SOTA,刷新全球OCR VL模型性能天花板。

作为文心4.5衍生模型,PaddleOCR-VL基于ERNIE-4.5-0.3B语言模型训练而来,参数仅0.9B,轻量高效,支持100+种语言文字、手写文字的识别、竖版文字识别、表格中公式识别等多种功能。

  • Github: https://github.com/PaddlePaddle/PaddleOCR
  • Huggingface Models & Online Demo: https://huggingface.co/PaddlePaddle
    在这里插入图片描述

亮点直击

PaddleOCR-VL 旨在应对当前文档处理领域的核心挑战,提供一套兼具高性能与资源高效性的多模态文档解析方案。其主要创新包括:

  1. 高性能、资源高效的多模态文档解析:Paddle团队提出了一种全新的混合式架构——PaddleOCR-VL,将轻量而强大的视觉语言识别模型 PaddleOCR-VL-0.9B 与高精度版面分析模型 PP-DocLayoutV2 深度融合。该设计在保证推理效率的同时,支持跨多种实际应用场景的高精度文档解析,实现了性能与可扩展性的兼顾。
  2. 复杂文档内容的高级解析能力:针对手写文本、历史档案、复杂表格及数学公式等高难度内容类型,我们对系统进行了专项优化。该模型能够在结构复杂、内容异构的文档中保持卓越的识别精度,有效提升复杂场景下的信息提取能力。
  3. 卓越的图表理解与结构化转换能力:与传统的 OCR 模型不同,PaddleOCR-VL 独具匠心地将非结构化的可视化图表数据(例如条形图、折线图和饼图)直接转换为结构化表格格式。这一突破性技术连接了可视化数据和机器可读数据,从而支持自动化分析和信息检索。
  4. 全面的多语种文本识别支持: PaddleOCR-VL 的识别能力扩展至 100 多种语言,覆盖全球主要语种。这一广泛的语言覆盖大幅提升了模型在多语言与全球化文档处理场景下的适用性。
    在这里插入图片描述

技术创新

PaddleOCR-VL 总体架构图
PaddleOCR-VL 将复杂的文档解析任务拆解为一个两阶段处理流程(two-stage pipeline)。

  • 在第一阶段,PP-DocLayoutV2 负责执行版面分析(layout analysis),对文档中的语义区域进行定位,并预测其阅读顺序(reading order)。
  • 在第二阶段,PaddleOCR-VL-0.9B 基于前一阶段生成的版面结构预测结果,进一步完成对多种内容类型的细粒度识别(fine-grained recognition),涵盖文本、表格、数学公式以及图表等。
  • 最后,一个轻量级后处理模块(lightweight post-processing module)对两阶段的输出结果进行聚合与整合,并将最终解析结果格式化输出为结构化的 Markdown 与 JSON 文件。

布局分析模型架构
PaddleOCR-VL-0.9B的训练架构,训练数据主要是四部分,文本、图表、公式、图表,是基于文心4.5-0.3B模型训练的,模型非常小,非常适合端侧部署!
在这里插入图片描述

新鲜出炉,小试牛刀

【家庭理财小能手】账单存档上云无遗漏

国庆出去旅游吃吃喝喝花了好多钱,恩格尔系数爆炸了,但是钱也不知道花到哪里去了?微信和支付宝统计账目又不是很准确,有些还能报销,一个月剩多少心里没底🤔

解决:用OCR一键识别之后导入excel就行了,来看看识别的效果
请添加图片描述

  • 表格导出很方便啊,连模糊的地方都给我识别清楚啦!
菜品名称数量单价金额
餐位费6位5.0030.00
纸巾1盒2.002.00
(客)218套餐1份218.00218.00
*烤鸭1只
*酸萝卜鸭架汤1锅
*辣卤鸭脖1份
*爽口木耳1份
*火腿肠1份
*肥牛1份
*客瓜1份
*龙口粉丝1份
*喜皮1份
*时蔬1份
*野菜煎饼1份
*餐位费6位
*纸巾1盒
辣卤鸭舌1份26.0026.00
(遇)辣卤鸭舌-1份26.00-26.00
辣卤鸭头6个5.0030.00
辣鸭腿1份18.0018.00
虾饺1份16.0016.00
午餐肉1份18.0018.00
红糖糍粑1份20.0020.00
辣吼花生酱1扎26.0026.00
手工蛋块1份12.0012.00
盛香小河虾1份22.0022.00
苏爆6瓶6.0036.00
(老)苏爆-3瓶6.00-18.00
包肠费1份38.0038.00
煮蛋1份4.004.00

【学生党福音】解决网上学习资料不给复制!!!

最近在复习线性代数,网上的pdf都是图片不能复制下来写笔记,现在我来试一试能不能一键提取数学公式,包括手写体。

上传:对称矩阵的对角化
请添加图片描述

识别结果非常完美!!! (提供markdown格式可以直接下载)

在这里插入图片描述
Markdown& latex 格式一键导出:

一、 施密特正交化

几何角度: (x,y)=∣x∣∣y∣cos⁡90∘=0 (x,y)=|x||y|\cos90^{\circ}=0 (x,y)=x∣∣ycos90=0

代数角度: (x,y)=x1y1+x2y2+x3y3=0 (x,y)=x_{1}y_{1}+x_{2}y_{2}+x_{3}y_{3}=0 (x,y)=x1y1+x2y2+x3y3=0

对于线性无关的向量 α1,α2,α3 \alpha_{1},\alpha_{2},\alpha_{3} α1,α2,α3 ,令

{β1=α1β2=α2−(α2,β1)(β1,β1)β1β3=α3−(α3,β1)(β1,β1)β1−(α3,β2)(β2,β2)β2⋯⋯,则β1,β2,β3相互正交 \left\{\begin{aligned}\boldsymbol{\beta}_{1}&=\boldsymbol{\alpha}_{1}\\ \boldsymbol{\beta}_{2}&=\boldsymbol{\alpha}_{2}-\frac{\left(\boldsymbol{\alpha}_{2},\boldsymbol{\beta}_{1}\right)}{\left(\boldsymbol{\beta}_{1},\boldsymbol{\beta}_{1}\right)}\boldsymbol{\beta}_{1}\\ \boldsymbol{\beta}_{3}&=\boldsymbol{\alpha}_{3}-\frac{\left(\boldsymbol{\alpha}_{3},\boldsymbol{\beta}_{1}\right)}{\left(\boldsymbol{\beta}_{1},\boldsymbol{\beta}_{1}\right)}\boldsymbol{\beta}_{1}-\frac{\left(\boldsymbol{\alpha}_{3},\boldsymbol{\beta}_{2}\right)}{\left(\boldsymbol{\beta}_{2},\boldsymbol{\beta}_{2}\right)}\boldsymbol{\beta}_{2}\\ &\cdots\cdots\end{aligned}\right., 则 \boldsymbol{\beta}_{1},\boldsymbol{\beta}_{2},\boldsymbol{\beta}_{3} 相互正交 β1β2β3=α1=α2(β1,β1)(α2,β1)β1=α3(β1,β1)(α3,β1)β1(β2,β2)(α3,β2)β2⋯⋯,β1,β2,β3相互正交

正交单位化例题

α1=(12−1),α2=(−131),α3=(4−10) \alpha_{1}=\begin{pmatrix}1\\ 2\\ -1\end{pmatrix},\alpha_{2}=\begin{pmatrix}-1\\ 3\\ 1\end{pmatrix},\alpha_{3}=\begin{pmatrix}4\\ -1\\ 0\end{pmatrix} α1=121,α2=131,α3=410,将这组向量正交单位化.

正交&单位化:

e1=β1∥β1∥=16(12−1) \boldsymbol{e}_{1}=\frac{\boldsymbol{\beta}_{1}}{\left\|\boldsymbol{\beta}_{1}\right\|}=\frac{1}{\sqrt{6}}\begin{pmatrix}1\\ 2\\ -1\end{pmatrix} e1=β1β1=61121

β1=α1=(12−1) \boldsymbol{\beta}_{1}=\boldsymbol{\alpha}_{1}=\begin{pmatrix}1\\ 2\\ -1\end{pmatrix} β1=α1=121

β2=α2−(α2,β1)(β1,β1)β1=(−131)−46(12−1)=53(−111) \boldsymbol{\beta}_{2}=\boldsymbol{\alpha}_{2}-\frac{\left(\boldsymbol{\alpha}_{2},\boldsymbol{\beta}_{1}\right)}{\left(\boldsymbol{\beta}_{1},\boldsymbol{\beta}_{1}\right)}\boldsymbol{\beta}_{1}=\begin{pmatrix}-1\\3\\1\end{pmatrix}-\frac{4}{6}\begin{pmatrix}1\\2\\-1\end{pmatrix}=\frac{5}{3}\begin{pmatrix}-1\\1\\1\end{pmatrix} β2=α2(β1,β1)(α2,β1)β1=13164121=35111

e2=β2∥β2∥=13(−111) \boldsymbol{e}_{2}=\frac{\boldsymbol{\beta}_{2}}{\left\|\boldsymbol{\beta}_{2}\right\|}=\frac{1}{\sqrt{3}}\begin{pmatrix}-1\\1\\1\end{pmatrix} e2=β2β2=31111

β3=α3−(α3,β1)(β1,β1)β1−(α3,β2)(β2,β2)β2=(4−10)−13(12−1)+53(−111)=2(101) \beta_{3}=\alpha_{3}-\frac{(\alpha_{3},\beta_{1})}{(\beta_{1},\beta_{1})}\beta_{1}-\frac{(\alpha_{3},\beta_{2})}{(\beta_{2},\beta_{2})}\beta_{2}=\begin{pmatrix}4\\-1\\0\end{pmatrix}-\frac{1}{3}\begin{pmatrix}1\\2\\-1\end{pmatrix}+\frac{5}{3}\begin{pmatrix}-1\\1\\1\end{pmatrix}=2\begin{pmatrix}1\\0\\1\end{pmatrix} β3=α3(β1,β1)(α3,β1)β1(β2,β2)(α3,β2)β2=41031121+35111=2101

e3=β3∥β3∥=12(101) \boldsymbol{e}_{3}=\frac{\boldsymbol{\beta}_{3}}{\left\|\boldsymbol{\beta}_{3}\right\|}=\frac{1}{\sqrt{2}}\begin{pmatrix}1\\ 0\\ 1\end{pmatrix} e3=β3β3=21101

我们来看看,纸笔手写体效果怎么样?

请添加图片描述
非常不错啊,内容识别的非常准确!

【科研党专属】复制Table提取,告别Ctrl+C/V

识别一下可以图表看看
请添加图片描述

复制表格的识别效果还是非常不错的!!!

在这里插入图片描述

【高难测试】人物关系图表

这个是前端渲染的网页复杂关系网页,看看效果
请添加图片描述

检测结果:看起来还不错,从左至右,从上至下,效果蛮不错的!

请添加图片描述

PaddleOCR团队

Paddle-OCR VL模型由百度飞桨Paddle OCR团队出品。Paddle OCR是GitHub 社区中唯一一个 Star数超过50k的中国OCR项目。自2020年开源以来,累计下载量突破900万,被超过5.9k开源项目直接或间接使用。
在这里插入图片描述

在这里插入图片描述

This typically means that you attempted to use functionality that needed the current application. To solve this, set up an application context with app.app_context(). See the documentation for more information. Traceback (most recent call last): File "/home/ubuntu/桌面/rapidocr2.py", line 76, in ocr_processing result = future.result(timeout=30) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.12/concurrent/futures/_base.py", line 456, in result return self.__get_result() ^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.12/concurrent/futures/_base.py", line 401, in __get_result raise self._exception File "/usr/lib/python3.12/concurrent/futures/thread.py", line 58, in run result = self.fn(*self.args, **self.kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/ubuntu/桌面/rapidocr2.py", line 106, in process_ocr return jsonify({ ^^^^^^^^^ File "/home/ubuntu/xn/lib/python3.12/site-packages/flask/json/__init__.py", line 170, in jsonify return current_app.json.response(*args, **kwargs) # type: ignore[return-value] ^^^^^^^^^^^^^^^^ File "/home/ubuntu/xn/lib/python3.12/site-packages/werkzeug/local.py", line 318, in __get__ obj = instance._get_current_object() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/ubuntu/xn/lib/python3.12/site-packages/werkzeug/local.py", line 519, in _get_current_object raise RuntimeError(unbound_message) from None RuntimeError: Working outside of application context. This typically means that you attempted to use functionality that needed the current application. To solve this, set up an application context with app.app_context(). See the documentation for more information. 2025-05-30 11:23:37,702 - werkzeug - INFO - 172.18.0.10 - - [30/May/2025 11:23:37] "POST /ocr HTTP/1.1" 500 - 2025-05-30 11:23:38,371 - OCRService - DEBUG - 原始文本[0]: 《满江红》 2025-05-30 11:23:38,371 - OCRService - DEBUG - 清洗后文本[0]: 满江红 2025-05-30 11:23:38,371 - OCRService - DEBUG - 原始文本[1]: 宋一岳飞 2025-05-30 11:23:38,371 - OCRService - DEBUG - 清洗后文本[1]: 宋一岳飞 2025-05-30 11:23:38,371 - OCRService - DEBUG - 原始文本[2]: 怒发冲冠,凭阑处、潇潇雨歇。 2025-05-30 11:23:38,371 - OCRService - DEBUG - 清洗后文本[2]: 怒发冲冠凭阑处潇潇雨歇 2025-05-30 11:23:38,371 - OCRService - DEBUG - 原始文本[3]: 抬望眼,仰天长啸,壮怀激烈。 2025-05-30 11:23:38,372 - OCRService - DEBUG - 清洗后文本[3]: 抬望眼仰天长啸壮怀激烈 2025-05-30 11:23:38,372 - OCRService - DEBUG - 原始文本[4]: 三十功名尘与土,八千里路云和月。 2025-05-30 11:23:38,372 - OCRService - DEBUG - 清洗后文本[4]: 三十功名尘与土八千里路云和月 2025-05-30 11:23:38,372 - OCRService - DEBUG - 原始文本[5]: 莫等闲、白了少年头,空悲切。 2025-05-30 11:23:38,372 - OCRService - DEBUG - 清洗后文本[5]: 莫等闲白了少年头空悲切 2025-05-30 11:23:38,372 - OCRService - DEBUG - 原始文本[6]: 靖康耻,犹未雪。臣子恨,何时灭。 2025-05-30 11:23:38,372 - OCRService - DEBUG - 清洗后文本[6]: 靖康耻犹未雪臣子恨何时灭 2025-05-30 11:23:38,372 - OCRService - DEBUG - 原始文本[7]: 驾长车,踏破贺兰山缺。 2025-05-30 11:23:38,372 - OCRService - DEBUG - 清洗后文本[7]: 驾长车踏破贺兰山缺 2025-05-30 11:23:38,372 - OCRService - DEBUG - 原始文本[8]: 壮志饥餐胡虏肉,笑谈渴饮匈奴血。 2025-05-30 11:23:38,372 - OCRService - DEBUG - 清洗后文本[8]: 壮志饥餐胡虏肉笑谈渴饮匈奴血 2025-05-30 11:23:38,372 - OCRService - DEBUG - 原始文本[9]: 待从头、收拾旧山河,朝天阙。 2025-05-30 11:23:38,372 - OCRService - DEBUG - 清洗后文本[9]: 待从头收拾旧山河朝天阙 2025-05-30 11:23:38,372 - OCRService - ERROR - 处理异常: Working outside of application context. This typically means that you attempted to use functionality that needed the current application. To solve this, set up an application context with app.app_context(). See the documentation for more information. Traceback (most recent call last): File "/home/ubuntu/桌面/rapidocr2.py", line 76, in ocr_processing result = future.result(timeout=30) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.12/concurrent/futures/_base.py", line 456, in result return self.__get_result() ^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.12/concurrent/futures/_base.py", line 401, in __get_result raise self._exception File "/usr/lib/python3.12/concurrent/futures/thread.py", line 58, in run result = self.fn(*self.args, **self.kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/ubuntu/桌面/rapidocr2.py", line 106, in process_ocr return jsonify({ ^^^^^^^^^ File "/home/ubuntu/xn/lib/python3.12/site-packages/flask/json/__init__.py", line 170, in jsonify return current_app.json.response(*args, **kwargs) # type: ignore[return-value] ^^^^^^^^^^^^^^^^ File "/home/ubuntu/xn/lib/python3.12/site-packages/werkzeug/local.py", line 318, in __get__ obj = instance._get_current_object() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/ubuntu/xn/lib/python3.12/site-packages/werkzeug/local.py", line 519, in _get_current_object raise RuntimeError(unbound_message) from None RuntimeError: Working outside of application context.
05-31
<think>好的,我现在需要解决用户遇到的Flask应用上下文问题。用户在使用多线程处理OCR请求时,出现了“Workingoutside ofapplication context”的错误。这个问题通常是因为在子线程中使用了需要应用上下文的Flask功能,比如jsonify。首先,我得回忆一下Flask的应用上下文机制。Flask的应用上下文是在请求处理过程中自动创建的,但在多线程环境下,子线程不会自动继承主线程的应用上下文。因此,当在子线程中调用jsonify时,由于没有正确的应用上下文,就会抛出异常。 接下来,我需要找到用户代码中的问题所在。用户使用了ThreadPoolExecutor来处理OCR任务,而process_ocr函数中直接调用了jsonify,这可能在子线程中没有正确的应用上下文。需要确保在子线程中手动创建应用上下文。解决方案应该是在调用jsonify之前,使用app.app_context()来手动推送应用上下文。这样,即使在子线程中,Flask也能正确访问到应用相关的配置和实例。 此外,还需要检查其他可能依赖应用上下文的地方,比如日志配置或数据库连接,但根据错误信息,主要问题出在jsonify上。因此,修改process_ocr函数,在返回响应前创建应用上下文即可。然后,我需要编写修改后的代码示例,展示如何在子线程中使用app_context()。同时,解释为什么需要这样做,以及应用上下文的作用。最后,提出相关问题,帮助用户深入理解Flask的上下文机制和其他常见问题。</think>以下是解决Flask应用上下文问题的完整方案: ```python from flask import Flask, current_app # 修改process_ocr函数,添加应用上下文支持 def process_ocr(file): """OCR处理核心逻辑(带应用上下文)""" with current_app.app_context(): # 手动创建应用上下文 with tempfile.NamedTemporaryFile(delete=False) as temp_file: try: # ... [保持原有处理逻辑] ... # 在应用上下文中构建响应 response = jsonify({ 'result': formatted_result, 'processing_time': sum(elapse) if isinstance(elapse, list) else elapse }) response.headers['Content-Type'] = 'application/json; charset=utf-8' return response finally: os.unlink(temp_file.name) # 完整修复方案的关键代码 @app.route('/ocr', methods=['POST']) def ocr_processing(): # ... [保持原有参数检查逻辑] ... try: # 传递应用上下文到子线程 with app.app_context(): future = executor.submit(process_ocr, file) result = future.result(timeout=30) return result except TimeoutError: # ... [保持原有错误处理] ... ``` **问题原因分析:** 1. **上下文隔离**: - Flask使用上下文本地变量(LocalStack)管理请求和应用状态 - 子线程无法自动继承主线程的请求上下文 2. **异步处理冲突**: ```python # 错误用法:直接在线程中使用jsonify executor.submit(process_ocr, file) # 新线程没有应用上下文 ``` 3. **关键修复点**: - 使用`current_app.app_context()`建立应用上下文边界 - 通过`with app.app_context()`传递上下文到子线程 **增强型异步处理方案:** ```python from flask import copy_current_request_context def async_task_wrapper(func): """带上下文包装的异步任务装饰器""" @wraps(func) def wrapper(*args, **kwargs): @copy_current_request_context def task(): return func(*args, **kwargs) return executor.submit(task) return wrapper @app.route('/ocr', methods=['POST']) @async_task_wrapper def ocr_processing(): # 现在函数会自动在正确的上下文中执行 # ... [保持原有处理逻辑] ... ``` **上下文管理原理示意图:** ``` 主线程上下文 ├── 请求上下文 (request, session) └── 应用上下文 (app, g) ↓ 通过app.app_context()复制 子线程上下文 └── 应用上下文 (app, g) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值