⚖️
OCR 종합 비교 — API vs 오픈소스 vs 파인튜닝, 뭘 써야 하나
3가지 접근법의 정확도·비용·보안·난이도·유지보수를 한 장으로 비교
3가지 접근법
1. API → Google Vision / Azure / Textract에 이미지를 보내고 결과를 받음
2. 셀프호스팅 → EasyOCR / PaddleOCR을 내 서버에서 실행
3. 파인튜닝 → TrOCR / manga-ocr을 내 데이터로 추가 훈련
5가지 축으로 비교
| 축 | API | 셀프호스팅 | 파인튜닝 |
|---|---|---|---|
| 정확도 | ★★★★★ (최고) | ★★★☆☆ (양호) | ★★★★☆ (특화 시 높음) |
| 비용 | 페이지당 과금 | 서버 비용만 | 서버 + 훈련 비용 |
| 보안 | ❌ 데이터 외부 전송 | ✅ 로컬 처리 | ✅ 로컬 처리 |
| 난이도 | ★☆☆☆☆ (API 키만) | ★★☆☆☆ (pip install) | ★★★☆☆ (데이터+훈련) |
| 유지보수 | 제공사가 관리 | 내가 업데이트 | 내가 업데이트+재훈련 |
상세 비교
정확도
Google Vision > Sarashina2.2(파인튜닝 가능) > PaddleOCR > EasyOCR > Tesseract
API 셀프호스팅/파인튜닝 셀프호스팅 셀프호스팅 셀프호스팅
API가 기본 정확도에서는 이긴다 — Google/Microsoft가 수십억 장의 이미지로 훈련한 모델이니까.
근데 특정 도메인(부동산 계약서, 의료 처방전, 고문서)에서는 파인튜닝이 API를 이길 수 있다. API는 범용이라 전문 용어에 약하기 때문.
비용 (월 10,000페이지 기준)
| 방식 | 모델 비용 | 인프라 비용 | 합계 |
|---|---|---|---|
| Google Vision API | ~$15 | $0 | ~$15 |
| Azure (Read) | ~$15 | $0 | ~$15 |
| Azure (Contract 특화) | ~$100 | $0 | ~$100 |
| EasyOCR (CPU 서버) | $0 | ~$20 | ~$20 |
| PaddleOCR (CPU 서버) | $0 | ~$20 | ~$20 |
| Sarashina2.2 (GPU 서버) | $0 | ~$70 | ~$70 |
| 파인튜닝 manga-ocr (GPU) | $0 | ~$70 + 훈련 1회 | ~$70+ |
소량이면 API가 싸다. 대량이면 셀프호스팅이 싸다. 분기점은 보통 월 50,000~100,000페이지.
보안
API: 이미지가 Google/Microsoft/AWS 서버로 전송됨
셀프호스팅: 이미지가 내 서버 밖으로 나가지 않음
파인튜닝: 이미지가 내 서버 밖으로 나가지 않음
계약서, 의료 문서, 개인정보가 포함된 문서는 API 사용이 규정상 불가능한 경우가 많다. 이런 경우 셀프호스팅이 유일한 선택.
난이도
API (★☆☆☆☆):
1. API 키 발급
2. pip install sdk
3. response = client.detect_text(image)
끝.
셀프호스팅 (★★☆☆☆):
1. pip install easyocr
2. reader = easyocr.Reader(['ja'])
3. result = reader.readtext('doc.png')
끝. 근데 서버 관리가 필요.
파인튜닝 (★★★☆☆):
1. 데이터 준비 (이미지 + 정답 텍스트 수백 개)
2. Dataset 클래스 작성
3. Seq2SeqTrainer.train()
4. 평가 (CER 측정)
5. 배포
데이터 준비가 가장 오래 걸림.
유지보수
API:
- 제공사가 모델을 업데이트함. 내가 할 일 없음
- 근데 가격 인상, API 변경, 서비스 종료 리스크
셀프호스팅:
- 새 버전 나오면 pip install --upgrade
- 서버 모니터링, 스케일링 직접 관리
파인튜닝:
- 새 유형의 문서가 추가되면 재훈련 필요
- 데이터 라벨링 → 재훈련 → 재배포 사이클
의사결정 플로우차트
기밀 문서인가?
├─ YES → 셀프호스팅/파인튜닝 (데이터 외부 전송 불가)
│ ├─ GPU 있나?
│ │ ├─ YES → Sarashina2.2 or 파인튜닝 manga-ocr
│ │ └─ NO → PaddleOCR (CPU OK)
│ └─ 특수 도메인인가? (계약서, 의료 등)
│ ├─ YES → 파인튜닝 (데이터 수백 개 필요)
│ └─ NO → PaddleOCR/EasyOCR 그대로
│
└─ NO → API 가능
├─ 소량 (<50K/월)?
│ ├─ YES → Google Vision (가장 정확, 가장 저렴)
│ └─ NO → 셀프호스팅이 더 쌈
└─ 구조화 필요? (영수증, 계약서 필드 추출)
├─ YES → Azure Document Intelligence (전용 모델)
└─ NO → Google Vision
조합 전략 — 실전에서는 섞어 쓴다
비기밀 일반 문서 → Google Vision API (빠르고 정확)
기밀 계약서 → PaddleOCR 셀프호스팅 (로컬 처리)
특수 양식 → manga-ocr 파인튜닝 (도메인 특화)
하나만 쓸 필요 없다. 문서 유형별로 다른 방식을 쓰는 게 실전이다.
코드 비교 — 같은 이미지, 3가지 방법
# 1. API (Google Vision)
from google.cloud import vision
client = vision.ImageAnnotatorClient()
response = client.text_detection(image=vision.Image(content=open("doc.png","rb").read()))
text_api = response.text_annotations[0].description
# 2. 셀프호스팅 (EasyOCR)
import easyocr
reader = easyocr.Reader(['ja'])
result = reader.readtext('doc.png')
text_self = ' '.join([r[1] for r in result])
# 3. 파인튜닝 (내 모델)
from transformers import TrOCRProcessor, VisionEncoderDecoderModel
processor = TrOCRProcessor.from_pretrained("./my-contract-ocr")
model = VisionEncoderDecoderModel.from_pretrained("./my-contract-ocr")
pixel_values = processor(images=Image.open("doc.png"), return_tensors="pt").pixel_values
text_ft = processor.batch_decode(model.generate(pixel_values), skip_special_tokens=True)[0]
# 비교
print(f"API: {text_api[:50]}")
print(f"셀프호스팅: {text_self[:50]}")
print(f"파인튜닝: {text_ft[:50]}")
3가지 방법 전부 input(이미지) → 텍스트 결과는 같다. 차이는 정확도·비용·보안.
핵심 개념
1
API (★☆☆☆☆) — API 키만 발급하면 즉시 사용. 모델 관리 불필요
2
셀프호스팅 (★★☆☆☆) — pip install + 3줄. 무료. 보안 OK. 서버 관리 필요
3
파인튜닝 (★★★☆☆) — 데이터 수백 개 + Trainer.train(). 특수 도메인에서 API를 이김
4
기밀 문서 → 로컬(셀프호스팅/파인튜닝), 비기밀 → API 가능
5
실전에서는 문서 유형별로 섞어 쓴다 — 비기밀은 API, 기밀은 로컬
사용 사례
OCR 아키텍처 설계 — 기밀성·비용·정확도 기준으로 최적 조합 선택
비용 최적화 — 소량은 API, 대량은 셀프호스팅으로 분기점 계산
보안 컴플라이언스 — 기밀 문서 처리 시 로컬 실행 필수 요건 충족