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% | - |
💡 最佳实践
-
场景分类优先
# 先分类,再选择引擎
classifier = SceneClassifier()
scene_type = classifier.classify(image)
engine_map = {
"document": "paddleocr",
"scene": "easyocr",
"printed": "tesseract"
}
ocr = OCRFlux(engine=engine_map[scene_type]) -
结果验证
# 低置信度时使用多引擎验证
result = ocr.recognize(image)
if result.confidence < 0.8:
result = ocr.recognize(
image,
engines=["paddleocr", "easyocr"],
fusion_strategy="vote"
) -
资源管理
# 使用上下文管理器
with OCRFlux() as ocr:
for image in images:
result = ocr.recognize(image)
# 自动清理资源
📚 资源链接
- GitHub: https://github.com/ocrflux/ocrflux
- 文档: https://ocrflux.readthedocs.io/
- 示例: https://github.com/ocrflux/examples
⚠️ 注意事项
- 多引擎会增加处理时间和资源消耗
- 需要安装对应的OCR引擎
- 缓存策略需要考虑存储空间
- 注意各引擎的license要求
🆚 适用场景
选择 OCRFlux 当:
- 需要处理多种类型的文档
- 追求更高的准确率
- 需要灵活的工作流
- 有多个OCR引擎可用
- 需要统一的接口
直接使用单一引擎当:
- 场景单一
- 追求极致性能
- 资源受限
- 简单场景
🔄 更新日志
- 2024.06: v1.2 - 添加工作流编排
- 2024.03: v1.1 - 支持多引擎融合
- 2023.12: v1.0 - 首次发布