이번 게시물에서는 OCR(Optical Character Recognition) 의 모델 구조, 평가 방법, 사용가능한 API 종류에 대해 설명하고 다음 게시물에서 각 API 별 장단점과 실제 데이터로 성능을 비교한 결과를 공유하고자 한다.
1. OCR(Optical Character Recognition) 이란?
OCR 모델의 구조 : Text detection + Text recognition
Text detection - 글자의 위치를 찾고
Text recognition - 어떤 글자 인지를 인식하자

1) OCR 알고리즘의 유형
a. Two stage algorithm : OCR Text Dectection 과 Text Recognition을 분리해서 학습 Pipeline 구성

- 글자 검출 Text Detection : Object detection 테스크를 문자 찾기로 확장한 영역
- input : 전체 image / output : 텍스트가 있는 Bounding box
- Object detection과 유사한 접근 방식 - Object가 Text boundary box
- 활용 알고리즘 : CNN 기반 모델
- 글자 인식 Text Recognition : 검출된 문자가 텍스트로 뭔지
- input : 텍스트만 추려진 image / output : 텍스트
- ex. RNN 계열 모델 (with attention), Transformer (input : image / output : text), CRNN
- 문제점
- 글자 검출에서 bounding box가 잘못된 경우 - 글자 인식도 잘못됨
- 2번의 Image backbone이 별도로 구성됨
- ⇒ 이 둘을 하나로 합치는 접근 방식이 E2E OCR 방법론
b. End-to-End Scene Text Detection & Recognition : Detection과 Recognition 한번에 E2E OCR 방법론

- 특징
- input : 전체 image / output : 텍스트가 있는 Bounding box & 텍스트
- 검출과 인식을 한번에 진행 - 모델 학습 업데이트 측면에서 편리
- Image Backbone을 공유 : 2번의 Image Backbone Forward 를 거칠 필요 없음
- 예시 알고리즘
- FOTS (Fast Oriented Text Spotting with a Unified Network)
- DEER (Detection agnostic End to End Recognizer) ⇒ Naver Clova API
2. OCR(Optical Character Recognition) 성능 평가 방법
보편적인 평가 방법 (accuracy, F1 score, Recall, Precision) 외에 Error Rate, IoU 지표를 사용하며, 그 외에도 처리속도나 범용성 등을 확인
a. Text Detection
- IoU (Intersection over Union)
- 이미지 내의 텍스트 영역을 정확하게 감지하는 능력을 평가하는 데 사용
- A, B 좌표값으로 Intersection 계산 후, A∪B=A+B−A∩B를 이용하여 Union 계산

intersection_x_length = min(max_x1, max_x2) - max(min_x1, min_x2);
intersection_y_length = min(max_y1, max_y2) - max(min_y1, min_y2);
b. Text Recognition
- Text Recognition - 오류율 (Error Rate)
- Edit Distance 알고리즘
- 문자열 A와 문자열 B가 있을 때 A의 문자를 삭제(Deletion), 변경(Substitution), 삽입(Insertion)하여 B의 문자열을 만들어야 할 때, 최소 횟수를 구하는 문제
- 문자 오류율 (Character Error Rate, CER): 잘못 인식된 문자의 비율을 측정
- 단어 오류율 (Word Error Rate, WER): 잘못 인식된 단어의 비율을 측정
- 논문에서는 ACC-CER(=1-CER), ACC-WER(=1-WER) 로 정확도로 표현하기도 함
- 좀 더 보수적으로 평가하고자 한다면 WER, 세부적으로 평가하고자 한다면 CER

실제 python torch metric으로 계산하는 코드
import torch
from torchmetrics.text import CharErrorRate, WordErrorRate
# CER, WER 계산기 초기화
calc_cer = CharErrorRate()
calc_wer = WordErrorRate()
def calculate_cer_wer(gt_text, pred_text):
"""
torchmetrics.text의 CharErrorRate와 WordErrorRate를 사용하여 CER, WER 계산
"""
# torchmetrics는 입력을 리스트 형태로 받아야 함
cer = calc_cer([pred_text], [gt_text])
wer = calc_wer([pred_text], [gt_text])
return cer.item(), wer.item()
# 예제 테스트
ground_truth = "안녕하세요, 오늘 날씨가 참 좋네요."
predicted_text = "안녀하세요, 온늘 날씨가 참 줗네요."
cer, wer = calculate_cer_wer(ground_truth, predicted_text)
print(f"CER: {cer:.4f}")
print(f"WER: {wer:.4f}")
c. 그 외 평가 항목
- 처리 속도 (Processing Speed)
- OCR 시스템이 이미지를 처리하는 데 걸리는 시간을 측정
- 범용성 (Versatility)
- 다양한 유형의 문서(언어, 글꼴, 크기, 배경 등)에 대한 시스템의 인식 능력을 평가

3. OCR 사용 가능 API, python package (유료 / 무료 섞여있음)
Cloud 기반 API 서비스 | Azure API | 유료 |
Google API | ||
국내 API 서비스 | Naver Clova | |
Upstage | ||
Python 패키지 | PaddleOCR | 무료 |
EasyOCR | ||
Tesseract |
표로 정리하자면 위와 같다.
Cloud 기반 API 서비스에는 Azure, Google 이 있으며 해당 서비스는 유료이다. 영어 인식, 다국어인식에 유리하다
국내 API 서비스에는 Naver, Upstage 가 있으며 해당 서비스도 마찬가지로 유료다. 국내 서비스다 보니 한국어 인식이 뛰어나다.
마지막으로 Python 패키지는 API를 호출할 수 없는, 네트워크 연결없이 OCR 인식을 해야하는 경우 적합하며, 무료인게 가장 큰 장점이다.
Paddle, EasyOCR, Tesseract 가 있으며 Python에서 패키지로 설치해 실행이 가능하다.
다음 게시물에선 각각 API, Package의 장단점 / 비용 / 성능 그리고 사용 방법에 대해서 상세히 다뤄보고자 한다
댓글