테스트 환경
Multi column
System Environment
CPU Intel(R) Core(TM) i7-14700F(2.10 GHz) GPU / VRAM NVIDIA GeForce RTX 5060 / 8GB RAM 32.0GB OS Windows 11 Python 3.12.10 / 3.13.5 PyTorch 2.8.0+cu129 CUDA / cuDNN 12.9 / v9.11 Library Dependencies
pytesseract 0.3.13 EasyOCR 1.7.2 PaddleOCR 3.2.0(paddlepaddle-gpu=3.0.0)
테스트에 사용된 이미지
국가법령정보센터에서 제공하는 「식품 등의 표시 · 광고에 관한 법률」
위의 링크에서 다운로드 받은 pdf 파일을 이미지로 변환하여 OCR 테스트를 진행한다. 테스트에 진행된 파일은 다음과 같다. 테스트 이미지 파일(Dropbox)
주요 평가 지표
1. 문자 오인식률(CER; Character Error Rate)
- OCR 결과 텍스트에서 문자 단위로 얼마나 틀렸는지를 측정하는 지표.
계산 공식
- = Substitutions (틀리게 바뀐 문자 수)
- = Deletions (빠진 문자 수)
- = Insertions (추가된 문자 수)
- = 정답 텍스트 총 문자 수
2. 단어 오인식률(WER; Word Error Rate)
- OCR 결과 텍스트에서 단어 단위로 얼마나 틀렸는지를 측정하는 지표.
계산 공식
- 계산 방식은 CER과 동일하지만, 단위를 문자 → 단어로 바꿈.
- 문장은 공백 기준으로 나누어 단어 단위로 비교함.
두 평가지표 모두 값이 0에 가까울수록 좋은 성능을 나타냄.
모델의 종류 및 특징
Tesseract
| |
| --- | --- |
| 장점 | - CPU 기반으로 동작하며 모델이 가볍기 때문에 서버 로컬 배치에 용이하다.
- 언어 데이터가 잘 정비되어 있다. → 다국어 지원 |
| 단점 | - 최신 딥러닝 기반 모델에 비해 성능 ↓
- 특히 장면 텍스트+), 손글씨 등에 안 좋은 성능을 보인다. |
| 추천 용도 | - 스캔된 인쇄 문서
- 단순 텍스트 추출 |
+) 장면 텍스트: 야외 환경에서 카메라로 촬영한 이미지/동영상에 나타나는 텍스트
EasyOCR
| |
| --- | --- |
| 장점 | - 설치 · 사용이 매우 간단 → 프로토타이핑에 최적
- 넓은 범위의 다국어 지원, GPU로 가속 처리 가능 |
| 단점 | - Tesseract보단 무겁고, TrOCR 같은 트렌스포머 모델에 비해 최상위 정확도는 아님. |
| 추천 용도 | - 장면 텍스트, 표지판
- 사진으로 찍은 문장 인식 |
PaddleOCR
| |
| --- | --- |
| 장점 | - 문서 전용 기능이 풍부함 → 표 인식, 문서 레이아웃 분석 등
- 한국어 전용(pretrained) 모델을 여러 옵션으로 제공 |
| 단점 | - 환경 세팅이 상대적으로 번거롭고, 고성능 모델은 많이 무거움.
- GPU/리소스 요구가 큼 → 모바일 전용 모델로 타협 가능 |
| 추천 용도 | - 한국어(및 다국어) 문서 자동화 파이프라인 |
테스트 방법

OCR 테스트
Tesseract, EasyOCR, PaddleOCR 모두 독립적인 가상 환경에서 테스트를 진행한다.
Tesseract
시작하기 전
- tesseract 엔진 설치 (Mannheim 빌드)
링크에서 Windows 64비트용 파일 설치

Mannheim 빌드는 독일 Mannheim 대학교에서 배포하는 Windows 전용 tesseract 설치 패키지다. 공식 tesseract 프로젝트는 “Windows용 설치 파일(.exe)” 제공하지 않기 때문에 Windows 환경에서 tesseract를 사용하기 위해서는 Mannheim 빌드를 받아 설치해야 한다.
설치 시 유의사항!
Choose Components 화면에서 Additional language data (download) - Korean 선택!
- 환경 변수에
tesseract.exe추가설치 시 기본 폴더 위치는 다음과 같다:
C:\Program Files\Tesseract-OCR
- [WIndows 키] > [시스템 환경 변수 편집] 검색 > [환경 변수]
또는 [제어판] > [시스템] > [고급 시스템 설정] > [환경 변수] list-grid

- 아래와 같이 사용자 변수의 Path 클릭 후 편집(E) 클릭
) - 새로 만들기(N) 클릭 후
tesseract.exe가 존재하는 폴더 경로 추가

- 필요 라이브러리 설치
- pytesseract, Pillow, jiwer(평가 지표 측정) 설치
pip install tesseract Pillow jiwer
- pytesseract, Pillow, jiwer(평가 지표 측정) 설치
tesseract - OCR 성능 테스트
- 테스트 이미지들은 ./Images 라는 폴더에 위치해 있으며, ‘OCR_test_image_(*).jpg’ 라는 이름으로 저장되어 있다.
import os
import glob
from PIL import Image
import pytesseract
# 이미지 경로
image_folder = "Images"
image_files = glob.glob(os.path.join(image_folder, "*.jpg"))
image_files.sort() # 파일명 순서대로 정렬
# ['Images\\OCR_test_image_(01).jpg', 'Images\\OCR_test_image_(02).jpg', ...]
# 결과 저장 폴더
output_folder = "OCR_Results"
os.makedirs(output_folder, exist_ok=True)
# 최종 결과를 합쳐서 저장할 리스트
all_texts = []
for filename in image_files:
img_path = filename
print(f"OCR 처리 중: {filename}")
# 이미지 열기
img = Image.open(img_path)
# OCR 실행 (한국어 + 영어)
text = pytesseract.image_to_string(img, lang="kor+eng")
# 결과 미리보기
print("인식 결과 미리보기:")
print(text[:200], "...\n")
# OCR 결과 all_text 리스트에 추가
all_texts.append(text)
all_texts.append("\n") # OCR 결과 간 줄바꿈
# 모든 결과를 하나의 파일로 저장
final_result_path = os.path.join(output_folder, "tesseract_OCR_result.txt")
with open(final_result_path, "w", encoding="utf-8") as f:
f.writelines(all_texts)
print("✅ tesseract_OCR_result.txt로 저장 완료.")
pytesseract.image_to_string()이미지를 입력 받아 문자열 형태로 반환하는 pytesseract 메서드.
- 파라미터
lang: 기본값은eng, 여러 언어를 지정하고 싶은 경우eng+kr와 같이 지정하면 된다.
OCR 결과가
tesseract_OCR_result.txt라는 이름으로 저장되었다.
tesseract - OCR 평가
ground_truth.txt ↑ ground_truth.txt는 정답 텍스트이다.(「식품 등의 표시 · 광고에 관한 법률」의 실제 텍스트) tesseract_OCR_result.txt와 비교하여 tesseract의 정확도를 확인해본다.
from jiwer import wer, cer
# 1. 원본 텍스트
with open("ground_truth.txt", "r", encoding="utf-8") as f:
ground_truth = f.read()
# 2. tesseract-OCR 결과 텍스트
with open("OCR_Results/tesseract_OCR_result.txt", "r", encoding="utf-8") as f:
ocr_result = f.read()
# 3. 가능한 정확한 비교를 위해 줄바꿈 제거 후 비교
gt_clean = ground_truth.replace("\n", " ").strip()
ocr_clean = ocr_result.replace("\n", " ").strip()
# 4. CER, WER 계산
word_error = wer(gt_clean, ocr_clean)*100
char_error = cer(gt_clean, ocr_clean)*100
print(f"WER: {word_error:.3f}")
print(f"CER: {char_error:.3f}")WER: 93.056
CER: 63.195
WER / CER 결과 해석
- WER: 93.056 → 단어 기준으로 약 93% 오류
- CER: 63.195 → 글자 기준으로 약 63% 오류
실제로
tesseract_OCR_result.txt를 확인해보면 tesseract의 OCR 성능이 매우 좋지 않음을 확인할 수 있다.
EasyOCR
시작하기 전
- NVIDIA 드라이버 설치하기
-
수동 설치 정식 NVIDIA 드라이버 → 자신의 GPU에 맞는 드라이버 검색하여 설치하기
-
자동 설치 게이머와 크리에이터를 위한 NVIDIA 앱 다운로드 → NVIDA 앱 설치 후 Game Ready 드라이버 또는 Studio 드라이버를 설치하면 자신의 GPU에 맞게 알아서 설치된다.
-
Windows 11 환경에서 NVIDA 앱 설치 시 자주 발생하는 오류
- CUDA와 cuDNN 설치하기
- 사용중인 PC의 GPU에 따라 설치해야 하는 CUDA의 버전이 상이하다. 자신의 시스템 환경에 따른 CUDA 버전 찾기
-
자신의 GPU와 호환되는 CUDA SDK version 확인
- 현재 사용중인 GPU의 Compute capability(version)을 가장 먼저 확인한다.
테스트 환경에서의 GPU는 GeForce RTX 5060 이고, 해당 GPU는 12.0의 Compute capability(version), Micro-architecture는 Blackwell에 해당한다.

- 아래 그림의 빨간 박스는 12.0 버전이 사용할 수 있는 SDK version의 범위를 알려준다.
표를 참고하면 12.8~13.0까지의 CUDA SDK version을 사용할 수 있음을 확인할 수 있다.

- 현재 사용중인 GPU의 Compute capability(version)을 가장 먼저 확인한다.
테스트 환경에서의 GPU는 GeForce RTX 5060 이고, 해당 GPU는 12.0의 Compute capability(version), Micro-architecture는 Blackwell에 해당한다.
-
CUDA 설치하기
- CUDA Archive
- CUDA Archive에 접속해 자신의 GPU 환경에 맞는 CUDA Tool kit를 선택해 설치하면 된다.
12.9 버전을 설치하고자 했을 때의 예시 화면이다. CUDA 설치 시 exe(local)로 진행하는 것이 좋다.
설치 시 기본 폴더 위치는 다음과 같다:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v*
-
cuDNN 설치하기
-
cuDNN은 설치한 CUDA의 버전에 맞춰 설치하면 된다.
cuDNN 9.11.1이 현재 테스트 환경에 적합하므로 cuDNN 9.11.1 버전을 설치한다.cuDNN 설치 시 주의사항 Tarball version을 선택하여 설치하는 것을 강력하게 권장한다.

cuDNN 설치 시 주의할 점은 CUDA를 설치할 때와 마찬가지로 exe(local)를 이용해 설치하려고 하면 안 된다!
-
Tarball Version을 다운로드 받은 후, 압축을 풀게 되면 다음과 같은 디렉토리를 확인할 수 있다.
-
해당 디렉토리를 CUDA가 설치된 경로에 복사 및 붙여넣기를 진행해주면 cuDNN 설치가 완료된다.

cuDNN의 파일들을 CUDA 파일들과 함께 보관함으로서, 환경변수를 통해 CUDA를 불러올 때 cuDNN의 파일을 같이 불러올 수 있다.
-
환경 변수 확인
- CUDA가 잘 설치되었는지 확인하기 위해 PATH를 확인한다.
CUDA 설치 시, 기본적으로 Windows의 환경 변수(PATH)에 등록이 되지만, 확인해보는 것이 좋다.
아래의 사진과 같이 CUDA_PATH가 잘 등록되어 있으면 된다.

- CUDA가 잘 설치되었는지 확인하기 위해 PATH를 확인한다.
CUDA 설치 시, 기본적으로 Windows의 환경 변수(PATH)에 등록이 되지만, 확인해보는 것이 좋다.
아래의 사진과 같이 CUDA_PATH가 잘 등록되어 있으면 된다.
- PyTorch 설치하기
- EasyOCR Github Repo의 README.md를 읽어보면 Windows 사용자를 위한 안내 사항이 다음과 같이 나와있다.
EasyOCR을 설치하기 이전에 반드시 PyTorch를 먼저 설치하자

- PyTorch: Get Started → 해당 링크에 접속하여 자신의 CUDA 버전에 맞는 PyTorch 설치 Command만 찾아서 설치를 진행하면 된다!
pip install torch==2.8.0 torchvision==0.23.0 torchaudio==2.8.0 --index-url https://download.pytorch.org/whl/cu129
- EasyOCR Github Repo의 README.md를 읽어보면 Windows 사용자를 위한 안내 사항이 다음과 같이 나와있다.
EasyOCR을 설치하기 이전에 반드시 PyTorch를 먼저 설치하자
- EasyOCR 설치하기
- PyTorch를 설치한 이후에 EasyOCR을 다음과 같이 설치한다.
pip install easyocr
- PyTorch를 설치한 이후에 EasyOCR을 다음과 같이 설치한다.
EasyOCR - OCR 성능 테스트
import os
import glob
import torch
import easyocr
# 1) Reader 생성 (한국어 + 영어)
reader = easyocr.Reader(['ko', 'en'], gpu=True) # GPU=True로 하면 GPU 사용 → 더 빠름
# 2) 이미지 경로 & 결과 저장 폴더
image_folder = "Images"
image_files = glob.glob(os.path.join(image_folder, "*.jpg"))
image_files.sort() # 파일명 순서대로 정렬
# ['Images\\OCR_test_image_(01).jpg', 'Images\\OCR_test_image_(02).jpg', ...]
output_folder = "OCR_Results"
os.makedirs(output_folder, exist_ok=True)
# 3) 결과 저장용 리스트
all_texts = []
for img_path in image_files:
results = reader.readtext(img_path, detail=0) # detail=0 → 텍스트만 추출
text = "\n".join(results)
all_texts.append(text)
all_texts.append("\n\n")
# GPU VRAM 상태 출력 (GB 단위)
if torch.cuda.is_available():
allocated = torch.cuda.memory_allocated(0) / 1024**3 # GB
reserved = torch.cuda.memory_reserved(0) / 1024**3 # GB
print(f"현재 VRAM 사용: {allocated:.3f} GB, 예약된 VRAM: {reserved:.3f} GB")
# 4) 결과를 파일로 저장
final_result_path = os.path.join(output_folder, "EasyOCR_result.txt")
with open(final_result_path, "w", encoding="utf-8") as f:
f.writelines(all_texts)
print("✅ EasyOCR_result.txt 결과 저장 완료.")reader = easyocr.Reader(['ko', 'en'], gpu=True)에서 gpu=False 입력 시 CPU만으로 OCR을 수행한다.
OCR 결과가
EasyOCR_result.txt라는 이름으로 저장되었다.
EasyOCR - OCR 평가
from jiwer import wer, cer
# 1. 원본 텍스트
with open("ground_truth.txt", "r", encoding="utf-8") as f:
ground_truth = f.read()
# 2. OCR 결과 텍스트
with open("OCR_Results/EasyOCR_result.txt", "r", encoding="utf-8") as f:
ocr_result = f.read()
# 3. 가능한 정확한 비교를 위해 줄바꿈 제거 후 비교
gt_clean = ground_truth.replace("\n", " ").strip()
ocr_clean = ocr_result.replace("\n", " ").strip()
# 4. CER, WER 계산
word_error = wer(gt_clean, ocr_clean)*100
char_error = cer(gt_clean, ocr_clean)*100
print(f"WER: {word_error:.2f}")
print(f"CER: {char_error:.2f}")WER: 38.54
CER: 9.66
WER / CER 결과 해석
- WER: 38.54 → 단어 기준으로 약 39% 오류
- CER: 9.66 → 글자 기준으로 약 10% 오류
tesseract 모델과 비교했을 때, EasyOCR의 오인식률이 현저히 낮은 것을 확인할 수 있다. 또한, tesseract와 달리 GPU 가속을 활용하기 때문에 처리 속도 측면에서 훨씬 좋은 성능을 보인다.
PaddleOCR
시작하기 전
PaddleOCR 사용 시 가상 환경
PaddleOCR은 anaconda 가상 환경에서는 잘 작동하지 않는다. 따라서 현재 프로젝트 내부에 직접 가상 환경을 생성하는 것을 추천한다.
- PaddlePaddle 설치하기
-
PaddleOCR은 PaddlePaddle이라는 종속성 프레임워크가 함께 설치되어야만 정상적으로 작동한다.
-
(3.0 버전을 기준으로) PaddleOCR은 EasyOCR처럼 GPU 사용 여부를 결정 짓는 파라미터가 존재하지 않는다. (어떤 GPU를 사용할 것인지 지정할 수는 있다.)
-
따라서 CPU 환경에서만 돌릴 경우, CPU 전용 paddlepaddle을 설치해야 하고, GPU 환경에서 사용하려면 또 그에 맞는 paddlepaddle을 설치해줘야 한다.
-
PaddleOCR github repo의 설치 문서에 따르면 현재 50 series에 대한 이슈가 나와 있다.
-
자신의 GPU가 50 series가 아니라면 설치 공식 문서에서 안내하는 대로 설치를 진행하면 된다.
테스트 환경이 50 series GPU를 사용중이므로 가상 환경의 python 버전은 3.12를 사용하고, 문서에서 안내하는 방법대로 paddle framework를 설치한다.# python 3.12 python -m pip install https://paddle-qa.bj.bcebos.com/paddle-pipeline/Develop-TagBuild-Training-Windows-Gpu-Cuda12.9-Cudnn9.9-Trt10.5-Mkl-Avx-VS2019-SelfBuiltPypiUse/86d658f56ebf3a5a7b2b33ace48f22d10680d311/paddlepaddle_gpu-3.0.0.dev20250717-cp312-cp312-win_amd64.whl -
PaddlePaddle Wheel 설치 이후, 설치가 잘 이루어졌는지 확인하기 위해 콘솔창에 다음과 같이 입력한다.
python -c "import paddle; print(paddle.__version__)"설치가 성공적으로 이루어졌다면 다음과 같이 출력된다.
3.0.0또는 다음과 같이 입력해서 확인할 수도 있다.
python -c "import paddle; paddle.utils.run_check()"아래와 같이 출력되면 성공적으로 설치된 것이다.
Running verify PaddlePaddle program ... PaddlePaddle works well on 1 GPU. PaddlePaddle is installed successfully! Let's start deep learning with PaddlePaddle now. -
PaddlePaddle이 CUDA / cuDNN과 잘 연동되는지 확인하려면 다음의 절차를 따른다.
python -c "import paddle; print(paddle.device.is_compiled_with_cuda()); print(paddle.device.get_device())"True gpu:0반드시
True가 출력되어야 GPU를 사용하여 PaddleOCR을 실행할 수 있다. PaddleOCR은 꽤 무거운 모델에 속하기 때문에 GPU 사용 여부가 속도에 큰 영향을 미친다.PaddleOCR은 CUDA뿐만 아니라 TensorRT를 연동하여 OCR을 시행할 수 있다. 하지만 본 문서에서는 해당 내용을 다루지 않는다.
- PaddleOCR 설치하기
- PaddlePaddle을 성공적으로 설치했다면 그다음으로 PaddleOCR을 설치하면 된다. 콘솔창에 다음과 같이 입력한다.
python -m pip install paddleocr
- PaddlePaddle을 성공적으로 설치했다면 그다음으로 PaddleOCR을 설치하면 된다. 콘솔창에 다음과 같이 입력한다.
PaddleOCR - OCR 성능 테스트
import os
import glob
from paddleocr import PaddleOCR
# 1) OCR 객체 생성 (한국어 + 영어)
ocr = PaddleOCR(
lang='korean',
use_doc_orientation_classify=False, # 문서 방향 분류 모델 비활성화
use_doc_unwarping=False, # 텍스트 이미지 언와핑 모델 비활화 (문서 왜곡 보정)
use_textline_orientation=False, # 텍스트 줄 방향 분류 모델 비활성화
textline_orientation_batch_size=4,
text_recognition_batch_size=8,
ocr_version="PP-OCRv5", # 모델 버전 명시
precision='fp16', # FP16 정밀도 사용
text_det_limit_side_len=1024, # 필요 시 감지 입력 최대 길이 제한
)
# 2) 이미지 경로 & 결과 저장 폴더
image_folder = "Images"
image_files = glob.glob(os.path.join(image_folder, "*.jpg"))
image_files.sort() # 파일명 순서대로 정렬
output_folder = "OCR_Results"
os.makedirs(output_folder, exist_ok=True)
# 3) 결과 저장용 리스트
all_texts = []
# 4) 모든 이미지 OCR 처리
for img_path in image_files:
result = ocr.predict(input=img_path)
# 텍스트 추출
lines = result[0]['rec_texts'] # 리스트 형태
text = "\n".join(lines)
# 이미지 구분용 줄바꿈 추가
all_texts.append(text + "\n\n")
# 5) 결과를 하나의 파일로 저장
final_result_path = os.path.join(output_folder, "PaddleOCR_result.txt")
with open(final_result_path, "w", encoding="utf-8") as f:
f.writelines(all_texts)PaddleOCR - OCR 평가
from jiwer import wer, cer
# 1. 원본 텍스트
with open("ground_truth.txt", "r", encoding="utf-8") as f:
ground_truth = f.read()
# 2. OCR 결과 텍스트
with open("OCR_Results/PaddleOCR_result.txt", "r", encoding="utf-8") as f:
ocr_result = f.read()
# 3. 가능한 정확한 비교를 위해 줄바꿈 제거 후 비교
gt_clean = ground_truth.replace("\n", " ").strip()
ocr_clean = ocr_result.replace("\n", " ").strip()
# 4. CER, WER 계산
word_error = wer(gt_clean, ocr_clean)*100
char_error = cer(gt_clean, ocr_clean)*100
print(f"WER: {word_error:.2f}")
print(f"CER: {char_error:.2f}")WER: 23.88
CER: 5.57
WER / CER 결과 해석
- WER: 23.88 → 단어 기준으로 약 29% 오류
- CER: 5.57 → 글자 기준으로 약 6% 오류
EasyOCR 모델과 비교했을 때 CER이 소폭 감소하고, WER이 10%p 감소했다. 세 개의 모델 중 PaddleOCR이 가장 좋은 인식률을 보이는 것이 확인된다. 하지만 모델이 무거운 만큼 EasyOCR에 비해 처리 속도가 더 오래 걸린다는 단점이 있으며, 텍스트가 매우 많은 이미지에 사용하기에는 적합하지 않은 것으로 보인다.
결과 및 성능 비교


Windows 11 환경에서 위와 같은 오류가 발생했다면 NVIDIA 앱을 백날 재설치해봐야 해결되지 않는다. 해결 방법은 다음과 같다. 

