diff --git a/VesiScan_Android_Pipeline_Summary.md b/VesiScan_Android_Pipeline_Summary.md index ddcfaa2..11d95b5 100644 --- a/VesiScan_Android_Pipeline_Summary.md +++ b/VesiScan_Android_Pipeline_Summary.md @@ -2,7 +2,7 @@ ## 작성일: 2026-04-23 ## 작성자: dwjang -## 마지막 업데이트: 2026-07-13 (v7 patch) — 1.2.0-demo (versionCode 26) +## 마지막 업데이트: 2026-07-15 (v7 patch) — 1.2.0-demo (versionCode 26) ## 권장 펌웨어: **VBTFW0120+** (mim FIFO 지원 필수. VBTFW0121 은 `mls mode 0` handler 취약) ### v7 주요 변경 요약 (2026-07-06 ~ 2026-07-10) @@ -27,7 +27,19 @@ - **lastBleRxAt 갱신 확대** (커밋 3a41864). `processReceivedData` 진입점에서 모든 유효 응답에 대해 갱신 → "기기 응답 없음" false-positive 배너 해소. -**Alignment (V2 6-stage)** +**Alignment (V2 6-stage + V3 2-Pass)** +- **V3 CenterAligner 2-Pass BVCV 이식** (커밋 9387552 / fcdce12, 2026-07-15). + piezophantomtest PR #35 (`ffd436b`) 의 `vesiscan_test.alignment.CenterAligner` + 를 Kotlin 으로 1:1 이식. Clinical 세션 전용 batch 방식 (실시간 V2 와 병행). + - Pass 1 `scanSelect`: 0~4 cm 각 20 cycle → 11 trace → Rule A + bvcv tie 선택 + (ch3 필수 + per-trace ch3 검출률 ≥ 80% + max nch + min bv_cv) + - Pass 2 `guide`: 재측정 위치가 target 기준 (ch3, 검출률, nch, bv_cv × 1.15) + 충족 시 STOP, 미충족 시 MOVE_UP + - MethodDRunner (apply_cross false/true 두 모드) + PiezoBVEstimator 재사용 + - **검증**: `CenterAlignerValidationTest` — data123 인체 3 세션 대상 + Python reference 와 nch/ch3/ch3_hit 완전 일치, bv_cv 오차 <2%, + 최종 선택 = cm=3 일치. 상세: [docs/ALGORITHM_COMPARISON.md](docs/ALGORITHM_COMPARISON.md#v3-centeraligner-2-pass-bvcv-alignmentadvisorv3kt-2026-07-15). + - UI 통합 (Pass 1/2 화면) 은 후속 작업. - **CH3 flicker 무한 대기 방지** (커밋 e808b5b). VERTICAL_CLIMB 진입 조건을 "3연속 hit" → "최근 6프레임 중 3회 hit" sliding window majority 로 완화. 20 프레임 대기 시 상단 3채널 relaxed mode 진입 (CH3 없이도 정렬 완료). diff --git a/docs/ALGORITHM_COMPARISON.md b/docs/ALGORITHM_COMPARISON.md index 7bb194d..bf62b3d 100644 --- a/docs/ALGORITHM_COMPARISON.md +++ b/docs/ALGORITHM_COMPARISON.md @@ -1,6 +1,6 @@ # Method A / B / C Algorithm Comparison & Placement Test -_마지막 업데이트: 2026-07-13 — V2 6-stage / CH3 flicker 3-Layer 반영._ +_마지막 업데이트: 2026-07-15 — V3 CenterAligner 2-Pass BVCV 이식 추가._ ## Wall Detection Comparison @@ -211,6 +211,52 @@ CV 로 정밀 vertical 조정 + CH3 flicker 대응 sliding-window majority. (CH3 31.8%) 회귀 방지 + Human 1CM (77.3%) 조기 진입 확인, 팬텀 false-positive 없음. 상세 표: `tools/README.md`. +### V3: CenterAligner 2-Pass BVCV (`AlignmentAdvisorV3.kt`, 2026-07-15) + +piezophantomtest [`ffd436b`](https://gitea.medithings.net/medithings-rnd/piezo-phantom-test/commit/32e22a17e8a5733e5a8ea0790d84c3fa9b54ebdb) +(PR #35 "feat: alignment bvcv 규칙 추가") 의 `vesiscan_test.alignment.CenterAligner` +를 Kotlin 으로 이식. 기존 V2 (실시간 sliding 6-stage) 와 병행. Clinical 세션 +전용 batch 방식. + +**Pass 1 — `scanSelect(cyclesByCm)`** +- 사용자가 치골 위 0/1/2/3/4 cm 각각에서 **20 cycle 씩** 측정. +- 각 위치마다: + - 20 cycle → sliding window 10 → **11 trace** + - `mean_scan` (전체 20 cycle 평균) → `detectMultichannel(applyCross=false)` → `nch`, `ch3` + - `per-trace` → `detectMultichannel(applyCross=true)` → `estimateBladderVolume6ch` → volume_ml 리스트 → `bv_cv = std/mean` +- **Rule A + bvcv tie 로 최적 위치 선택**: + 1. ch3 필수 (mean_scan base 검출) + 2. per-trace ch3 검출률 ≥ **`CH3_HIT_MIN = 0.80`** (임계 통과 없으면 ch3=O 전체 fallback) + 3. max `nch` + 4. 동률 → min `bv_cv` +- 선택 위치의 record 를 `target` 으로 저장 (Pass 2 기준값). + +**Pass 2 — `guide(cycles, cm)`** +- 재측정한 한 위치 (20 cycle) 가 target 기준 충족 시 `STOP`: + - `ch3='O'` + - per-trace ch3 검출률 ≥ 80% + - `rec.nch ≥ target.nch` + - `rec.bv_cv ≤ target.bv_cv × (1 + bvCvTol)` (기본 `bvCvTol = 0.15`) +- 미충족: `MOVE_UP` (다음 위치로 이동 안내) + 실패 사유 한글 표시. + +**Python 1:1 매핑**: +- `_traces(cycles, win=10)` ↔ `buildRecord()` sliding +- `alignment_selection.select_cm(rule='A', tie='bvcv')` ↔ `selectCm()` +- `CenterAligner._fail_reason()` ↔ `failReason()` +- BV 리스트 축적: Python `if bv is not None: bvs.append(volume_ml)` ↔ Kotlin `bv?.let { bvs.add(it.volumeMl) }` (nan/0 필터 없음 — Python 1:1) + +**검증** (`app/src/test/java/com/medithings/vesiscan/managers/CenterAlignerValidationTest.kt`, +data123/ 인체 3 세션): +- Python reference 와 `nch / ch3 / ch3_hit` **완전 일치** +- `bv_cv` 오차 <2% (정상 케이스). BV 발산 케이스만 큰 오차 — Rule A 필터링으로 선택 영향 없음 +- 최종 선택 위치 = **cm=3 (Python 과 일치)** + +주의: unit test 는 `PiezoHW.activePreset = DevicePreset.V1` 명시 설정 필요. +실기기는 `BleManager.autoDetectPreset(deviceName)` 이 자동 처리. + +UI 통합 (Pass 1 위치 안내 · 진행바 · Pass 2 판정 화면) 은 후속 작업. +관련 commit: `9387552` (이식) + `fcdce12` (Python 1:1 nan/0 필터 제거). + ### Measurement Modes (v6 업데이트) - **Auto Scan**: **min 600ms gap** (state-based throttle: `!isComplete` + 600ms), 10-sample trimmed mean (max/min removed, 8 avg)