숫자를 내기 전에, 숫자를 검증합니다
검증은 두 단계입니다. ① 알고리즘 검증은 정답을 아는 합성 신호로 코드 자체의 오차를 잽니다(아래 결과는 실제로 실행한 값). ② 실측 검증은 사람을 대상으로 기준기기와 비교해야 하며, 이 페이지의 도구로 직접 수행합니다. ①은 ②를 대신할 수 없습니다.
① 알고리즘 검증 · 시뮬레이션 교차검증
초기 데모의 결함을 찾아 고친 기록
처음 만든 v1(피크 계수)은 신호가 나빠도 항상 숫자를 냈고, 이 맥파 모델(이완기 봉우리가 수축기의 45%)에서는 안정시 심박 50–60 bpm에서 이완기 봉우리를 박동으로 한 번 더 세는 결함이 드러났습니다. 베타차단제 복용자가 많은 심박대라 치명적입니다. 이를 스펙트럼 추정 + 품질 기준(v1.6)으로 바꾸고, 기준값은 교차검증으로 정했습니다. 줄어든 오답의 상당 부분은 숫자를 내지 않고 보류해서 얻은 것이며, 그 대가를 아래에 함께 공개합니다.
품질 기준은 데이터가 아니라 비용 선택입니다
기준을 엄격하게 할수록 오답이 줄지만 정답도 함께 줄어듭니다. 채택한 2 dB는 "정답 − 3 × 오답"을 최대화하는 설계 가중치(오답 1건의 손해 = 보류 4건)에서 나온 값입니다.
가중치를 바꾸면
조건별 상세 결과, 심박별 측정 가능성, 재현, 민감도, 회복기 편향 펼치기
각 칸은 조건마다 심박 11단계 × 40회 = 440개 신호의 결과입니다. 행의 입력 SNR은 녹색 채널 맥파의 RMS 대 표본당 센서 잡음(20 Hz)의 비로, 품질 기준에 쓰는 스펙트럼 SNR과 다른 양입니다. 오답 출력이 5%를 넘는 칸은 강조 표시했습니다.
정지 체크인 심박은 운동을 멈춘 직후 회복기 12초의 평균이라 멈춘 순간보다 2–9 bpm 낮게 나옵니다(위 표). 커널은 이 값을 운동 목표와 비교하므로 과강도를 덜 잡아내는 쪽으로 치우칩니다. 그래서 운동부하검사가 없으면 자각인지도가 1차 기준이고, 심박이 1차 기준이어도 자각인지도가 목표를 넘으면 강도를 낮춥니다.
시뮬레이션 신호 모델
피부 ROI의 RGB(평균 144/106/86)에 혈액량 색 서명(0.33 : 0.77 : 0.53)을 따르는 두 봉우리 맥파(이완기 봉우리 = 수축기의 45%, 0.3·박동간격 뒤), 심박변이(3%)와 호흡성 부정맥, 호흡에 의한 기저선 흔들림, 조명 무작위 드리프트, 채널별 백색 센서 잡음, 브라우저 타이머 지터를 넣었습니다. 움직임은 심박 대역 안(0.8–2.5 Hz)의 주기 신호로 녹색 채널에서 맥파와 같은 세기, 밝기 변화는 맥파의 5배(밝기의 약 2.5%)입니다 — 둘 다 실제보다 약한 조건입니다. 브라우저와 같은 12초 시간 창을 씁니다.
재현 방법
소스 저장소를 받아 npm run verify(약 80초, Node만 필요)를 실행하면 위 표가 그대로 다시 계산됩니다. 난수 시드가 고정되어 있어 누구나 같은 숫자를 얻습니다. npm test는 필터 응답, 50 bpm 이중 계수 회귀, 표시 주기와 무관한 12초 창, 잡음 보류, 통계식(Shrout & Fleiss 1979 예제, 독립 Python 구현·statsmodels 혼합모형과 대조)을 확인합니다.
② 실측 검증 · 프로토콜
기준기기와 나란히 재기
기준기기
가능하면 흉부 스트랩형 심전도 심박계, 없으면 인증받은 손가락 맥박산소측정기를 씁니다. 기준기기는 한 연구에서 하나로 통일하고, 섞였다면 기준기기별로 나눠 보고합니다. 브라우저 rPPG의 공개 검증 연구도 심전도를 기준으로 삼았습니다(Finotti et al., 2026, ICC 0.96).
측정 조건과 짝짓기
앉은 안정 시, 30초 앉았다일어서기 직후 회복기를 각각 자연광·실내등에서 잽니다. 기준기기 값을 읽는 순간 ‘스냅샷’을 누르면 직전 12초 창의 추정치가 고정되고, 창의 시작·끝 시각이 함께 저장됩니다. 회복기는 심박이 빠르게 변하므로 시각이 기록되는 심전도 스트랩을 권장합니다.
표본 수
참여자마다 여러 번 재므로 일치한계는 Bland & Altman(2007) 반복측정 방법으로 구하고, 신뢰구간은 참여자 단위 부트스트랩으로 구합니다. 일치한계의 정밀도는 측정 건수보다 참여자 수에 좌우됩니다. t 분포를 쓴 Bland–Altman 근사식으로 95% 신뢰구간 반폭은 20명이면 차이 표준편차의 약 ±0.81배이고, ±0.5배로 좁히려면 약 48명이 필요합니다(참여자당 1회 측정 기준 근사). 도구는 참여자 10명 미만이면 신뢰구간을 내지 않습니다.
형평성
rPPG 성능은 피부톤에 따라 달라질 수 있다고 보고됩니다(Pirzada et al., 2024). 참여자 자기보고 Fitzpatrick 유형을 함께 기록해 유형별 오차를 따로 보고합니다.
② 실측 검증 · 측정 도구
같은 영상에서 두 방식을 동시에
카메라를 켜면 같은 얼굴 영상으로 녹색(v1.6)과 POS 추정치를 동시에 계산합니다. 12초 창이 다 찬 뒤에만 숫자를 냅니다. 품질 기준에 걸려 보류된 값도 원래 추정치를 함께 남겨, 실제 데이터에서 품질 기준이 제 역할을 했는지 검증할 수 있게 했습니다.
대기 중
기록 (0건)
기록은 서버로 가지 않고 이 브라우저의 저장소에 ‘모두 지우기’ 전까지 남습니다. 공개 주소(y3korea.github.io)의 저장소는 같은 계정의 다른 GitHub Pages 사이트와 공유되므로, 공용 컴퓨터에서는 수집 뒤 CSV로 내보내고 바로 지우세요.
| # | ID | 조건 | 조명 | 피부 | 기준기기 | 기준 | 녹색 | SNR (녹색) | POS | SNR (POS) | 삭제 |
|---|
② 실측 검증 · 자동 분석
논문에 들어갈 숫자
편향과 반복측정 95% 일치한계(Bland & Altman 2007), MAE·RMSE·MAPE, Pearson r, Lin의 일치상관계수, ICC(2,1)를 계산하고, 참여자 단위 부트스트랩 신뢰구간을 붙입니다. 계산식은 단위 테스트로 검증되어 있습니다.