agentic_huge_data_base / wiki
页面 RAGFlow · 6.4 视觉处理:OCR 与布局识别·DeepWiki 中文全文译文

6.4 · 视觉处理:OCR 与布局识别(Vision Processing: OCR and Layout Recognition)

复杂文档理解与引用检索 · 本章是 RAGFlow DeepWiki 中文译文的独立章节页,保留原始链接、源码锚点、模块标签和章节层级。

项目RAGFlow 章节6.4 状态全文译文 模块测试、发布与运维、入库与解析、文档对象与元数据、系统架构
源码线索
  • admin/build_cli_release.sh
  • api/utils/__init__.py
  • api/utils/crypt.py
  • api/utils/file_utils.py
  • deepdoc/parser/figure_parser.py
  • deepdoc/parser/pdf_parser.py
  • deepdoc/parser/ppt_parser.py
  • deepdoc/vision/__init__.py
  • deepdoc/vision/layout_recognizer.py
  • deepdoc/vision/ocr.py
模块标签
  • 测试、发布与运维
  • 入库与解析
  • 文档对象与元数据
  • 系统架构
  • 界面与交互

中文译文

视觉处理:OCR 与布局识别(中文译文)

原始 DeepWiki 页面:https://deepwiki.com/infiniflow/ragflow/6.4-vision-processing-ocr-and-layout-recognition
翻译时间:2026-05-27T08:44:27.745Z
翻译模型:deepseek-chat
原文字符数:12264
项目:RAGFlow (ragflow)

---

视觉处理:OCR 与版面识别

相关源文件

以下文件为本维基页面的生成提供了上下文:

  • admin/build_cli_release.sh
  • api/utils/__init__.py
  • api/utils/crypt.py
  • api/utils/file_utils.py
  • deepdoc/parser/figure_parser.py
  • deepdoc/parser/pdf_parser.py
  • deepdoc/parser/ppt_parser.py
  • deepdoc/vision/__init__.py
  • deepdoc/vision/layout_recognizer.py
  • deepdoc/vision/ocr.py
  • deepdoc/vision/operators.py
  • deepdoc/vision/postprocess.py
  • deepdoc/vision/recognizer.py
  • deepdoc/vision/t_ocr.py
  • deepdoc/vision/t_recognizer.py
  • deepdoc/vision/table_structure_recognizer.py
  • rag/settings.py

本文档介绍 RAGFlow 用于 OCR(光学字符识别)和版面分析的视觉处理系统。该系统可以识别文本区域、识别文本内容、对文档区域进行分类(标题、表格、图形等)以及检测表格结构。关于解析后的文档内容如何进行片段切分和嵌入向量处理,请参阅 6.3 内容增强与嵌入向量。关于不同文档解析策略的详细信息,请参阅 6.1 文档解析策略

OCR 系统架构

OCR 系统由多个核心类组成,用于检测和识别图像中的文本。该系统使用 ONNX 模型进行文本检测(det.onnx)和识别(rec.onnx)。OCR 类负责管理这些模型,并提供用于整页处理的高级方法。

系统到代码实体的空间映射

下图将高级 OCR 系统组件与其在代码库中的具体类实现和模型加载逻辑进行了关联。

标题:OCR 系统实体映射

graph TB
    subgraph "OCR_类空间"
        OCR["OCR<br/>deepdoc/vision/ocr.py"]
        text_detector["text_detector: List[TextDetector]<br/>每个 GPU 一个实例"]
        text_recognizer["text_recognizer: List[TextRecognizer]<br/>每个 GPU 一个实例"]
    end

    subgraph "TextDetector_实体"
        DetectorClass["TextDetector<br/>deepdoc/vision/ocr.py"]
        det_predictor["predictor: ort.InferenceSession<br/>ONNX 模型 (det.onnx)"]
        det_preprocess["preprocess_op<br/>DetResizeForTest, NormalizeImage"]
        det_postprocess["postprocess_op<br/>DBPostProcess"]
    end

    subgraph "TextRecognizer_实体"
        RecognizerClass["TextRecognizer<br/>deepdoc/vision/ocr.py"]
        rec_predictor["predictor: ort.InferenceSession<br/>ONNX 模型 (rec.onnx)"]
        rec_postprocess["postprocess_op<br/>CTCLabelDecode"]
        rec_batch["rec_batch_num: 16<br/>批处理"]
    end

    subgraph "模型加载逻辑"
        load_model["load_model()<br/>deepdoc/vision/ocr.py:71-136"]
        onnx_session["ort.InferenceSession<br/>CPU 或 CUDA 提供者"]
        loaded_models["loaded_models: dict<br/>全局缓存"]
    end

    OCR --> text_detector
    OCR --> text_recognizer
    text_detector --> DetectorClass
    text_recognizer --> RecognizerClass

    DetectorClass --> det_predictor
    DetectorClass --> det_preprocess
    DetectorClass --> det_postprocess

    RecognizerClass --> rec_predictor
    RecognizerClass --> rec_postprocess
    RecognizerClass --> rec_batch

    det_predictor --> load_model
    rec_predictor --> load_model
    load_model --> onnx_session
    load_model --> loaded_models

来源: 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 执行流程

sequenceDiagram
    participant 调用者
    participant OCR
    participant TextDetector
    participant TextRecognizer
    participant ONNXRuntime

    调用者->>OCR: __call__(img, device_id)
    OCR->>TextDetector: __call__(img)

    TextDetector->>TextDetector: 预处理 (DetResizeForTest, NormalizeImage)
    TextDetector->>ONNXRuntime: predictor.run(det.onnx)
    ONNXRuntime-->>TextDetector: 概率图
    TextDetector->>TextDetector: 后处理 (DBPostProcess)<br/>提取轮廓,过滤边界框
    TextDetector-->>OCR: dt_boxes (边界框)

    OCR->>OCR: sorted_boxes()<br/>从上到下、从左到右排序

    loop 对每个边界框
        OCR->>OCR: get_rotate_crop_image()<br/>裁剪并旋转文本区域
    end

    OCR->>TextRecognizer: __call__(img_crop_list)
    TextRecognizer->>TextRecognizer: 批预处理<br/>resize_norm_img()
    TextRecognizer->>ONNXRuntime: predictor.run(rec.onnx)
    ONNXRuntime-->>TextRecognizer: CTC 预测
    TextRecognizer->>TextRecognizer: postprocess_op (CTCLabelDecode)<br/>转换为文本
    TextRecognizer-->>OCR: rec_res (文本, 置信度)

    OCR->>OCR: 按 drop_score (0.5) 过滤
    OCR-->>调用者: List[(bbox, (text, confidence))]

来源: 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

标题:版面识别组件

graph TB
    subgraph "版面识别器类"
        BaseRecognizer["Recognizer<br/>deepdoc/vision/recognizer.py"]
        LayoutRecONNX["LayoutRecognizer<br/>layout_recognizer.py"]
        LayoutRecAscend["AscendLayoutRecognizer<br/>(昇腾 NPU)"]
    end

    subgraph "处理管线"
        Preprocess["preprocess()<br/>调整大小、填充、归一化"]
        Inference["ONNX/昇腾推理"]
        Postprocess["postprocess()<br/>NMS、坐标缩放"]
        TagBoxes["用版面类型标记 OCR 边界框"]
        Cleanup["layouts_cleanup()<br/>移除重叠的版面"]
    end

    BaseRecognizer --> LayoutRecONNX
    BaseRecognizer --> LayoutRecAscend

    Preprocess --> Inference
    Inference --> Postprocess
    Postprocess --> TagBoxes
    TagBoxes --> Cleanup

来源: 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 数据流

graph TB
    subgraph "TableStructureRecognizer_实体"
        TSRClass["TableStructureRecognizer<br/>table_structure_recognizer.py"]
        TSRLabels["labels = [<br/>'table', 'table column',<br/>'table row', 'table column header',<br/>'table projected row header',<br/>'table spanning cell']"]
    end

    subgraph "表格构建逻辑"
        IdentifyCaption["is_caption()<br/>table_structure_recognizer.py"]
        BlockType["blockType()<br/>table_structure_recognizer.py"]
        ConstructTable["construct_table()<br/>table_structure_recognizer.py"]
    end

    TSRClass --> TSRLabels
    TSRLabels --> IdentifyCaption
    IdentifyCaption --> BlockType
    BlockType --> ConstructTable

来源: 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、版面识别和表格识别。它在构造函数中初始化 OCRLayoutRecognizerTableStructureRecognizer 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_MB2048每个会话的最大显存 deepdoc/vision/ocr.py:107
算子内线程数OCR_INTRA_OP_NUM_THREADS2算子内部的并行度 deepdoc/vision/ocr.py:100
算子间线程数OCR_INTER_OP_NUM_THREADS2算子之间的并行度 deepdoc/vision/ocr.py:101
竞技场策略OCR_ARENA_EXTEND_STRATEGYkNextPowerOfTwo内存分配策略 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