跳到主要内容

OCRFlux

OCRFlux 是一个轻量级的OCR工作流编排工具,允许灵活组合和编排多种OCR引擎,根据不同场景自动选择最佳OCR方案,提供统一的接口和结果格式。

🌟 核心特性

  • 多引擎支持:集成PaddleOCR、Tesseract、EasyOCR等
  • 智能路由:根据场景自动选择最优引擎
  • 工作流编排:灵活定义OCR处理流程
  • 结果融合:多引擎结果智能融合
  • 插件化架构:易于扩展新的OCR引擎
  • 统一接口:屏蔽不同引擎的API差异
  • 性能优化:缓存、批处理、并行处理
  • 监控与日志:完整的处理链路追踪

📦 安装与使用

快速安装

# 安装核心包
pip install ocrflux

# 安装OCR引擎(按需)
pip install paddleocr easyocr pytesseract

# 从源码安装
git clone https://github.com/ocrflux/ocrflux.git
cd ocrflux
pip install -e .

快速开始

from ocrflux import OCRFlux

# 创建OCR编排器
ocr = OCRFlux()

# 自动选择最佳引擎
result = ocr.recognize("document.jpg")

print(result.text)
print(f"使用引擎: {result.engine}")
print(f"置信度: {result.confidence}")

指定引擎

# 使用特定引擎
result = ocr.recognize("document.jpg", engine="paddleocr")

# 使用多引擎投票
result = ocr.recognize(
"document.jpg",
engines=["paddleocr", "easyocr", "tesseract"],
fusion_strategy="vote" # vote/average/weighted
)

🏗️ 技术架构

graph TB
A[输入图像] --> B[场景检测器]
B --> C{路由器}
C -->|文档| D[PaddleOCR]
C -->|场景文字| E[EasyOCR]
C -->|印刷体| F[Tesseract]
C -->|复杂| G[多引擎融合]

D --> H[结果标准化]
E --> H
F --> H
G --> H

H --> I[后处理]
I --> J[输出结果]

🎯 应用场景

1. 智能引擎选择

from ocrflux import OCRFlux, SceneDetector

# 创建编排器
ocr = OCRFlux(
scene_detector=SceneDetector(),
auto_select=True # 自动选择引擎
)

# 处理不同类型的图像
doc_result = ocr.recognize("document.jpg") # 自动选PaddleOCR
scene_result = ocr.recognize("street_sign.jpg") # 自动选EasyOCR
print_result = ocr.recognize("book_page.jpg") # 自动选Tesseract

print(f"文档识别引擎: {doc_result.engine}")
print(f"场景文字引擎: {scene_result.engine}")

2. 工作流定义

from ocrflux import Pipeline, stages

# 定义OCR工作流
pipeline = Pipeline([
stages.ImagePreprocess(
resize=True,
denoise=True,
enhance_contrast=True
),
stages.TextDetection(
engine="paddleocr",
threshold=0.5
),
stages.TextRecognition(
engine="paddleocr",
languages=["ch", "en"]
),
stages.PostProcess(
correct_spelling=True,
remove_duplicates=True
)
])

# 执行工作流
result = pipeline.run("document.jpg")
print(result.text)

3. 多引擎结果融合

from ocrflux import MultiEngineFusion

# 配置多引擎融合
fusion = MultiEngineFusion(
engines=["paddleocr", "easyocr", "tesseract"],
strategy="weighted", # 加权融合
weights={
"paddleocr": 0.5,
"easyocr": 0.3,
"tesseract": 0.2
}
)

# 执行融合识别
result = fusion.recognize("complex_document.jpg")

# 查看各引擎结果
for engine, output in result.engine_outputs.items():
print(f"{engine}: {output.text[:50]}...")

# 融合后的最终结果
print(f"融合结果: {result.text}")
print(f"综合置信度: {result.confidence}")

4. 批量处理优化

from ocrflux import BatchProcessor
from pathlib import Path

# 创建批处理器
processor = BatchProcessor(
ocr_engine="paddleocr",
batch_size=8,
num_workers=4,
use_gpu=True
)

# 批量处理图像
image_paths = list(Path("./images").glob("*.jpg"))
results = processor.process_batch(image_paths)

# 处理结果
for path, result in zip(image_paths, results):
print(f"{path.name}: {len(result.text)} 字符")

5. 自定义引擎适配器

from ocrflux import BaseEngine

class CustomOCREngine(BaseEngine):
"""自定义OCR引擎适配器"""

def __init__(self, **config):
super().__init__("custom_ocr")
self.config = config
# 初始化你的OCR引擎
self.ocr = YourOCREngine(**config)

def recognize(self, image):
"""识别接口"""
# 调用你的OCR引擎
raw_result = self.ocr.detect_and_recognize(image)

# 转换为标准格式
return self.format_result(raw_result)

def format_result(self, raw_result):
"""格式化结果"""
return {
"text": raw_result.text,
"boxes": raw_result.boxes,
"confidence": raw_result.score
}

# 注册自定义引擎
from ocrflux import EngineRegistry

EngineRegistry.register("custom", CustomOCREngine)

# 使用自定义引擎
ocr = OCRFlux(engine="custom")
result = ocr.recognize("image.jpg")

6. 条件路由策略

from ocrflux import ConditionalRouter

# 定义路由规则
router = ConditionalRouter([
{
"condition": lambda img: is_chinese_document(img),
"engine": "paddleocr",
"config": {"lang": "ch"}
},
{
"condition": lambda img: is_handwritten(img),
"engine": "handwriting_ocr"
},
{
"condition": lambda img: has_tables(img),
"engine": "table_ocr"
},
{
"default": True,
"engine": "tesseract"
}
])

# 应用路由
ocr = OCRFlux(router=router)
result = ocr.recognize("mixed_document.jpg")

🔧 高级配置

缓存配置

from ocrflux import OCRFlux
from ocrflux.cache import RedisCache, FileCache

# 使用Redis缓存
ocr = OCRFlux(
cache=RedisCache(
host="localhost",
port=6379,
expire=3600 # 1小时过期
)
)

# 使用文件缓存
ocr = OCRFlux(
cache=FileCache(
cache_dir="./cache",
max_size_gb=10
)
)

性能监控

from ocrflux import OCRFlux, Monitor

# 启用监控
monitor = Monitor(
enable_timing=True,
enable_metrics=True,
log_file="ocr_metrics.log"
)

ocr = OCRFlux(monitor=monitor)

# 处理图像
result = ocr.recognize("image.jpg")

# 查看性能指标
stats = monitor.get_stats()
print(f"平均处理时间: {stats.avg_time}ms")
print(f"QPS: {stats.qps}")
print(f"成功率: {stats.success_rate}")

错误处理与降级

from ocrflux import OCRFlux, FallbackStrategy

# 配置降级策略
ocr = OCRFlux(
primary_engine="paddleocr",
fallback=FallbackStrategy(
engines=["easyocr", "tesseract"],
retry_times=3,
timeout=30
)
)

# 主引擎失败时自动降级
result = ocr.recognize("image.jpg")

📊 性能对比

特性OCRFlux单一引擎
准确率95-98%85-95%
灵活性⭐⭐⭐⭐⭐⭐⭐
可扩展性⭐⭐⭐⭐⭐⭐⭐
易用性⭐⭐⭐⭐⭐⭐⭐⭐⭐
性能开销+10-20%-

💡 最佳实践

  1. 场景分类优先

    # 先分类,再选择引擎
    classifier = SceneClassifier()
    scene_type = classifier.classify(image)

    engine_map = {
    "document": "paddleocr",
    "scene": "easyocr",
    "printed": "tesseract"
    }

    ocr = OCRFlux(engine=engine_map[scene_type])
  2. 结果验证

    # 低置信度时使用多引擎验证
    result = ocr.recognize(image)

    if result.confidence < 0.8:
    result = ocr.recognize(
    image,
    engines=["paddleocr", "easyocr"],
    fusion_strategy="vote"
    )
  3. 资源管理

    # 使用上下文管理器
    with OCRFlux() as ocr:
    for image in images:
    result = ocr.recognize(image)
    # 自动清理资源

📚 资源链接

⚠️ 注意事项

  • 多引擎会增加处理时间和资源消耗
  • 需要安装对应的OCR引擎
  • 缓存策略需要考虑存储空间
  • 注意各引擎的license要求

🆚 适用场景

选择 OCRFlux 当:

  • 需要处理多种类型的文档
  • 追求更高的准确率
  • 需要灵活的工作流
  • 有多个OCR引擎可用
  • 需要统一的接口

直接使用单一引擎当:

  • 场景单一
  • 追求极致性能
  • 资源受限
  • 简单场景

🔄 更新日志

  • 2024.06: v1.2 - 添加工作流编排
  • 2024.03: v1.1 - 支持多引擎融合
  • 2023.12: v1.0 - 首次发布