
OCR 도입이 오후 한나절이면 끝날 줄 알았습니다 — Tesseract의 배신과 프로덕션의 현실
단순 라이브러리 설치부터 이미지 전처리, PDF 렌더링까지: 오픈소스 OCR 파이프라인 구축 시 마주하는 치명적인 함정들
처음 OCR 기능을 구현하라는 요청을 받았을 때, 저는 정말 가볍게 생각했습니다. ‘Tesseract라는 유명한 오픈소스가 있고, 파이썬 래퍼 라이브러리도 잘 되어 있으니 pip install 하고 API 몇 번 호출하면 금방 끝나겠지’라고요. 하지만 실제 현장에서 마주한 데이터는 처참했습니다. 깨끗한 스캔본에서는 80% 정도 나오던 정확도가, 노이즈가 섞인 실제 문서만 들어가면 40~50%까지 뚝 떨어지더라고요 [1, 2].
여기서 우리가 깨달아야 할 뼈아픈 진실이 하나 있습니다. 오픈소스 OCR, 특히 Tesseract는 설치는 정말 쉽지만, 프로덕션 수준의 정확도를 얻으려면 엔진 설정보다 ‘이미지 전처리’와 ‘환경 구성’이라는 거대한 전단계에 훨씬 더 많은 공수가 든다는 점입니다.
OCR의 환상: ‘pip install’만 하면 끝나는 게 아니다
많은 개발자가 pytesseract 같은 라이브러리를 설치하면 모든 준비가 끝났다고 생각하시곤 합니다. 하지만 Tesseract는 단순한 파이썬 라이브러리가 아니라, OS 레벨에서 돌아가는 C/C++ 기반의 엔진이에요. 즉, 파이썬 패키지를 깔았다고 되는 게 아니라 서버 OS에 Tesseract 엔진 자체가 설치되어 있어야 하고, 경로 설정까지 정확히 맞춰줘야 합니다.
더 골치 아픈 건 언어 팩 관리입니다. 한국어나 영어 같은 언어별 .traineddata 파일을 수동으로 다운로드해서 정확한 디렉토리에 넣어줘야 하거든요. 만약 엔진 버전과 데이터 파일 버전이 맞지 않으면 어떻게 될까요? 에러가 나면 다행인데, 최악의 경우 에러 없이 정확도만 조용히 떨어집니다.
“Errors in file placement or version mismatches silently degrade accuracy.”
(파일 배치 오류나 버전 불일치는 인식 정확도를 소리 없이 저하시킵니다.) [3]
또 하나, PDF 파일을 처리해야 한다면 상황은 더 복잡해집니다. PDF는 텍스트가 포함된 경우도 있지만, 많은 경우 ‘이미지로 된 PDF’거든요. 이때는 단순 텍스트 추출이 아니라 pypdfium2 같은 도구로 PDF 페이지를 고품질 이미지로 먼저 렌더링하는 단계가 반드시 필요합니다.
# Tesseract를 사용하기 위한 기본적인 파이썬 설정 예시
import pytesseract
from PIL import Image
# 1. OS에 설치된 Tesseract 엔진 경로를 명시적으로 지정해야 합니다.
# 윈도우의 경우 설치 경로가 기본값과 다를 때 필수 설정입니다.
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
def extract_text_from_image(image_path):
# 이미지를 불러와서 OCR 수행
# lang='kor+eng' 설정을 통해 한글과 영어를 동시에 인식하게 합니다.
image = Image.open(image_path)
text = pytesseract.image_to_string(image, lang='kor+eng')
return text
# 실제 사용 시에는 이 단계 이전에 '이미지 전처리' 과정이 반드시 들어가야 합니다.
print(extract_text_from_image('sample_doc.png'))
정확도를 결정짓는 8할: Tesseract가 좋아하는 ‘이미지’ 만들기
엔진 옵션을 아무리 만져봐도 정확도가 안 오른다면, 그건 엔진 문제가 아니라 ‘이미지’ 문제입니다. Tesseract는 생각보다 입맛이 까다롭거든요.
가장 먼저 챙겨야 할 건 DPI(해상도)입니다. Tesseract는 최소 300 DPI 이상의 이미지에서 가장 잘 작동합니다 [4]. 해상도가 너무 낮으면 글자가 뭉쳐 보여서 엉뚱한 문자로 인식하기 일쑤죠.
그다음은 ‘이진화(Binarization)’와 ‘노이즈 제거’입니다. 배경에 그림자가 있거나 종이 질감이 그대로 드러나면, 엔진은 그걸 글자의 일부로 착각합니다. 그래서 배경은 완전히 흰색으로, 글자는 완전히 검은색으로 분리하는 작업이 필수적이에요. 여기에 텍스트 라인이 삐뚤어져 있다면 ‘데스큐잉(Deskewing)’을 통해 수평을 맞춰줘야 합니다. 페이지가 너무 기울어지면 라인 세그멘테이션(글 줄 나누기) 품질이 급격히 떨어지기 때문이죠 [4].
재밌는 점은 ‘여백(Border)’의 역설입니다. 텍스트 영역에 적절한 여백(약 10px)이 없으면 인식이 잘 안 될 때가 있고, 반대로 여백이 너무 많으면 엔진이 아예 ‘빈 페이지’라고 판단해버리는 황당한 상황이 발생하기도 합니다 [4].
import cv2
import numpy as np
def preprocess_for_tesseract(image_path):
# 이미지 로드
img = cv2.imread(image_path)
# 1. 그레이스케일 변환 (색상 정보 제거)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 2. 노이즈 제거 (가우시안 블러)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# 3. 이진화 (Adaptive Thresholding으로 배경 그림자 제거)
# 배경이 균일하지 않을 때 일반 Threshold보다 훨씬 효과적입니다.
binary = cv2.adaptiveThreshold(
blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2
)
# 4. 적절한 여백 추가 (10px)
bordered = cv2.copyMakeBorder(
binary, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=[255, 255, 255]
)
return bordered
# 전처리된 이미지를 저장하거나 바로 Tesseract에 전달합니다.
processed_img = preprocess_for_tesseract('noisy_document.jpg')
cv2.imwrite('cleaned.png', processed_img)
딥러닝 OCR(docTR) vs 전통적 OCR(Tesseract)의 트레이드오프
전처리를 열심히 해도 한계가 느껴질 때가 있습니다. 특히 문서 레이아웃이 복잡하거나 표가 섞여 있는 경우죠. 이때 고려할 수 있는 대안이 docTR 같은 딥러닝 기반 OCR입니다.
정확도 면에서는 딥러닝 모델이 압도적입니다. 실제 프로덕션 문서 테스트에서 Tesseract가 40~50%의 정확도를 보일 때, docTR은 이를 80~85%까지 끌어올리기도 합니다 [1]. 하지만 세상에 공짜는 없죠.
가장 큰 문제는 리소스 비용입니다. GPU 없이 CPU만 사용하는 환경이라면 docTR은 Tesseract보다 약 3~4배 정도 느립니다 [1]. 실시간성이 극도로 중요한 서비스라면 Tesseract의 속도가 여전히 강력한 무기가 되겠지만, 정확도가 생명인 문서 자동화 시스템이라면 GPU 인프라 비용을 감수하더라도 딥러닝 모델로 가는 게 맞습니다.
절대 하지 말아야 할 OCR 안티패턴
제가 옆에서 지켜본 많은 분이 하는 실수들이 있습니다. 이것만 피해도 삽질 시간을 절반으로 줄일 수 있어요.
- “엔진이 알아서 해주겠지” 하며 원본 이미지를 그대로 넣는 것: Tesseract는 전경과 배경 분리가 뚜렷하지 않으면 쉽게 무너집니다 [5]. 전처리는 선택이 아니라 필수입니다.
- Tesseract로 필기체를 인식하려는 시도: 단언컨대, Tesseract는 필기체를 제대로 인식하지 못합니다 [5]. 필기체가 필요하다면 처음부터 다른 도구를 찾으세요.
- PNG 파일의 알파 채널(투명도)을 방치하는 것: 투명 배경이 포함된 이미지는 인식 오류의 주범이 됩니다. 특히 Tesseract 3.0x 버전 등을 쓴다면 반드시 알파 채널을 제거해야 합니다 [4].
- 무턱대고 ‘재학습(Retraining)’에 매달리는 것: 폰트가 정말 특이한 경우가 아니라면, 재학습보다는 이미지 전처리 파이프라인을 정교하게 짜는 것이 훨씬 효율적이고 빠릅니다 [4].
현실적인 선택지와 한계
물론 모든 문제를 오픈소스로 해결할 수는 없습니다. IronOCR 같은 상용 라이브러리를 쓰면 전처리의 고통을 많이 덜 수 있고 정확도도 높지만, 매달 나가는 비용과 특정 벤더에 종속된다는 리스크가 있죠 [3].
또한, 딥러닝 모델이 정확하긴 하지만 인프라 구축 비용이 만만치 않습니다. 결국 “우리 서비스에서 허용 가능한 오차 범위는 어디까지인가?”와 “인프라 비용을 얼마나 쓸 수 있는가?” 사이의 저울질이 필요합니다.
핵심 요약
- OCR의 핵심은 ‘엔진’ 그 자체가 아니라, 엔진이 읽기 좋게 만드는 ‘전처리’에 있습니다.
- Tesseract를 쓰기 전, 대상 문서의 DPI가 300 이상인지, 기울기는 없는지, 노이즈는 얼마나 섞였는지부터 확인하세요.
- 필기체 인식이 필요하다면 Tesseract는 과감히 리스트에서 지우세요.
- PDF 처리 시에는
pypdfium2같은 라이브러리로 고품질 이미지를 먼저 만드는 파이프라인을 구축하세요. - 정확도 80%의 벽을 넘어야 한다면, GPU 인프라를 준비하고
docTR같은 딥러닝 기반 OCR 도입을 검토하세요.
처음에는 단순한 API 호출 한 번으로 끝날 줄 알았던 작업이, 결국 이미지의 해상도와 픽셀, 물리적 기울기를 고민해야 하는 컴퓨터 비전의 영역이었다는 사실에 꽤 놀랐습니다. 라이브러리를 ‘설치’하는 것과 기능을 ‘구현’하는 것 사이에는 정말 거대한 간극이 있더라고요. 여러분은 부디 저처럼 “오후 한나절이면 끝나겠지”라는 환상에 빠지지 마시고, 처음부터 전처리 파이프라인 설계에 시간을 투자하시길 바랍니다.
참고 자료 (References)
[1] [47billion.com] Deep Learning OCR: Tesseract vs docTR Guide — https://47billion.com/blog/deep-learning-ocr-tesseract-vs-doctr-explained-with-real-world-results [2] [markaicode.com] Tesseract Production Setup: 4 Steps to 99% OCR Accuracy — https://markaicode.com/tutorial/tesseract-tutorial-production-setup-guide/ [3] [ironsoftware.com] Best Tesseract OCR Engine for .NET Projects (2026) — https://ironsoftware.com/csharp/ocr/blog/compare-to-other-components/tesseract-ocr-library [4] [tesseract-ocr.github.io] Improving the quality of the output | tessdoc — https://tesseract-ocr.github.io/tessdoc/ImproveQuality.html [5] [klippa.com] Tesseract OCR: What Is It and Why Choose It in 2026? — https://www.klippa.com/en/blog/information/tesseract-ocr
관련 글 추천
- https://infobuza.com/2026/06/16/20260616-d47ecq/
- https://infobuza.com/2026/06/16/20260616-nemlzn/
FAQ
Tesseract를 사용할 때 파이썬 라이브러리만 설치하면 바로 사용할 수 있나요?
아니요, Tesseract는 OS 레벨에서 동작하는 C/C++ 기반 엔진이므로 서버 OS에 엔진 자체가 설치되어 있어야 하며, 경로 설정과 언어별 데이터 파일(.traineddata)을 수동으로 설치하는 과정이 필요합니다.
Tesseract OCR의 인식 정확도를 높이기 위해 가장 중요한 전처리 작업은 무엇인가요?
최소 300 DPI 이상의 해상도를 확보하고, 배경은 흰색 글자는 검은색으로 분리하는 이진화 작업, 노이즈 제거, 그리고 텍스트 수평을 맞추는 데스큐잉(Deskewing) 작업이 필수적입니다.
이미지로 된 PDF 파일을 OCR로 처리하려면 어떻게 해야 하나요?
단순 텍스트 추출이 불가능하므로, pypdfium2와 같은 도구를 사용하여 PDF 페이지를 먼저 고품질 이미지로 렌더링하는 단계가 반드시 필요합니다.
Tesseract와 딥러닝 기반의 docTR의 차이점은 무엇인가요?
docTR은 Tesseract보다 정확도가 압도적으로 높지만, GPU 없이 CPU만 사용할 경우 속도가 약 3~4배 정도 느리며 인프라 비용이 더 많이 발생한다는 트레이드오프가 있습니다.
Tesseract를 사용할 때 주의해야 할 안티패턴은 무엇인가요?
원본 이미지를 전처리 없이 그대로 사용하는 것, Tesseract로 필기체 인식을 시도하는 것, PNG 파일의 알파 채널(투명도)을 방치하는 것, 그리고 전처리보다 재학습에 먼저 매달리는 것을 피해야 합니다.




























