Hotdry.
ai-systems

构建 OCR Arena 互动评测游乐场:实时多模型 OCR 对比与 ELO 排名

手把手构建类似 OCR Arena 的实时互动平台,支持图像/PDF 上传、匿名模型盲测、用户投票生成 ELO 排行,以及 CER/WER 等自动化评估管道。

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}。

前后端实现要点

前端

// Upload & Battle
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();
  // SSE 监听
  const eventSource = new EventSource(`/sse/${battle_id}`);
  eventSource.onmessage = (e) => {
    const data = JSON.parse(e.data);
    setResults(data.results); // 并排显示 text_a, text_b
  };
};

投票按钮: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 通知

实时性: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)

查看归档