UNDER DEVELOPMENT · ESTIMATION DISABLED IN THE CURRENT APP
Historical model-development results. The current scanner reports BP when its checks pass and does not produce oxygen saturation estimates.
PULSE LAB / SpO₂ MODEL S2
Neural model trained.
Research use only.
5 October 2026 · revised RGB temporal CNN · six participants · all attempts reported.
What changed after the retry
The first neural model had MAE 7.39 points. A second attempt tested 18 spectral regression, support-vector and tree candidates with nested participant-separated selection; its overall MAE was 7.13. The final revision uses a two-network ensemble, masks static RGB brightness-ratio features, clips standardized inputs at six standard deviations, adds dropout and stronger weight decay, balances training by participant and oxygen range, and constrains the output to 70–100% through a sigmoid head.
The revised neural MAE is 6.37 points, approximately tied with ratio regression at 6.38. The difference of 0.004 points is negligible; this is not evidence of superiority. Compared with ratio regression, low-range bias improves, but overall RMSE and the low-range 90th-percentile error worsen. The website deploys the revised neural candidate for continued research.
All candidates, same 1,908 windows
| Model / selection procedure | MAE | RMSE | Bias | Mean participant MAE |
|---|---|---|---|---|
| Revised neural ensemble · deployed | 6.37 | 8.22 | -0.25 | 6.33 |
| RGB ratio regression | 6.38 | 7.81 | -0.20 | 6.39 |
| First neural model | 7.39 | 9.81 | +2.11 | 7.36 |
| Spectral model selection | 7.13 | 8.52 | -2.71 | 7.01 |
| Training-median constant | 6.75 | 8.13 | +1.17 | 6.82 |
Units: SpO₂ percentage points. 95% versus 90% is a 5-point error. Positive bias means overestimation. These are individual source-window metrics before the website’s extra gates and averaging.
Revised model across oxygen ranges
| Reference SpO₂ | Windows | MAE | Bias | 90th-percentile error |
|---|---|---|---|---|
| 70 to <80% | 346 | 9.13 | +8.05 | 20.18 |
| 80 to <90% | 618 | 6.63 | +0.81 | 11.90 |
| 90 to 100% | 944 | 5.20 | -3.98 | 12.62 |
The 70–100% output range is imposed by the model. It does not prove that a person’s true saturation is in that range and cannot rule out oxygen levels below 70%.
Held-out participant results
| Test participant | Windows | MAE | Bias | Epochs, two seeds |
|---|---|---|---|---|
| 100001 | 318 | 7.85 | +6.64 | 9 / 9 |
| 100002 | 371 | 8.92 | -8.81 | 100 / 82 |
| 100003 | 352 | 4.49 | -0.47 | 8 / 20 |
| 100004 | 336 | 5.71 | +5.62 | 48 / 21 |
| 100005 | 284 | 3.76 | -2.76 | 43 / 62 |
| 100006 | 247 | 7.24 | -1.06 | 1 / 1 |
The large variation between participants and unstable selected epoch counts show limited generalization. Six people cannot establish broad population or device performance.
Training protocol
- Use the official Hoffman RGB means, recorded at nominal 30 Hz on Nexus 6P phones. Both hands from each person stay in that person’s fold. After a fixed initial six-second discard, create 180-frame windows without overlap.
- Reference labels are the mean of six 1 Hz
SpO2 5Masimo observations. Exclude missing values and windows containing reference values outside 70–100%. Follow the source repository’s common-start alignment assumption; no label-guided shift is fitted. - Normalize each channel by its own DC mean and remove a linear trend while retaining AC/DC amplitudes. Input the three RGB waveforms and six log pulse-amplitude/ratio features. Static DC colour ratios are masked.
- For each held-out test person, use four other people for fitting and a fifth person for epoch selection. Fit all normalization statistics on training data. Refit on the five non-test people at the selected epoch count and predict the excluded test person. Repeat for two fixed seeds and average outputs.
- Use training-only participant × oxygen-band sample weights, Huber loss, AdamW, dropout 0.15, weight decay 0.01 and maximum 100 epochs. Inner stopping uses equal oxygen-band MAE. Final deployment networks are refitted on all six people for 20 epochs.
The same cohort was examined in earlier attempts. Participant separation prevents direct fitting on each outer test person, but repeated design choices and final candidate selection make this exploratory development. There is no untouched external cohort or final-model clinical validation. The final all-data fit is not separately tested.
Website behavior
The phone captures whole-frame RGB for SpO₂ alongside the separate BP region. After settling, each contiguous six-second segment must pass checks for browser-reported flash, measured frame timing, at least 24 fps, unclipped colour channels, repeatable variation and training-ratio range. Three accepted segments produce an experimental mean. Contact loss discards incomplete segments; retained segments expire after two minutes. No missing signal is fabricated.
Inference happens locally in the browser. Scans remain in the tab until exported. Results and exports identify the model, raw accepted RGB, source-test error and limitations. The normalized display waveform is not used for inference. A stable result or narrow segment spread is not a confidence interval.
The BP model and cuff-reference flow remain separate. This run does not train glucose, add personalization, integrate EMR into SpO₂ inference, or train a joint BP/SpO₂/glucose encoder.
Verification and limits
Python and JavaScript neural predictions agree on six parity cases to within 0.00000664 percentage points. Parity cases are final-fit data and verify implementation only. Real RGB replay, participant separation, missing models, invalid timing, flash off, clipping, gaps, flat signals, domain rejection, contact reset, expiry, model loading and scan/report exports were checked in software. Physical iPhone performance and browser rendering were not tested.
- Only six participants and one source phone model; subgroup accuracy is unknown.
- Reference labels come from a pulse oximeter, not arterial co-oximetry.
- Phone/browser exposure, white balance, tone mapping, flash and frame resizing differ from the source study.
- Adjacent windows and the two hands remain correlated even without overlap; 1,908 windows are not 1,908 independent people.
- Live quality gates and three-segment averaging have no separate clinical evaluation.
Sources, artifacts and reproducibility
Official dataset · Hoffman et al., 2022 · MIT attribution · First-attempt report
This is a new implementation; the paper’s reported accuracy is not substituted for these measurements. Dataset commit c483ae8fe4cd32b0b9ce412d07299b05279fc58f. Deployed model spo2-hoffman-bounded-cnn-20261005.