openstetho v0.2.0-s3 — parallel S3 + murmur detection
Adds a synthetic-S3-augmented third-heart-sound (S3) detector that runs
in parallel with the existing MurmurCNN murmur classifier in stetho-ui.
What's in the asset
`MurmurCNN.mlpackage.zip` now bundles two Core ML packages:
- MurmurCNN.mlpackage — unchanged murmur classifier from v0.1.0-circor.
- S3CNN_v2.mlpackage — new S3 detector. ANE-friendly (Conv2D, Conv1D,
BatchNorm, ReLU, AdaptiveAvgPool, Linear). Trained on CirCor 2022 +
PhysioNet/CinC 2016 + PASCAL 2011 with synthetic S3 injection,
HSMM-segmented S2-anchored 1.5 s crops, and S4 confounder negative
mining.
The UI loads both opportunistically — both probabilities render side
by side in the top status bar. Missing S3 file = silent murmur-only mode.
Validation
Real-world held-out tests against three public cardiologist-labeled
auscultation libraries (UW Physical Diagnosis, U Michigan Heart Sound &
Murmur Library, two MEDZCOOL / educational YouTube clips):
- n = 41 clips, 5 S3-positive
- AUROC ≈ 0.97 on the combined real set
- Youden's J max at threshold 0.93 → sensitivity 1.0, specificity 0.92
- Best F1 at threshold 0.99 → sensitivity 0.80, specificity 1.0
See `docs/real_validation_results.md` in the repo for the per-clip
table and operating-threshold discussion. The stetho-ui readout colors
S3 amber 0.50–0.93 and red ≥ 0.93 to reflect the calibrated range.
Important caveats
- Not a clinical device. Educational / research use only.
- Trained on synthetic S3 injection. Cycle-level cardiologist-labeled
ground truth does not exist in our public corpora yet — the annotation
pipeline (`docs/s3_annotation_pipeline.md`) is the next step before
any clinical claim. - Threshold ≠ 0.5. Synthetic-set calibration does not transfer to
real audio. Use 0.93 (high-sensitivity) or 0.99 (high-specificity).
How to upgrade
Existing UI installs will auto-download this bundle on next launch
because the download URL resolves to `/releases/latest/download/MurmurCNN.mlpackage.zip`.
The murmur path is unchanged behaviorally — same model file, same
sliding-window cadence. The S3 readout appears as soon as the S3
`.mlpackage` lands next to the murmur model.