HuggingFace镜像/Falcon-OCR
模型介绍文件和版本分析
下载使用量0
Falcon OCR Logo

Falcon OCR

Falcon OCR 是一个拥有 3 亿参数的早期融合视觉语言模型,专为文档 OCR 设计。给定一张图像,它能够根据请求的输出格式,生成纯文本、公式的 LaTeX 代码或表格的 HTML 代码。

大多数 OCR VLM 系统采用流水线架构,由视觉编码器向独立的文本解码器提供输入,并辅以额外的特定任务粘合模块。Falcon OCR 则采用了不同的方法:单个 Transformer 从第一层开始就在共享参数空间中处理图像块和文本标记,并使用混合注意力掩码——图像标记进行双向注意力计算,而文本标记则在图像的条件下进行因果解码。

我们采用这种设计主要基于两个实际考虑。首先,它简化了接口:一个主干网络、一个解码路径,通过提示词实现任务切换,而非依赖不断增加的模块。其次,3 千万参数的模型比 9 千万参数级别的 OCR VLM 具有更低的延迟和成本,在我们基于 vLLM 的服务设置中,这转化为更高的吞吐量,根据序列长度和批处理配置的不同,通常快 2-3 倍。据我们所知,这是首次尝试将这种早期融合单栈方案直接应用于该规模的高性能文档 OCR。

链接

  • 代码与推理引擎:https://github.com/tiiuae/Falcon-Perception
  • 技术报告:https://arxiv.org/pdf/2603.27365
  • 感知模型:tiiuae/falcon-perception
  • vLLM/Docker:https://ghcr.io/tiiuae/falcon-ocr:latest

快速开始

安装

pip install "torch>=2.5" transformers pillow einops

Falcon OCR 需 PyTorch 2.5 或更新版本以支持 FlexAttention。首次调用可能会较慢,因为 torch.compile 正在构建优化内核。

单图像 OCR

import torch
from PIL import Image
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(
    "tiiuae/Falcon-OCR",
    trust_remote_code=True,
    torch_dtype=torch.bfloat16,
    device_map="auto",
)
image = Image.open("document.png")
texts = model.generate(image)  # default category is "plain"
print(texts[0])

使用 category 选择输出格式

texts = model.generate(image, category="text")     # plain text
texts = model.generate(image, category="formula")  # LaTeX
texts = model.generate(image, category="table")    # HTML table

API

model.generate(images, category="plain", **kwargs)

  • 输入:
    • images:一个 PIL.Image.Image 或图像列表
    • category:可选值为 plain、text、table、formula、caption、footnote、list-item、page-footer、page-header、section-header、title
  • 返回:list[str],每张图像对应一个提取的字符串

版面 OCR(两阶段流水线)

对于内容稀疏的文档,直接对整幅图像运行 OCR 即可获得良好效果。对于包含异构区域的密集文档(如多栏布局、表格与公式交错、小型图注等),我们提供了一个可选的两阶段流水线:

  1. 版面检测器定位页面上的各个区域。
  2. Falcon OCR 根据每个区域的类别提示,独立对每个裁剪区域执行 OCR。 我们使用 PP-DocLayoutV3 作为版面检测器。
results = model.generate_with_layout(image)
for det in results[0]:
    print(f"[{det['category']}] {det['text'][:100]}...")

批处理模式:

results = model.generate_with_layout(
    [Image.open("page1.png"), Image.open("page2.png")],
    ocr_batch_size=32,
)

布局模型在首次调用 generate_with_layout() 时延迟加载,并与 OCR 模型运行在同一 GPU 上。 返回值:list[list[dict]],每张图像对应一个列表,按阅读顺序排列:

{
    "category": "text",       # layout category
    "bbox": [x1, y1, x2, y2], # in original image pixels
    "score": 0.93,            # detection confidence
    "text": "..."             # extracted text
}

何时使用何种模式

模式最适用于使用方法
纯文本 OCR简单文档、实景照片、幻灯片、收据、发票model.generate(image)
布局 + OCR复杂多栏文档、学术论文、报告、报纸等密集页面model.generate_with_layout(image)

基准测试结果

olmOCR 基准测试

FalconOCR 与最先进 OCR 模型的类别性能比较。我们报告所有类别划分的准确率(%)。

模型平均值ArXiv 数学基础页眉/页脚微小文本多栏旧扫描件旧数学公式表格
Mistral OCR 381.785.499.993.888.982.148.868.386.1
Chandra82.081.499.888.891.982.949.273.688.2
Gemini 3 Pro80.270.699.884.090.379.247.584.984.9
PaddleOCR VL 1.579.385.498.896.980.882.639.266.484.1
PaddleOCR VL79.285.498.696.980.882.538.866.483.9
DeepSeek OCR v278.881.999.895.688.783.633.768.878.1
Gemini 3 Flash77.566.599.883.888.273.746.085.875.9
GPT 5.269.861.099.875.662.270.234.675.879.0
FalconOCR80.380.599.594.078.587.143.569.290.3
OmniDocBench

全页文档解析性能比较。Overall↑ 综合了三个子指标。Edit↓ 衡量文本编辑距离(值越低越好)。CDM↑ 评估公式识别准确率。TEDS↑ 衡量表格结构相似度。

模型Overall↑Edit↓CDM↑TEDS↑
PaddleOCR VL 1.594.370.02594.491.1
PaddleOCR VL91.760.02491.785.9
Chandra88.970.04688.189.5
DeepSeek OCR v287.660.03789.277.5
GPT 5.286.560.06188.077.7
Mistral OCR 385.200.05384.376.1
FalconOCR88.640.05586.884.6

结果分析

首先,当接口简单且训练信号具有针对性时,轻量级模型也能具备竞争力。在olmOCR上,Falcon OCR在多列文档和表格上表现出色,整体性能与规模大得多的系统相比也具有竞争力。其次,全页解析的评估对匹配和表示细节较为敏感。在OmniDocBench上,表格和公式的评估指标不仅取决于识别质量,还取决于预测元素与真实标签的匹配方式以及输出结构的规范化方式。

从更广泛的角度来看,这些结果表明,对于OCR任务,早期融合的单栈Transformer可以成为常见的“视觉编码器+文本解码器”方案的可行替代方案。我们并不认为这是一个最终答案,而是一个充满前景的方向:一个早期融合的主干网络、文本与图像共享的参数空间、单一的解码接口,以及更优质的数据和训练信号,而非日益复杂的流水线。据我们所知,这是首次证明这种早期融合方案能够在如此规模上达到具有竞争力的文档OCR accuracy,我们希望这能鼓励该方向的进一步研究。

服务吞吐量

在单张A100-80GB GPU上使用vLLM进行测量,在高并发下处理来自olmOCR-Bench的文档图像,以实现vLLM的最佳利用率。

  • Layout + OCR — 完整的端到端流水线:布局检测找到每一页上的区域,对其进行裁剪,然后vLLM对每个裁剪区域运行OCR。这代表了真实世界的服务吞吐量,包括布局检测和OCR时间。
模式tok/simg/s描述
Layout + OCR5,8252.9完整流水线:布局检测 → 裁剪 → 区域级OCR

Falcon OCR的参数规模为0.3B,比0.9B级别的OCR VLM(如PaddleOCR VL)小约3倍,这直接转化为在保持竞争力accuracy的同时实现更高的服务吞吐量。

局限性

  • 老旧扫描件与微小文本:严重受损的扫描件和极小的字符依然是挑战。这些情况通常需要更高的有效分辨率和训练数据中更好的覆盖范围。
  • 非唯一表格表示:视觉上相同的表格可能会被编码为结构不同的HTML形式,这可能会影响基于树的评估指标。
  • 公式匹配敏感性:根据基准测试的归一化和匹配流程,LaTeX和Unicode约定可能会受到不同的惩罚。

示例

点击下方各部分可展开查看。

手写体与真实世界图像

Handwriting and real world OCR examples

表格

Table OCR examples

公式

Formula OCR examples

复杂排版

Complex layout OCR examples


vLLM 服务器

我们还提供一个基于Docker的vLLM推理服务器,能够实现约6000 tokens/秒的服务能力。

单个Docker镜像包含两个服务:

服务默认端口描述
vLLM8000Falcon-OCR视觉语言模型(兼容OpenAI API)
Pipeline5002完整文档解析:布局检测 → 裁剪 → OCR → markdown

布局模型在pipeline进程内部运行——它不是一个独立的服务。

快速开始

docker run -d --name falcon-ocr \
  --gpus '"device=0,1"' \
  -e EXPOSED_GPU_IDS=0,1 \
  -e VLLM_GPU=0 \
  -e PIPELINE_GPU=1 \
  -e VLLM_GPU_MEM_UTIL=0.90 \
  -p 8000:8000 \
  -p 5002:5002 \
  ghcr.io/tiiuae/falcon-ocr:latest

API

健康检查
curl http://localhost:8000/health      # vLLM
curl http://localhost:5002/health      # Pipeline
上传(多部分文件上传 — 图片和 PDF)

发送文件的最简单方式。支持图片和多页 PDF:

# Single image
curl -X POST http://localhost:5002/falconocr/upload \
  -F "files=@photo.jpg;type=image/jpeg"
# PDF document
curl -X POST http://localhost:5002/falconocr/upload \
  -F "files=@document.pdf;type=application/pdf"
Parse(全流程:布局 + OCR)

发送经过 base64 编码的图像,以进行布局检测、裁剪和 OCR 识别:

curl -X POST http://localhost:5002/falconocr/parse \
  -H "Content-Type: application/json" \
  -d '{
    "images": ["data:image/jpeg;base64,<...>"],
    "skip_layout": false
  }'

响应:

{
  "json_result": [[{
    "index": 0,
    "mapped_label": "text",
    "content": "The Manuscript",
    "bbox": [273, 273, 937, 380],
    "score": 0.3145
  }]],
  "markdown_result": "The Manuscript",
  "total_output_tokens": 93,
  "processing_time_ms": 414
}
Parse(直接 VLM,无布局)

跳过布局检测,将完整图像直接发送至 VLM:

curl -X POST http://localhost:5002/falconocr/parse \
  -H "Content-Type: application/json" \
  -d '{
    "images": ["data:image/jpeg;base64,<...>"],
    "skip_layout": true
  }'
Direct vLLM(兼容 OpenAI)
curl -X POST http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "falcon-ocr",
    "messages": [{"role": "user", "content": [
      {"type": "image_url", "image_url": {"url": "data:image/png;base64,<...>"}},
      {"type": "text", "text": "Extract the text content from this image.\n<|OCR_PLAIN|>"}
    ]}],
    "max_tokens": 2048
  }'

配置

所有设置在 docker run 时通过环境变量控制。

GPU 分配
变量默认值描述
VLLM_GPU0vLLM 进程使用的主机 GPU ID
PIPELINE_GPU0流水线(布局模型)使用的主机 GPU ID
EXPOSED_GPU_IDS(所有可见 GPU)通过 --gpus 传递的逗号分隔主机 GPU ID(用于索引重映射)
端口分配
变量默认值描述
VLLM_PORT8000vLLM OpenAI 兼容 API 的端口
PIPELINE_PORT5002流水线 API 的端口
vLLM 调优
变量默认值描述
VLLM_GPU_MEM_UTIL0.90vLLM 可使用的 GPU 内存比例
MAX_NUM_SEQS2048vLLM 中的最大并发序列数
MAX_MODEL_LEN8192模型最大上下文长度
DTYPEbfloat16模型数据类型
MAX_NUM_BATCHED_TOKENS(自动)每次迭代的最大批处理令牌数
CHUNKED_PREFILLfalse启用分块预填充
布局模型调优
变量默认值描述
LAYOUT_BATCH_SIZE64布局检测推理的批处理大小
模型路径
变量默认值描述
FALCON_OCR_MODEL/models/Falcon-OCRFalcon-OCR VLM 权重路径(容器内)
SERVED_MODEL_NAMEfalcon-ocrvLLM API 公开的模型名称

部署模式

双 GPU(最佳吞吐量)

vLLM 在一个 GPU 上运行,布局模型在另一个 GPU 上运行 — 无 GPU 资源竞争:

docker run -d --name falcon-ocr \
  --gpus '"device=3,4"' \
  -e EXPOSED_GPU_IDS=3,4 \
  -e VLLM_GPU=3 \
  -e PIPELINE_GPU=4 \
  -e VLLM_GPU_MEM_UTIL=0.90 \
  -p 8000:8000 \
  -p 5002:5002 \
  ghcr.io/tiiuae/falcon-ocr:latest
单 GPU(内存共享)

两个服务共享一个 GPU —— 调整 VLLM_GPU_MEM_UTIL 以给布局模型留出空间:

docker run -d --name falcon-ocr \
  --gpus '"device=0"' \
  -e EXPOSED_GPU_IDS=0 \
  -e VLLM_GPU=0 \
  -e PIPELINE_GPU=0 \
  -e VLLM_GPU_MEM_UTIL=0.55 \
  -e LAYOUT_BATCH_SIZE=32 \
  -e MAX_NUM_SEQS=512 \
  -p 8000:8000 \
  -p 5002:5002 \
  ghcr.io/tiiuae/falcon-ocr:latest
自定义端口
docker run -d --name falcon-ocr \
  --gpus '"device=0,1"' \
  -e EXPOSED_GPU_IDS=0,1 \
  -e VLLM_GPU=0 \
  -e PIPELINE_GPU=1 \
  -e VLLM_PORT=18000 \
  -e PIPELINE_PORT=15002 \
  -p 18000:18000 \
  -p 15002:15002 \
  ghcr.io/tiiuae/falcon-ocr:latest

Docker --gpus "device=3,4" 会使容器将 GPU 识别为本地索引 0,1。 EXPOSED_GPU_IDS=3,4 允许您引用主机 GPU ID(VLLM_GPU=3、PIPELINE_GPU=4); 入口点会将它们重新映射到正确的容器本地索引。

Citation

If you use Falcon OCR, please cite:

@article{bevli2026falcon,
  title   = {Falcon Perception},
  author  = {Bevli, Aviraj and Chaybouti, Sofian and Dahou, Yasser and Hacid, Hakim and Huynh, Ngoc Dung and Le Khac, Phuc H. and Narayan, Sanath and Para, Wamiq Reyaz and Singh, Ankit},
  journal = {arXiv preprint arXiv:2603.27365},
  year    = {2026},
  url     = {https://arxiv.org/abs/2603.27365}
}