本文对比了PDF文档中三种OCR技术方案:只提取位图OCR、全页渲染OCR和仅对含图页渲染OCR。实验表明,第三种方案在准确性和效率间取得最佳平衡,显著减少不必要的OCR操作,提高处理速度。对于包含数学公式等复杂内容的PDF文档,全页渲染效果优于仅提取位图。该方案尤其适用于图片较少的文档,能有效降低计算量,提升PDF文本提取效率。

在RAG应用中通常需要对各种文档进行文本提取,如果稳定是纯文本那文档提取会简单很多,但通常文档中会存在各种图片信息,这时就需要使用OCR在提取文档文本信息的同时对图片进行OCR获取图片中的文本内容。本文只介绍PDF文档中OCR技术方案。PDF文档解析目前有不少开源框架亦可支持对PDF中的图片进行OCR,但此类框架通常比较重如Marker、Unstructured等。

这里只使用PyMuPDF读取PDF文件并根据文档实际情况使用调用OCR进行文本提取,文本提取的质量依赖于OCR模型。PDF文档解析的速度也依赖于OCR的性能,几百页的PDF文档并不少见。

1、只提取PDF中的位图进行OCR

此方案通过解析PDF提取其内嵌的图片,只对提取的内嵌图片进行OCR,但可能会由于PDF嵌入的图片质量效果不佳或分辨率较低的问题,即使在原PDF中很清晰的图片提取出来后也是模糊不清,导致OCR准确率大大降低。特别是对于存在数学公式的PDF,提取位图进行OCR准确率极低。对图片进行二次处理如 灰度、放大、二值化、去噪后 OCR效果也不一定很理想。

上图为PDF中的数学公式,图片为PNG格式,存在一个Alpha 通道,尽管已经分离该透明通道并填充白色背景,但是OCR识别的效果依然不佳,再进行灰度、放大、二值化、去噪后,还是效果不佳。
  提取文本、提取图片进行OCR的结果、提取文本、在提取图片OCR,将文本与OCR的结果进行按原顺序作为该页的文本内容。

[{'save_path': '',
'data': [{'text': 'p=$26500:(0.905)',
'confidence': 0.8825955390930176,
'text_box_position': [[3, 4], [170, 2], [171, 14], [3, 16]]},
{'text': '1.1',
'confidence': 0.9956590533256531,
'text_box_position': [[285, 3], [313, 3], [313, 15], [285, 15]]}]}]

2、整个PDF全页都进行渲染

将PDF中每一页都进行渲染为高清位图,再对每一页进行OCR。但这将导致计算量飙升,原本800页中只有10%存在图片即需要OCR的只有80页,但这种简单粗暴的方式导致OCR计算量直接翻十倍。极端情况下可能及只有一两页文档存在图片,但此方案还是会将整个文档的每页都提交OCR,导致PDF解析速度严重缓慢,图片DPI为200-300。

3、只对PDF中的“含图页”进行渲染

在本方案中通过快速扫描PDF定位PDF中哪些页数存在图片,对这些存在图片的当前页进行渲染然后进行OCR。这样将尽可能得平衡OCR的准确率与效率,极大的降低OCR次数,释放更多性能。

上图为对存在图片的该页渲染后得到的图片,对该图片直接进行OCR得到的结果比使用方案一对位图处理后OCR的结果还要好:

 {'text': 'p = $26 500 (0.905)m', 'confidence': 0.9309449195861816,
'text_box_position': [[738, 2136], [1272, 2121], [1275, 2200], [740, 2215]]},
{'text': '(1.1)', 'confidence': 0.9146772623062134,
'text_box_position': [[1593, 2138], [1706, 2138], [1706, 2204], [1593, 2204]]}

在此方案中由于只整页进行OCR可以直接把OCR结果作为提取到的该页文本内容。而按方案一的方式需要对提取文本、提取图片进行OCR的结果、提取文本、在提取图片OCR,将文本与OCR的结果进行按原顺序作为该页的文本内容。
  本方案的图片肯定会比方案一大很多,但由于OCR的次数是固定一次的,方案一图片可能会小一点但其图片数量比较多其整体性能也不一定会很高。

import fitz  # PyMuPDF

def get_result(self):
    """获取pdf文件提取结果
    """
    t0 = time.perf_counter()
    self.extract_text()
    self.extract_images()
    for inx,item in enumerate(self.text_list):
        if str(item).startswith('img_'):
            if self.ocr_result:
                ocr= self.ocr_result.pop(0)
                self.text_list[inx]=ocr

    logger.info(f"ocr:{self.ocr_result},images:{len(self.images_list)},txt:{len(self.text_list)}")
    elapsed = time.perf_counter() - t0
    logger.success(f"全部提取完成,耗时 {elapsed:.2f} 秒")

性能对比

这里选择了一个使用了 《程序员的数学.pdf》 进行解析提取文档中的文本信息以对比三种方案的性能,整个文档883页这里只解析200页内容用于性能对比。这里渲染出进行OCR的图片大小从500KB到2MB不等,本地环境配置较差所以OCR整体性能都不高。

方案文档页数OCR次数(图片数)耗时(秒)说明
位图OCR200>=200-根据文档情况OCR次数可能最多(一页包含多张图片)
每页OCR200200343.43不管存不存在图片一律进行图片OCR
只对图片页OCR200139223.85OCR次数最少

由于本文所使用的PDF为数学书籍包含比较多的数学公式、图表等因此包含了大量图片所以方案三和方案二的区别不是特别明显,但在图片很少的场景下两者就会有巨大的差别。存在极端情况PDF是扫描件,全部是图片方案三退化方案二,但整体看来方案三性能还是会好过方案二。


如何系统学习掌握AI大模型?

AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。

学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享

1. 成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。

在这里插入图片描述

2. 大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

在这里插入图片描述

3. 大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

在这里插入图片描述

4. 大模型行业报告

行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

在这里插入图片描述

5. 大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

6. 大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

在这里插入图片描述

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方CSDN官方认证二维码,免费领取【保证100%免费

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐