Skip to main content

OCR — 이미지 속 텍스트 인식

OCR(Optical Character Recognition)은 이미지에서 텍스트를 인식하여 디지털 문자열로 변환하는 기술입니다. 문서 디지털화, 번호판 인식, 영수증 처리 등에 핵심적으로 활용됩니다.

핵심 아이디어

전통적인 OCR은 텍스트 영역 탐지(Detection)와 문자 인식(Recognition)을 분리하여 수행합니다. 최근에는 Transformer 기반의 End-to-End 모델이 등장하여 복잡한 문서 레이아웃도 처리할 수 있게 되었습니다.

동작 방식

구현

PaddleOCR

from paddleocr import PaddleOCR

# 한국어 + 영어 OCR
ocr = PaddleOCR(use_angle_cls=True, lang='korean')

result = ocr.ocr('document.jpg', cls=True)

for line in result[0]:
    bbox = line[0]        # 텍스트 영역 좌표
    text = line[1][0]     # 인식된 텍스트
    conf = line[1][1]     # 신뢰도
    print(f"[{conf:.2f}] {text}")

EasyOCR

import easyocr

reader = easyocr.Reader(['ko', 'en'])
results = reader.readtext('document.jpg')

for bbox, text, conf in results:
    print(f"[{conf:.2f}] {text}")

OCR 도구 비교

비교 항목PaddleOCREasyOCRTesseractDonut
한국어 지원우수우수보통좋음
속도빠름보통빠름느림
정확도높음높음보통매우 높음
레이아웃 이해기본기본없음강함
GPU 필요권장권장불필요필수
추천 용도범용 OCR간단한 OCR레거시문서 AI

Donut: End-to-End Document Understanding

Donut은 OCR 없이 이미지에서 직접 구조화된 정보를 추출하는 Transformer 모델입니다.
from transformers import DonutProcessor, VisionEncoderDecoderModel
import torch

processor = DonutProcessor.from_pretrained("naver-clova-ix/donut-base-finetuned-cord-v2")
model = VisionEncoderDecoderModel.from_pretrained("naver-clova-ix/donut-base-finetuned-cord-v2")

# 영수증 파싱
from PIL import Image
image = Image.open("receipt.jpg")
pixel_values = processor(image, return_tensors="pt").pixel_values

with torch.no_grad():
    outputs = model.generate(pixel_values, max_length=512)

result = processor.batch_decode(outputs, skip_special_tokens=True)[0]
print(result)  # JSON 구조의 영수증 정보
가능하지만 인쇄체보다 정확도가 낮습니다. TrOCR(Transformer OCR)이 손글씨 인식에 특화되어 있으며, Hugging Face에서 사전학습 모델을 제공합니다.
표 인식은 Table Detection(표 영역 탐지)과 Table Structure Recognition(행/열 구조 파악)으로 나뉩니다. Microsoft의 Table Transformer, PaddleOCR의 PP-Structure 등이 활용됩니다.

참고 논문

논문학회/연도링크
OCR-free Document Understanding (Donut)ECCV 2022arXiv:2111.15664
TrOCRAAAI 2023arXiv:2109.10282