BVM 환기 데이터 수집 SOP
2026-04-15
(주)달구 BreathAI
0. 개요 (Purpose & Scope)
본 SOP는 BreathAI 프로젝트의 BVM 환기 품질 분석 모델 학습용 데이터 수집 절차를 표준화한다. 멀티카메라(최소 3대) 영상과 마네킹/돼지/사람의 ground-truth 환기량 데이터를 동시 수집하여, 흉부 시각 정보로부터 환기 깊이·유량·일관성을 추정하는 모델 학습에 활용한다.
마네킹에서 측정된 실제 환기량 (VT, flow) 시계열과 동기화된 마네킹 카메라 영상을 페어로 묶어, ConvLSTM 기반 회귀/분류 모델을 학습한다. 모델 입력은 (RGB 또는 RGB+mask) × T frames, 출력은 환기 사이클별 VT 예측 또는 환기 품질 score. 본 SOP가 명시하는 모든 수집·동기화·메타데이터 절차는 이 ConvLSTM 학습 데이터의 품질을 보장하기 위함이다. 마네킹 단계에서 ConvLSTM PoC를 검증한 뒤 돼지·사람 도메인으로 transfer.
적용 범위
- 1차: 마네킹(Manikin) 데이터 — 알고리즘 PoC 및 모델 baseline
- 2차: 돼지(Porcine) 데이터 — 생체 도메인 시프트 1단계 검증
- 3차: 사람(Human, in vivo) — 임상 검증 및 최종 배포
변경 이력
| 버전 | 일자 | 변경 내용 | 작성자 |
|---|---|---|---|
| v1.0 | 2026-04-15 | 초안 작성 (마네킹 1차 수집 기준) | 연구원 |
1. 용어집 (Glossary)
본 SOP에서 "혼란변수"라는 표현은 통계/ML 용어로 정확히 다음 다섯 가지로 분리된다. 변수마다 어느 분류인지 §2에서 일관되게 표기한다.
| 용어 | 정의 | 본 프로젝트 예시 |
|---|---|---|
| CONFOUNDER 혼란변수 |
X(설명변수)와 Y(목표변수) 양쪽에 영향을 주어, 둘 사이의 인과/상관 관계를 왜곡하는 제3의 변수. | 마네킹 lung compliance — 같은 백 압축에도 compliance가 작으면 흉부 ΔZ도 작아지고 ΔV도 작아짐. ΔZ↔ΔV 회귀를 왜곡. |
| EFFECT MODIFIER 효과 수정자 |
X→Y 관계 자체(기울기/형태)를 바꾸는 변수. 층화 분석 필요. | BVM 사이즈 / 마스크 사이즈 — 같은 ΔZ라도 성인백(1500mL) vs 소아백(500mL)이면 ΔV 환산 기울기가 다름. |
| MEDIATOR 매개변수 |
X→M→Y 인과 경로의 중간 단계. | 손가락 squeeze 깊이 → 백 부피 압축 → 마스크 통과 → 폐 ΔV. |
| NUISANCE 잡음 변수 |
Y에 직접 영향은 없지만 측정 노이즈를 일으키는 변수. | 조명 변화, 카메라 흔들림, 의류 무늬, 배경 움직임. |
| DOMAIN SHIFT 도메인 변수 |
학습 분포와 배포 분포가 다른 변수. Domain Adaptation으로 보정. | 마네킹 → 돼지 → 사람 — 흉부 형상, 표면 텍스처, 자발 호흡 잔존, compliance 분포 모두 다름. |
의학·생리 용어
| 용어 | 정의 | 참고값 |
|---|---|---|
| Tidal Volume (VT) | 1회 환기량 (mL) | 성인 6~8 mL/kg ideal body weight (~500mL) |
| Compliance (C) | ΔV/ΔP, 폐가 부푸는 정도 | 정상 성인 ~50 mL/cmH₂O · COPD <30 · ARDS <40 |
| Resistance (R) | 기도 저항 | 정상 1~2 cmH₂O/L/s · asthma 5~10 |
| Mask Seal / Leak | 마스크-얼굴 밀착 / 누출률 | BVM 누출 최대 30% 보고 |
| Ground Truth | 학습용 정답 (회귀 타깃 또는 분류 라벨) | 마네킹 내장 flow 센서 mL, 외부 스피로미터 |
| Domain Adaptation | 도메인 시프트 보정 기법 | fine-tuning, covariate matching, few-shot calibration |
| IACUC | 동물실험윤리위원회 | 돼지 실험 시 사전 승인 필수 |
| IRB | 임상시험심사위원회 | 사람 데이터 수집 시 사전 승인 필수 |
2. 영향 변수 분류 (Variable Inventory)
각 변수마다 분류 / 통제 방식 / 사람 transfer 영향을 명시한다. 통제 방식은 fix(세션 내 고정), randomize(셀 간 랜덤화), measure(매 세션 측정), log(manifest 기록).
2.1 BVM 측 변수
| 변수 | 분류 | 통제 | 비고 |
|---|---|---|---|
| Bag 사이즈 (성인 1500 / 소아 500 / 영아 250 mL) | MODIFIER | fix per session, randomize across cells, log | 가장 큰 효과 수정자. 셀 단위 분리 학습 또는 입력 임베딩. |
| 제조사 (Ambu / Laerdal / 국산) | MODIFIER | cell-level | 밸브 저항, 백 탄성 차이. |
| 마스크 사이즈 (0~5호) | MODIFIER | cell-level | seal 면적 → leak 영향. |
| 저장백(reservoir) 부착 여부 | NUISANCE | log | 주로 영상 가림 영향. |
| PEEP 밸브 부착 | MODIFIER | 1차 미부착 fix | 압력→부피 곡선 변화. |
| 백 노후 / 탄성 변화 | NUISANCE | 신품/사용기간 log | 장기 수집 시 동일 lot 권장. |
2.2 마네킹 측 변수
| 변수 | 분류 | 통제 | 비고 |
|---|---|---|---|
| 모델 (Resusci Anne / SimMan 3G / Ambu Man / 국산) | CONFOUNDER + DOMAIN | cell-level, log | compliance·흉벽 가동성 등 내부 특성이 X와 Y 양쪽에 영향. |
| 연령군 (성인 / 소아 / 영아) | DOMAIN | 1차 성인 fix | 해부·기준 환기량 모두 다름. |
| Lung compliance 설정 (가변형) | CONFOUNDER | cell-level fix + log | 가장 중요한 confounder. SimMan 등은 변경 가능. |
| Airway resistance 설정 | CONFOUNDER | log | flow 곡선 형태에 영향. |
| 흉벽 가동범위 saturation | NUISANCE | 사전 측정 후 안전 범위 fix | 일정 압력 이상에서 ΔZ saturate. |
2.3 Ground Truth 센서
| 변수 | 분류 | 통제 | 비고 |
|---|---|---|---|
| 센서 종류 (마네킹 내장 / in-line spirometer / 압력→부피 환산) | — | log | 측정 신뢰도 직결. 세션 내 변경 금지. |
| 샘플링 Hz (50~200) | NUISANCE | fix per session | 카메라(30Hz)와의 align에 영향. |
| 카메라 ↔ 센서 latency | NUISANCE | 매 세션 LED sync 측정 | sync_offset_ms로 manifest 기록. |
| Drift / zero offset | NUISANCE | 5분마다 zero 재조정 + log | 장시간 세션 시 누적 오차. |
| Dead-space 보정 | NUISANCE | fix per setup | 마스크/회로 dead-space mL을 빼야 VT 정확. |
2.4 술자 (Operator) 변수
| 변수 | 분류 | 통제 | 비고 |
|---|---|---|---|
| operator_id | Random Effect | log, subject-level CV 분할 | 학습 leakage 방지에 결정적. |
| 손 크기 (hand_length_cm) | MODIFIER | 측정 + log | squeeze 깊이↔백 부피 환산에 영향. |
| 그립 방식 (한손 / 두손 / E-C / TE) | MODIFIER | cell-level randomize | 최소 두 가지는 데이터에 포함 권장. |
| 숙련도 (응급의 / 간호사 / 일반인 / 학생) | DOMAIN | log | 리듬·일관성 분포 차이. |
| 압축 속도 / 리듬 | 자연 변동 | 기록만 | 모델 입력의 일부. |
2.5 마스크 실링 / Leak
- Leak rate CONFOUNDER — 마네킹 leak 센서가 있으면 실측, 없으면 (squeeze volume − delivered volume) / squeeze volume으로 추정.
- 라벨에 leak 정도 분류 추가:
none / minor (<10%) / major (10~30%) / severe (>30%) - 학습 시 leak 라벨에 따라 가중치 부여 또는 분리 모델.
2.6 환경 변수
| 변수 | 분류 | 통제 | 비고 |
|---|---|---|---|
| 자세 (head tilt 각도, jaw thrust) | MODIFIER | cell-level fix | 마스크 실링과 직접 연관. |
| 조명 (lux, 자연/형광/LED) | DOMAIN | 측정 + log | 1차 800±100 lux LED diffuse 권장. |
| 배경 | NUISANCE | fix (무광 단색) | 패턴 배경은 flow 노이즈 유발. |
| 의류 (없음 / 얇은 / 두꺼운) | DOMAIN | cell-level 변경 | 사람 transfer 일반화 핵심. |
2.7 카메라 셋업 변수
| 변수 | 분류 | 통제 | 비고 |
|---|---|---|---|
| 카메라 배치 ID (extrinsic 캘리브레이션 버전) | — | log | setup_id로 추적. |
| fps / resolution / exposure | NUISANCE | fix per session | auto-exposure 끄기. |
| Lens 왜곡 calibration 버전 | — | log | calib 파일 hash 권장. |
2.8 도메인 계층 (Manikin → Porcine → Human)
본 프로젝트는 3단 도메인 전이로 설계한다. 단계 사이의 분포 격차를 미리 정량화해두면 모델 일반화 전략을 설계할 수 있다.
| 도메인 | 용도 | Compliance | 흉부 형상 | 영상 분포 | 윤리/규제 |
|---|---|---|---|---|---|
| Manikin | 1차 대량 수집, 알고리즘 PoC | 고정/가변 (보통 50 mL/cmH₂O) | 표준화 | 균일, 텍스처 단조 | 자유 |
| Porcine (자돈 30~50kg) |
알고리즘 검증, 도메인 시프트 1단계 | 사람과 가장 유사 (생체) | 흉부가 횡으로 길고 깊음, 털·피부색 다름 | 마네킹과 사람의 중간 | IACUC 승인 필수, 마취·수의사 동석 |
| Human (in vivo) |
최종 임상 검증 | 환자별 천차만별 (20~100+ mL/cmH₂O) | 다양 (옷·체형·연령·성별) | 매우 다양 | IRB, 동의서, 임상 프로토콜 |
2.8.1 돼지(Porcine) 모델 변수
- 체중 / 종 (Yorkshire, Landrace, 한국 토종돼지) MODIFIER — log
- 마취 깊이 (TIVA / 흡입 마취) CONFOUNDER — 자발 호흡 잔존에 영향, 마취 기록과 sync
- 흉부 털 처리 (제모 여부, 면적) DOMAIN — 영상 분포 영향. 사진 촬영 후 log. 권장: ArUco 마커 부착 부위 + 흉골 중앙선 따라 5~7cm 폭만 부분 제모, 나머지는 그대로. 학습 데이터에 제모/비제모 모두 포함하여 robust 학습. 전체 제모는 IACUC 부담 + 사람 transfer 시 오히려 부자연스러움
- 체위 (앙와위 / 측와위) — 사람 기준에 맞춤
- 흉부 조직 두께 (지방층 mm) MODIFIER — 사람 BMI 대응
- 기도 확보 방법 (intubation / supraglottic / mask BVM) — 본 프로젝트는 mask BVM 우선
- 윤리/실험 메타 — IACUC protocol number, 실험 일자, 수의사 ID, 마취 약제·용량 — manifest 의무 기록
돼지 캘리브레이션 (ArUco 대안 포함)
돼지 흉부에 ArUco 직접 부착은 가능하지만 굴곡·마취 미세 움직임으로 정확도가 떨어진다. 마커 없이 캘리브레이션하는 대안:
| 방법 | 원리 | 장점 | 단점 |
|---|---|---|---|
| ArUco 직접 부착 | 5×5cm 마커 양면테이프/의료 접착제로 흉부 부착 (ECG 부위 활용) | 기존 SOP와 일관 | 호흡 굴곡으로 평면 휨, 정확도 ↓, IACUC 추가 절차 |
| 수술용 ruler 비치 (권장) | 30cm 자/표식을 흉부 옆에 놓고 캘리브 후 제거 | 부착 X, 가장 단순, 윤리 부담 0 | 매 세션 시작 전 1회 캡처 필요 |
| 격자 drape | 1cm 격자 무늬 천을 흉부에 덮어 캘리브 후 제거 | 부착 X, 영역 전체 환산 가능 | 천 보관·소독 필요 |
| 알려진 해부학 길이 | 견갑간 거리(25~30cm) 사전 측정 → 픽셀 환산 | 도구 0 | 개체차 ±10%, 자세 변화 영향 |
| 카메라 위치 정밀 고정 + PnP | K가 알려진 카메라 위치를 mm 정확도로 고정 | 마커 0 | 매 세션 위치 똑같이 (셋업 부담) |
| 3D 표면 사전 스캔 | 세션 전 흉부 3D 스캔 → 모델로 픽셀↔mm | 정밀, 굴곡 보정 | 스캐너 장비, 셋업 부담 ↑ |
| 딥러닝 단안 깊이 (MiDaS/ZoeDepth) | 모델로 흉부 표면 추정 | 도구 0, 자동 | 절대 깊이 부정확, 보정 anchor 필요 |
2.8.2 사람(Human) 추가 변수
- 자발 호흡 잔존 (agonal / spontaneous) DOMAIN — 라벨에 reject 표시 또는 분리 학습
- 위 팽창 (gastric inflation) DOMAIN — 복부 ROI 추가 측정 권장
- 체격 (BSA, 신장, 체중, BMI) MODIFIER — 모델 입력 또는 정규화
- 흉부 조직 (지방, 유방, 호흡근) DOMAIN — 영상에서만 추정
- 나이 / 성별 MODIFIER
- 임상 상태 (CPR 중 / 마취 중 / 일반 환자) DOMAIN
- IRB / 동의서 ID — manifest 의무 기록
2.8.3 도메인 전이 전략
- Manikin → Porcine: 모델 입력에 도메인 임베딩 추가, 돼지 데이터 소량으로 fine-tune.
- Porcine → Human: 사람 GT(특히 VT)는 라벨링이 어려우므로 self-supervised pretraining(마네킹+돼지 영상) → 사람 적은 라벨로 fine-tune 권장.
- 각 단계마다 학습 안 본 도메인 1셀 hold-out으로 transfer test.
3. 카메라 셋업 (Hardware SOP)
최종 배포 도메인 = 액션캠이므로 학습 데이터도 액션캠 기반 RGB로 수집한다. Depth 카메라 사용 안 함. 흉부 ΔZ는 ArUco 마커 평면 스케일(px↔mm)로 환산. ConvLSTM 입력 = 단일 RGB 시퀀스. 멀티캠은 occlusion 보강 + 학습용 다양성 확보 목적.
3.1 카메라 구성 (액션캠 기반, RGB only)
최종 배포 카메라는 액션캠이고, 술자가 어디에 어떻게 부착하든 동일한 환기 품질 결과를 내야 한다. 즉 모델은 카메라 각도/위치에 invariant해야 한다. 이를 학습으로 달성하려면 학습 데이터에 의도적으로 다양한 시점을 포함해야 한다 ("domain randomization" 전략, Tobin et al. 2017). 9-site 멀티사이트는 이 다양성 자산을 자연스럽게 제공하지만, 제어된 다중 시점으로 보강해야 invariance가 학습된다.
3.1.1 시점 다양성 설계 (Stratified Multi-View)
각 사이트가 같은 표준 위치 + 의도적 변형 시점을 모두 수집하도록 설계한다. 이렇게 하면 site 효과와 viewpoint 효과를 분리 가능하면서, 모델은 다양한 viewpoint를 학습 → invariance 획득.
| Position ID | 위치 | 거리/각도 | 역할 | 모든 사이트 공통? |
|---|---|---|---|---|
| P1 (필수) | 천장 또는 환자 발치쪽 wide | 흉부에서 1.2~2m, 흉부를 위에서 | GT 정렬 anchor (ArUco 평면 인식 가장 정확한 시점) | ✅ 의무 |
| P2 (필수) | 술자 어깨/가슴 마운트 | 흉부에서 50~80cm, 발쪽 30° | 배포 도메인 매칭, 학습 메인 시점 | ✅ 의무 |
| P3 (변형 a) | 술자 헤드마운트 | 흉부에서 60~100cm, 발쪽 30~45° | 헤드 흔들림 도메인 | 최소 3사이트 |
| P4 (변형 b) | 환자 측면 삼각대 | 1m, 흉부 30° 위 | 측면 시점 (술자 반대편) | 최소 3사이트 |
| P5 (변형 c) | 환자 발치 액션캠 (저각) | 2m, 흉부 향함 | 저각 시점 | 최소 3사이트 |
① 모든 9사이트가 P1+P2 의무 수집 (anchor + 배포 도메인)
② 9사이트 중 3개씩 P3, P4, P5 추가 수집 (variant 시점) — 사이트 분담 표는 §3.7 참고
③ 같은 P 시점이 여러 사이트에서 수집되어야 사이트와 시점이 분리 가능
3.1.2 예산 현실 (액션캠 30대 vs 순회 키트)
50만원 × 3대 × (9사이트 + 본사) = 약 1,500만원의 카메라 예산이 비현실적인 경우 다음 절감 전략:
| 전략 | 대수 | 예산 | 장점 | 단점 |
|---|---|---|---|---|
| 순회 키트 (권장) | 본사 1세트 (3~5대) | ~300만원 | 장비 일관성 100%, 캘리브레이션 1회 | 9사이트 동시 수집 불가, 일정 분산 |
| 중고 GoPro Hero 10/11 | 30대 | ~750만원 | 풀 동시 수집 가능 | 중고 품질 산포, 펌웨어 sync 어려움 |
| 계층화 | 핵심 2~3사이트 풀(9~12대) + 나머지 헤드캠 1대(6~7대) | ~700만원 | 핵심 사이트는 풀 데이터, 나머지도 배포 도메인 확보 | 사이트별 데이터 양 불균등 → site-level CV 평가 시 가중치 |
| DJI Action 4 보급형 | 30대 | ~900만원 | 신품 + Pro 모델 80% 성능 | D-Log M 없음, color profile 약함 |
| 풀 GoPro Hero 13 | 30대 | ~1500만원 | 최고 품질 + 동시 수집 | 예산 과다 |
순회 키트로 사이트 돌며 수집, 본사는 상시 PoC·검증·돼지/사람 단계 준비. 일정은 1사이트당 1~2일 × 9사이트 = 2~3주. 카메라 동일 → 모델 학습 시 카메라 효과가 confound 변수가 아님 (큰 장점).
3.1.3 Fallback (천장 마운트 불가)
천장 ≤2.2m 사이트는 P1을 환자 발치쪽 2m wide로 대체. manifest의 p1_mount에 "foot_wide" 명시. 변경 자체가 또 하나의 의도된 시점 변형이므로 invariance 학습에 오히려 기여.
3.2 배치 도식 (Top view + Side view)
치수 가이드
- 천장 높이 2.5m 기준, Cam A는 흉부에서 1.2~1.5m 떨어진 천장에 설치 (너무 가까우면 화각에 흉부 다 안 들어옴)
- Cam B는 환자 어깨 옆 0.8~1m, 삼각대 기준 카메라 높이 1.2m 정도, 흉부를 30° 내려다보게
- Cam C 헤드마운트는 술자 모자/안경에 GoPro 마운트 부착, 발쪽으로 30~45° 기울임
- ArUco 마커: 흉부 정중앙(흉골 위), 5×5cm 또는 7×7cm. 양면테이프 또는 옷에 핀.
- LED sync: 모든 카메라 시야 안에 들어오는 위치(예: 침대 발치 끝). 세션 시작 시 1초 동안 깜빡.
3.3 Optical Flow가 카메라에 요구하는 것
현재 파이프라인은 Farneback dense optical flow로 흉부 ROI 내부 수직 움직임(`flow_dy`)을 추출하고, ConvLSTM은 그 위에 학습한다. Optical flow 알고리즘은 다음 가정을 깔고 동작하므로, 이를 깨는 카메라 설정이면 데이터 자체가 오염된다.
| 요구사항 | 이유 | 위반 시 영향 |
|---|---|---|
| Manual exposure 고정 | Brightness constancy 가정 (밝기 불변) | auto exposure가 흔들리면 가짜 flow 벡터 발생, baseline EMA 깨짐 |
| EIS (전자식 손떨림 보정) OFF | EIS는 프레임을 비강체(non-rigid)로 변형 → flow의 평면성 가정 파괴 | 흉부 외 영역에 인공 flow 발생, 전역 카메라 보상 불가 |
| ≥60 fps | 프레임 간 이동량 작아져 sub-pixel flow 정확도 ↑ | 30fps면 손 움직임에서 큰 변위 → flow 알고리즘 발산 |
| 낮은 압축 (≥60Mbps) | H.264/H.265 블록 아티팩트가 균질 영역에 가짜 corner 생성 | 흉부처럼 텍스처 약한 영역에서 flow 노이즈 ↑ |
| Linear lens 모드 | Wide/SuperView fish-eye는 곡률 있는 flow 생성 | 흉부 위치별 mm 환산이 다름, ArUco 평면 가정 깨짐 |
| Shutter 1/120 이상 | Motion blur 줄여 corner detection 정확도 유지 | 흐리면 Lucas-Kanade keypoint tracking 실패 |
| Flat / Log color profile | 그림자/하이라이트 디테일 보존 | 일반 모드는 dark area에서 flow 손실 |
| Global shutter (이상) | 모든 행 동시 노출 | Rolling shutter는 빠른 손 움직임에 skew → 잘못된 flow 방향 |
EIS OFF · 수동 노출 고정 · 1080p60 · Linear 렌즈. 이 네 개만 지키면 액션캠 RGB로도 학습 가능. 나머지는 정확도 조금씩 끌어올리는 항목.
사람이 시청하기에는 EIS(HyperSmooth/RockSteady/FlowState) 적용 영상이 훨씬 매끄럽다. 그러나 ML 학습에는 정반대다. 이유:
- 비강체 변형 — EIS는 프레임 내부를 영역별로 다르게 warp함. 흉부 움직임과 인공 warp가 섞여 optical flow가 가짜 벡터를 만든다.
- 흉부 상승을 흔들림으로 오판 — EIS 알고리즘이 흉부 ΔZ 상승을 "카메라 흔들림"으로 인식하고 상쇄해버릴 위험. 찾으려는 신호 자체가 지워짐.
- 되돌릴 수 없음 — EIS 적용된 영상은 원본(raw)으로 복원 불가능. 한 번 저장되면 끝.
- 캘리브레이션 K 무효화 — 내부 파라미터는 고정 변환 기준인데 EIS는 매 프레임 다른 변형을 가함.
gyroflow 등으로 선택적 보정. Raw는 양쪽(학습·시청) 모두 커버 가능, EIS 영상은 학습 불가. 즉 raw 수집은 양날검이 아니라 상위 호환.
웹캠(저급)으로 1차 시도 시 다음 문제가 실측됨:
- 30fps는 절대 부족 — squeeze 동작이 빨라서 프레임 사이 변위가 너무 큼 → optical flow 발산. 60fps 이상 필수.
- 저화질 + 강한 압축으로 흉부 ROI 텍스처가 죽음 → SAM2/RT-DETR 세그멘테이션 마스크 경계가 프레임마다 흔들림 (jitter), MediaPipe Hand 키포인트 신뢰도 하락.
- auto exposure로 환자/술자 위치 바뀔 때 밝기 변화 → flow_dy 베이스라인 흔들림.
3.4 액션캠 기종 비교 (Optical Flow 관점)
| 항목 | GoPro Hero 13 | DJI Osmo Action 5 Pro | Insta360 Ace Pro 2 | Logitech Brio 4K (참고) |
|---|---|---|---|---|
| 가격 (대당) | 50~60만원 | 55~65만원 | 50~60만원 | 20만원 |
| 센서 크기 | 1/1.9" | 1/1.3" (대형) | 1/1.3" Leica-tuned | 1/3" |
| 최대 fps (4K) | 4K120 | 4K120 | 4K120, 8K30 | 1080p30 |
| 1080p60 bitrate | ~60 Mbps HEVC | 100 Mbps | 170 Mbps H.265 | ~10 Mbps |
| EIS off 가능 | ✅ ProTune | ✅ Pro mode | ✅ | N/A |
| Manual exposure | ✅ ISO/Shutter/WB | ✅ 가장 직관적 | ✅ | ✅ Logi Tune |
| Color profile | Flat / GP-Log | D-Log M (10-bit) | I-Log | Standard만 |
| Linear 렌즈 모드 | Linear / Wide / SuperView | Standard / Wide / Ultra-Wide | Standard / Wide | 90° fixed |
| 외부 sync | GoPro Labs precision time + 마이크 | Mimo timecode + 마이크 | 마이크 sync | LED 후처리 |
| Webcam USB stream | HDMI+캡처보드 | USB-C 직결 | USB-C | 이미 webcam |
| Optical flow 적합도 | ★★★★ | ★★★★★ | ★★★★ | ★★ |
권장 (Optical Flow 최우선)
- 1순위 — DJI Osmo Action 5 Pro: 큰 센서로 저조도 노이즈 적음, D-Log M 10bit가 ML 전처리에 가장 깨끗, 수동 노출 가장 직관적, 1080p240 고프레임 옵션. 약점: GoPro 대비 마운트 액세서리 작음.
- 2순위 — GoPro Hero 13: 액세서리 생태계 최강, ProTune Flat color profile, GoPro Labs precision time으로 멀티캠 sync 정식 지원 (큰 장점), Linear 렌즈 dewarp 우수.
- 최저선 — Logitech Brio 4K: 1080p30 한계로 PoC 수준만. 학습엔 부적합.
3.4.1 헤드마운트 전용 비교 (Cam C / P2 / P3)
술자 헤드/어깨 마운트 시점은 일반 액션캠 외에 무게·배터리·마운트 편의가 핵심 추가 요건. 긴 세션에서 술자 피로와 마운트 안정성을 고려.
| 모델 | 무게 | 1080p 최대 fps | 배터리 (1080p60) | Manual exposure | Anti-flicker | 마운트 | 중고 시세 | 신품 | 헤드 적합도 |
|---|---|---|---|---|---|---|---|---|---|
| Insta360 GO 3S | 39g (+ pod 96g) | 120fps | 45분 (pod 170분) | △ 제한적 | ✅ 50/60Hz | 자석·모자 클립 | 40만 | 60만 | ★★★★★ 가장 가벼움 |
| DJI Action 2 (단종) | 56g (core) | 120fps | 60분 | ✅ | ✅ | 자석 | 20만 | — | ★★★★ 중고 가성비 |
| DJI Osmo Action 5 Pro | 146g | 240fps | 150분 | ✅ D-Log M | ✅ | 1/4" + 자석 | 45만 | 65만 | ★★★★ 성능 최강 |
| GoPro Hero 13 | 158g | 240fps | 100분 | ✅ ProTune | ✅ | GoPro 마운트 생태계 | 40만 | 55만 | ★★★★ 정석 |
| GoPro Hero 10/11 중고 | 153g | 240fps | 80분 | ✅ ProTune | ✅ | GoPro 마운트 | 25~35만 | — | ★★★★ 가성비 최고 |
| Insta360 Ace Pro 2 | 180g | 240fps | 110분 | ✅ Leica | ✅ | 자석 + 1/4" | 45만 | 60만 | ★★★ 무거움 |
| Ray-Ban Meta (Gen 2) | 49g (안경 전체) | 30fps | 30초/클립 제한 | ❌ | N/A | 안경 자체 | — | 45만 | ★ 상시 녹화 불가 |
| ELP USB 헤드캠 | 30g | 30fps | 케이블 전원 | △ OBS 설정 | △ | DIY 헤어밴드 | — | 5~10만 | ★★ 연구 목적만 |
헤드마운트 권장 순위
- GoPro Hero 10/11 중고 (25~35만원) — 실전 검증 ProTune 수동 제어 + 240fps + 헤드 스트랩 생태계 풍부 + 가성비 최고. Pilot·양산 모두 대응.
- Insta360 GO 3S (중고 40만원) — 39g 초경량. 긴 세션에서 술자 피로 최소. 단 배터리 45분 제약 (action pod 연결 시 170분).
- DJI Action 2 중고 (20만원대) — 최저가. 단종이라 A/S 어려움.
녹화 클립 30초 제한 + 수동 노출 불가 때문에 학습 데이터 수집용으론 X. 다만 향후 스마트글라스 배포 도메인 검증용으로는 참고 가치 있음 (§2.8.3).
① GoPro Hero 10 중고 1대 + C922 Pro 1대 = 30만원 + 기존 장비. 헤드마운트(GoPro) + 천장(C922)로 multi-view consistency 학습 즉시 가능.
② Insta360 GO 3S 중고 1대 + C922 Pro 1대 = 40만원 + 기존 장비. 초경량 헤드마운트 중시할 때.
3.5 액션캠 왜곡 처리 (Distortion Handling)
액션캠 기본 광각(170° HFOV)은 fish-eye 왜곡이 매우 강해 optical flow와 ArUco 평면 환산에 치명적이다. 단순 dewarp 외에도 학습 단계에서 활용 가능한 기법들을 함께 검토.
| 접근 | 방법 | 장점 | 단점 |
|---|---|---|---|
| ① Linear 모드 + 중앙 crop | 카메라 내장 dewarp + 중앙 60% 사용 | 가장 단순, 즉시 동작 | 시야각 손실 (170°→60°), 화질 약간 손실 |
| ② Wide 모드 + 후처리 undistort | cv2.fisheye.undistortImage 학습 직전 보정 | 화질 보존 ↑, full FOV 활용 | fisheye calibration 필수 |
| ③ 왜곡 그대로 학습 (논문 차용) | distorted 프레임 그대로 모델 입력. K matrix만 별도 입력으로 | 화질 손실 0, 모델이 왜곡 자체를 학습 | 학습 데이터 多 필요 |
| ④ Equirectangular projection | fish-eye를 구면 좌표로 펴서 spherical CNN 사용 | 360° 무왜곡 표현 | 모델 구조 변경, 학습 인프라 부담 |
| ⑤ Multi-View Consistency Loss (논문 차용) | 같은 환기를 다른 시점으로 동시 캡처 → 모델이 두 시점에서 같은 VT 출력하도록 contrastive/consistency 학습 | view-invariance 자동 학습, 왜곡 보정 안 해도 됨 | multi-view 동시 수집 필수, sync 정확도 요구 |
3.6 카메라 캘리브레이션 (Multiple Methods)
3.6.1 Intrinsic 캘리브레이션 (단일 카메라)
| 방법 | 패턴 | 도구 | 적합 상황 |
|---|---|---|---|
| Checkerboard (정석) | 7×9 체스판 50장 | cv2.calibrateCamera | 표준 카메라, Linear 모드 |
| ChArUco | ChArUco 보드 30~50장 | cv2.aruco.calibrateCameraCharuco | 일부 가림 OK, 자동 corner 검출 |
| AprilTag grid | AprilTag 4×3 보드 | Kalibr, AprilTag SDK | ROS 환경, 더 robust |
| Asymmetric circles | 점 패턴 | cv2.findCirclesGrid | sub-pixel 정확도, 저조도 |
| Fish-eye 캘리브레이션 | 체스판 50장 (다각도) | cv2.fisheye.calibrate | 액션캠 Wide/SuperView 모드 필수 |
| OCAM 모델 | 체스판 | Scaramuzza OCAM Toolbox | 매우 강한 왜곡 (≥180°) |
| 딥러닝 기반 | 단일 이미지 | DeepCalib, GeoCalib | 캘리브 보드 없을 때 추정 |
3.6.2 Extrinsic 캘리브레이션 (멀티캠 상대 위치)
| 방법 | 도구 | 장점 | 단점 |
|---|---|---|---|
| stereoCalibrate (pairwise) | cv2.stereoCalibrate | OpenCV 표준, 검증 충분 | 2대씩만, N대 시 N(N-1)/2 페어 |
| Multical (multi-camera 동시) | multical (Python) | N대 동시 추정, ChArUco 자동 | 설치/문서 약간 부담 |
| Kalibr | Kalibr (ROS) | IMU + 카메라 동시, robust | ROS 환경 필요 |
| COLMAP / SfM | COLMAP, OpenSfM | 보드 없이 자연 특징점으로 자가 캘리브 | 정적 장면 필요, 시간 소요 |
| AprilTag bundle adjustment | tagbundle, custom BA | 3D AprilTag 큐브로 어디서든 환산 | 큐브 제작 필요 |
3.6.3 Scale Reference (px↔mm 환산용, 도메인 공통)
흉부 ΔZ를 mm 단위로 환산하려면 매 세션 또는 매 프레임 px↔mm 환산 기준이 필요. 마네킹·돼지·사람 모두 동일한 방식 사용 권장 (학습 파이프라인 일관성).
| 방법 | 위치 | 마네킹 | 돼지 | 사람 | 특징 |
|---|---|---|---|---|---|
| ArUco 흉부 위 | 흉부 정중앙 부착 | ✅ | △ (굴곡·윤리) | △ (옷·접착) | 매 프레임 자동 보정 ○, 흉부 ROI 일부 가림 |
| ArUco 베드 옆 (권장) | 베드 가장자리 | ✅ | ✅ | ✅ | 매 프레임 자동 보정 ○, 흉부 가림 X, 평면 가정 안정 |
| 수술용 ruler | 흉부 옆 일시 비치 (캘리브 후 제거) | ✅ | ✅ | ✅ | 세션 시작 시 1회, 부착 X |
| 격자 drape | 흉부 위 일시 덮음 (캘리브 후 제거) | ✅ | ✅ | △ (위생) | 영역 전체 환산 가능, 1회 측정 |
| 알려진 해부학 길이 | — | 고정 (제조사 spec) | 견갑간 25~30cm | BSA 추정 | 도구 0, 정확도 ±10% |
| 카메라 위치 고정 + PnP | — | ✅ | ✅ | ✅ | 마커 0, 매 세션 위치 똑같이 (셋업 부담) |
| 3D 스캔 사전 캘리브 (옵션) | — | — | — | — | 장비 미보유로 본 프로젝트 미사용. 향후 iPhone Pro LiDAR 등 도입 시 마네킹 1회 스캔으로 영구 활용 가능 |
| 딥러닝 단안 깊이 (MiDaS/ZoeDepth) | — | △ | △ | △ | 도구 0, 자동. 절대 깊이 부정확 → 위 방법 중 하나로 anchor 보정 필요. 보조용으로만 |
현재 코드(
ChestAutoRoiAnalyzer의 ARUCO_EMA_ALPHA)는 마네킹 흉부 위 ArUco를 가정하지만, 위 표대로 ArUco를 베드 옆으로 옮기거나 ruler/drape 방식으로 변경 가능. 변경 시 코드 수정은 1줄 (마커 검출 영역 ROI 확장만).
① ArUco를 베드 옆에 부착 (자동 보정, 매 프레임) +
② 수술용 ruler를 세션 시작 시 흉부 옆에 1회 비치 후 제거 (cross-check anchor)
마네킹·돼지·사람 모두 동일. 이 두 가지로 충분, 3D 스캐너·딥러닝 깊이는 향후 옵션.
3.6.4 Online Calibration (세션 중 자동 보정)
- 흉부 위 ArUco 마커가 매 프레임 픽셀 좌표 + 알려진 실제 크기를 제공 → 매 세션 자동 px↔mm 환산 (이미 구현)
- ArUco 가려지면 마지막 valid 환산값 hold (이미 구현)
- 정식 캘리브레이션 결과(K, dist)는 변하지 않으므로 사이트 등록 시 1회 + 6개월마다 재확인
3.6.4 권장 워크플로
- 사이트 등록 시 1회: 체커보드 50장 →
cv2.fisheye.calibrate(Wide 모드). 검증: reprojection error < 1.5 px - 사이트 셋업 시 1회: A2 ChArUco 환자 자리 → multical 또는 cv2.stereoCalibrate. 검증: 페어 reprojection error < 2.0 px
- 매 세션 자동: ArUco online scale 환산
- 저장:
calib/<site_id>_v<date>/calib.yaml(K, dist, R, t per camera, 렌즈 모드, 캘리브 일자). manifest에 calib_version 기록 - 헤드마운트(P3): 매 세션 1회 재캘리브 (술자 머리 각도 매번 바뀜). ChArUco 1장 빠르게 잡고 PnP 풀기
3.7 멀티캠 동기화 (액션캠 대응)
액션캠은 하드웨어 트리거 입력이 없으므로 산업캠 GenICam 방식 불가. 다음 방법으로 sync.
| 방법 | 정확도 | 셋업 | 비고 |
|---|---|---|---|
| GoPro Labs precision time | ~10~30ms | GoPro Labs 펌웨어 + QR 코드로 시각 주입 | GoPro 전용. 매일 1회 sync |
| DJI Mimo Timecode | ~30~50ms | DJI Mimo 앱에서 캠 그룹 timecode 전송 | DJI 전용 |
| LED + 오디오 클랩 (보편) | ~1프레임 (~16ms @60fps) | 모든 캠 시야에 LED + 마이크 입력에 클랩 동시 | 기종 무관, 후처리에서 LED frame + audio peak 검출 |
| Tentacle Sync E | <1ms | 외부 timecode 발생기 ($300/대) 마이크 입력 | 오버스펙. 본 프로젝트 불필요 |
GT 센서 sync
- 마네킹 SkillGuide raw USB 패킷의 PC 수신 timestamp 기준
- 세션 시작 시 LED 점멸 + 키보드 enter (또는 별도 트리거 신호) 동시 발생 → 카메라 영상의 LED frame과 패킷 timestamp를 align
- 측정한
sync_offset_ms를 manifest에 기록 (§4 참고)
3.8 환경 측정 (조명·배경)
3.8.1 조명 lux 측정 방법
| 도구 | 가격 | 정확도 | 비고 |
|---|---|---|---|
| 스마트폰 앱 (Lux Light Meter Pro 등) | 무료 | ±10~15% | 가장 간편, 캘리브레이션 없으면 기종별 편차 |
| 알리/저가 lux meter | 1~2만원 | ±5% | UNI-T UT383, BT-881D 등 |
| Testo 540 | ~5만원 | ±3% | 독일 정밀, 검교정 가능 |
| Konica Minolta T-10A | ~50만원 | ±2% | 연구·실험실 표준 |
3.8.2 측정 절차
- 센서를 환자 흉부 위치(마네킹 가슴 위)에 둠
- 센서 면을 카메라 방향으로 향함 (카메라가 보는 빛의 양)
- 3회 측정 후 평균 → manifest
lighting_lux에 기록 - 세션 중간 조명 변화 있으면 (커튼/창문) 재측정 + log
3.9 멀티사이트 운영 (9개 교육장)
본 프로젝트는 9개 교육장에서 분산 데이터 수집한다. 이는 도메인 일반화에 핵심적 자산(조명·배경·술자·장비 다양성)이지만, 동시에 SOP 일관성을 가장 도전적으로 만든다. 각 사이트가 다음 규약을 따른다.
3.9.0 P1-P5 시점 사이트 분담표
9사이트가 모두 P1+P2 의무, variant(P3~P5)는 3사이트씩 분담. 같은 P 시점이 여러 사이트에서 수집되어야 site/viewpoint 분리 가능.
| site_id | P1 (anchor) | P2 (어깨캠) | P3 (헤드캠) | P4 (측면) | P5 (저각) |
|---|---|---|---|---|---|
| SITE_01 | ✅ | ✅ | ✅ | — | — |
| SITE_02 | ✅ | ✅ | ✅ | — | — |
| SITE_03 | ✅ | ✅ | ✅ | — | — |
| SITE_04 | ✅ | ✅ | — | ✅ | — |
| SITE_05 | ✅ | ✅ | — | ✅ | — |
| SITE_06 | ✅ | ✅ | — | ✅ | — |
| SITE_07 | ✅ | ✅ | — | — | ✅ |
| SITE_08 | ✅ | ✅ | — | — | ✅ |
| SITE_09 | ✅ | ✅ | — | — | ✅ |
| 본사 | ✅ | ✅ | ✅ | ✅ | ✅ |
본사는 모든 시점 수집(검증·개발용). 분담은 사이트 환경/예산 따라 조정 가능. 핵심은 각 P 시점이 최소 3사이트에서 수집되는 것 (시점-사이트 교차 데이터로 invariance 학습 가능).
3.9.1 사이트 등록 절차 (1회, 사이트 셋업 시)
- 본 SOP 전체 검토 → 사이트 환경에 맞는 카메라 옵션(A/B/C) 결정
- 사이트 카탈로그에 다음 정보 등록 (별도
site_catalog.html또는 같은 manifest 내):site_id: 예SITE_01_SEOUL_BORAMAE- 천장 높이, 카메라 옵션(A/B/C), 보유 마네킹·BVM 모델 리스트
- 조명 종류·평균 lux, 배경 색상, 공간 크기
- 담당자 연락처, IRB·IACUC 권한 여부
- 카메라 캘리브레이션 1회 수행 후
calib/<site_id>_v<date>/calib.yaml저장 - 1회 dry-run 세션 (30초) 후 본 SOP §12 자동 품질 리포트로 셋업 검증
3.9.2 세션 운영 규칙
- 모든 manifest에
site_id의무 기록 - 같은 세션 안에서 카메라 옵션 변경 금지 (§6.5와 동일)
- 사이트 간 데이터 교환은 raw + manifest 단위 (정제본은 중앙에서 일괄 처리)
- 각 사이트가 LED+오디오 sync 자체 보유 — 사이트 간 sync 불필요 (학습 단위는 세션이지 사이트가 아님)
3.9.3 학습 시 활용 (data partitioning)
| 분할 방식 | 방법 | 평가 의의 |
|---|---|---|
| Site-level CV | 9개 사이트 중 1~2개 hold-out → 학습 7~8개 | 새 교육장에서의 일반화 성능 (가장 엄격) |
| Subject-level CV | 술자 단위 hold-out (사이트 무관) | 새 술자에 대한 일반화 |
| Cell-level CV | BVM×마네킹 조합 hold-out | 새 장비에 대한 일반화 |
| Stratified random | 모든 변수 균등 분포 무작위 | baseline (낮은 난이도, 기준치) |
최종 모델 보고 시 site-level + subject-level 이중 hold-out으로 평가. 이 둘이 통과해야 "새 교육장의 새 술자"에 대한 generalization이 검증됨.
3.9.4 사이트 카탈로그 (9-site)
각 사이트의 카메라 옵션·보유 장비·환경 정보는 site_catalog.html 별도 문서에서 관리한다. 사이트 등록 시 카탈로그에 row를 추가하고, 본 SOP가 항상 최신 카탈로그를 reference로 가리킨다.
4. 세션 메타데이터 스키마
data/<subject_id>/<session_YYYYMMDD_HHMMSS>/manifest.json:
{
"session_id": "session_20260415_143022",
"domain": "manikin", // manikin | porcine | human
"operator_id": "OP003",
"operator_hand_length_cm": 18.5,
"operator_grip_type": "E-C two-hand",
"operator_skill": "nurse",
"manikin_model": "Laerdal_SimMan_3G",
"manikin_compliance_mL_per_cmH2O": 50,
"manikin_resistance": "normal",
"manikin_age_group": "adult",
"bvm_brand": "Ambu",
"bvm_size_mL": 1500,
"bvm_lot": "LOT-2026Q1-A",
"mask_size": 4,
"reservoir_attached": true,
"peep_valve_attached": false,
"ground_truth_source": "SimMan_internal_flow",
"gt_sampling_hz": 100,
"gt_dead_space_mL": 75,
"camera_setup_id": "setup_v2_2026Q2",
"camera_calib_version": "calib_20260410",
"camera_count": 4,
"lighting_lux": 800,
"lighting_type": "LED_diffuse",
"clothing": "thin_cotton",
"head_tilt_deg": 15,
"jaw_thrust": false,
"session_start_iso": "2026-04-15T14:30:22+09:00",
"sync_method": "LED+timestamp",
"sync_offset_ms": -23.5,
// 돼지 도메인 시 추가 필드
"porcine_protocol_iacuc": null,
"porcine_weight_kg": null,
"porcine_anesthesia": null,
// 사람 도메인 시 추가 필드
"human_irb_id": null,
"human_consent_id": null,
"human_bsa_m2": null,
"notes": "백 새것, 마스크 실링 양호"
}
5. 프레임 단위 데이터 스키마
현 analyzers/data_recorder.py는 11컬럼(timestamp + 10 features + label), ArUco 모드 시 13컬럼(+ bbox_height_px, chest_rise_mm). GT 통합을 위해 다음 확장:
timestamp,
flow_dy_mean, flow_dy_top, flow_dy_bottom, flow_mag_mean, flow_mag_std,
area_change, centroid_dy, bg_flow_dy, subject_motion, time_since_squeeze,
bbox_height_px, bbox_width_px, chest_rise_mm,
gt_flow_mL_s, gt_volume_mL, gt_pressure_cmH2O, [추가: GT 스트림]
label_squeezing, leak_estimate [추가: 라벨]
analyzers/feature_extractor.py: flow_dy_mean, flow_dy_top, flow_dy_bottom, flow_mag_mean, flow_mag_std, area_change, centroid_dy, bg_flow_dy, subject_motion, time_since_squeeze
→ data_recorder.py에 GT 센서 스트림을 받아 카메라 timestamp에 align해서 같은 row에 기록하는 헬퍼 추가 필요 (구현은 SOP 승인 후 별도 작업).
6. 실험 설계 (Experimental Design)
6.1 데이터 단위 위계
| 단위 | 정의 | 일반 규모 |
|---|---|---|
| Site Campaign | 한 사이트 1~2일 방문 동안의 모든 수집 활동 | 9사이트 × 1캠페인 = 9캠페인 |
| Cell | (BVM 종류) × (마네킹 종류) × (마스크 사이즈)의 한 조합 | 1차 그리드 6셀 (§6.3 참고) |
| Scenario | 환기 모드/조건 (정상/과환기/저환기/leak/...) | §6.2 참고 |
| Session | 한 술자 × 한 cell × 한 scenario × 한 카메라 셋업 × 60~90초 연속 녹화 | 1캠페인당 50~150 세션 |
| Cycle | 1회 squeeze (호기→흡기→완전 이완) | 1세션당 8~15회 |
중간에 BVM/마네킹/카메라/scenario 바꾸면 신규 세션. 술자 휴식도 신규 세션. 한 사이트 캠페인은 보통 5명 술자 × 6셀 × 3시나리오 × 1캠셋업 = 90 세션 (반나절~1일).
6.2 시험 시나리오 (Ventilation Scenarios)
모델이 정상만 학습하면 이상치를 못 잡으므로, 의도적 변형 시나리오를 cell마다 분배 수집한다.
| scenario_id | 설명 | 목표 rate | 목표 VT | 의도 |
|---|---|---|---|---|
| S1_normal | 정상 환기 (가이드라인 준수) | 10/min | 500 mL | baseline 성공 케이스 |
| S2_fast | 과환기 (빠른 squeeze) | 20/min | 500 mL | rate 이상 학습 |
| S3_slow | 저환기 (느린 squeeze) | 5/min | 500 mL | rate 이상 학습 |
| S4_shallow | 얕은 환기 (VT 부족) | 10/min | 250 mL | volume 이상 학습 |
| S5_deep | 과한 환기 (VT 과다) | 10/min | 800 mL | volume 이상 학습 |
| S6_leak | 의도적 마스크 leak | 10/min | 500 mL bag | 실제 delivered VT ≪ bag squeeze 학습 |
| S7_two_person | 2인 환기 (1명 mask, 1명 bag) | 10/min | 500 mL | 2인 시나리오 시점/그립 다양성 |
| S8_head_tilt | head tilt 0° / 30° 변형 | 10/min | 500 mL | 자세 변화 robust |
| S9_irregular | 리듬 불규칙 (사람다움) | 변동 | 변동 | real-world 변동 학습 |
6.3 셀(Cell) 정의 (장비 조합)
한 셀 = (BVM 종류) × (마네킹 종류) × (마스크 사이즈) 의 하나의 조합.
6.2 1차 그리드 (마네킹)
- BVM: 3종 (Ambu adult / Laerdal adult / 국산 adult)
- 마네킹: 2종 (SimMan 3G / Resusci Anne)
- 마스크: 1종 (사이즈 4 고정)
- → 6 셀
6.3 셀당 수집량
- 술자 5명 × 60초 × 3 반복 = 15분/셀 raw
- 6셀 × 15분 = 1.5시간 raw → 정제 후 ~1시간 학습 가능
6.4 Transfer Test 셋
- 학습에 안 본 BVM × 마네킹 조합 1셀 hold-out → 일반화 평가
- Subject hold-out: 술자 1명 전체 hold-out (subject-level CV)
6.5 세션 진행 규칙
7. 세션 절차 (Step-by-step)
| 시간 | 작업 |
|---|---|
| T-30분 | 장비 점검 (§11 체크리스트). 모든 카메라 부팅 + 네트워크 확인. |
| T-15분 | 카메라 캘리브레이션 (없으면 신규, 있으면 setup_id 일치 확인). |
| T-5분 | 마네킹 / BVM 셋업, 마스크 실링 사전 점검, GT 센서 영점. |
| T-0 | LED sync 발사 → 세션 시작. manifest.json 사전 입력. |
| +0~10s | 캘리브레이션 (술자 대기, 마네킹 정지). baseline EMA 안정화. |
| +10s~ | 환기 시작. 스페이스바 라벨 또는 자동 라벨. |
| 중간 | 5분마다 GT 센서 zero 재조정 (timestamp log). |
| 종료 | stop_session() → manifest 자동 저장 + 사후 노트 작성. |
8. 캘리브레이션 (소프트웨어)
8.1 적응형 baseline (이미 구현)
- 90 frames (3s) 초기 캘리브레이션 → baseline + noise floor
- EMA: αbaseline = 0.01 (느림, 드리프트), αnoise = 0.05
- IDLE 구간에서만 갱신, RISING 중에는 정지
- 임계값: rise = baseline_ema + max(0.3, noise_ema × 3); idle = baseline_ema − max(0.2, noise_ema × 1.5)
8.2 ArUco px↔cm 환산 (이미 구현)
- 세션 시작 시 마커 크기/각도 검증 (왜곡 5% 이내)
- 세션 중간 마커 가려지면 마지막 valid 환산값 hold
- EMA 평활화 α = 0.3 (ARUCO_EMA_ALPHA)
8.3 마스크 안정성
- BVM mask bbox IoU(직전 vs 현재) < 0.7이면 측정 일시 중단 (마네킹/BVM 이동)
- 5초 이상 회복 안 되면 세션 자동 일시정지
9. Ground Truth 정렬 (Alignment)
- 카메라 timestamp 기준으로 GT를 nearest-neighbor 또는 선형 보간
- 동기 오프셋
sync_offset_ms는 manifest에 기록, 후처리 시 보정 - 사후 검증: GT volume 사이클 정점 vs 카메라 chest_rise_mm 정점이 < 100ms 이내인지 → 초과 시 세션 폐기
10. 도메인 전이 — Manikin → Porcine → Human
10.1 Transfer-friendly feature 우선
- 텍스처 의존 feature(마네킹 표면 무늬 학습) 회피
- 물리적 기하 feature 위주: ΔZ (mm), ROI 면적 변화율, 사이클 주기/지속시간
10.2 모델 출력 권장
- 절대 mL 회귀보다 상대 지표 (% predicted, 환기 일관성 score)
- uncertainty 출력 (도메인 OOD 감지)
10.3 임상 단계 보정
- 환자별 초기 5~10회 환기에서 spirometer로 calibration anchor 측정 (가능한 환경)
- 또는 BSA / 체중 기반 사전 조정
10.4 마네킹 단계에서 미리 할 일
- 학습 데이터에 BVM·마네킹 ID를 입력 또는 임베딩으로 포함 → mixed-effects 또는 multi-task 모델
- 사람 전이 시 새 도메인 임베딩만 fine-tune
11. 체크리스트 (인쇄용 1쪽)
- 카메라 4대 전원 / 네트워크 / timestamp sync
- 캘리브레이션 파일 일치 (
setup_id) - 조명 lux 측정값 800±100 범위
- 마네킹 모델 / compliance 설정 manifest 일치
- BVM 신품 / 사용기간 표시 (lot 번호 기록)
- 마스크 실링 사전 점검 (수동 압축 시 leak <10%)
- GT 센서 영점, 샘플링 Hz 확인
- LED sync trigger 작동 확인
- ArUco 마커 부착 + 카메라 시야에서 인식
- 술자 동의서 / hand_length 측정
- manifest.json 사전 입력
- 데이터 수집 모드 ON, 빈 세션 30초 dry-run
- (돼지 세션) IACUC protocol 번호 + 수의사 동석 확인
- (사람 세션) IRB 승인 + 동의서 서명 확인
12. 데이터 품질 검수 (사후)
각 세션 자동 리포트 생성:
- 총 프레임 수, 라벨 분포 (1/0)
- 캘리브레이션 정상 종료 여부
- GT-카메라 sync residual (median ms)
- 사이클 검출 수 vs GT 사이클 수 일치
- 마스크 안정성 (IoU < 0.7 발생 횟수)
13. 버전 관리 / 감사 추적
- SOP 자체 버전 (현재 v1.0)
- 카메라 캘리브레이션 버전, BVM lot 번호, 마네킹 시리얼 등 추적 가능 항목 manifest에 모두 기록
- 변경 이력 표 (날짜 / 변경자 / 사유) — §0 참고
- raw 데이터 + manifest는 NAS의
breath_data/raw/에 immutable 저장 (수정 금지, 정제본은 별도 폴더)
14. Continuous Learning Pipeline (야간 학습 루프)
9사이트에서 매일 수집되는 데이터를 중앙 서버(H100)에서 야간 학습하여 모델을 지속 개선하고, OTA로 재배포하는 full pipeline. 수집 → 학습 → 배포가 사람 개입 없이 야간에 자동 순환.
14.1 아키텍처
14.2 Nightly Data Sync (사이트 → NAS)
- 도구:
rsync(Linux) /rclone(Windows/Mac 크로스플랫폼) - 주기: 매일 02:00 KST cron
- 프로토콜: SSH + rsync, 또는 S3 호환 (NAS에 MinIO 띄우면 사이트들이 S3 SDK로 PUT)
- 재시도: 실패 시 지수 백오프 3회 재시도, 실패는 Slack/메일 알림
- 체크섬: SHA256 검증, 전송 무결성 확인
- 증분 전송만: 이미 업로드된 세션은 스킵 (sync timestamp 기반)
14.3 Auto QC & Data Versioning
- NAS에 도착한 세션에 §12 자동 품질 리포트 적용
- pass:
training_pool/v<YYYYMMDD>/로 이동 - fail:
quarantine/로 이동, 원인 기록, 사이트 담당자에게 알림 - Data versioning:
DVC또는 날짜 기반 스냅샷 (dataset_2026-04-17_v42). 학습된 모델이 어떤 데이터 버전인지 추적
14.4 학습 트리거 (3가지 옵션)
| 옵션 | 조건 | 장점 | 단점 |
|---|---|---|---|
| Daily (본 프로젝트 기본) | 매일 02:30 cron | 일관된 주기, 개선 빠름 | 데이터 적은 날도 학습 → 과학습 위험 |
| Weekly | 일요일 02:30 cron | 충분한 데이터 누적, 비용 ↓ | 피드백 느림 |
| Accumulation-based | 신규 pass 세션 ≥50개 또는 신규 프레임 ≥100k | 학습 신호 충분할 때만 동작 → 효율 | 모니터링 필요, 조건 튜닝 |
14.4.1 Hyperparameter Optimization — Optuna
Optuna는 Python 오픈소스 하이퍼파라미터 자동 최적화 라이브러리. PyTorch·sklearn·XGBoost 등과 쉽게 결합해서 learning rate, hidden dim, dropout 같은 수치를 자동으로 탐색한다. 본 프로젝트의 ConvLSTM·Optical flow 파라미터 튜닝에 활용.
샘플링 전략 (Sampler)
| Sampler | 방식 | 특징 |
|---|---|---|
| RandomSampler | 무작위 | 단순, baseline |
| TPESampler (기본값) | 베이지안 (Tree-structured Parzen Estimator) | 좋은 결과 나온 영역 점점 더 많이 탐색 — 가장 효율적 |
| CMA-ES | 진화 알고리즘 | 연속 공간 최적화 |
| GridSampler | 전수 조사 | 공간 좁을 때 |
| NSGA-II | 다목적 최적화 | 여러 지표 동시 (예: F1 ↑ + latency ↓) |
코드 예시 (ConvLSTM 튜닝)
import optuna
def objective(trial):
lr = trial.suggest_float('lr', 1e-5, 1e-2, log=True)
hidden = trial.suggest_int('hidden', 32, 256, step=32)
dropout = trial.suggest_float('dropout', 0.0, 0.5)
window = trial.suggest_categorical('window', [60, 90, 120])
model = train_convlstm(lr=lr, hidden=hidden, dropout=dropout, window=window)
return model.val_f1 # 최대화할 지표
study = optuna.create_study(direction='maximize', sampler=optuna.samplers.TPESampler())
study.optimize(objective, n_trials=100)
print(study.best_params) # {'lr': 3e-4, 'hidden': 128, 'dropout': 0.2, 'window': 90}
주요 기능
- Pruning — 학습 도중 성능 나쁜 trial을 조기 중단해서 H100 GPU 시간 절약 (MedianPruner, SuccessiveHalving 등)
- Distributed search — H100 여러 대 또는 DGX Cloud로 분산 실행 가능
- MLflow 연동 — 모든 trial이 MLflow Tracking에 자동 기록 (§14.5)
- Storage 백엔드 — SQLite/PostgreSQL에 study 영속화 → 중단 후 재개 가능
- Visualization —
optuna.visualization.plot_param_importances()로 어떤 파라미터가 중요한지 자동 분석 - 무료 오픈소스 —
pip install optuna
본 프로젝트 활용 방안
- ConvLSTM 하이퍼파라미터 — hidden, num_layers, dropout, lr, window_size, batch
- Optical flow 파라미터 — Farneback의 pyr_scale, levels, winsize, iterations, poly_n, poly_sigma
- 데이터 증강 확률 — p_flip, p_crop, p_color_jitter
- Loss 가중치 — multi-view consistency loss vs supervised loss 비율
학습 트리거 확장 (§14.4 보강)
| 트리거 | 주기 | 내용 |
|---|---|---|
| Daily incremental fine-tune | 매일 02:30 | 전일 데이터로 fine-tune, 고정 하이퍼파라미터 |
| Weekly full retrain | 일요일 02:30 | 전체 데이터로 full retrain |
| Weekly Optuna HPO (신규) | 토요일 22:00 ~ 일요일 02:00 | Optuna TPE × 50~100 trials × 각 trial 5~10분 → 최적 config 도출 → 일요일 full retrain에 반영 |
| Monthly architecture search | 월 1회 (옵션) | 레이어 수·종류까지 탐색 (NAS 유사) |
매일 fine-tune + 주 1회 HPO (Optuna) + 주 1회 full retrain (HPO 결과 반영). HPO는 H100 한 대로 충분, trials 수는 시간 예산에 따라 조정. MLflow Tracking에 study 전체 기록 → 팀이 언제든 trial 비교 가능.
14.5 Model Registry (MLflow 권장)
학습된 모델을 버전 관리하는 시스템. Git이 코드를 관리하듯, registry는 모델 파일 + 학습 메타데이터 + 성능 지표 + stage(staging/production/archived)를 묶어 관리.
| 도구 | 특성 | 비용 | 본 프로젝트 적합도 |
|---|---|---|---|
| MLflow (self-host) | 오픈소스, Python SDK, Docker 1줄 실행 | 무료 | ✅ 권장 (H100 서버 같이 구동) |
| Weights & Biases (W&B) | SaaS, UI 예쁨, 실험 추적 강력 | 무료 제한 / 유료 | ○ 팀 협업 필요 시 |
| DVC + Git | 데이터+모델을 Git처럼 관리 | 무료 | △ 초기 복잡도 |
| 자체 (S3 + JSON) | 폴더+메타데이터 JSON | 무료 | △ 기능 부족 |
각 모델 entry가 기록하는 내용: 모델 파일 (.pth) / 학습일자 / 데이터 버전 / site-level F1 / subject-level F1 / transfer F1 / 하이퍼파라미터 / stage.
14.6 Evaluation Gate (배포 승격 기준)
새 모델이 production 승격되려면 다음 모두 통과:
- Site-level hold-out F1 ≥ 이전 production 모델 F1 − 1%p (유의미 하락 없음)
- Subject-level hold-out F1 ≥ 이전 − 1%p
- Transfer test (학습 안 본 BVM×마네킹 조합) F1 ≥ 이전 − 2%p
- 타이밍 오차 (환기 감지 시점) median < 100ms
- False positive rate (자발 호흡/카메라 흔들림) < 5%
하나라도 실패 시 staging에 보류, 슬랙 알림 → 사람이 리뷰.
14.7 OTA 배포 (Canary → Full Rollout)
- Canary: 본사에만 먼저 배포 (30분 모니터링)
- Partial rollout: 1사이트 선택 배포 → 24시간 성능 모니터링
- Full rollout: 모든 사이트에 배포
- 롤백: 단계별 drift/error 감지 시 즉시 이전 버전으로 복귀
OTA 구현 방식
- 각 사이트 PC는 기동 시 registry에 "production 모델 버전" 쿼리 → 로컬 버전과 다르면 다운로드
- 또는 MQTT/webhook으로 registry가 사이트에 "v42 available" 푸시 → 사이트가 업데이트
- 모델 파일 체크섬 검증 후 로드
- 업데이트 실패 시 이전 버전 유지, 다음 기동 시 재시도
14.8 Monitoring & Drift Detection
- 사이트별 실시간 지표: 추론 confidence 분포, flow_dy 분포, 사이클 수/분
- Drift 알림: 평균값이 이전 주 대비 ±3σ 벗어나면 Slack 알림
- 활용 로그: 각 세션의 예측 결과와 (가능하면) 사후 피드백을 NAS로 수집 → 다음 학습 데이터로 재사용
- Active learning: 모델이 낮은 confidence로 예측한 세션을 우선 재라벨링 대상으로 표시
14.9 인프라 현황 & 로드맵
| 자원 | 현재 | 확장 계획 |
|---|---|---|
| 학습 서버 | H100 × 1 | 데이터 증가 시 NVIDIA DGX Cloud / GPU Cloud 전환 검토 |
| 저장소 | NAS (용량·모델 미정) | 최종 용량 산정 후 구매 — raw 영상 수십 TB 예상 |
| Model Registry | 미구축 | MLflow self-host on H100 서버 (Docker) |
| 실험 추적 | 미구축 | MLflow 기본, W&B 옵션 |
| OTA 시스템 | 미구축 | registry 폴링 + 체크섬 검증 방식으로 자체 구현 |
| 모니터링 | 미구축 | Grafana + Prometheus (사이트별 지표) / Slack 알림 |
① NAS 스펙·용량 확정 (최소 50TB 권장) ② H100 서버에 MLflow + Docker 셋업 ③ 사이트별 야간 sync cron 스크립트 배포 ④ OTA 클라이언트 구현 (사이트 PC). 본 섹션은 타겟 아키텍처이며 실제 구축은 데이터 수집 1차 완료 후 단계적 진행.
15. 추가 아이디어 — 구조대원을 위한 스마트 헬멧 제품 비전
데이터 수집 SOP의 확정 사항이 아니라 장기 제품화 방향에 대한 아이디어. 내부 검토·대표님 협의 후 공식 로드맵 편입 여부 결정. 현 단계 pilot·수집 업무는 본 섹션에 영향받지 않음.
15.1 제품 비전 — "구조대원을 도와주는 스마트 헬멧"
BVM 환기 품질 분석 AI 모델을 탑재한 스마트 헬멧·캡을 구조대원·EMS·응급의료 교육기관에 공급한다. 카메라 + 실시간 추론 + 피드백(오디오/HUD) 일체형. 단순 녹화 도구가 아니라 현장에서 처치자에게 즉시 피드백을 주는 어시스턴스 장치.
15.2 스마트 헬멧 기능 스택
| 레이어 | 구성 | 역할 | 본 프로젝트 관련도 |
|---|---|---|---|
| 1. 카메라 | 전방 카메라 (흉부 향함), 선택 측면 카메라 | BVM 환기 영상 분석 입력 | ★★★ 핵심 |
| 2. 연산 | SoC (Jetson Orin Nano / RK3588 / 스마트폰 연결) | 실시간 ConvLSTM 추론 | ★★★ 핵심 |
| 3. 피드백 출력 | 골전도 이어폰 / LED 인디케이터 / 진동 / AR HUD | "너무 빠름", "너무 얕음" 즉시 지시 | ★★★ 사용자 가치 |
| 4. 통신 | Wi-Fi / 5G / LTE-M | 서버 업로드, OTA, 지휘센터 스트림 | ★★ 연속학습 |
| 5. 측위·자세 | GPS, IMU, 기압계 | 현장 위치, 자세, 낙하 감지 | ★ 확장 |
| 6. 생체 모니터링 | PPG 심박, 체온 | 구조대원 자체 안전 | ★ 확장 |
| 7. 라이트 | LED 전조등 | 야간·실내 조명 확보 | ★ 확장 |
| 8. 팀 통신 | 마이크 + 이어폰 | 팀 간 통화 | — 별도 |
MVP 최소 구성: 레이어 1 + 2 + 3. 나머지는 시장 확장 옵션.
15.3 제품 형태 3가지 변주
| 형태 | 무게 | 구성 | 타깃 시장 | 예상 가격 |
|---|---|---|---|---|
| 경량형 (택티컬 캡) | 200~300g | 카메라 + 골전도 이어폰 | 교육장·일반 EMS·시뮬레이션센터 | 100~200만원 |
| 중형 (소프트쉘 헬멧) | 400~500g | + LED + 통신 + 마이크 | EMS 현장·소방 구조 | 300~500만원 |
| 풀스펙 (하드쉘) | 700g+ | + HUD + 생체센서 + 방탄 | 군·특수구조·고위험 | 1,000만원+ |
15.4 경쟁/참고 제품
- C-Thru Smart Helmet (미국, 소방) — HUD 내장, 열화상
- WeaRobot Smart Helmet (중국, 소방)
- Cairns XF1 — Bluetooth 통신
- Galvion Caiman — 군용 ballistic + 센서 확장
- PlanarLabs (한국) — 군용 스마트 헬멧
대부분 소방·군용이며 EMS 교육·현장 피드백 특화 제품은 틈새 시장. BreathAI의 "환기 품질 실시간 분석 + 피드백"은 경쟁 제품과 중복되지 않는 고유 포지션.
15.5 데이터 수집 측면 이득
| 항목 | 현 SOP (기성 액션캠) | 제품 컨셉 (헬멧 일체형) |
|---|---|---|
| 카메라 위치 일관성 | 사이트마다 마운트 조정 필요 | ✅ 공장에서 고정, 모든 사이트 동일 |
| 캘리브레이션 | 사이트 등록 시 1회, 주기적 재검증 | ✅ 공장 1회, 영구 (K, dist, 위치 모두 고정) |
| 셋업 난이도 | 삼각대·마운트·각도 설정 | ✅ 헬멧 착용만 |
| 학습↔배포 도메인 갭 | 수집 카메라 ≠ 배포 카메라 가능성 | ✅ 동일 — "수집 헬멧 = 배포 헬멧" |
| 카메라 effect confounder | 통제 변수로 관리 필요 | ✅ 제거 (하드웨어로 해결) |
소프트웨어·SOP로 맞춰야 할 일관성 문제 상당수가 하드웨어 설계 단계에서 해결됨. 이게 핵심 이득.
15.6 단계별 로드맵
| Phase | 구성 | 목적 | 예상 비용 |
|---|---|---|---|
| Phase 1 Prototype | 기성 EMS/공사용 헬멧 + GoPro Hero 10 중고 + 3D 프린트 마운트 adapter (치구로 위치 표준화) | pilot 데이터 수집 + 제품 컨셉 시뮬레이션 | 헬멧 3~10만 × 3개 + 카메라 30만 × 3개 + 마운트 설계 = ~120만원 |
| Phase 2 MVP | 전용 3D 프린트 하우징 + Raspberry Pi Camera Module 3 + 배터리 팩 + 자체 펌웨어 | 자체 하드웨어 PoC, 양산 전 검증 | ~500만원 (설계·시제품) |
| Phase 3 양산 | 맞춤 PCB + SoC (Jetson Orin Nano 등) + 실시간 ConvLSTM 추론 + PEEK 하우징 + 인증 | 시장 출시 | 초기 개발 수억 원, 양산 BOM 50~100만원/대 |
1차 pilot 데이터 수집부터 이 prototype 구성으로 진행하면 "9사이트 순회 시 카메라 위치 일관성" 문제가 즉시 해결된다. GoPro Hero 10 중고 3대 주문은 이미 다음 단계 권장 사항과 일치. 추가로 필요한 건 3D 프린트 마운트 치구 1종 (SLA 프린트 1~5만원)과 공사용 헬멧 3개 (3~10만원/개).
15.7 기술적 고려사항
Phase 1~2에서 결정해야 할 것
- 카메라 위치 — 이마 정중앙 위 3cm, 발쪽 30° 가정 (pilot에서 최적값 검증)
- 시야각 — 술자가 흉부를 자연스럽게 내려다볼 때 흉부 전체 + 손 그립 모두 프레임 안
- 배선/전원 — Phase 1: 외부 배터리 팩 + 케이블, Phase 2~3: 내장 리튬 폴리머 (안전 인증 필요)
- 열 관리 — 헬멧 안 밀폐 공간 → 방열 설계 필수 (특히 Phase 3 SoC)
- 통신 — USB-C 유선 / Wi-Fi / 5G. 교육용은 유선도 OK, 실전용은 무선
인증·규제
- 의료기기 분류 — "교육·피드백 장치"로 positioning하면 인증 회피 가능. "진단·치료"로 규정되면 KFDA/FDA class II 이상 (수개월~수년)
- EMS 헬멧 안전 기준 — EN 443 (유럽), KC (한국). 카메라 내장으로 기존 헬멧 개조 시 충격 인증 재취득 필요 가능
- 전자파 인증 — CE / FCC / KC (Wi-Fi 있으면 추가)
- 배터리 안전 — UN 38.3 (운송), KC 61960 (국내)
15.8 비즈니스 관점
- 타깃 시장 — EMS 교육기관, 병원 시뮬레이션센터, 군 의무부대, 응급의학 학회
- 경쟁 제품 — SkillReporter 마네킹(수천만원)·Laerdal SimMan 3G(2~3억) 대비 저가 교육 솔루션으로 포지션
- 예상 가격대 — 교육용 200~500만원/대 (BOM 대비 4~10배 마진)
- 수익 모델 — 하드웨어 판매 + SaaS (분석 대시보드, 교육 리포트) + OTA 모델 구독
15.9 다음 의사결정 항목 (대표님/팀 협의)
- 현 pilot 단계부터 prototype 헬멧으로 수집할지, 기존 SOP 대로 범용 액션캠으로 수집할지
- Phase 2 MVP 진행 여부 — 개발 리소스 투입 판단
- 의료기기 인증 트랙 결정 — "교육 장치" vs "의료기기"
- 양산 파트너 (EMS 헬멧 제조사와 협업 vs 자체 설계)
이 방향은 소프트웨어/SOP로 풀기 어려운 일관성 문제를 하드웨어로 해결하고 제품화 후 지속 매출까지 연결된다. 최소한 Phase 1 prototype은 현재 pilot 예산 안에서 시도 가능하므로, 일단 실험적으로 도입해보고 Phase 2 이상은 결과 보고 결정하는 단계적 접근을 제안.
16. 가림 처리 & Multi-modal Fusion 설계
BVM 환기는 본질적으로 술자 손이 환자 얼굴·턱·때로 흉부 위에 올라간 상태에서 진행된다. 세그멘테이션·optical flow만으론 가려진 영역의 움직임을 직접 관측할 수 없다. 이 섹션은 가림 상황을 다루는 설계 원칙을 정리한다.
16.1 문제 정의
| 시나리오 | 손 위치 | Torso 가시성 |
|---|---|---|
| 정상 E-C 그립 | 얼굴 위 마스크 + 턱밑 3손가락 | ✅ 대부분 가시 (흉부 위엔 손 없음) |
| 팔뚝이 위에서 내려다보며 | 팔뚝이 torso 앞을 지나감 | △ 일부 가림 |
| 2인 환기 (협조자 흉부 압박) | 두 번째 사람 손이 torso 위 | ❌ 흉부 일부 가림 |
| 근접 카메라 (헤드마운트 등) | 손·팔이 프레임의 상당 부분 차지 | △ 각도에 따라 다름 |
16.2 잘못된 접근 — 단순 마스크 차감
이 방식이 의미 있는 경우:
- 손이 torso의 <20% 만 가림 (정상 BVM)
- 가시 영역만으로도 방사형 팽창 관측 가능
- noise 필터링 목적으로만 제한 사용
16.3 올바른 접근 — Multi-modal Fusion
손 가림으로 얻지 못하는 정보는 다른 독립 신호로 보완. BVM 환기에는 손 가림과 무관한 여러 신호가 존재한다.
| 신호 | 출처 | 손 가림 영향 | 정보 타입 |
|---|---|---|---|
| 흉부 마스크 flow_dy | YOLO-seg + Farneback | ❌ 직접 영향 | 흉부 움직임 (가시 영역만) |
| 흉부 마스크 면적 변화 | YOLO-seg | △ 부분 영향 | 팽창 정도 |
| Hand Y 이동 | MediaPipe Hands | ✅ 오히려 활용 | 손이 흉부 위면 손 Y = 흉부 Y 근사 |
| BVM 백 bbox 변화 | RT-DETR | ✅ 무관 | Squeeze 강도 (환기 본질 신호) |
| 손가락 각도 | MediaPipe Hands | ✅ 무관 | Squeeze 깊이 proxy |
| 얼굴 랜드마크 | 3DDFA V2 | 마스크 밀착도 | Head tilt, seal quality |
| SkillGuide V_T (학습 시) | 마네킹 raw 센서 | ✅ 완전 무관 | 절대 GT mL |
16.4 ConvLSTM 입력 설계
위 신호들을 매 프레임 feature vector로 묶어 ConvLSTM에 입력. 모델이 시간 축으로 신호 신뢰도를 학습.
feature_t = [
# 1. 흉부 관련 (가림 시 신뢰도↓)
flow_dy_mean, # 마스크 내부 평균 수직 flow
flow_dy_top, # 상단 30% (흉부 상부)
flow_dy_bottom, # 하단 30% (복부)
area_change, # 마스크 면적 변화율
valid_chest_ratio, # 가시 영역 비율 (신뢰도 지표)
# 2. 손 관련 (가림 시 오히려 유효)
hand_y_delta, # 손 중심 Y 이동 (흉부 위면 흉부 Y 근사)
finger_squeeze_angle,# 4-finger MCP-PIP-DIP 각도 (squeeze 깊이)
# 3. BVM 관련 (가림 무관, 환기 본질)
bvm_bbox_area, # 백 크기 (squeeze로 줄어듦)
bvm_squeeze_rate, # 백 bbox 변화율
# 4. 보조
bg_flow_dy, # 카메라 흔들림 보정
head_tilt_angle, # 얼굴 각도 (마스크 seal 관련)
] # 11차원 × T 프레임 → ConvLSTM
ConvLSTM이 학습 중 자동 발견할 규칙 (예시):
- "
valid_chest_ratio가 낮을 때flow_dy무시하고bvm_squeeze_rate에 가중치" - "손이 흉부 위에 있으면
hand_y_delta= 흉부 움직임 근사로 간주" - "
bvm_squeeze_rate와flow_dy시차 있으면 leak 있음 (seal 불량)"
16.5 왜 ConvLSTM이 가림을 해결하는가
시간 축 reasoning
ConvLSTM은 T 프레임(90개, 3초) 윈도우로 과거·현재 신호를 종합한다. 현재 프레임이 가려졌어도:
- 직전 10 프레임의 패턴 → 다음 움직임 예측
- 주기적 호흡 패턴 학습 → 가림 구간 보간
- 다른 신호(BVM, 손가락)에서 현재 상태 추론
Confidence-weighted fusion
모델이 각 신호의 "현재 유효성"을 암묵적으로 학습. valid_chest_ratio 가 0.2면 flow_dy 신뢰도 낮다고 판단 → 다른 신호에 의존.
GT pair 기반 end-to-end 학습
입력(카메라 영상, 가림 포함) + 출력(SkillGuide 정확한 V_T) 페어 수천 쌍 → 모델이 "어떤 가림 상황에서도 V_T 맞추는 법"을 스스로 학습. 사람이 가림별 로직 작성 불필요.
16.6 구현 단계
- 데이터 수집 단계 (현재)
- 손 가림 상황 포함한 raw 영상 + SkillGuide V_T 페어 수집
- 가림 "제거" 시도 금지 — 학습 재료로 사용
- 목표: 가림 있는 세션 vs 없는 세션 섞어서 수천 개
- Feature 추출 단계
- 매 프레임 11차원 feature 계산
valid_chest_ratio,bvm_squeeze_rate,hand_y_delta추가 구현- 기존
feature_extractor.py확장
- ConvLSTM 학습
- 입력: (T=90, 11) feature 시퀀스
- 출력: V_T (mL) 회귀 또는 환기 품질 score
- Loss: MSE 또는 MAE (mL 단위)
- 배포 추론
- 카메라만 입력 (SkillGuide 없음)
- Feature 계산 → ConvLSTM → V_T 예측
- 가림 상황 자동 처리 (학습에서 이미 경험)
16.7 단기·장기 지표
| 단계 | 신호 개수 | 가림 대응 | V_T 오차 목표 |
|---|---|---|---|
| 현재 (v3 세그 + flow) | 10 (기존 feature) | 부분적 (valid 영역만) | ±20% (참고) |
| v4 (가림 학습 데이터 추가) | 10 | 개선 | ±15% |
| Multi-modal ConvLSTM | 11+ | 자동 처리 | ±10% |
| + 사람 transfer (Phase 3) | 11+ | domain adaptation | ±15% (사람은 compliance 다양) |
"가림은 제거할 문제가 아니라 학습 재료". 단일 신호 필터링이 아닌 multi-modal fusion + 시간 축 ConvLSTM 으로 근본 해결. 현재 데이터 수집 단계는 raw + GT 페어 확보에만 집중하고, 모델 설계 단계에서 자연스럽게 풀린다.
부록 A. 변수-분류 매트릭스
전체 변수를 한 눈에 보는 요약 표. 인쇄해서 데이터 수집 현장 벽에 부착 권장.
| 변수 | 분류 | 통제 | 도메인 |
|---|---|---|---|
| BVM bag 사이즈 | MODIFIER | fix/randomize | 전체 |
| BVM 제조사 | MODIFIER | cell-level | 전체 |
| 마스크 사이즈 | MODIFIER | cell-level | 전체 |
| PEEP 밸브 | MODIFIER | 1차 fix | 전체 |
| 마네킹 모델 | CONF+DOMAIN | cell-level | 마네킹 |
| 마네킹 compliance | CONFOUNDER | fix+log | 마네킹 |
| 마네킹 resistance | CONFOUNDER | log | 마네킹 |
| 흉벽 saturation | NUISANCE | 안전 범위 fix | 마네킹 |
| GT 센서 종류 | — | log | 전체 |
| GT 샘플링 Hz | NUISANCE | fix | 전체 |
| GT-카메라 latency | NUISANCE | 매 세션 측정 | 전체 |
| GT drift / zero | NUISANCE | 5분마다 재조정 | 전체 |
| Dead-space 보정 | NUISANCE | fix per setup | 전체 |
| Operator ID | Random Effect | log, CV 분할 | 전체 |
| Operator 손 크기 | MODIFIER | 측정+log | 전체 |
| Operator 그립 방식 | MODIFIER | cell-level | 전체 |
| Operator 숙련도 | DOMAIN | log | 전체 |
| Mask leak rate | CONFOUNDER | 측정+라벨 | 전체 |
| 자세 (head tilt, jaw thrust) | MODIFIER | cell-level fix | 전체 |
| 조명 | DOMAIN | 측정+log | 전체 |
| 배경 | NUISANCE | fix | 전체 |
| 의류 | DOMAIN | cell-level 변경 | 사람 |
| 카메라 setup ID | — | log | 전체 |
| 카메라 fps/exposure | NUISANCE | fix | 전체 |
| 돼지 체중/종 | MODIFIER | log | 돼지 |
| 돼지 마취 깊이 | CONFOUNDER | log+sync | 돼지 |
| 돼지 흉부 털 처리 | DOMAIN | 사진+log | 돼지 |
| 돼지 지방층 두께 | MODIFIER | 측정+log | 돼지 |
| 사람 자발 호흡 잔존 | DOMAIN | 라벨 | 사람 |
| 사람 위 팽창 | DOMAIN | 복부 ROI | 사람 |
| 사람 BSA/BMI | MODIFIER | log | 사람 |
| 사람 흉부 조직 | DOMAIN | 영상 추정 | 사람 |
| 사람 나이/성별 | MODIFIER | log | 사람 |
| 사람 임상 상태 | DOMAIN | log | 사람 |
부록 B. 참고 문헌
- AHA BLS/ACLS 2020 Guidelines — 환기 속도/부피 기준 (성인 10/min, VT 6~8 mL/kg)
- Baskett P, Nolan J, Parr M. Tidal volumes which are perceived to be adequate for resuscitation. Resuscitation 1996;31(3):231-4.
- European Resuscitation Council Guidelines 2021 — Adult Basic Life Support
- Manikin compliance specifications: Laerdal SimMan 3G Technical Manual; Ambu Man W Specifications
- OpenCV multi-camera calibration:
cv2.stereoCalibrate,multical라이브러리 - Domain Adaptation references: Ganin Y et al., Domain-Adversarial Training of Neural Networks, JMLR 2016
Egocentric / 스마트글라스 시점 (Cam D 관련)
아래 4편은 사내 토론 자료 (Desktop/대표님_내부토론_기술문서/)에 보관되어 있으며, 향후 헤드마운트 / 스마트글라스 기반 배포의 광학 시점 설계에 참고한다. 단계별 활용도:
| 논문 | 현 단계 활용도 | 언제 본격 사용 |
|---|---|---|
| Ego-Exo4D (CVPR 2024) | ★★★ 직접 반영 | 1차 데이터 수집 SOP (multi-view 동시 수집 원칙) |
| Egocentric 3D Pose Wild (CVPR 2022) | ★★ 설계 참고 | §3.5 fish-eye 왜곡 처리, 자기 신체 가림 대응 |
| Mobile Egocentric Body Motion (IEEE VR 2021) | ★ 읽어두기 | 모델 구현 단계 (현 수집 단계 불필요) |
| EgoAdapt (ICCV 2025) | ★ 나중에 | 돼지·사람 transfer 단계 domain adaptation 구현 시 |
- Ego-Exo4D: Understanding Skilled Human Activity from First- and Third-Person Perspectives, CVPR 2024 — 같은 동작을 egocentric + exocentric 다중 시점으로 동시 수집하는 데이터셋·학습 프레임워크. 본 SOP의 Cam A/B/C(외부) + Cam D(자기 시점) 멀티뷰 설계 근거.
- Estimating Egocentric 3D Human Pose in the Wild with External Weak Supervision, CVPR 2022 — 헤드마운트 카메라의 fish-eye 왜곡과 자기 신체 부분 가림 문제 해결 기법. Cam D 광각 렌즈 사용 시 calibration / pose 추정 참고.
- Mobile Egocentric Body Motion Reconstruction Using Eyeglasses-Mounted Cameras, IEEE VR 2021 — 안경 카메라로 전신 모션 복원. 술자 손/마스크 그립 추적의 baseline 방법론.
- EgoAdapt: Adaptive Multisensory Distillation for Egocentric Perception, ICCV 2025 — 자기 시점 도메인 적응 (multi-sensor distillation). Manikin/돼지에서 수집한 외부 시점 데이터를 스마트글라스 도메인으로 transfer할 때 참고.
관련 사내 문서: BVM_스마트글라스_내부기술토론문서.docx