Measuring a pulse from ordinary video
Every heartbeat pushes blood into the face and changes how much light the skin absorbs. The change is far too small to see, but a camera can measure it. This dashboard reports how accurately two methods recover a heart rate that way — a deep model called PHASE-Net and a classical algorithm called POS — and, just as importantly, where they fail.
Average error on 6 subjects the model had never seen.
Checked against a medical device's own reading, which our code cannot influence.
Sitting perfectly still, nothing moving. This is the number that limits everything else.
Ten seconds each. Heart rate changes within a minute, so one value per video is not enough.
So how far off is it?
The same measurement in four situations. Shorter is better; the shaded band is within 3 BPM of the truth.
On controlled recordings the model is close to what its authors report. Point a laptop webcam at someone sitting perfectly still and the bar runs off the end of that band — before anyone has moved. That gap, not movement, is the thing worth fixing.
It works on good data
Clinical validation
Measured against a pulse oximeter on the UBFC-rPPG dataset, the model is off by 0.39 BPM on average.
Getting there needed the evaluation fixed first: measuring one heart rate per video averages away a quantity that changes within the minute.
See the agreement plots →Its edge is reliability
Model comparison
On average the two tie. What separates them is how badly they fail on their worst subject — and for monitoring a patient, never being badly wrong matters more than a better average.
Compare the methods →Three ideas, all wrong
Motion protocol
Each was tested and each failed. What the experiments found instead was the noise floor above — the error is already large before anyone moves.
Read the experiments →What these numbers do not show
- Only 6 subjects are genuinely held out of the released checkpoint's training split; the other 9 measure memorisation, not generalisation.
- Half of the paper's 12-subject test split was unavailable, so the comparison with its reported 0.15 BPM is not like-for-like.
- On this webcam the noise floor is about 8 BPM while sitting perfectly still - twenty times the error achieved on the controlled UBFC recordings. Capture quality, not the model, is the current bottleneck.
- The motion protocol is one subject, one recording per condition.
- Ground truth is not always right: on two subjects the oximeter's own HR readout is wrong by more than 20 BPM, confirmed by two independent analyses of its waveform.
Two references, because neither alone is trustworthy
The same processing runs on the prediction and on the ground-truth pulse. Comparable to published figures — but shared processing can hide shared mistakes. Scoring a method against itself once made a result look eighteen times better than it was.
The device reports its own heart rate, untouched by our code, so it cannot flatter us. It is not perfect either: on two subjects it is wrong by more than 20 BPM, which two independent analyses of its own waveform confirm.
Both are reported on every page. Where they disagree, the disagreement is the interesting part.