오픈소스 OCR 모델 가이드 – 현대 비전-언어 OCR 선택, 실행 및 확장

TL;DR

Hugging Face는 최신 오픈소스 OCR 모델을 정리하고, 강점(다국어 지원, 레이아웃 인식, 출력 형식)을 설명하며, 벤치마크에서 평가하는 방법을 보여주고, 로컬 및 원격 추론을 위한 즉시 사용 가능한 도구를 제공합니다.


1. 현대 OCR 환경 – 오늘날 모델이 할 수 있는 일

1.1 핵심 기능

  • Transcription – 손글씨 텍스트, 여러 스크립트(라틴어, 아라비아어, 일본어), 수학식, 화학식 및 페이지 번호 태그를 처리합니다.
  • Complex Document Elements – 이미지, 차트, 표를 인식하고, 좌표를 추출하거나 캡션을 생성하거나 시각 데이터를 구조화된 형식(HTML 표, Markdown 표, JSON)으로 변환할 수 있습니다.
  • Output Formats – 모델은 다음 중 하나 이상을 출력합니다:
    • DocTag – Docling 모델에서 사용하는 XML과 유사한 레이아웃 보존 마크업.
    • HTML – 디지털 재구성에 적합한 전체 구조 표현.
    • Markdown – 이미지 캡션을 선택적으로 포함할 수 있는 인간이 읽기 쉬운 텍스트, LLM에 제공하기에 이상적.
    • JSON – 표나 차트를 위한 구조화된 스니펫.
  • Locality Awareness – 현대 OCR 모델은 경계 상자 “앵커” 메타데이터를 삽입하여 읽기 순서를 보존하고 환각을 줄입니다.
  • Prompting – 일부 모델(예: granite-docling)은 *"Convert this formula to LaTeX"*와 같은 작업 전환 프롬프트를 지원하고, 다른 모델은 고정 시스템 프롬프트로 조건화됩니다.

1.2 올바른 형식 선택

사용 사례 선호 출력
디지털 재구성 DocTag 또는 HTML
LLM 기반 Q&A 캡션이 포함된 Markdown
프로그래밍 분석 표/차트를 위한 JSON

2. 최첨단 오픈 OCR 모델

2.1 모델 비교 스냅샷

모델 출력(들) 주요 특징 크기 다국어 지원? 평균 OlmOCR‑Bench 점수
Nanonets‑OCR2‑3B Markdown + HTML 표 캡션, 워터마크 추출, 체크박스, 플로우차트 4 B ✅ (EN, ZH, FR, AR, …) N/A
PaddleOCR‑VL Markdown, JSON, HTML 손글씨, 오래된 문서, 프롬프트 가능, 이미지 삽입 0.9 B ✅ (109 languages) N/A
dots.ocr Markdown, JSON Grounding, 이미지 삽입, 손글씨 3 B ✅ (multilingual) 79.1 ± 1.0
OlmOCR‑2 Markdown, HTML, LaTeX Grounding, 배치 최적화 8 B ❌ (English only) 82.3 ± 1.1
Granite‑Docling‑258M DocTag 프롬프트 기반 작업 전환, 위치 토큰 258 M ✅ (EN, JA, AR, ZH) N/A
DeepSeek‑OCR Markdown, HTML 일반 시각 이해, 손글씨, 메모리 효율 3 B ✅ (~100 languages) 75.4 ± 1.0
Chandra Markdown, HTML, JSON Grounding, 이미지 추출 9 B ✅ (40+ languages) 83.1 ± 0.9
Qwen3‑VL 모든 형식 (프롬프트를 통해) 고대 텍스트, 손글씨, 이미지 삽입 9 B ✅ (32 languages) N/A

Note: 점수는 영어 전용 OlmOCR 벤치마크에서 평가된 모델 카드에서 가져온 것입니다.

2.2 평가 벤치마크

  • OmniDocBenchmark – 다양한 문서 유형(책, 잡지, 교과서)을 포함하며, HTML/Markdown 표를 허용하고, 편집 거리 및 트리 편집 메트릭을 사용합니다.
  • OlmOCR‑Bench – 영어 PDF에 초점을 맞춘 단위 테스트 스타일 평가로, 표 셀 관계 및 기타 레이아웃 요소를 확인합니다.
  • CC‑OCR (Multilingual) – 비영어/중국어 데이터가 포함된 유일한 벤치마크이며, 문서 품질은 낮지만 다국어 검증에 유용합니다.

Recommendation: 모델을 실제 적용하기 전에 작은 도메인‑특정 데이터셋으로 테스트하세요. 벤치마크 범위가 사용 사례를 반영하지 않을 수 있습니다.


3. 비용 효율성 고려 사항

  • 파라미터 수는 <1 B (PaddleOCR‑VL)부터 9 B (Chandra, Qwen3‑VL)까지 다양합니다.
  • 추론 비용은 최적화된 런타임(vLLM, SGLang)과 하드웨어 가격에 크게 좌우됩니다. 예시: H100($2.69/시간)에서 OlmOCR‑2를 사용할 경우 백만 페이지당 약 US$178이 소요됩니다.
  • 양자화된 변형 및 배치 처리 스크립트를 사용하면 페이지당 비용을 추가로 낮출 수 있어, 대규모에서는 오픈 모델이 많은 폐쇄형 대안보다 저렴합니다.

4. 시작하기 – 모델 실행

4.1 vLLM을 이용한 로컬 추론

vllm serve nanonets/Nanonets-OCR2-3B
from openai import OpenAI
import base64
client = OpenAI(base_url="http://localhost:8000/v1")
model = "nanonets/Nanonets-OCR2-3B"

def encode_image(path):
    with open(path, "rb") as f:
        return base64.b64encode(f.read()).decode()

def infer(img_b64):
    resp = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": [{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{img_b64}"}}, {"type": "text", "text": "Extract the text from the above document as if you were reading it naturally."}] }],
        temperature=0.0,
        max_tokens=15000,
    )
    return resp.choices[0].message.content

print(infer(encode_image("/path/to/doc.png")))

4.2 Transformers API 예시

from transformers import AutoProcessor, AutoModelForImageTextToText
model = AutoModelForImageTextToText.from_pretrained(
    "nanonets/Nanonets-OCR2-3B",
    torch_dtype="auto",
    device_map="auto",
    attn_implementation="flash_attention_2",
)
processor = AutoProcessor.from_pretrained("nanonets/Nanonets-OCR2-3B")

prompt = "Extract the text ..."  # see blog for full prompt
image = Image.open("doc.png")
messages = [{"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": [{"type": "image", "image": image}, {"type": "text", "text": prompt}]}]
text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = processor(text=[text], images=[image], padding=True, return_tensors="pt").to(model.device)
output_ids = model.generate(**inputs, max_new_tokens=15000, do_sample=False)
print(processor.batch_decode(output_ids, skip_special_tokens=True)[0])

4.3 Apple Silicon에서 MLX‑VLM 사용

pip install -U mlx-vlm
python -m mlx_vlm.generate \
  --model ibm-granite/granite-docling-258M-mlx \
  --max-tokens 4096 \
  --temperature 0.0 \
  --prompt "Convert this chart to JSON." \
  --image chart.png

4.4 Hugging Face Inference Endpoints를 통한 관리형 배포

  1. 모델 페이지를 엽니다(예: nanonets/Nanonets-OCR2-3B).
  2. Deploy → HF Inference Endpoints를 클릭합니다.
  3. GPU 크기를 설정합니다; 엔드포인트는 몇 분 안에 준비됩니다.
  4. 위에 표시된 OpenAI‑client 코드를 사용하여 엔드포인트 URL을 지정합니다.

5. 배치 작업으로 확장

Hugging Face Jobs와 uv-scripts/ocr 저장소를 함께 사용하면 GPU 없이도 수천 개의 이미지에 OCR을 실행할 수 있습니다.

hf jobs uv run --flavor l4x1 \
  https://huggingface.co/datasets/uv-scripts/ocr/raw/main/nanonets-ocr.py \
  your-input-dataset your-output-dataset \
  --max-samples 100

스크립트는 vLLM 배치를 자동으로 처리하고 OCR 결과를 새로운 markdown 열로 기록합니다.


6. 순수 OCR을 넘어 – 문서 AI 확장

6.1 시각적 문서 검색

  • 텍스트 쿼리에서 직접 상위 k개의 PDF를 검색합니다.
  • VLM과 결합하여 멀티모달 RAG 파이프라인을 구성합니다(블로그에 링크된 ColPali + Qwen2 VL 노트북 참고).
  • 메모리 효율적인 단일 벡터 모델 또는 높은 재현율의 다중 벡터 모델을 선택합니다; 대부분은 엔드포인트 사용 준비가 되어 있습니다.

6.2 문서 QA를 위한 비전‑언어 모델

  • 먼저 텍스트로 변환하는 대신, 원본 문서 이미지와 질문을 Qwen3‑VL과 같은 VLM에 입력합니다.
  • 이는 레이아웃 컨텍스트(표, 그림, 캡션)를 유지하여 LLM 전용 파이프라인이 놓칠 수 있는 정보를 보존합니다.

7. 오픈 데이터셋 – 미래 모델을 위한 연료

  • olmOCR‑mix‑0225 (AllenAI) – 70개 이상의 Hub 모델 학습에 사용되었습니다.
  • isl_synthetic_ocr와 같은 합성 파이프라인.
  • 휴리스틱으로 필터링된 VLM 생성 전사.
  • 도메인 특화 교정 코퍼스(예: 영국 인도 의료 역사) 등은 학습 데이터로 재활용될 수 있습니다.

8. 마무리 생각

Hugging Face의 가이드는 실무자에게 OCR 모델 선택을 위한 명확한 의사결정 매트릭스, 구체적인 벤치마크 참고자료, 비용 분석 및 로컬·클라우드 모두에서 바로 사용할 수 있는 도구를 제공합니다. 오픈 가중치 모델과 공개 데이터셋을 활용함으로써, 팀은 프라이버시를 보호하고 확장 가능한 문서 이해 파이프라인을 구축할 수 있으며, 폐쇄형 서비스에 의존할 필요가 없습니다.

Further Reading

  • 비전-언어 모델 설명
  • 비전-언어 모델 2025 업데이트
  • PP‑OCR‑v5 블로그
  • Grounded OCR에 Kosmos2.5 파인튜닝 (노트북)
  • DocVQA에 Florence‑2 파인튜닝 (노트북)
  • Core ML 및 dots.ocr를 이용한 온디바이스 SOTA OCR

Sources