视觉处理:OCR 与布局识别
视觉处理:OCR 与版面识别
相关源文件
以下文件为本维基页面的生成提供了上下文:
admin/build_cli_release.shapi/utils/__init__.pyapi/utils/crypt.pyapi/utils/file_utils.pydeepdoc/parser/figure_parser.pydeepdoc/parser/pdf_parser.pydeepdoc/parser/ppt_parser.pydeepdoc/vision/__init__.pydeepdoc/vision/layout_recognizer.pydeepdoc/vision/ocr.pydeepdoc/vision/operators.pydeepdoc/vision/postprocess.pydeepdoc/vision/recognizer.pydeepdoc/vision/t_ocr.pydeepdoc/vision/t_recognizer.pydeepdoc/vision/table_structure_recognizer.pyrag/settings.py
本文档介绍 RAGFlow 用于 OCR(光学字符识别)和版面分析的视觉处理系统。该系统可以识别文本区域、识别文本内容、对文档区域进行分类(标题、表格、图形等)以及检测表格结构。关于解析后的文档内容如何进行片段切分和嵌入向量处理,请参阅 6.3 内容增强与嵌入向量。关于不同文档解析策略的详细信息,请参阅 6.1 文档解析策略。
OCR 系统架构
OCR 系统由多个核心类组成,用于检测和识别图像中的文本。该系统使用 ONNX 模型进行文本检测(det.onnx)和识别(rec.onnx)。OCR 类负责管理这些模型,并提供用于整页处理的高级方法。
系统到代码实体的空间映射
下图将高级 OCR 系统组件与其在代码库中的具体类实现和模型加载逻辑进行了关联。
标题:OCR 系统实体映射
来源: deepdoc/vision/ocr.py:71-136, deepdoc/vision/ocr.py:139-151, deepdoc/vision/ocr.py:542-585
OCR 类初始化
OCR 类根据 settings.PARALLEL_DEVICES 初始化多个检测器和识别器实例。每个实例可以通过 device_id 参数指定特定的 GPU,从而支持跨多个文档或页面进行并行 OCR 处理 deepdoc/vision/ocr.py:542-585。
文本检测与识别管线
OCR 分两个阶段运行:检测(定位文本区域)和识别(读取文本)。
标题:OCR 执行流程
来源: deepdoc/vision/ocr.py:142-151, deepdoc/vision/ocr.py:509-537, deepdoc/vision/ocr.py:587-640
检测阶段(TextDetector)
检测器使用 DB(可微分二值化)模型识别文本区域 deepdoc/vision/ocr.py:284-301。
| 步骤 | 方法 | 描述 |
|---|---|---|
| 1. 预处理 | DetResizeForTest | 将图像调整到最大边长为 960 像素 deepdoc/vision/ocr.py:287 |
| 2. 归一化 | NormalizeImage | 均值=[0.485, 0.456, 0.406],标准差=[0.229, 0.224, 0.225] deepdoc/vision/operators.py:122-123 |
| 3. 推理 | predictor.run() | ONNX 模型输出概率图 deepdoc/vision/ocr.py:326 |
| 4. 后处理 | DBPostProcess | 提取轮廓并按分数过滤 deepdoc/vision/ocr.py:295 |
识别阶段(TextRecognizer)
识别器使用 CTC(连接主义时间分类)模型将裁剪后的文本区域转换为字符串。默认情况下,它以 16 个区域为一批进行处理 deepdoc/vision/ocr.py:142。
乱码文本检测
系统使用正则表达式模式识别乱码文本,特别是查找类似 (cid:123) 的 CID 模式,这通常表示 PDF 中存在字体编码问题 deepdoc/vision/layout_recognizer.py:70-71。
版面识别系统
版面识别将文档区域分类为语义类型。RAGFlow 支持基于 ONNX 和基于昇腾的识别器 deepdoc/vision/layout_recognizer.py:48-60。
标题:版面识别组件
来源: deepdoc/vision/layout_recognizer.py:33-46, deepdoc/vision/recognizer.py:31-52, deepdoc/parser/pdf_parser.py:75-90
垃圾版面过滤
系统使用 Counter 跟踪重复项,将跨页面频繁出现的页眉、页脚和参考文献识别为"垃圾"内容 deepdoc/vision/layout_recognizer.py:154-162。
表格结构识别
表格结构识别(TSR)可以识别行、列和表头,从而实现结构化数据提取 deepdoc/vision/table_structure_recognizer.py:30-52。
标题:TSR 数据流
来源: deepdoc/vision/table_structure_recognizer.py:30-40, deepdoc/vision/table_structure_recognizer.py:114-118, deepdoc/vision/table_structure_recognizer.py:152-193
表格组件分类
blockType 函数根据正则表达式模式将表格单元格分类为 Dt(日期)、Nu(数字)、Ca(代码/地址)或 Tx(文本)等类型 deepdoc/vision/table_structure_recognizer.py:121-150。
图形处理与视觉大语言模型集成
RAGFlow 可以通过使用视觉语言模型(VLM)描述图像内容来增强图形提取效果。VisionFigureParser 类负责管理这种增强功能 deepdoc/parser/figure_parser.py:59-60。
VLM 增强流程
系统尝试使用 get_tenant_default_model_by_type 查找租户的默认 IMAGE2TEXT 模型 deepdoc/parser/figure_parser.py:100-101。如果可用,它会将图像和周围的文本上下文传递给 VLM,以生成描述,然后将这些描述与文档一起索引 deepdoc/parser/figure_parser.py:112-132。
来源: deepdoc/parser/figure_parser.py:93-132, deepdoc/parser/figure_parser.py:135-163
PDF 处理与视觉集成
RAGFlowPdfParser 协调 OCR、版面识别和表格识别。它在构造函数中初始化 OCR、LayoutRecognizer 和 TableStructureRecognizer deepdoc/parser/pdf_parser.py:70-91。
拼接特征
解析器使用 XGBoost 模型 updown_cnt_mdl 判断两个文本块是否应该拼接 deepdoc/parser/pdf_parser.py:92-101。特征包括版面类型匹配、垂直距离以及从 rag_tokenizer 派生的语言模式 deepdoc/parser/pdf_parser.py:131-175。
模型加载与设备管理
推理使用 ONNX Runtime,支持 CPU 和 CUDA 提供者。系统提供对线程数和内存分配的显式控制,以防止多工作进程环境中的资源过度订阅。
| 参数 | 环境变量 | 默认值 | 描述 |
|---|---|---|---|
| GPU 内存限制 | OCR_GPU_MEM_LIMIT_MB | 2048 | 每个会话的最大显存 deepdoc/vision/ocr.py:107 |
| 算子内线程数 | OCR_INTRA_OP_NUM_THREADS | 2 | 算子内部的并行度 deepdoc/vision/ocr.py:100 |
| 算子间线程数 | OCR_INTER_OP_NUM_THREADS | 2 | 算子之间的并行度 deepdoc/vision/ocr.py:101 |
| 竞技场策略 | OCR_ARENA_EXTEND_STRATEGY | kNextPowerOfTwo | 内存分配策略 deepdoc/vision/ocr.py:108 |
| 竞技场收缩 | OCR_GPUMEM_ARENA_SHRINKAGE | - | 如果设置为 "1",则在执行后释放显存 deepdoc/vision/ocr.py:122-123 |
来源: deepdoc/vision/ocr.py:71-136, deepdoc/parser/pdf_parser.py:70-91, deepdoc/parser/pdf_parser.py:131-175