Skip to content

openstetho v0.2.0-s3 — parallel S3 + murmur detection

Choose a tag to compare

@ShaneBreazeale ShaneBreazeale released this 19 May 02:31
· 22 commits to master since this release

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.