카메라 한 대로 심박을 읽고, 에이전트를 안전하게 묶는 방법
이 페이지는 공학 논문 부록에 준하는 상세도로, VitalLens의 신호처리 파이프라인(v1.6)·기능평가·시스템과 에이전트 아키텍처·그리고 현재 한계를 문헌과 함께 기술합니다. 카메라로 재는 것은 멈춘 상태의 심박 하나뿐이며, 산소포화도·호흡수·심전도 리듬은 재지 않습니다.
01 · rPPG 파이프라인
원격 광용적맥파(rPPG)로 심박 추정하기
피부 아래 혈류량 변화가 만드는 미세한 색 변화를, 카메라의 녹색 채널이 가장 강하게 포착한다는 원리(Verkruysse et al., 2008)를 이용합니다.
프레임 캡처 & ROI 평균
getUserMedia로 웹캠 스트림(320×240)을 받아 초당 20회 캔버스에 그리고, 화면 중앙의 고정 사각 영역(가로 36% × 세로 50%)의 R·G·B 평균을 기록합니다. 얼굴 검출은 하지 않으므로 사용자가 얼굴을 가이드 타원에 맞춰야 합니다. 기본 추정에는 혈류 신호가 가장 강한 녹색 채널을 씁니다(Verkruysse et al., 2008).
12초 시간 창 & 균일 재표본화
표본은 개수가 아니라 시간으로 잘라 항상 최근 12초를 유지합니다(화면 주사율과 무관). 브라우저 타이머는 수 ms씩 흔들리고 가끔 수십 ms 멈추므로, 실제 타임스탬프로 선형 보간해 정확히 20 Hz 격자로 옮긴 뒤 분석합니다. 창이 다 차기 전에는 숫자를 내지 않습니다 — 품질 기준을 12초 창에서만 조정했기 때문입니다.
영위상 대역통과 필터
4차 버터워스 고역·저역 필터(0.67–3.0 Hz, 40–180 bpm)를 앞뒤로 두 번 적용해 위상 왜곡 없이 호흡에 의한 기저선 흔들림(약 0.25 Hz)과 고주파 잡음을 제거합니다. 차단 주파수에서 이득 0.5, 호흡 대역 0으로 단위 테스트합니다.
스펙트럼 추정 & 품질 기준
12초 창에 한(Hann) 창을 씌우고 0.01 Hz(0.6 bpm) 간격으로 스펙트럼을 계산해 최대 봉우리를 심박으로 봅니다. 봉우리와 대역 안 모든 배음 주변 에너지를 나머지와 비교한 스펙트럼 SNR이 2 dB 미만이면 숫자를 내지 않고 "측정 보류"합니다. 이 SNR은 de Haan & Jeanne(2013)의 지표를 변형한 것입니다: 원래는 기준 심박을 중심으로 재는 정확도 지표이지만, 여기서는 추정 봉우리를 중심으로 하므로 봉우리가 얼마나 뚜렷한가를 나타낼 뿐 정답 여부를 보장하지 않고, 주기적 움직임은 걸러내지 못합니다. 2 dB는 5겹 교차검증에서 "정답 − 3 × 오답"을 최대화하는 설계 가중치(오답 1건의 손해 = 보류 4건)로 골랐습니다.
Wang W, den Brinker AC, Stuijk S, de Haan G. Algorithmic Principles of Remote PPG. IEEE Trans Biomed Eng 2017;64(7):1479–1491. DOI ↗ · de Haan G, Jeanne V. Robust Pulse Rate From Chrominance-Based rPPG. IEEE Trans Biomed Eng 2013;60(10):2878–2886. DOI ↗ · Poh MZ, McDuff DJ, Picard RW, 2010(자동 얼굴 추적 + ICA). DOI ↗ · Verkruysse W, Svaasand LO, Nelson JS, 2008. DOI ↗
검증 근거
브라우저 기반 rPPG는 실제로 믿을 만한가
표준화된 온라인 인프라로 측정한 브라우저 기반 rPPG를 ECG 기준과 직접 비교 — Bland–Altman 한계 내 95% 일치, 녹화 시간이 길수록 오차 감소, 카메라 거리 영향은 미미.
연구 1(공개 데이터셋 CohFace, 접촉식 맥파 기준): r 약 0.75. 연구 2(온라인 영상 231개, 녹화 직후 잰 검증된 스마트폰 심박 앱 기준): r 0.58, rPPG가 심박을 낮게 추정 — 실사용 조건의 현실적 성능 범위입니다.
카메라 기반 바이탈 측정 제품을 규제 의료기기와 비교 — 심박수·호흡수·산소포화도 평균오차 ±3 이내, 혈압 ±10mmHg. VitalLens는 이 중 심박만 재며, 산소포화도는 재지 않습니다.
다중 관심영역 스펙트럼 접근으로 스마트폰 내장 카메라만으로 심박·호흡을 동시에 연속 측정 — 호흡수 평균절대오차 1회/분 미만, 심박수 0.7–6 bpm. 카메라 호흡수 측정은 VitalLens의 로드맵 항목입니다(현재 미구현).
종합 리뷰: Pirzada, Wilde & Harris-Birtill, IEEE Sensors Journal, 2024 — rPPG 파이프라인(ROI 선택·필터링·데이터셋)과 조명·움직임·피부톤에 따른 강건성 한계를 정리. DOI ↗
02 · 기능평가 자동화
30초 앉았다일어서기(STS) — 현재와 로드맵
30초 앉았다일어서기는 코스가 필요한 6분 보행검사와 달리 좁은 집에서도 할 수 있고 표준화가 쉬워 원격 기능평가로 택했습니다(지식베이스 9.4절). 자동 카운팅 기술은 아래와 같이 단계적으로 고도화합니다.
프레임 차분 기반 동작량 카운터
연속 프레임의 픽셀 차이(motion magnitude)를 계산합니다. 한 번의 반복에는 일어서기·앉기 두 번의 움직임이 있으므로, 히스테리시스 상태 기계로 움직임 덩어리를 찾아 홀수 번째 덩어리(일어서기)가 끝날 때만 1회로 셉니다. 30초 시계는 카메라 영상이 들어온 뒤에 시작합니다. 사람 영상으로 직접 센 횟수와 비교한 검증은 아직 없으므로, AI 코치 세션에서는 환자가 센 횟수를 씁니다.
자세추정 기반 관절 궤적 카운팅
엉덩이·무릎 키포인트의 수직 위치 진동으로 반복을 세고, 나아가 무게중심 궤적까지 도출하는 방식으로 고도화합니다. 아래 선행연구가 이 접근의 타당성을 뒷받침합니다.
지역사회 고령자 32명(정상 18·허약 14), 스마트폰 영상 + Keypoint R-CNN 자세추정으로 무게중심 운동학·엔트로피 지표를 추출해 랜덤포레스트로 판별. 같은 코호트 안 교차검증이며 저자들이 예비 타당성 연구로 규정 — VitalLens v2 설계의 참고 근거.
2D AI 카메라 자세추정 시스템의 STS 파워 측정치를 실험실 힘판과 비교해 타당성·신뢰성을 보고(건강한 성인 24명, 20–55세, 두 시행 모두 비례 편향).
골격 키포인트 + LSTM으로 운동 4종(푸시업·싯업·스쿼트·플랭크)을 분류한 정확도가 90% 이상 — 반복 횟수 정확도가 아니며, STS 카운팅으로 옮기려면 별도 검증이 필요합니다.
밀집 광류(optical flow)로 웨어러블 없이 여러 사람의 다양한 운동을 동시에 감지·인식·카운팅 — 가정 환경 다중 인물 시나리오에 참고.
03 · 시스템 아키텍처
3계층 설계 — 지식베이스 제9장 9.6절의 틀
원격 심폐재활의 기술 요건을 환자 측 계측·통신·플랫폼 3계층으로 정리한 문헌의 틀을 따르되, 환자 측 계측에서 심박 벨트를 카메라로 바꿉니다. 교재는 모든 심폐 원격재활의 최소 구성으로 심박 측정 기기와 맥박산소측정기를 꼽습니다. 카메라는 앞의 것만 대신합니다: 맥박산소측정기는 COPD·저산소혈증에서 필수이고(커널이 강제), 심장재활 환자에게도 권장합니다(값을 넣으면 커널이 판정). 심장재활에서 산소측정기를 필수로 두지 않은 것은 교재의 최소 구성과 다른 VitalLens의 선택입니다.
계층 1 · 환자 측
심박 벨트·심전도 패치 없이 정지 시 심박을 확인합니다. 산소포화도와 심전도(리듬)는 측정하지 않으므로 맥박산소측정기를 대체하지 않으며, COPD·저산소혈증 환자에게는 맥박산소측정기가 필수입니다(값은 체크인 때 입력). 심전도 리듬 감시가 필요한 환자는 원격 단독 세션 대상이 아닙니다.
계층 2 · 통신
영상은 기기 밖으로 전송되지 않습니다 — rPPG·STS 연산이 전부 브라우저 내부(클라이언트 사이드)에서 실행되므로 대역폭·지연에 민감한 실시간 영상 업로드가 필요 없습니다.
계층 3 · 플랫폼
세션 기록은 서버 없이 브라우저 메모리에만 있고, 세션이 끝나면 감사 기록 JSON과 HL7 FHIR R4 Bundle로 직접 내려받아 보관합니다. 심박은 LOINC 8867-4(단위 /min) — 카메라 값에만 측정법 PPG와 기기를 붙이고, 직접 입력한 값·SpO₂·RPE·호흡곤란은 환자 보고(performer)로 적습니다. 30초 앉았다일어서기는 66247-8. Borg 6–20과 수정 Borg 호흡곤란은 알맞은 LOINC 코드가 없어 VitalLens 로컬 코드로 표시합니다. 가상 환자 기록에는 합성 데이터 태그가 붙고, 감사 체인의 머리 해시는 Provenance에 담깁니다.
04 · 에이전트 하네스
열린 도구, 닫힌 안전 경계
도구로만 행동
플래너는 8개 도구(프로필·목표 구간·세션 전 확인·안내 문장·운동 단계·정지 체크인·STS·종료)로만 행동합니다. 환자에게 하는 말도 도구로만 보내므로, 모든 문장이 커널의 문장 검사를 지납니다. 도구 밖에서 쓴 모델의 글은 환자에게 보이지 않고 감사 기록에 "모델 메모"로 남습니다.
결정론적 커널
커널은 모든 제안의 형식(JSON 스키마)·순서(안전 확인 → 준비운동 → 체크인…)·범위(목표 구간, 시간, 누적 30분)·문장을 검사하고, 체크인마다 계속·하향·재확인·중단을 판정합니다. 규칙과 출처는 코드 한곳(SAFETY_RULES)에 있고 npm test가 안전·적대적 시나리오를 자동으로 돌립니다.
MCP로 여는 하네스
같은 도구·커널·감사 기록을 표준 MCP(Model Context Protocol) stdio 서버로 엽니다: node mcp/server.js. Claude Code 같은 MCP 클라이언트가 가상 환자 세션을 돌리며 커널의 거부를 직접 확인할 수 있습니다(claude mcp add vitallens -- node mcp/server.js). 실제 사람과 카메라는 연결하지 않습니다.
05 · 한계