⚖️

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, 대량은 셀프호스팅으로 분기점 계산 보안 컴플라이언스 — 기밀 문서 처리 시 로컬 실행 필수 요건 충족