날짜: 2025-11-07
버전: 0.1.0
상태: ✅ 모든 테스트 통과
uv run pytest tests/ -v결과: ✅ 35/35 테스트 통과 (100%)
| 모듈 | 테스트 수 | 통과 | 실패 |
|---|---|---|---|
| test_base.py | 25 | ✅ 25 | 0 |
| test_layout_detector.py | 10 | ✅ 10 | 0 |
| 합계 | 35 | 35 | 0 |
실행 시간: 7.48초
test_base.py:
- ✅ Coord 타입 (2개)
- ✅ BBox 타입 (4개)
- ✅ VLine 타입 (3개)
- ✅ overlaps() 함수 (4개)
- ✅ contains() 함수 (4개)
- ✅ NoOverlap 증명 검증 (5개)
- ✅ AllContained 증명 검증 (3개)
test_layout_detector.py:
- ✅ ColumnBound 유효성 (3개)
- ✅ PageLayout 컬럼 찾기 (1개)
- ✅ LayoutDetector 기본 기능 (2개)
- ✅ 수직선 병합 알고리즘 (1개)
- ✅ 합성 이미지 테스트 (2개)
- ✅ 여백 기반 감지 (1개)
- DPI: 200
- 감지기 설정:
- min_line_length: 100px
- line_thickness_threshold: 5px
- gap_threshold: 50px
결과: ✅ 성공
| 항목 | 값 |
|---|---|
| 페이지 수 | 1 |
| 감지 방법 | vertical_lines |
| 컬럼 수 | 3단 |
| 페이지 크기 | 2339×3309px |
| 구분선 수 | 2개 |
감지된 구분선:
- 선 1: x=275, 길이=1835px
- 선 2: x=295, 길이=1679px
컬럼 경계:
- 컬럼 1: x=[0, 275], 폭=275px
- 컬럼 2: x=[275, 295], 폭=20px
- 컬럼 3: x=[295, 2339], 폭=2044px
출력 파일: 고3_사회탐구_사회문화_1p_page1.jpg (1.4MB)
결과: ✅ 성공
| 항목 | 값 |
|---|---|
| 페이지 수 | 1 |
| 감지 방법 | vertical_lines |
| 컬럼 수 | 3단 |
| 페이지 크기 | 2339×3309px |
| 구분선 수 | 2개 |
감지된 구분선:
- 선 1: x=1084, 길이=2071px
- 선 2: x=1129, 길이=2556px
컬럼 경계:
- 컬럼 1: x=[0, 1084], 폭=1084px
- 컬럼 2: x=[1084, 1129], 폭=45px
- 컬럼 3: x=[1129, 2339], 폭=1210px
출력 파일: 통합과학_1_샘플_page1.jpg (874KB)
- 3단: 2개 페이지 (100%)
- vertical_lines: 2개 페이지 (100%)
- content_gaps: 0개 페이지 (0%)
- 전체: 2/2 (100%)
- 수직선 감지: 2/2 (100%)
✅ 두 샘플 모두 수직 구분선을 정확히 감지
✅ Hough Line Transform이 효과적으로 작동
✅ 근접한 선들을 올바르게 병합 (예: x=275, x=295)
✅ 3단 레이아웃을 정확히 인식
✅ 각 컬럼의 경계를 명확히 설정
✅ PyMuPDF 백엔드가 안정적으로 작동
✅ 200 DPI에서 충분한 해상도 확보
✅ 시각화 결과가 명확함
현재: 근접한 수직선 2개를 3개 컬럼으로 분리
개선안: 좁은 중간 컬럼을 구분선으로 간주하고 2단으로 재분류
# 개선 알고리즘 제안
if column_width < threshold:
# 이 컬럼은 실제로 구분선
merge_with_neighbors()min_line_length: 현재 100px
- 더 짧은 구분선도 감지하려면 50px로 조정 고려
line_thickness_threshold: 현재 5px
- 더 두꺼운 선도 허용하려면 10px로 조정 고려
현재 모든 샘플이 수직선 방식으로 감지됨
- content_gaps 방식도 테스트 필요
- 수직선 없는 샘플 추가 테스트 권장
output/layout_results/
├── .gitkeep
├── 고3_사회탐구_사회문화_1p_page1.jpg (1.4MB)
└── 통합과학_1_샘플_page1.jpg (874KB)
총 크기: ~2.3MB
- Idris2 명세 컴파일 (6개 모듈)
- Python 타입 구현 (base.py)
- PDF 변환기 (pdf_converter.py)
- 레이아웃 감지기 (layout_detector.py)
- 단위 테스트 35개 작성
- 단위 테스트 100% 통과
- 실제 샘플 2개 테스트
- 결과 시각화 및 저장
- Git 저장소 초기화
- 작업 단위별 커밋 (9개)
- OCR 통합 (Tesseract/EasyOCR)
- 문제 번호 패턴 인식 (1., 2., ①, etc.)
- NumberMarker 타입 구현
- 텍스트 영역 추출
- 이미지 영역 추출
- ContentRegion 타입 구현
- 문제 영역 그룹화
- 정답 영역 그룹화
- ProblemPair 생성
- 개별 파일 생성 (1_prb, 1_sol)
- ZIP 패키징
- OutputPackage 구현
[████████████████░░░░░░░░░░░░] 60%
완료:
✅ Idris2 명세 (100%)
✅ 기본 타입 구현 (100%)
✅ PDF 변환 (100%)
✅ 레이아웃 감지 (100%)
✅ 단위 테스트 (100%)
✅ 실제 샘플 테스트 (100%)
진행 중:
⏳ 문제 번호 인식 (0%)
⏳ 영역 추출 (0%)
대기 중:
⏳ 문제/정답 매칭
⏳ 출력 생성
테스트 실행 방법:
# 단위 테스트
uv run pytest tests/ -v
# 실제 샘플 테스트
uv run python test_samples.py결과 확인:
open output/layout_results/