👁️
OCR 오픈소스 카탈로그 — 이미지에서 텍스트를 뽑는 모든 방법
Tesseract부터 EasyOCR, PaddleOCR, Surya, TrOCR, Qwen2-VL까지 — 난이도·언어·속도 비교
OCR = image → model(image) → text
OCR도 지금까지 정리한 패턴과 동일하다:
image = Image.open("document.png") # input
text = model(image) # model(input) → output
print(text) # "인식된 텍스트"
전처리는 이미지 리사이즈 + 정규화. 오디오의 STFT보다 간단하다.
가장 쉬운 것부터: EasyOCR
3줄이면 한국어 OCR이 된다:
pip install easyocr
import easyocr
reader = easyocr.Reader(['ko', 'en']) # 한국어 + 영어
result = reader.readtext('document.png')
for (bbox, text, confidence) in result:
print(f"{text} ({confidence:.0%})")
# → "안녕하세요" (98%)
# → "Hello World" (99%)
도구별 비교
| 도구 | 타입 | 크기 | GPU | 한국어 | 일본어 | 난이도 |
|---|---|---|---|---|---|---|
| EasyOCR | CNN+RNN | ~100MB | 불필요 | ✅ | ✅ | ★☆☆☆☆ |
| Tesseract | LSTM 하이브리드 | ~15MB | 불필요 | ✅ | ✅ | ★★☆☆☆ |
| PaddleOCR | CNN+RNN | 10~150MB | 불필요 | ✅ | ✅ | ★★☆☆☆ |
| Surya | Transformer | ~300MB | 권장 | ✅ | ✅ | ★★☆☆☆ |
| docTR | CNN+Transformer | 50~100MB | 불필요 | ❌ | ❌ | ★★☆☆☆ |
| TrOCR | Transformer | 334~558MB | 권장 | ❌ | ❌ | ★★★☆☆ |
| GOT-OCR | Transformer | ~580MB | 필수 | △ | △ | ★★★☆☆ |
| Qwen2-VL | 멀티모달 LLM | 2B~72B | 필수 | ✅ | ✅ | ★★★★☆ |
각 도구 코드
Tesseract — 가장 오래되고 가벼움:
brew install tesseract tesseract-lang # macOS
pip install pytesseract pillow
import pytesseract
from PIL import Image
text = pytesseract.image_to_string(Image.open("doc.png"), lang="kor+eng")
PaddleOCR — CJK 최강:
pip install paddlepaddle paddleocr
from paddleocr import PaddleOCR
ocr = PaddleOCR(lang='korean')
result = ocr.ocr('document.png')
for line in result[0]:
bbox, (text, conf) = line
print(f"{text} ({conf:.0%})")
Surya — 최신 고정밀:
pip install surya-ocr
surya_ocr document.png --langs ko,en
Qwen2-VL — "이미지 속 텍스트 전부 읽어줘":
# 2B 모델도 GPU 필요
from transformers import Qwen2VLForConditionalGeneration, AutoProcessor
model = Qwen2VLForConditionalGeneration.from_pretrained("Qwen/Qwen2-VL-2B-Instruct", device_map="auto")
# → 이미지 + "모든 텍스트를 읽어줘" 프롬프트로 OCR
분류: 전통 vs 딥러닝 vs LLM
| 세대 | 도구 | 특징 |
|---|---|---|
| 1세대 (전통) | Tesseract | LSTM + 규칙. 깨끗한 인쇄물 OK |
| 2세대 (딥러닝) | EasyOCR, PaddleOCR, Surya | CNN/Transformer. 장면 텍스트도 OK |
| 3세대 (LLM) | Qwen2-VL, Florence-2 | 멀티모달 LLM. "읽어줘" 한 마디로 OCR |
세대가 올라갈수록 정확도는 높아지지만 모델이 커지고 GPU가 필요해진다.
용도별 추천
| 용도 | 추천 |
|---|---|
| 가볍게 시작 | EasyOCR (pip 한 줄, 3줄 코드) |
| 한국어/일본어/중국어 | PaddleOCR (CJK 최강) |
| 최고 정확도 | Surya (최신 Transformer) |
| GPU 없는 환경 | Tesseract (15MB, CPU만) |
| "그냥 읽어줘" | Qwen2-VL (LLM, GPU 필수) |
핵심 개념
1
EasyOCR (★☆☆☆☆) — pip install easyocr + 3줄. 80개 언어. 가장 쉬움
2
PaddleOCR (★★☆☆☆) — CJK(한중일) 최강. 경량 모델 10MB
3
Surya (★★☆☆☆) — 최신 Transformer. 90개 언어. 벤치마크 최고
4
Tesseract (★★☆☆☆) — 15MB로 가장 가벼움. 100개 언어. GPU 불필요
5
Qwen2-VL (★★★★☆) — 멀티모달 LLM. \"읽어줘\" 한 마디로 OCR. GPU 필수
사용 사례
문서 디지털화 — 스캔된 문서/이미지에서 텍스트 추출
장면 텍스트 인식 — 간판, 메뉴판, 명함 등 사진에서 텍스트 추출
RAG 파이프라인 — OCR로 문서를 텍스트화 → 벡터 DB에 저장 → LLM 질의응답