OCR 模型评估正面临传统基准饱和的困境:如 CER(字符错误率)和 WER(词错误率)在印刷体上已趋完美,但真实场景中手写、多语言、噪声干扰下的表现差异巨大。类似 LMSYS Chatbot Arena 的用户偏好投票机制,能捕捉人类感知质量,提供更贴近实际的排名。为此,我们构建 OCR Arena 式互动游乐场:用户上传图像/PDF,两款匿名 OCR 模型实时提取文本,用户一键投票,ELO 算法动态更新排行榜。该平台融合用户主观偏好与客观指标,支持自定义数据集评估多模型推理。
系统架构设计
平台采用前后端分离架构,前端基于 React + Tailwind,确保响应式 UI,支持拖拽上传 PDF/JPEG/PNG(最大 10MB)。核心流程:用户上传 → 随机配对两模型(e.g. PaddleOCR vs. EasyOCR)→ 异步推理 → SSE 推送实时结果 → 并排显示提取文本 → 用户投票(更好/平局/更差)→ 更新 ELO。
后端用 FastAPI + Redis 队列(RQ worker),处理并发上传。推理服务隔离:每个模型独立 Docker 容器,预热 GPU(如 NVIDIA A10),使用 vLLM 或 Transformers 加速。数据库 PostgreSQL 存储战斗记录(image_id, model_a/b, texts, vote)、用户会话(匿名)、ELO 分数(初始 1200)。ELO 更新公式:新分 = 旧分 + K * (实际得分 - 预期得分),K=32,预期基于分差 logistic。
风险控制:队列限流(max 100 并发),超时 30s 回退默认模型;投票防刷:IP/设备指纹限频(1min 3 次),异常检测(单一模型胜率 >95% 暂停)。
模型集成与多样数据集
选取 8 个开源 OCR 模型覆盖场景:
- 传统规则+DL:Tesseract 5.3(轻量,多语言),PaddleOCR PP-OCRv4(中文强,速度快)。
- 端到端 DL:EasyOCR(易用,180+语言),MMOCR(文本检测+识别,ABINet 骨干)。
- 现代 VLM:TrOCR-base(Transformer,打印/手写),Qwen2-VL-2B(多模态,布局感知)。
- 闭源 API:GPT-4o-mini(高精度,贵),Gemini-1.5-flash(平衡)。
部署参数:batch_size=1,max_length=4096,half-precision FP16 省显存。合成数据集:用 TextRecognitionDataGenerator 生成 10k 样本(模糊、旋转、曲面、多字体),混真实 ICDAR/SVT 等。用户上传实时评估,GT 可选(私有模式)。
客观指标管道:提取文本后,计算 CER/WER(jiwer 库),布局 IoU(若有 bbox)。自定义指标:语义相似(SentenceTransformer cosine),公式解析准确(SymPy)。结果融合:总分 = 0.6用户 ELO + 0.4平均 CER^{-1}。
前后端实现要点
前端:
const handleUpload = async (file) => {
const formData = new FormData();
formData.append('image', file);
const res = await fetch('/api/battle', { method: 'POST', body: formData });
const { battle_id } = await res.json();
const eventSource = new EventSource(`/sse/${battle_id}`);
eventSource.onmessage = (e) => {
const data = JSON.parse(e.data);
setResults(data.results);
};
};
投票按钮:POST /vote/{battle_id},{ winner: 'a' | 'b' | 'tie' }。
后端:
from fastapi import FastAPI, UploadFile
from rq import Queue
from redis import Redis
import paddleocr
app = FastAPI()
redis_conn = Redis()
q = Queue(connection=redis_conn)
@app.post("/api/battle")
async def start_battle(file: UploadFile):
job = q.enqueue(ocr_battle, file.file.read(), models=['paddle', 'easy'])
return {"battle_id": job.id}
def ocr_battle(image_bytes, models):
results = {}
for m in models:
if m == 'paddle': results[m] = PaddleOCR().ocr(image_bytes)
sse_publish(battle_id, results)
实时性:SSE 比 WebSocket 轻量,断线重连简单。
评估管道与落地参数
战斗结束自动评测:
- CER/WER:阈值 <0.05 高置信,合成 GT 验证。
- 自定义:表格提取 F1(布局 bbox 匹配),手写置信(entropy <0.1)。
- 排行更新:每日 cron 聚合 ELO,Top-10 展示胜率/战斗数。
参数清单:
| 参数 |
值 |
说明 |
| 队列 TTL |
60s |
超时重试 3 次 |
| ELO K |
32 |
新模型快速收敛 |
| 投票权重 |
1/IP |
防刷 |
| GPU 批次 |
4 |
A10 峰值吞吐 |
| 成本阈值 |
$0.01/战斗 |
云 GPU autoscaling |
回滚:A/B 测试新模型(10% 流量),胜率 >50% 上线。
部署与监控
Docker Compose 本地:Nginx + FastAPI + RQ + Postgres + Redis。
云部署:Kubernetes (EKS/GKE),HorizontalPodAutoscaler(CPU>70% 扩容),模型 Pod GPU shared(NVIDIA device plugin)。
监控:Prometheus + Grafana(队列深度、ELO 分布、CER 均值),Sentry 错误,成本:AWS/GCP 按需 GPU(spot 实例省 70%)。
用户增长:首日 100 战斗,月 10k,成本 $50(优化后)。
平台已在 https://ocrarena.ai 验证有效,引用:“Current Rankings with ELO and Win Rate。” 扩展:集成 OmniDocBench 等基准,私有企业版(自定义模型)。
通过该平台,不仅民主化 OCR 评估,还驱动模型迭代。开源代码 GitHub,欢迎 PR!
(字数:1256)