
本文深入探讨了tesseract ocr引擎中 `--psm 2` 模式用于纯页面分割(布局检测)的实践问题。尽管官方文档指出该模式旨在仅进行页面分割而不执行ocr,但用户在实际操作中常发现此功能未被实现。文章通过验证命令揭示了这一限制,并分析了其对`pytesseract`和`layoutparser`等python封装库的影响。最后,提供了在 `--psm 2` 不可用时,实现页面分割或优化处理速度的替代策略和建议,包括后处理tesseract输出和考虑专用布局检测工具。
Tesseract OCR引擎提供了一系列页面分割模式(Page Segmentation Mode, PSM),允许用户根据输入图像的特性和期望的输出结果来指导Tesseract的分析行为。这些模式通过 --psm 参数进行设置,旨在优化文本检测和识别的准确性。
其中,--psm 2 模式在Tesseract的官方文档中被描述为“自动页面分割,但不进行方向和脚本检测(OSD)或光学字符识别(OCR)”。这使得它成为那些只需要图像布局信息(如文本块、段落、行和单词的边界框),而不需要实际识别文本内容的用户的理想选择。例如,当用户拥有自己的定制OCR模型,或仅需进行文档结构分析时,纯页面分割可以显著提高处理效率。
尽管 --psm 2 模式在理论上非常有用,但在实际使用中,用户可能会发现它并未按预期工作。这通常是因为该模式在特定Tesseract版本或编译环境中并未被完全实现。要验证您的Tesseract安装是否支持 --psm 2,可以通过命令行执行以下命令:
tesseract --help-psm 2
该命令将显示所有可用的页面分割模式及其描述。如果 --psm 2 模式后面附有 (not implemented) 字样,则表示您的Tesseract版本不支持此功能。例如,输出可能如下所示:
Page segmentation modes: 0 Orientation and script detection (OSD) only. 1 Automatic page segmentation with OSD. 2 Automatic page segmentation, but no OSD, or OCR. (not implemented) 3 Fully automatic page segmentation, but no OSD. (Default) ...
如果输出明确指出 (not implemented),那么尝试使用 --psm 2 将无法达到仅进行页面分割而不执行OCR的目的。Tesseract在执行时仍会进行OCR处理,或者根本不产生预期的输出。
当Tesseract核心程序不支持 --psm 2 时,使用Python封装库如 pytesseract 或 layoutparser 也会受到影响。即使在这些库中明确指定 --psm 2 配置,底层Tesseract引擎仍会执行完整的OCR过程,导致处理速度缓慢,并且返回的数据中包含不必要的OCR文本信息。
例如,在使用 pytesseract 的 image_to_data 函数时:
import cv2 import pytesseract # 假设 img_path 是图片路径 img = cv2.imread(img_path) # 即使指定 --psm 2,如果底层Tesseract不支持,仍会执行OCR layout_info = pytesseract.image_to_data(img, config='tsv --psm 2', output_type='data.frame')
或者使用 layoutparser 的 TesseractAgent 时:
import layoutparser as lp # 假设 img_path 是图片路径 ocr_agent = lp.TesseractAgent() # layoutparser的TesseractAgent默认也会调用Tesseract进行OCR # 且没有直接的参数来禁用OCR,如果需要纯分割,需在Tesseract层面解决 res = ocr_agent.detect(img_path, return_response=True) layout_info = res['data'] # 仍然包含OCR输出
在这些情况下,layout_info 数据框中依然会包含OCR结果,并且处理时间并不会因为指定了 --psm 2 而缩短。
鉴于 --psm 2 模式可能未实现,用户需要考虑其他方法来实现页面分割或优化处理速度。
如果您的Tesseract版本不支持纯页面分割,但您仍希望利用Tesseract的分割能力,可以采取以下策略:
以 pytesseract 为例,您可以这样操作:
import cv2 import pytesseract img_path = "your_image.png" # 替换为您的图片路径 img = cv2.imread(img_path) # 使用默认或支持分割的PSM(例如--psm 3),然后过滤结果 # 这里我们不指定--psm 2,让Tesseract执行默认的OCR和分割 layout_data = pytesseract.image_to_data(img, output_type=pytesseract.Output.DATAFRAME) # 过滤掉置信度为-1的行(通常表示非文本或边界信息) # 并且只保留与布局相关的列,例如 'level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height' # 丢弃 'text' 和 'conf' 列(如果不需要) pure_layout_info = layout_data[layout_data.conf != -1].drop(columns=['text', 'conf'], errors='ignore') print(pure_layout_info.head())
这种方法虽然没有避免OCR的计算开销,但确保了您只处理和存储布局信息。
如果Tesseract的OCR处理时间是关键瓶颈,并且您只需要布局检测,那么考虑使用专门的布局检测库或模型可能更有效。
layoutparser 结合其他模型: layoutparser 库本身是一个强大的布局分析工具,它不仅支持Tesseract作为OCR后端,还支持多种其他布局检测模型(如Detectron2、PaddlePaddle等)。您可以利用 layoutparser 的布局检测功能,而不依赖其Tesseract OCR代理。
import layoutparser as lp import cv2 img_path = "your_image.png" # 替换为您的图片路径 image = cv2.imread(img_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # layoutparser通常期望RGB格式 # 示例:使用一个基于深度学习的布局检测模型 # 这里以一个预训练的Detectron2模型为例 # 您可能需要安装detectron2以及相关的依赖 # model = lp.models.Detectron2LayoutModel( # config_path="lp://PubLayNet/faster_rcnn_R_50_FPN_3x/config", # model_path=None, # 使用预训练模型 # extra_config=["MODEL.ROI_HEADS.SCORE_THRESH_TEST", 0.8], # label_map=lp.models.PubLayNet.LABEL_MAP # ) # 对于简单的应用,可以考虑基于规则或传统CV的布局方法 # 或者寻找其他轻量级的布局检测模型 # 如果您有其他布局检测模型,可以这样使用: # layout = model.detect(image) # print(layout)
请注意,使用深度学习模型通常需要GPU支持才能达到最佳性能,并且可能需要额外的安装配置。
如果您的工作流程中OCR是不可避免的,但希望提高整体处理速度,可以考虑以下优化措施:
Tesseract的 --psm 2 模式旨在提供纯页面分割功能,但其在不同版本中的实现状态不一,用户在依赖此功能前务必通过 tesseract --help-psm 2 命令进行验证。当该模式不可用时,可以通过对Tesseract的完整输出进行后处理来提取布局信息,或转向更专业的布局检测库(如 layoutparser 结合其他模型)以获得更高的效率和灵活性。同时,对图像进行适当的预处理和优化Tesseract的配置,也能有效提升整体处理速度。
以上就是Tesseract页面分割模式--psm 2的限制与替代方案的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号