결론 — “전체 객체 수 보존”이 핵심 기준이다
시험지 OCR에서 TP/FP/FN을 계산할 때 가장 중요한 원칙은:
“총합 문제 수가 일치되어야 정확하다”
부분 검출을 성공으로 인정하고, 전체 객체 수가 보존되는지를 기준으로 평가하면 혼란이 해소된다.
예시: GT(정답) = 문제 10개, 해설 0개
모델이 문제 9개를 정확히 찾고, 문제 1개를 “해설”로 잘못 분류한 경우:
| 클래스 | TP | FP | FN | 해석 |
|---|---|---|---|---|
| 문제 | 9 | 1 | 0 | 9개 정확 탐지 + 1개를 해설로 잘못 분류(FP) |
| 해설 | 0 | 0 | 1 | 실제 해설 0개인데, 문제 1개가 해설로 빠져나감(FN) |
검증: 전체 객체 수 = TP + FN = 9 + 0 + 0 + 1 = 10 ✓ (GT와 일치)
이 관점에서 보면:
- 문제 클래스 FP(잘못 찾은 것) = 해설 클래스 FN(찾지 못한 것)
- 한쪽의 FP는 다른 쪽의 FN으로 이동한 것이다
- 전체 합이 보존되므로 평가 체계가 일관적
“전체 객체 수 보존” 관점이 시험지 OCR에 적합한 이유
시험지 OCR은 단순 Detection(박스 찾기)이 아니라 문서 구조 복원이다. 핵심 목표는:
- 문제가 몇 개인지 정확히 파악
- 각 문제의 지문·선택지·해설이 올바르게 연결
- 읽기 순서가 보존
따라서 “박스를 몇 개 맞혔는가?”보다 “전체 문제 수가 일치하는가?”가 더 중요한 지표다.
| 관점 | 질문 | 적합한 상황 |
|---|---|---|
| Detection 관점 | 박스를 몇 개 맞혔나? | 일반 Object Detection (YOLO 등) |
| 구조 복원 관점 | 전체 문제 수가 맞는가? | 시험지 OCR, 문서 AI |
문제 상황 — “이어지는 문단”을 하나로 볼 것인가?
시험지에서 하나의 문제 지문이:
- 왼쪽 컬럼에서 시작되고
- 오른쪽 컬럼으로 이어지는 경우
이때 핵심 질문:
이어지는 문단을 하나의 객체로 볼 것인가? 아니면 두 개의 객체로 볼 것인가?
이 기준이 정해지지 않으면 TP/FP/FN 계산 자체가 불가능하다.
평가 이전에 결정해야 할 것: Annotation Policy(라벨링 정책)
TP/FP/FN을 계산하기 전에 “무엇을 하나의 객체로 정의할 것인가?”를 먼저 고정해야 한다.
방식 1: 시각적 블록 기준 (Visual Block Detection)
| 규칙 | 장점 | 단점 |
|---|---|---|
| 화면상 분리된 박스 = 각각 별도 객체 | Detection 모델에 적합, 좌표 기반 평가 단순, Annotation 쉬움 | 의미론적으로 같은 문단이 분리됨 |
예: 왼쪽 문단 + 오른쪽 이어진 문단 = 객체 2개
방식 2: 논리적 문단 기준 (Logical Paragraph)
| 규칙 | 장점 | 단점 |
|---|---|---|
| 논리적으로 이어지는 문단 = 하나의 객체 | 문서 구조 복원에 적합, 읽기 순서 보존 | Annotation 복잡, 모델 학습 어려움 |
예: 컬럼 넘어 이어지는 문단 = 객체 1개
목적별 권장 기준
| 목적 | 권장 기준 |
|---|---|
| 일반 Object Detection | 시각 블록 기준 |
| OCR 문서 복원 | 논리 문단 기준 |
| LayoutLM / Donut | 논리 구조 기준 |
| 시험지 OCR | 논리 구조 기준 |
시험지 OCR에서 논리 구조 기준이 중요한 이유
시험지 OCR은 단순 Detection보다 다음이 더 중요하기 때문:
- 문제 구조 복원
- 지문 연결
- 해설 연결
- 읽기 순서
- 검색/토큰화
즉: “읽을 수 있게 복원되었는가?”가 핵심이다.
권장 객체 정의
| 객체 | 정의 |
|---|---|
| 문제 번호 | 개별 |
| 선택지 | 개별 |
| 문제 지문 | 이어지는 문단 포함 → 하나 |
| 해설 | 문단 단위 또는 전체 → 하나 |
부분 검출(Partial Detection) 처리 방식
문단 전체를 찾지는 못했지만 일부는 검출된 경우:
| 방식 | 기준 | 판정 |
|---|---|---|
| Strict | 문단 전체 복원 실패 | FN |
| Lenient | 일부라도 충분히 검출 | TP |
| Coverage (권장) | 검출 영역 / GT 영역 ≥ 0.7 | TP (미만이면 FN) |
본 프로젝트에서는 Coverage 기준(부분 검출 성공 인정)을 채택한다. 이유:
- 컬럼을 넘는 문단에서 70% 이상 검출되면 구조 복원에 충분
- 전체 객체 수 보존 원칙과 자연스럽게 양립
Confusion Matrix — 클래스별 계산 예시
상황: GT = 문제 10개, 해설 0개
모델 결과: 문제 9개 정확 탐지, 문제 1개를 해설로 잘못 분류
| GT \ Pred | 문제 | 해설 |
|---|---|---|
| 문제 | 9 (TP) | 1 (misclass) |
| 해설 | 0 | 0 |
문제 클래스 기준
- TP = 9: 문제를 문제로 정확히 탐지
- FP = 1: 문제가 아닌 것(해설)을 문제로 예측한 경우… 가 아니라, 여기서는 문제를 해설로 잘못 분류한 것이므로 FP가 아님
- 정정: FP = 0 (해설을 문제로 잘못 찾은 경우 없음)
- FN = 1: 문제인데 찾지 못함 (해설로 빠져나감)
해설 클래스 기준
- TP = 0: 실제 해설이 없으므로
- FP = 1: 문제인데 해설로 잘못 예측
- FN = 0: 실제 해설이 없으므로 놓칠 것도 없음
전체 객체 수 검증
문제: TP(9) + FN(1) = 10 ✓ (GT 문제 수와 일치)
해설: TP(0) + FN(0) = 0 ✓ (GT 해설 수와 일치)
전체 탐지 수: 문제 TP(9) + 해설 FP(1) = 10 ✓ (보존)
Detection 평가와 구조 복원 평가는 분리해야 한다
시험지 OCR에서는 평가를 두 레이어로 나누는 것이 실무적이다:
Layer 1: Detection Metric
박스 단위의 엄밀한 평가:
- TP / FP / FN
- IoU (Intersection over Union)
- Precision / Recall / F1
Layer 2: Structural Reconstruction Metric
문서 복원 품질 평가:
| Metric | 의미 |
|---|---|
| Problem Count Accuracy | 문제 수 일치 여부 |
| Explanation Count Accuracy | 해설 수 일치 여부 |
| Paragraph Recovery | 문단 복원율 |
| Reading Order Accuracy | 읽기 순서 정확도 |
핵심: 글자 하나 OCR 틀림보다 문제 하나 누락이 훨씬 치명적이다. 따라서 총 문제 수 consistency를 별도 지표로 관리해야 한다.
추천하는 최종 파이프라인
1단계 — Detection
시각 박스 검출 (YOLO, Faster R-CNN 등)
2단계 — Merge
다음 조건을 만족하면 병합:
- 동일 클래스
- 읽기 순서 연결
- 컬럼 연결
- 거리 threshold 이하
3단계 — Logical Region 평가
최종적으로 논리 객체 기준으로 평가:
- 문제 지문 1개 (이어진 문단 포함)
- 해설 1개
- 전체 객체 수 보존 확인
정리
| 원칙 | 내용 |
|---|---|
| 객체 정의 | 논리 구조 기준 (이어지는 문단 = 1개) |
| 부분 검출 | Coverage ≥ 70%이면 TP |
| 핵심 검증 | 전체 객체 수 보존 (GT 수 = TP + FN) |
| 평가 분리 | Detection Metric + Structural Reconstruction Metric |
| 최우선 지표 | 총 문제 수 일치 (Problem Count Accuracy) |
결론: “박스를 몇 개 맞혔는가?”보다 “문서를 얼마나 읽을 수 있게 복원했는가?”가 시험지 OCR의 진짜 평가 기준이다. 그리고 그 출발점은 “전체 객체 수가 보존되는가?”이다.
실측 채점 결과

이어서 읽기
탐지 기준을 세우고 나면 남는 것은 처리 속도다. 같은 시험지 파이프라인에서 PDF 렌더링 구간을 벤치마크하고 필요한 쿠버네티스 사양을 산정한 기록이 아래에 있다.
답글 남기기