PDF-Extract-Kit (PDF内容抽取开源项目)

news2024/12/24 2:48:36

Github 地址:https://github.com/opendatalab/PDF-Extract-Kit


整体介绍

PDF文档中包含大量知识信息,例如文本、表格、图像、公式等。此外,PDF的文档布局也相当复杂,页眉、页脚、表格标题、图片标题等等,提取高质量的PDF内容并非易事。将PDF内容提取工作进行拆解:

  • 布局检测:使用LayoutLMv3模型进行区域检测,如图像表格,标题,文本等;
  • 公式检测:使用YOLOv8进行公式检测,包含行内公式行间公式
  • 公式识别:使用UniMERNet进行公式识别
  • 光学字符识别:使用PaddleOCR进行文本识别

注意: 由于文档类型的多样性,现有开源的布局检测公式检测很难处理多样性的PDF文档,为此内容采集多样性数据进行标注和训练,使得在各类文档上取得精准的检测效果,细节参考布局检测和公式检测部分。
对于公式识别,UniMERNet方法可以媲美商业软件,在各种类型公式识别上均匀很高的质量。
对于OCR,我们采用PaddleOCR,对中英文OCR效果不错。

PDF内容提取框架如下图所示

在这里插入图片描述

PDF-Extract-Kit输出格式

{
    "layout_dets": [    # 页中的元素
        {
            "category_id": 0, # 类别编号, 0~9,13~15
            "poly": [
                136.0, # 坐标为图片坐标,需要转换回pdf坐标, 顺序是 左上-右上-右下-左下的x,y坐标
                781.0,
                340.0,
                781.0,
                340.0,
                806.0,
                136.0,
                806.0
            ],
            "score": 0.69,   # 置信度
            "latex": ''      # 公式识别的结果,只有13,14有内容,其他为空,另外15是ocr的结果,这个key会换成text
        },
        ...
    ],
    "page_info": {         # 页信息:提取bbox时的分辨率大小,如果有缩放可以基于该信息进行对齐
        "page_no": 0,      # 页数
        "height": 1684,    # 页高
        "width": 1200      # 页宽
    }
}

其中category_id(类别)包含的类型如下:

{0: 'title',              # 标题
 1: 'plain text',         # 文本
 2: 'abandon',            # 包括页眉页脚页码和页面注释
 3: 'figure',             # 图片
 4: 'figure_caption',     # 图片描述
 5: 'table',              # 表格
 6: 'table_caption',      # 表格描述
 7: 'table_footnote',     # 表格注释
 8: 'isolate_formula',    # 行间公式(这个是layout的行间公式,优先级低于14)
 9: 'formula_caption',    # 行间公式的标号

 13: 'inline_formula',    # 行内公式
 14: 'isolated_formula',  # 行间公式
 15: 'ocr_text'}              # ocr识别结果

效果展示

结合多样性PDF文档标注,训练了鲁棒的布局检测公式检测模型。在论文、教材、研报、财报等多样性的PDF文档上,pipeline都能得到准确的提取结果,对于扫描模糊、水印等情况也有较高鲁棒性。
请添加图片描述

使用教程

环境安装 (Linux)

conda create -n pipeline python=3.10

pip install -r requirements.txt

pip install --extra-index-url https://miropsota.github.io/torch_packages_builder detectron2==0.6+pt2.3.1cu121

安装完环境后,可能会遇到一些版本冲突导致版本变更,如果遇到了版本相关的报错,可以尝试下面的命令重新安装指定版本的库。

pip install pillow==8.4.0

除了版本冲突外,可能还会遇到torch无法调用的错误,可以先把下面的库卸载,然后重新安装cuda12和cudnn。

pip uninstall nvidia-cusparse-cu12

运行提取脚本

python pdf_extract.py --pdf data/pdfs/ocr_1.pdf

参数解释:

  • pdf :待处理的pdf文件,如果传入一个文件夹,则会处理文件夹下的所有pdf文件。
  • output: 处理结果保存的路径,默认是"output"
  • vis: 是否对结果可视化,是则会把检测的结果可视化出来,主要是检测框和类别
  • render: 是否把识别得的结果渲染出来,包括公式的latex代码,以及普通文本,都会渲染出来放在检测框中。注意:此过程非常耗时,另外也需要提前安装xelateximagemagic

本项目专注使用模型对多样性文档进行高质量内容提取,不涉及提取后内容拼接成新文档,如PDF转Markdown。如果有此类需求,请参考另一个Github项目: MinerU


在Windows上运行 : 在Windows环境下使用PDF-Extract-Kit

在macOS上运行: 在macOS系统使用PDF-Extract-Kit

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nature子刊 | ATAC-seq、RNA-seq和蛋白组联合分析揭示脂质激活转录因子PPARα在肾脏代偿性肥大的作用机制

2023年6月,美国国立心肺血液研究所的研究团队在Nature Communications上发表题为“Signaling mechanisms in renal compensatory hypertrophy revealed by multi-omics”的文章,该研究通过在单侧肾切除的小鼠模型中使用多组学方法(蛋白质组学…

十一、面向对象进阶

文章目录 学习目标一、类方法和静态方法二、单例模式三、Python的继承3.1 继承的基本使用3.2 Python继承的特点3.3 私有属性的继承特点3.4 新式类和经典类四、对象相关的运算符和内置函数五、多态的使用5.1 子类重写父类的方法5.2 多态的使用学习目标 说出类方法和实例方法的区…

Spring中的IOC详解

文章目录 IOCIOC容器的工作原理Bean的生命周期Bean的自动装配AutowiredResourceInject 使用Spring底层组件 IOC Spring的核心之一是IOC,IOC全称为Inversion of Control,中文译为控制反转,是面向对象编程中的一种设计原则,可以用来…

栈和队列(一) ------基本概念,循环队列

目录 栈 python实现 队列 python实现 循环队列 力扣622- --循环队列 力扣20 ----有效括号判断 分析 代码 栈 python实现 在Python中实现一个栈(Stack)可以通过使用列表(list)来完成,因为列表提供了动态数…

【网络安全的神秘世界】Error:Archives directory /var/cache/apt/archives/partial is missing.

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 ✨问题描述 在kali中想要安装beef-xss软件包时,发生如下报错: Error: Archives directory /var/cac…

d3d12.dll 文件缺失如何解决?五种修复丢失问题的方法

d3d12.dll 文件缺失如何解决?它为什么会不见呢?今天,我们将探讨 d3d12.dll 文件的重要性、原因以及丢失时的解决策略。本文将全面介绍 d3d12.dll 文件,并提供五种修复丢失问题的方法。 d3d12.dll文件是什么的详细介绍 d3d12.dll …

【RAGFlow】Ubuntu系统下实现源码启动RAGFlow

一、RAGFlow 是什么? RAGFlow 是一款基于深度文档理解构建的开源 RAG(Retrieval-Augmented Generation)引擎。RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程,结合大语言模型(LLM)针对用…

【C语言初阶】C语言数组基础:从定义到遍历的全面指南

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C语言 “ 登神长阶 ” 🤡往期回顾🤡:C语言函数 🌹🌹期待您的关注 🌹🌹 ❀数组 📒1. 什么是数组…

【医学影像】X86+FPGA:支持AI医学影像设备应用的工控主板,赋能CT、MRI、X线、超声等医学影像设备

支持AI医学影像设备应用的工控主板 在我国人口老龄化问题不断加剧,对影像诊断需求持续增长,和国家利好高端医学影像市场发展的系列法规和政策接连出台的大环境下,AI医学影像设备产业迎来发展黄金期。紧跟发展大势,基于12/13代 In…

天途无人机林业应用解决方案

林业应用现状分析 森林环境较为复杂,人员无法快速到达现场,工作人员通常会面临监控盲区,林区爬山涉水困难多;森林防火重要性不可忽视,2019年全国共发生森林火灾2345起,森林防火仍为重中之重;环…

SAPUI5基础知识16 - 深入理解MVC架构

1. 背景 经过一系列的练习,相信大家对于SAPUI5的应用程序已经有了直观的认识,我们在练习中介绍了视图、控制器、模型的概念和用法。在本篇博客中,让我们回顾总结下这些知识点,更深入地理解SAPUI5的MVC架构。 首先,让…

Jvm基础(一)

目录 JVM是什么运行时数据区域线程私有1.程序计数器2.虚拟机栈3.本地方法栈 线程共享1.方法区2.堆 二、对象创建1.给对象分配空间(1)指针碰撞(2)空闲列表 2.对象的内存布局对象的组成Mark Word类型指针实例数据:对齐填充 对象的访问定位句柄法 三、垃圾收集器和内存…

React基础学习-Day04

React基础学习-Day04 常见的钩子函数及基础使用方式 1.useState useState 是 React 的一个 Hook,用于在函数组件中添加状态。它返回一个状态变量和一个更新该状态的函数。与类组件的 this.state 和 this.setState 相对应,useState 让函数组件也能拥有…

【第10章】Spring Cloud之Nacos动态配置

文章目录 前言一、上下文1. 新增配置2. 启动类3. 效果 二、注解 ( 推荐 ) \color{#00FF00}{(推荐)} (推荐)1. 获取配置2. 测试2.1 未配置2.2 配置值2.3 修改值 总结 前言 这一章我们通过两个案例来学习Nacos动态配置,通过在控制台修改服务端配置文件值,…

linux环境交叉编译openssl库,以使Qt支持https

一.前言 Qt若需要支持https,则需要openssl的支撑,并且要注意,Qt不同版本会指定对应的openssl版本库,比方我用的Qt5.15.10他要求用的openssl版本是1.1.1,你就不能用其他版本,不然基本就是失败报错。 如何查看Qt对应ope…

TK秘籍:深度剖析机房IP与住宅IP的利与弊

大家好,今天我们来聊聊TikTok运营中的一个重要环节——IP地址的选择。 想象一下,你在TikTok上发布视频,就像是在一个热闹的市集上摆摊,而IP地址就是你的摊位位置。选对了位置,你的摊位就能吸引更多顾客,也…

浪漫情怀:红酒中的诗意与情感

在生活的点滴细节中,总有些元素能触动我们内心较柔软的地方,唤起那份深深的浪漫情怀。而红酒,便是这其中的一种神奇媒介。它以其不同的色泽、香气和口感,让人沉醉其中,感受那份诗意与情感的交织。今天,就让…

使用Kotlin Flow和协程开发高性能Android应用

使用Kotlin Flow和协程开发高性能Android应用:以电影业务为例 引言 在当今移动互联网快速发展的时代,用户对应用的性能和响应速度有了更高的要求。作为开发者,我们需要不断探索和采用新的技术来提升应用的性能和用户体验。Kotlin作为Android开发的首选语言,其协程和Flow特…

抖音/腾讯/百度ocpm深度回传如何操作?广告投放双出价的投放技巧?

要实现抖音、腾讯和百度的OCPM(Optimized Cost Per Mille)深度回传,可以通过借助第三方平台,例如(转化宝)实现广告数据精准回传,如此之外,在广告投放过程中还需要注重这些方面。 转化…