결론 — “전체 객체 수 보존”이 핵심 기준이다
시험지 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의 진짜 평가 기준이다. 그리고 그 출발점은 “전체 객체 수가 보존되는가?”이다.
실측 채점 결과

답글 남기기