오픈소스 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를 통한 관리형 배포
- 모델 페이지를 엽니다(예:
nanonets/Nanonets-OCR2-3B). - Deploy → HF Inference Endpoints를 클릭합니다.
- GPU 크기를 설정합니다; 엔드포인트는 몇 분 안에 준비됩니다.
- 위에 표시된 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