OCR
Optical Character Recognition
이미지에서 텍스트 추출. 문서 디지털화에 활용.
Optical Character Recognition
이미지에서 텍스트 추출. 문서 디지털화에 활용.
OCR(Optical Character Recognition, 광학 문자 인식)은 이미지나 스캔 문서에서 텍스트를 추출하여 편집 가능한 디지털 텍스트로 변환하는 기술입니다. 종이 문서 디지털화, 명함 인식, 번호판 인식, 영수증 처리 등 다양한 분야에서 활용됩니다.
1920년대 Emanuel Goldberg의 기계 연구에서 시작되어, 1970년대 상업용 OCR 시스템이 등장했습니다. 2000년대 Tesseract 오픈소스 엔진이 공개되고, 2010년대 딥러닝 기반 OCR이 정확도를 획기적으로 높였습니다. 현재는 GPT-4V, Claude Vision 같은 멀티모달 LLM이 복잡한 문서도 이해합니다.
OCR 파이프라인은 이미지 전처리(노이즈 제거, 기울기 보정) → 텍스트 영역 검출(Text Detection) → 문자 인식(Text Recognition) → 후처리(맞춤법 교정, 레이아웃 복원) 단계로 구성됩니다. 딥러닝 모델은 CRNN, Transformer 기반 아키텍처가 주로 사용됩니다.
실무에서 OCR 선택 시 고려할 점은 지원 언어(한글 포함 여부), 정확도, 처리 속도, 비용입니다. 간단한 작업은 Tesseract, 고품질 문서는 Google Vision/AWS Textract, 복잡한 레이아웃은 멀티모달 LLM 조합이 효과적입니다. 한글 OCR은 네이버 CLOVA OCR이나 카카오 OCR도 좋은 선택입니다.
# OCR 구현 예제 (Tesseract + EasyOCR)
# pip install pytesseract easyocr pillow
import pytesseract
from PIL import Image
import easyocr
# ===== 1. Tesseract OCR (오픈소스) =====
# Tesseract 설치 필요: apt-get install tesseract-ocr tesseract-ocr-kor
def tesseract_ocr(image_path):
"""Tesseract로 텍스트 추출"""
image = Image.open(image_path)
# 한글 + 영어 인식
text = pytesseract.image_to_string(image, lang='kor+eng')
return text
# 상세 정보 (위치, 신뢰도 포함)
def tesseract_detailed(image_path):
image = Image.open(image_path)
data = pytesseract.image_to_data(image, lang='kor+eng', output_type=pytesseract.Output.DICT)
return data
# ===== 2. EasyOCR (딥러닝 기반) =====
def easy_ocr(image_path):
"""EasyOCR로 텍스트 추출 (GPU 지원)"""
reader = easyocr.Reader(['ko', 'en']) # 한글, 영어
results = reader.readtext(image_path)
# 결과: [(좌표, 텍스트, 신뢰도), ...]
for (bbox, text, confidence) in results:
print(f"텍스트: {text}, 신뢰도: {confidence:.2%}")
return results
# ===== 3. Google Cloud Vision API =====
# pip install google-cloud-vision
from google.cloud import vision
def google_vision_ocr(image_path):
"""Google Vision API로 고품질 OCR"""
client = vision.ImageAnnotatorClient()
with open(image_path, 'rb') as f:
content = f.read()
image = vision.Image(content=content)
response = client.text_detection(image=image)
texts = response.text_annotations
if texts:
return texts[0].description # 전체 텍스트
return ""
# ===== 4. 이미지 전처리 (정확도 향상) =====
import cv2
import numpy as np
def preprocess_image(image_path):
"""OCR 전 이미지 품질 개선"""
img = cv2.imread(image_path)
# 그레이스케일 변환
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 노이즈 제거
denoised = cv2.fastNlMeansDenoising(gray)
# 이진화 (Adaptive Threshold)
binary = cv2.adaptiveThreshold(
denoised, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2
)
return binary
# 사용 예시
# text = tesseract_ocr("document.png")
# results = easy_ocr("receipt.jpg")
"영수증 처리라면 Google Vision이나 AWS Textract가 정확도가 높습니다. 비용이 부담되면 EasyOCR로 시작하고, 전처리(이진화, 기울기 보정)만 잘 해도 Tesseract로 90% 이상 정확도 나와요."
"OCR 파이프라인은 전처리, 텍스트 검출, 문자 인식, 후처리로 구성됩니다. 딥러닝 이전에는 규칙 기반이었지만, 지금은 CRNN이나 Transformer 기반 모델이 주로 쓰입니다. 최근에는 GPT-4V 같은 멀티모달 LLM으로 복잡한 레이아웃도 처리합니다."
"한글 인식률이 낮으면 먼저 이미지 해상도 확인하세요. 300 DPI 이상이 좋고, 기울어진 문서는 deskew 처리가 필수입니다. 그래도 안 되면 네이버 CLOVA OCR 같은 한글 특화 서비스가 나을 수 있어요."
저품질 이미지에 OCR을 바로 돌리면 정확도가 급격히 떨어집니다. 노이즈 제거, 이진화, 기울기 보정 등 전처리가 필수입니다.
최고 수준의 OCR도 100% 완벽하지 않습니다. 후처리(맞춤법 검사, 정규표현식 검증)와 사람 검토 프로세스를 설계하세요.
데이터 특성에 맞는 OCR 엔진 선택 → 전처리 파이프라인 구축 → 신뢰도 기반 후처리 → 저신뢰도 결과 수동 검토 프로세스 구현