顔動画から心拍数を測る:Neutropic の遠隔 PPG(rPPG)

顔動画から心拍数を測る:Neutropic の遠隔 PPG(rPPG)

心臓が拍動するたびに、顔の皮膚には少しだけ多くの血液が送り込まれます。そのたびに肌の色がごくわずかに変わります。目には見えませんが、カメラには記録されます。遠隔光電容積脈波(rPPG)は、普通の動画からこの信号を取り出して心拍数に変える手法です。画面を使う実験、インタビュー、すでに撮ってある録画など、胸ベルトや指先センサーが邪魔になる研究で、接触センサーなしに生理指標を得られます。

この記事では、Neutropic で rPPG がどう動くか、何が返ってくるか、どう確かめたか、どこから信頼できなくなるかを説明します。スクリーンショットは、どのアカウントでも開けるサンプルプロジェクト(例 · 分野別スキル)の顔動画セッションから撮りました。脈拍が分かっているサンプル動画で実行したものです。

何をアップロードするか

顔が映った動画をアップロードします。MP4、MOV、WebM、AVI、MKV、M4V に対応しています。アプリ内のプレビューはブラウザ標準のプレーヤーを使うため、Neutropic で動画も見たい場合は H.264 の MP4 がいちばん確実です。解析はどの形式でもサーバー側でファイルをデコードして行います。アップロードは最大 1 GB です。

使える信号を得るには、次の条件をそろえます。

  • 動画の大部分で顔が見えていて、おおむね正面を向いていること。顔が検出されたフレームが少なくとも 5 秒分必要で、長いほど良くなります。
  • 照明が一定であること。ちらつく照明、顔の上を動く日差し、明るさが変わるモニターは、どれも脈拍と関係のない色の変化を加えます。
  • フレームレートが 8 fps 以上であること。一般的なウェブカメラの 25–30 fps で十分です。

あとは普段の言葉で頼みます。

text
/analyze face_pulse_72bpm.mp4 から遠隔 PPG で心拍数を推定してください。POS・CHROM・GREEN の 3 手法を比較し、手法ごとの SNR を報告して、脈波信号とスペクトルを図にしてください。

処理の流れ

データ分析スキルはまず media_info でフレームレート、解像度、長さを読み取ります。続いて rppg ツールが次の処理を行います。

  • 顔を見つける。 MediaPipe の顔検出器がおよそ 1 秒に 1 回動きます。検出の合間は枠を保持するので、領域が揺れません。
  • 肌の色を平均する。 領域は顔の枠の内側(幅の 20–80%、高さの 10–70%)で、額と頬が大半を占めます。フレームごとに赤・緑・青の平均値を求めます。
  • 脈波を取り出す。 公開済みのアルゴリズム 3 種から使います。GREEN(Verkruysse ら、2008)、CHROM(de Haan & Jeanne、2013)、POS(Wang ら、2017)で、既定は POS です。3 つすべてを頼めば 3 つの結果が返ります。
  • フィルタして測る。 信号を 0.7–4.0 Hz(42–240 bpm)に帯域通過させ、パワースペクトルのピークから心拍数を読みます。SNR は、ピークの ±0.1 Hz 以内のパワーを帯域の残りと比べた値です。個々の拍動からも 2 つ目の推定値(ピークに基づく心拍数と RMSSD)を出します。
rPPG の図を開いた顔動画セッション。上がフィルタ後の脈波、下がパワースペクトルで、凡例に心拍数の線と SNR が表示されています。
rPPG の図を開いた顔動画セッション。上がフィルタ後の脈波、下がパワースペクトルで、凡例に心拍数の線と SNR が表示されています。

返ってくるもの

  • 図(*_rppg.png):既定手法のフィルタ後の脈波の時系列と、推定心拍数を示した 1 分あたり拍動数単位のスペクトル。
  • 表(*_rppg.csv):時刻、フレームごとの顔領域の R・G・B 平均、手法ごとのフィルタ後の信号。描き直したり、自分の解析パイプラインに渡したりできます。
  • 手法ごとの数値:心拍数、ピーク周波数、SNR、ピークに基づく心拍数、RMSSD、拍動数。各手法の論文の出典も一緒に返ります。
  • レポート:これらの数値から書かれ、図と表にはそれを作ったツール呼び出しが残ります。成果物パネルの { } ボタンで確認できます。
脈波とスペクトルの拡大表示。POS のスペクトルのピークは 72.0 bpm、SNR は 12.0 dB です。
脈波とスペクトルの拡大表示。POS のスペクトルのピークは 72.0 bpm、SNR は 12.0 dB です。

どう確かめたか

心拍数ツールは、実際にある心拍数を見つけられてはじめて役に立ちます。そこで、答えが先に分かっている動画で試しました。笑顔の写真 1 枚から 20 秒・30 fps の動画を作り、肌の色をちょうど毎分 72 回で変調させました。さらにゆっくりした照明の変動を重ね、きれいな正弦波を追うだけでは当てられないようにしました。

社内の検証記録に残っている結果は次のとおりです。600 フレーム中 600 フレームで顔が検出され、POS・CHROM・GREEN はいずれも 72.0 bpm を返しました。SNR はそれぞれ 12.0、11.1、13.5 dB でした。これとは別に、ユニットテストでは合成した 72 bpm の色の軌跡を 3 手法に入れて 72.0 が返ること、信号を 96 bpm に変えるとそれに追従することを確かめています。

サンプルセッションのレポートは、3 手法をそれぞれの論文とともに並べて示します。

レポートの手法比較。POS・CHROM・GREEN と出典、ピーク周波数、SNR が並び、3 手法とも 72.0 bpm です。
レポートの手法比較。POS・CHROM・GREEN と出典、ピーク周波数、SNR が並び、3 手法とも 72.0 bpm です。

これはパイプラインが動くことの確認であって、妥当性研究ではありません。合成動画には頭の動きも、発話も、肌の色の幅も、カメラの圧縮ノイズもありません。研究上の主張に rPPG を使う前に、参加者の一部で同時に記録した接触式の基準(ECG や指先 PPG)と照らし合わせてください。

結果の読み方:手法間の一致と SNR

推定値をどこまで信じてよいかを示す数値が 2 つあり、ツールはどちらも報告します。

  • SNR。 SNR が低いか負の値なら、スペクトルのピークがノイズからほとんど突き出ていないということです。ツール自身の目安では、SNR が 0 dB 未満だと推定値は信頼できません。
  • 手法間の一致。 POS、CHROM、GREEN は動きと照明をそれぞれ違う方法で扱います。3 つが 5 bpm を超えてずれるなら、脈拍以外の何かが信号を動かしています。たいていは動き、照明の変化、顔が小さすぎることが原因です。

3 手法をすべて実行する(method: all)コストは小さく、この照合がおまけで手に入ります。エージェントは心拍数だけでなく、SNR と手法間の差も合わせて報告するよう指示されています。

チャットに残った手順。media_info、face_expression、rppg が、それぞれ処理したファイルとともに表示されています。
チャットに残った手順。media_info、face_expression、rppg が、それぞれ処理したファイルとともに表示されています。

心拍数は大丈夫、HRV は要注意

rPPG はピークに基づく RMSSD も返すので、これを心拍変動(HRV)として使いたくなるかもしれません。注意が必要です。短時間 HRV は慣例的に 5 分間の記録から計算しますし、動画から得る拍動のタイミングはフレームレートに縛られます。30 fps ならフレーム間隔は約 33 ms です。20 秒の動画の RMSSD は、せいぜい信号の安定性の目安にすぎません。サンプルのレポートも限界の節でその点を明記しています。

レポートの限界の節。20 秒の記録は標準的な HRV には短すぎ、RMSSD は探索的な値にとどまると書かれています。
レポートの限界の節。20 秒の記録は標準的な HRV には短すぎ、RMSSD は探索的な値にとどまると書かれています。

HRV が結果変数なら、接触式の ECG や PPG を記録し、RR 間隔に HRV ツールを使ってください。Neutropic は RR 間隔を CSV で受け付け、HRV ツールは平均 RR、SDNN、RMSSD、pNN50 を報告します。

研究での使いどころ

  • センサーなしの生理的覚醒。 ウェブカメラがすでに録画している画面課題で、刺激ブロックごとの心拍数を追います。
  • UX・HCI のセッション。 同じ動画から得た表情と心拍数を組み合わせ、ユーザビリティテストで負荷やストレスがかかった瞬間を探します。表情分析も参照してください。
  • 既存の録画の再解析。 別の目的で撮ったインタビューや実験の動画。ただし同意の範囲がこの用途を含んでいる必要があります(後述)。
  • 参加者をまたいだ比較。 各 *_rppg.csv や要約値が参加者単位の表の 1 行になります。そこから統計ツールで条件を比べます。たとえば前提チェック付きの compare_groups や、ブロックの繰り返しを扱う混合モデルです。
text
/stats hr_by_block.csv には参加者とブロック(baseline、task、recovery)ごとに rPPG 心拍数が 1 行ずつあります。ブロック間で心拍数に差があるかを検定し、前提を確認して効果量を報告してください。

限界をはっきりと

  • 古典的なアルゴリズムのみ。 POS、CHROM、GREEN を搭載しています。深層学習の rPPG モデル(PhysNet や TS-CAN など)は学習済みの重みと PyTorch が必要なため含めていません。
  • 動きと照明。 頭の動き、発話、変わる照明、強い動画圧縮はいずれも SNR を下げます。ツールは 1 秒ごとに顔を検出し直す以外、動きの補正はしません。
  • 顔は 1 つ。 最初に検出された顔を使います。複数人が映る動画は先に切り出してください。
  • 肌の色とカメラ。 公開されている rPPG の性能は、肌の色、カメラ、照明で変わります。上の合成データでの確認からは、あなたの参加者と環境でどう動くかは分かりません。
  • 医療機器ではありません。 推定値は研究用の測定値であり、臨床判断に使うのには適していません。

参加者を撮影するとき:同意とプライバシー

顔の動画は個人情報であり、そこから得た心拍数は多くの法域で健康情報にあたります。最初のアップロードの前に、Neutropic は 研究データをアップロードする前に という案内を表示します。データを処理するのに必要な権利、参加者の同意、承認(IRB や倫理委員会など)がそろっていることを確認する手順です。

  • 同意書には、動画を見るだけでなく、心拍数などの生理信号の解析に使うことを書いておきましょう。
  • 計測ツールは Neutropic のサーバーで動き、モデルが受け取るのはツールが返した数値です。アップロードは削除するまで非公開のワークスペースに残り、モデルの学習には使われません。選んだモデル提供者に何が送られるかを含む詳細はプライバシーポリシーにあります。
  • 共同研究者とは、できれば動画そのものではなく派生した表(*_rppg.csv)を共有してください。

あわせて読みたい