
RAGFlow OCR实现机制
概述
RAGFlow 的 OCR(光学字符识别)系统是其文档理解的核心组件,基于深度学习模型实现了高精度的文本检测和识别。该系统位于 deepdoc/vision
模块中,采用了分离式的文本检测和文本识别架构。
系统架构
核心组件
RAGFlow 的 OCR 系统主要由以下几个核心模块组成:
-
OCR 主类 (
deepdoc/vision/ocr.py
)TextDetector
: 负责文本区域检测TextRecognizer
: 负责文本内容识别OCR
: 统一接口类,整合检测和识别功能
-
布局识别器 (
deepdoc/vision/layout_recognizer.py
)LayoutRecognizer
: 识别文档布局结构- 支持 10 种基本布局类型:文本、标题、图像、图像标题、表格、表格标题、页眉、页脚、参考文献、公式
-
图像处理操作符 (
deepdoc/vision/operators.py
)- 提供各种图像预处理和后处理操作
-
后处理模块 (
deepdoc/vision/postprocess.py
)DBPostProcess
: DB 文本检测后处理CTCLabelDecode
: CTC 文本识别解码
模型架构
输入图像
↓
文本检测模型 (TextDetector)
↓
检测框筛选与排序
↓
文本区域裁剪
↓
文本识别模型 (TextRecognizer)
↓
置信度过滤
↓
输出文本结果
技术实现细节
1. 文本检测 (TextDetector)
模型基础: 基于 DB (Differentiable Binarization) 算法的文本检测模型
关键参数:
pre_process_list = [{
'DetResizeForTest': {
'limit_side_len': 960,
'limit_type': "max",
}
}, {
'NormalizeImage': {
'std': [0.229, 0.224, 0.225],
'mean': [0.485, 0.456, 0.406],
'scale': '1./255.',
'order': 'hwc'
}
}]
postprocess_params = {
"name": "DBPostProcess",
"thresh": 0.3,
"box_thresh": 0.5,
"max_candidates": 1000,
"unclip_ratio": 1.5,
"use_dilation": False,
"score_mode": "fast",
"box_type": "quad"
}
处理流程:
- 图像预处理:缩放、归一化、通道转换
- 模型推理:ONNX Runtime 执行推理
- 后处理:阈值处理、轮廓提取、框过滤
- 检测框排序:从上到下、从左到右的阅读顺序
2. 文本识别 (TextRecognizer)
模型基础: 基于 CTC (Connectionist Temporal Classification) 的文本识别模型
关键参数:
rec_image_shape = [3, 48, 320] # C, H, W
rec_batch_num = 16
drop_score = 0.5 # 置信度阈值
处理流程:
- 文本区域裁剪和透视变换矫正
- 图像缩放和归一化处理
- 批量推理提升效率
- CTC 解码获得文本结果
- 置信度过滤
3. 布局识别 (LayoutRecognizer)
支持的布局类型:
labels = [
"_background_", "Text", "Title", "Figure",
"Figure caption", "Table", "Table caption",
"Header", "Footer", "Reference", "Equation"
]
垃圾内容过滤: 系统能够自动识别和过滤页眉、页脚、版权信息等垃圾内容
模型管理
模型获取方式
RAGFlow 采用了灵活的模型管理策略:
- 本地模型: 优先使用本地
rag/res/deepdoc
目录下的模型 - 自动下载: 如果本地模型不存在,自动从 HuggingFace 下载
- 镜像支持: 支持 HuggingFace 镜像站点加速下载
if not model_dir:
try:
model_dir = os.path.join(get_project_base_directory(), "rag/res/deepdoc")
self.text_detector = TextDetector(model_dir)
self.text_recognizer = TextRecognizer(model_dir)
except Exception:
model_dir = snapshot_download(
repo_id="InfiniFlow/deepdoc",
local_dir=os.path.join(get_project_base_directory(), "rag/res/deepdoc"),
local_dir_use_symlinks=False
)
运行时优化
- ONNX Runtime: 使用 ONNX Runtime 进行模型推理,支持 CPU 和 GPU 加速
- 批量处理: 文本识别支持批量处理,提升处理效率
- 内存优化: 关闭 CPU 内存池,优化内存使用
- 重试机制: 内置推理失败重试机制,提升系统稳定性
接口使用
基本使用方式
from deepdoc.vision import OCR
import numpy as np
import cv2
# 初始化 OCR
ocr = OCR()
# 加载图像
image = cv2.imread("path/to/image.jpg")
# 执行 OCR
results = ocr(image)
# 结果格式: [(bbox, (text, confidence))]
for bbox, (text, confidence) in results:
print(f"文本: {text}, 置信度: {confidence}")
print(f"位置: {bbox}")
高级用法
# 仅检测文本位置
detection_results = ocr.detect(image)
# 识别特定区域文本
text = ocr.recognize(image, bbox)
# 自定义参数
ocr.drop_score = 0.7 # 调整置信度阈值
results = ocr(image, cls=False) # 禁用文本方向分类
性能特性
- 高精度: 针对多种文档类型优化,识别准确率高
- 高效率: 批量处理和 ONNX 推理优化,处理速度快
- 鲁棒性: 内置重试机制和异常处理,系统稳定性强
- 灵活性: 支持参数调整和模块化使用
测试工具
RAGFlow 提供了便捷的测试工具:
# OCR 测试
python deepdoc/vision/t_ocr.py --inputs=path_to_images_or_pdfs --output_dir=./ocr_outputs
# 布局识别测试
python deepdoc/vision/t_recognizer.py --inputs=path_to_images_or_pdfs --threshold=0.2 --mode=layout --output_dir=./layout_outputs
总结
RAGFlow 的 OCR 系统通过深度集成检测和识别模型,结合布局分析和智能后处理,为文档理解提供了强大的文本提取能力。其模块化设计和丰富的配置选项,使其能够适应各种应用场景的需求。
Copyright © 2017 - 2025 boboidea.com All Rights Reserved 波波创意软件工作室 版权所有 【转载请注明出处】