GitHub - StellaAthena/ocr-comparison: Compare OCR engines (Tesseract vs EasyOCR) with visualization and accuracy metrics
Service

GitHub - StellaAthena/ocr-comparison: Compare OCR engines (Tesseract vs EasyOCR) with visualization and accuracy metrics

StellaAthena
2026.01.28
·GitHub·by 네루
#OCR#Python#Tesseract#EasyOCR#Comparison

핵심 포인트

  • 1`ocr-comparison`은 Tesseract 및 EasyOCR과 같은 OCR 엔진들을 시각화하고 정확도 지표를 사용하여 비교하는 Python 라이브러리입니다.
  • 2이 시스템은 Overlay, Side-by-Side, Diff, Split+Flip Viewer 등 다양한 시각화 모드를 제공하며, CER, WER 같은 정확도 metrics를 계산합니다.
  • 3Adapter pattern을 통해 새로운 OCR 엔진 추가가 가능하며, CLI 또는 Python API를 통해 개별 이미지 및 배치 처리를 지원합니다.

ocr-comparison은 Tesseract와 EasyOCR과 같은 OCR(Optical Character Recognition) 엔진들의 성능을 시각화 및 정량적 측정 지표를 통해 비교할 수 있도록 설계된 파이썬 라이브러리입니다. 이 시스템은 확장 가능한 어댑터(adapter) 아키텍처를 기반으로 하여 새로운 OCR 엔진들을 쉽게 추가하고 통합할 수 있도록 합니다.

핵심 기능은 다음과 같습니다:

  • Multi-engine comparison: 동일한 이미지에 대해 여러 OCR 엔진을 실행하고 그 결과를 비교합니다.
  • Visualization: 인식된 텍스트의 바운딩 박스(bounding box)를 이미지에 오버레이하거나, 원본 이미지와 OCR 결과들을 나란히 배치하거나(side-by-side), 엔진 간의 불일치를 강조하는 Diff View 등을 제공합니다. 특히, Split + Flip Viewer는 각 엔진의 결과를 개별 이미지로 생성하고 이를 빠르게 전환하며 비교할 수 있게 하여, 엔진별 탐지 차이를 명확하게 보여주는 권장되는 시각화 방식입니다.
  • Accuracy metrics: Ground Truth(정답 텍스트)가 제공될 경우, CER(Character Error Rate), WER(Word Error Rate), Precision, Recall, F1 점수 등과 같은 정량적인 정확도 지표를 계산합니다.
  • Batch processing: 이미지 디렉토리 전체를 일괄 처리할 수 있습니다.
  • CLI and Python API: 커맨드 라인 인터페이스 또는 파이썬 코드 내에서 통합하여 사용할 수 있습니다.
  • Extensibility: 어댑터 인터페이스를 통해 새로운 OCR 엔진을 쉽게 추가할 수 있습니다.

코어 방법론: 어댑터 패턴 기반의 엔진 확장성

이 라이브러리의 핵심 설계는 BaseOCRAdapter 추상 기본 클래스를 활용하는 어댑터 패턴에 있습니다. 이는 다양한 OCR 엔진을 통합하고 표준화된 방식으로 접근할 수 있게 합니다.

  1. 데이터 모델:
    • BoundingBox: x, y, width, height, angle (회전 각도) 속성을 포함하며, IoU (Intersection over Union) 계산 메서드를 제공합니다. 두 바운딩 박스 B1B_1B2B_2 사이의 IoU는 다음과 같이 정의됩니다:
IoU(B1,B2)=Area(B1B2)Area(B1B2)IoU(B_1, B_2) = \frac{Area(B_1 \cap B_2)}{Area(B_1 \cup B_2)}
  • OCRWord: 인식된 단어의 텍스트, 해당 BoundingBox, 그리고 인식 신뢰도(confidence, 0.0 ~ 1.0)를 포함합니다.
  • OCRResult: 특정 엔진이 한 이미지에서 인식한 전체 결과를 나타내며, OCRWord 객체들의 리스트, 엔진 이름, 처리 시간, 이미지 크기, 전체 텍스트(full_text), 단어 수, 평균 신뢰도 등을 포함합니다.
  • AccuracyMetrics: Ground Truth와 비교하여 계산된 cer, wer, precision, recall, f1 점수를 저장합니다.
    • CER (Character Error Rate): 문자 단위의 인식 오류율로, Ground Truth 대비 Substitution(대체), Deletion(삭제), Insertion(삽입)된 문자의 비율입니다.
CER=S+D+INchar_gtCER = \frac{S+D+I}{N_{char\_gt}} (여기서 SS: 대체된 문자 수, DD: 삭제된 문자 수, II: 삽입된 문자 수, Nchar_gtN_{char\_gt}: Ground Truth의 전체 문자 수)
  • WER (Word Error Rate): 단어 단위의 인식 오류율로, CER과 유사하게 단어의 대체, 삭제, 삽입 비율입니다.
WER=S+D+INword_gtWER = \frac{S+D+I}{N_{word\_gt}} (여기서 SS: 대체된 단어 수, DD: 삭제된 단어 수, II: 삽입된 단어 수, Nword_gtN_{word\_gt}: Ground Truth의 전체 단어 수)
  • Precision, Recall, F1: 탐지된 바운딩 박스와 Ground Truth 바운딩 박스 간의 IoU를 기반으로 계산되는 지표입니다.
Precision=TPTP+FPPrecision = \frac{TP}{TP+FP}
Recall=TPTP+FNRecall = \frac{TP}{TP+FN}
F1=2×Precision×RecallPrecision+RecallF1 = 2 \times \frac{Precision \times Recall}{Precision + Recall}
(여기서 TPTP: True Positive, FPFP: False Positive, FNFN: False Negative)

  1. 엔진 어댑터 구현:
새로운 OCR 엔진을 추가하려면 BaseOCRAdapter를 상속받는 클래스를 구현해야 합니다.
  • name 속성: 엔진의 이름을 문자열로 반환합니다.
  • _initialize_engine() 메서드: OCR 엔진 라이브러리를 초기화하며, 필요 시점에(lazily) 호출됩니다. 필요한 라이브러리가 설치되지 않은 경우 ImportError를 발생시켜 사용자에게 설치 방법을 안내해야 합니다.
  • process(image:np.ndarray)>OCRResult_process(image: np.ndarray) -> OCRResult 메서드: 실제 OCR 처리를 수행하고 그 결과를 표준화된 OCRResult 객체로 반환합니다. 이 메서드는 입력 이미지를 NumPy 배열(RGB 형식)로 받아야 하며, OCR 엔진의 원시 출력(raw results)을 OCRWord 객체 리스트로 변환하고 OCRResult 객체에 포함시켜 반환해야 합니다. 신뢰도 값은 0.0에서 1.0 사이로 정규화해야 합니다.

이러한 어댑터 구조를 통해 OCRComparator는 다양한 OCR 엔진을 동일한 방식으로 처리하고 비교할 수 있으며, 개발자는 새로운 엔진을 추가할 때 기존 시스템의 나머지 부분에 영향을 주지 않고 특정 엔진의 통합 로직만 구현하면 됩니다.