视觉处理: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.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 系统实体映射
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、版面识别和表格识别。它在构造函数中初始化 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