얼굴 영상에서 심박수 재기: 뉴트로픽의 원격 PPG(rPPG)

얼굴 영상에서 심박수 재기: 뉴트로픽의 원격 PPG(rPPG)

심장이 뛸 때마다 얼굴 피부로 피가 조금 더 밀려듭니다. 그때마다 피부색이 아주 약간 달라지는데, 눈에는 안 보여도 카메라에는 기록됩니다. 원격 광용적맥파(rPPG)는 평범한 영상에서 이 신호를 되살려 심박수로 바꿉니다. 화면 기반 실험, 인터뷰, 이미 찍어 둔 녹화처럼 가슴 스트랩이나 손가락 센서가 방해가 되는 연구에서, 접촉 센서 없이 생리 지표를 얻는 방법입니다.

이 글은 뉴트로픽에서 rPPG가 어떻게 동작하는지, 무엇을 돌려주는지, 어떻게 확인했는지, 어디서부터 믿으면 안 되는지를 다룹니다. 스크린숏은 모든 계정이 열어 볼 수 있는 예시 프로젝트(예시 · 도메인별 스킬)의 얼굴 영상 세션에서 가져왔습니다. 맥박을 미리 알고 있는 샘플 영상으로 실행한 세션입니다.

무엇을 올리나

얼굴이 나오는 영상을 올립니다. MP4, MOV, WebM, AVI, MKV, M4V를 받습니다. 앱 안의 미리 보기는 브라우저 내장 플레이어를 쓰므로, 뉴트로픽에서 영상도 함께 보려면 H.264 MP4가 가장 무난합니다. 분석은 어느 형식이든 서버에서 파일을 디코딩해 진행합니다. 업로드는 최대 1GB까지 됩니다.

쓸 만한 신호를 얻으려면:

  • 영상 대부분에서 얼굴이 보이고 대체로 정면이어야 합니다. 얼굴이 검출된 프레임이 최소 5초 분량 필요하고, 길수록 좋습니다.
  • 조명이 일정해야 합니다. 깜박이는 조명, 얼굴 위로 움직이는 햇빛, 밝기가 바뀌는 모니터는 모두 맥박과 무관한 색 변화를 더합니다.
  • 프레임 레이트는 8 fps 이상이어야 합니다. 일반 웹캠의 25–30 fps면 충분합니다.

그다음 평소 말로 요청합니다.

text
/analyze face_pulse_72bpm.mp4 에서 원격 PPG로 심박수를 추정해 줘. POS·CHROM·GREEN 세 방법을 비교하고 방법별 SNR을 보고한 뒤, 맥파 신호와 스펙트럼을 그려 줘.

단계별로 무슨 일이 일어나나

데이터 분석 스킬은 먼저 media_info로 프레임 레이트, 해상도, 길이를 읽습니다. 이어서 rppg 도구가 다음을 수행합니다.

  • 얼굴 찾기. MediaPipe 얼굴 검출기가 대략 1초에 한 번 실행됩니다. 검출 사이에는 상자를 유지해 영역이 흔들리지 않습니다.
  • 피부색 평균 내기. 영역은 얼굴 상자의 안쪽(가로 20–80%, 세로 10–70%)으로, 이마와 뺨이 대부분을 차지합니다. 프레임마다 빨강·초록·파랑의 평균값을 구합니다.
  • 맥파 추출. 공개된 알고리즘 세 가지 중에서 씁니다. GREEN(Verkruysse 외, 2008), CHROM(de Haan & Jeanne, 2013), POS(Wang 외, 2017)이며 기본값은 POS입니다. 세 가지 모두를 요청하면 세 결과를 모두 받습니다.
  • 필터링과 측정. 신호를 0.7–4.0 Hz(42–240 bpm)로 대역 통과시킨 뒤, 파워 스펙트럼의 최고점에서 심박수를 읽습니다. SNR은 그 최고점 ±0.1 Hz 안의 파워를 대역의 나머지와 비교한 값입니다. 개별 박동에서도 두 번째 추정치(피크 기반 심박수와 RMSSD)를 계산합니다.
rPPG 그림을 연 얼굴 영상 세션. 위는 필터링한 맥파, 아래는 파워 스펙트럼이고, 범례에 심박수 선과 SNR이 표시됩니다.
rPPG 그림을 연 얼굴 영상 세션. 위는 필터링한 맥파, 아래는 파워 스펙트럼이고, 범례에 심박수 선과 SNR이 표시됩니다.

돌려받는 것

  • 그림(*_rppg.png): 기본 방법의 필터링한 맥파 시계열과, 추정 심박수를 표시한 분당 박동수 단위의 스펙트럼.
  • 표(*_rppg.csv): 시간, 프레임별 얼굴 영역의 R·G·B 평균, 방법별 필터링 신호. 다시 그리거나 자기 파이프라인에 넣을 수 있습니다.
  • 방법별 수치: 심박수, 최고점 주파수, SNR, 피크 기반 심박수, RMSSD, 박동 수. 도구는 각 방법의 논문 출처도 함께 돌려줍니다.
  • 보고서: 이 수치로 작성되며, 그림과 표마다 그것을 만든 도구 호출이 남아 있습니다. 산출물 패널의 { } 버튼으로 볼 수 있습니다.
맥파와 스펙트럼 크게 보기. POS 기준 스펙트럼 최고점은 72.0 bpm, SNR은 12.0 dB입니다.
맥파와 스펙트럼 크게 보기. POS 기준 스펙트럼 최고점은 72.0 bpm, SNR은 12.0 dB입니다.

어떻게 확인했나

심박수 도구는 실제로 있는 심박수를 찾아낼 때만 쓸모가 있습니다. 그래서 정답을 미리 아는 영상으로 시험했습니다. 웃는 얼굴 사진 한 장으로 20초, 30 fps 영상을 만들고, 피부색을 정확히 분당 72회로 변조했습니다. 여기에 느린 조명 변동을 얹어, 깨끗한 사인파만 따라가서는 맞힐 수 없게 했습니다.

내부 검증 기록에 남은 결과는 이렇습니다. 600프레임 중 600프레임에서 얼굴이 검출됐고, POS·CHROM·GREEN이 모두 72.0 bpm을 냈습니다. SNR은 각각 12.0, 11.1, 13.5 dB였습니다. 이와 별도로, 단위 테스트는 합성한 72 bpm 색 궤적을 세 방법에 넣어 72.0이 나오는지, 신호를 96 bpm으로 바꾸면 그대로 따라가는지를 확인합니다.

예시 세션의 보고서는 세 방법을 각 방법의 논문과 함께 나란히 보여 줍니다.

보고서의 방법 비교. POS·CHROM·GREEN과 출처, 최고점 주파수, SNR이 나오고 세 방법 모두 72.0 bpm입니다.
보고서의 방법 비교. POS·CHROM·GREEN과 출처, 최고점 주파수, SNR이 나오고 세 방법 모두 72.0 bpm입니다.

이것은 파이프라인이 동작한다는 점검이지, 타당도 연구가 아닙니다. 합성 영상에는 머리 움직임도, 말하기도, 다양한 피부 톤도, 카메라 압축 잡음도 없습니다. 연구 주장에 rPPG를 쓰기 전에, 참가자 일부에서 같은 시간에 기록한 접촉식 기준(ECG나 손가락 PPG)과 비교해 보세요.

결과 읽기: 방법 간 일치와 SNR

추정치를 얼마나 믿을지 알려 주는 숫자가 두 개 있고, 도구는 둘 다 보고합니다.

  • SNR. SNR이 낮거나 음수면 스펙트럼 최고점이 잡음 위로 거의 솟지 않았다는 뜻입니다. 도구 자체의 기준은 SNR이 0 dB 미만이면 추정치를 믿기 어렵다는 것입니다.
  • 방법 간 일치. POS, CHROM, GREEN은 움직임과 조명을 서로 다르게 다룹니다. 세 결과가 5 bpm 넘게 차이 나면 맥박이 아닌 무언가가 신호를 움직이고 있는 것입니다. 대개 움직임, 조명 변화, 너무 작은 얼굴 때문입니다.

세 방법을 모두 돌리는 것(method: all)은 비용이 크지 않고, 이 교차 확인을 덤으로 줍니다. 에이전트는 심박수만이 아니라 SNR과 방법 간 차이를 함께 보고하도록 지시받습니다.

채팅에 남은 단계. media_info, rppg, face_expression이 각각 실행한 파일과 함께 표시됩니다.
채팅에 남은 단계. media_info, rppg, face_expression이 각각 실행한 파일과 함께 표시됩니다.

심박수는 괜찮지만, HRV는 조심해야 합니다

rPPG는 피크 기반 RMSSD도 주기 때문에 이것을 심박변이도(HRV)로 쓰고 싶어질 수 있습니다. 조심하세요. 단기 HRV는 관례적으로 5분 기록에서 계산하고, 영상에서 얻는 박동 시점은 프레임 레이트에 묶여 있습니다. 30 fps에서는 프레임 간격이 약 33 ms입니다. 20초 영상의 RMSSD는 기껏해야 신호 안정성 지표입니다. 예시 보고서도 한계 절에서 이 점을 밝힙니다.

보고서의 한계 절. 20초 기록은 표준 HRV에 너무 짧고, RMSSD 값은 탐색적으로만 봐야 한다고 적혀 있습니다.
보고서의 한계 절. 20초 기록은 표준 HRV에 너무 짧고, RMSSD 값은 탐색적으로만 봐야 한다고 적혀 있습니다.

HRV가 결과 변수라면 접촉식 ECG나 PPG를 기록하고, RR 간격에 HRV 도구를 쓰세요. 뉴트로픽은 이를 CSV로 받고, HRV 도구는 평균 RR, SDNN, RMSSD, pNN50을 보고합니다.

연구에서의 쓰임

  • 센서 없는 생리적 각성 측정. 웹캠이 이미 녹화 중인 화면 기반 과제에서, 자극 블록별 심박수를 추적합니다.
  • UX·HCI 세션. 같은 영상의 표정과 심박수를 짝지어, 사용성 테스트에서 애쓰거나 스트레스를 받는 순간을 찾습니다. 표정 분석을 참고하세요.
  • 기존 녹화 재분석. 다른 목적으로 찍은 인터뷰나 실험 영상. 단, 동의 범위가 이 용도를 포함해야 합니다(아래 참조).
  • 참가자 간 비교. 각 *_rppg.csv나 요약값이 참가자 수준 표의 한 행이 됩니다. 그다음은 통계 도구가 조건을 비교합니다. 예를 들어 가정 점검을 거치는 compare_groups나, 반복 블록을 위한 혼합모형을 씁니다.
text
/stats hr_by_block.csv 에는 참가자와 블록(baseline, task, recovery)마다 rPPG 심박수가 한 행씩 있어. 블록 간 심박수 차이를 검정하고, 가정을 점검한 뒤 효과크기를 보고해 줘.

한계를 분명히

  • 고전 알고리즘만. POS, CHROM, GREEN이 들어 있습니다. 딥러닝 rPPG 모델(PhysNet, TS-CAN 등)은 학습된 가중치와 PyTorch가 필요해 넣지 않았습니다.
  • 움직임과 조명. 머리 움직임, 말하기, 바뀌는 조명, 강한 영상 압축은 모두 SNR을 떨어뜨립니다. 도구는 1초마다 얼굴을 다시 찾는 것 외에 움직임을 보정하지 않습니다.
  • 얼굴 하나. 처음 검출된 얼굴을 씁니다. 여러 사람이 나오는 영상은 먼저 잘라 주세요.
  • 피부 톤과 카메라. 공개된 rPPG 성능은 피부 톤, 카메라, 조명에 따라 달라집니다. 위의 합성 점검으로는 여러분의 참가자와 환경에서 어떻게 동작할지 알 수 없습니다.
  • 의료기기가 아닙니다. 추정치는 연구용 측정값이며 임상 판단에 쓰기에 적합하지 않습니다.

참가자 촬영: 동의와 개인정보

얼굴 영상은 개인정보이고, 거기서 얻은 심박수는 많은 법역에서 건강 정보입니다. 첫 업로드 전에 뉴트로픽은 연구 데이터를 올리기 전에 안내를 보여 줍니다. 데이터를 처리하는 데 필요한 권리, 참가자 동의, 승인(IRB나 윤리위원회 등)을 갖췄는지 확인하는 단계입니다.

  • 동의서에 영상을 보기만 하는 것이 아니라 심박수 같은 생리 신호 분석에 쓴다는 점을 적으세요.
  • 측정 도구는 뉴트로픽 서버에서 실행되고, 모델은 도구가 돌려준 숫자를 받습니다. 업로드는 삭제할 때까지 비공개 작업 공간에 남으며 모델 학습에 쓰이지 않습니다. 선택한 모델 제공자에게 무엇이 전송되는지를 포함한 자세한 내용은 개인정보처리방침에 있습니다.
  • 가능하면 공동 연구자와는 영상 자체보다 파생된 표(*_rppg.csv)를 공유하세요.

함께 읽기