Files
guitar_score/.agent/references/known-issues.md
quantlab 7c14f3c040 fix(pipeline): 스티칭 버그 3종 수정 + AI 마디번호 스탬프 제거
- [BUG1] _merge_scroll_candidates: 씬전환 가속도 조건 제거 (9→1 세그먼트)
- [BUG2] merge_panoramas_list: 매칭 임계치 0.60→0.50 (파노라마 3→1 병합)
- [BUG3] _detect_measure_bars: 마디선 최소간격 100px 필터 추가 (17px 오탐 제거)
- remove: _stamp_measure_number 호출 제거 (AI 임의 [1][2][3] 스탬프 삭제)
- add: sim_stitch.py, simulate_ocr_pipeline.py, verify_fixes.py (진단/검증 스크립트)
2026-03-28 09:17:22 +09:00

112 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Known Issues & Lessons Learned
> **이 파일은 SSOT(Single Source of Truth)입니다.**
> 디버깅이나 구현 전에 **반드시** 이 파일을 확인하세요.
> 세션 종료 시 새로 발견된 이슈를 이 파일에 추가합니다.
---
## 포맷
각 항목은 아래 형식을 따릅니다:
```markdown
### [날짜] [키워드] — 한줄 요약
- **증상**: 무엇이 잘못되었는가
- **원인**: 근본 원인
- **해결**: 올바른 해결 방법
- **주의**: 재발 방지를 위한 교훈
```
---
## 공통 이슈
### [2026-03-08] PowerShell curl — Invoke-WebRequest 충돌
- **증상**: `curl` 명령이 예상과 다른 응답 형식을 반환
- **원인**: PowerShell에서 `curl``Invoke-WebRequest`의 별칭
- **해결**: **`curl.exe`**를 명시적으로 사용
- **주의**: HTTP 관련 모든 명령에서 `curl.exe` 사용 필수
### [2026-03-08] PowerShell npm — 실행 정책 오류
- **증상**: `npm run` 명령이 `실행 정책` 관련 오류로 실패
- **원인**: PowerShell 스크립트 실행 정책이 제한적으로 설정됨
- **해결**: `cmd /c npm run dev` 형식으로 cmd를 통해 실행
- **주의**: npm 관련 명령은 항상 `cmd /c` 접두어 사용 권장
---
## 프로젝트별 이슈
### [2026-03-24] 히스토그램 비교 — Tab 프레임 구분 불가
- **증상**: 서로 다른 Tab 페이지가 "동일"로 판정되어 프레임 수가 과소 추출
- **원인**: 히스토그램 상관관계는 밝기 분포만 비교 — Tab 용지 배경이 같으면 다른 내용도 동일로 판정
- **해결**: MSE 픽셀 비교로 전환 (320px 리사이즈, factor 8)
- **주의**: MSE scaling factor는 영상 타입에 따라 다르게 동작할 수 있음
### [2026-03-24] split 감지 — 밝은 배경 오분류
- **증상**: 밝은 배경 기타 연주 영상(空奏列車)이 split으로 오분류
- **원인**: 흰 셔츠/밝은 배경이 상단 밝기 조건 통과, 기타줄이 _has_tab_lines 통과
- **해결**: split 검증 강화 (top>180, bottom<100, diff>80, 4+ lines) + overlay 우선 검사
- **주의**: 패턴 감지 순서는 반드시 overlay → split → scroll 유지
### [2026-03-24] overlay 크롭 크기 불일치
- **증상**: overlay 프레임 비교 시 모든 프레임이 "다르다"로 판정 (1000+개 추출)
- **원인**: _detect_tab_overlay가 프레임마다 다른 크기의 바운딩박스 반환 (69~360px)
- **해결**: 320×120 흰색 캔버스에 정규화 후 비교 + 슬라이딩 윈도우(5프레임)
- **주의**: overlay 프레임 수 최적화는 아직 진행 중 (추가 튜닝 필요)
### [2026-03-25] pHash 16×16 — Tab 프레임 과도합병
- **증상**: 서로 다른 Tab 페이지가 pHash 클러스터링에서 동일 그룹으로 합병 (20→9 프레임)
- **원인**: 16×16 dHash(256비트)는 Tab 구조(6선 + 숫자)를 구분하기엔 해상도 부족. 모든 Tab이 유사한 hash 생성
- **해결**: dHash 32×32(1024비트)로 확대 + max_hamming 50→20 조정
- **주의**: hash_size와 max_hamming은 항상 쌍으로 조정해야 함 (비트수 대비 비율)
### [2026-03-25] 1080p 프레임 — 메모리 부족/프로세스 행
- **증상**: 1920×1080 프레임 500+개 로딩 시 프로세스 무한 대기 (3.5GB+ RAM)
- **원인**: extract_frames가 모든 프레임을 list에 보관, 1080p는 프레임당 ~6MB
- **해결**: MAX_FRAME_WIDTH=1280 캡 + gc.collect() 추가. 4K→1280px 다운스케일
- **주의**: 영상 3개 순차 처리 시 GC 없으면 누적 메모리로 swap thrashing 발생
### [2026-03-25] yt-dlp 다운로드 — 360p 폴백
- **증상**: `bestvideo[height>=720]` 포맷으로 요청했으나 640×360 파일 다운로드
- **원인**: format string의 `/best` 폴백이 720p 없을 때 360p 선택. 또는 mp4 전용 필터가 해상도 제한
- **해결**: 명시적 1080p 우선 + 720p 폴백 체인 분리 (`bestvideo[height>=1080]/.../best[height>=720]/best`)
- **주의**: 캐시된 파일이 있으면 재다운로드 안 함 — 해상도 변경 시 기존 파일 삭제 필요
### [2026-03-27] OpenCV SIFT 트래킹 — 마커 보호 실패
- **증상**: 동일한 반주(코러스)가 반복될 때 SIFT 매칭 알고리즘이 화면을 과거로 건너뛰어 합병시킴(마디 삭제됨)
- **원인**: Red 채널 추출 시 노란색 마커가 흰색 배경과 동화되어 사라짐. 특징점이 동일해져서 과거 코러스 패턴과 100% 일치한다고 오판
- **해결**: 트래킹 엔진 전용 채널(Blue) 도입(노란색 마커를 거대한 검은 블럭으로 전환하여 강력한 특징점 제공) + 렌더링용 Red 채널 분리 독립
- **주의**: SIFT나 matchTemplate를 사용할 때, 이동을 측정하려면 특징점(마커)의 시각적 명확성이 음악적 물리 구조보다 절대적으로 우선되어야 함
### [2026-03-27] pHash — 반복 파트 원천 삭제
- **증상**: 4:45분짜리 영상(128+ 마디)이 15조각(약 48마디)으로 압축됨
- **원인**: 해시화(_dedup_by_hash)가 1280px 해상도를 8x8로 축소 비교하면서 1절과 2절이 동일한 프레임으로 오인되어 삭제당함
- **해결**: 스크롤 방식에서는 오직 물리적 마디 구분선(|)을 기준으로 분절 후 재배치하는 타일 엔진 도입
- **주의**: Scroll 파노라마 같은 선형 시계열 구조에서는 지엽적 Hash 기반 중복제거를 적용하면 안 됨
### [2026-03-28] Crop 마진 — 마디 번호 소실 (Decapitation)
- **증상**: 입력 영상 최상단에 존재하는 숫자(마디 번호)가 출력물에서 무차별적으로 잘려나감
- **원인**: 밀도 필터(row_dark > 0.02)에서 숫자 픽셀이 차지하는 비율이 가로폭 대비 0.4%에 불과하여 여백으로 간주됨
- **해결**: 필터링 임계점을 0.002로 대폭 완화 및 Top Clearance Margin을 120px로 확장
- **주의**: 심볼 밀도가 극히 낮은 구역 통과 시 % 기반의 밀도 크롭 알고리즘은 치명적으로 작용함
### [2026-03-28] 씬전환 오탐 — 스크롤 가속도 조건
- **증상**: 스크롤 속도가 급격히 변하는 구간(예: 빠른 이동)에서 씬전환으로 오탐 → 세그먼트 9개로 과다 분리
- **원인**: `_merge_scroll_candidates``abs(s_px - prev_s_px) > 100` 조건이 스크롤 가속을 씬전환으로 오인
- **해결**: 해당 조건 제거. confidence 기반 조건(`conf <= 0.15`, `prev_conf - conf > 0.4`)만 유지
- **주의**: 스크롤 속도는 영상마다 다르므로 절댓값 기반 조건은 신뢰할 수 없음
### [2026-03-28] 파노라마 병합 임계치 — 반복 구간 분리
- **증상**: 코러스처럼 유사한 구간에서 `merge_panoramas_list` 매칭 스코어가 0.56~0.59에 머물러 파노라마가 3개로 분리됨
- **원인**: `max_val > 0.60` 임계치가 반복성 악보의 픽셀 유사도를 커버하지 못함
- **해결**: 임계치 0.60 → 0.50으로 완화
- **주의**: 임계치를 낮추면 오매핑 위험이 있으므로 0.50 이하로는 내리지 말 것
### [2026-03-28] OCR-First 방식 — 스크롤 영상 적용 불가
- **증상**: 각 프레임에서 마디번호 OCR 시도 시 인식률 4.8% (126프레임 중 6개만 인식)
- **원인**: 스크롤 영상에서 마디번호는 화면 왼쪽 고정이 아닌 악보와 함께 이동 → 프레임마다 위치 다름. 오인식 결과(7→10→71→101→710)도 다수
- **해결**: OCR-First 방식 폐기. 파노라마 스티칭 후 물리적 마디구분선(|) 탐지 방식 유지
- **주의**: 스크롤 영상에서 마디번호 기반 중복제거는 파노라마를 완성한 뒤 적용해야 의미가 있음