Skip to content

Releases: ShaneBreazeale/openstetho

openstetho v0.4.0-murmur-ensemble — clean 3-seed ensemble (5s)

Choose a tag to compare

Clean public-data murmur model upgrade: a 3-seed bagged CNN+BiGRU ensemble (5 s / 78-frame), shipped as one fused Core ML package.

Model: transferred best-F1 0.5972 → 0.6439, OoF AUROC 0.8172 → 0.8415, Platt ECE 0.040 → 0.019 (5-fold patient-level CV, gate-verified). No teacher distillation.

Operating point: Youden default, sensitivity 0.724 / specificity 0.829 (screening-leaning); metadata-tunable.

Asset MurmurCNN.mlpackage.zip bundles:

  • MurmurCNN.mlpackage — fused 3-model probability-mean ensemble (5 s / 78-frame), sidecar n_frames:78, murmur_threshold:0.535999.
  • S3CNN_v2.mlpackage — unchanged from v0.3.1.

stetho-ui auto-upgrades via /releases/latest/download/; the engine reads window length + threshold from the sidecar metadata.

See PR #1 for the regression-gate harness and full provenance.

openstetho v0.3.1-murmur-bigru — 5s top-k murmur model

Choose a tag to compare

Model release

Publishes the current GUI-downloadable model bundle:

  • MurmurCNN.mlpackage: 5s log-mel CNN+BiGRU murmur detector.
  • MurmurCNN.openstetho.json: app sidecar with n_frames=78, murmur_aggregation=topk_mean, murmur_topk=4, and murmur_threshold=0.3433690369.
  • S3CNN_v2.mlpackage: bundled sibling S3 detector from the prior release path.

Asset:

  • MurmurCNN.mlpackage.zip

The app downloader expects that asset name and will discover the bundled sidecar and S3 package after extraction.

Murmur benchmark

Best selected operating point from the held-out validation tuning run:

  • Aggregation: top4_mean
  • Threshold: 0.343369
  • Sensitivity: 0.667
  • Specificity: 0.942
  • F1: 0.703
  • Counts: TP 58, FP 20, TN 323, FN 29

Core ML all-recording benchmark using the baked sidecar rule:

  • Recordings: 2964
  • AUROC: 0.909
  • Sensitivity: 0.749
  • Specificity: 0.936
  • Precision: 0.749
  • F1: 0.749
  • Counts: TP 454, FP 152, TN 2206, FN 152

Threshold sweep reference on the same all-recording Core ML benchmark:

  • Best F1: threshold 0.384910, sensitivity 0.715, specificity 0.955, F1 0.756
  • Specificity >= 0.95: threshold 0.377398, sensitivity 0.719, specificity 0.952, F1 0.755

Core ML export parity check:

  • max absolute logit diff: 7.6e-04

Caveats

This remains an experimental model trained on public CirCor data, not a clinically validated detector. The held-out validation result is the selection metric; the all-recording benchmark is a sanity check for the exported Core ML package and app-side aggregation rule, not an independent clinical estimate.

openstetho v0.3.0-murmur-bigru — CNN+BiGRU murmur model

Choose a tag to compare

Model release

Publishes the current GUI-downloadable model bundle:

  • MurmurCNN.mlpackage: 5s log-mel CNN+BiGRU murmur detector.
  • MurmurCNN.openstetho.json: app sidecar with n_frames=78, murmur_aggregation=topk_mean, murmur_topk=4, and murmur_threshold=0.3433690369.
  • S3CNN_v2.mlpackage: bundled sibling S3 detector from the prior release path.

Asset:

  • MurmurCNN.mlpackage.zip

The app downloader expects that asset name and will discover the bundled sidecar and S3 package after extraction.

Murmur benchmark

Best selected operating point from the held-out validation tuning run:

  • Aggregation: top4_mean
  • Threshold: 0.343369
  • Sensitivity: 0.667
  • Specificity: 0.942
  • F1: 0.703
  • Counts: TP 58, FP 20, TN 323, FN 29

Core ML all-recording benchmark using the baked sidecar rule:

  • Recordings: 2964
  • AUROC: 0.909
  • Sensitivity: 0.749
  • Specificity: 0.936
  • Precision: 0.749
  • F1: 0.749
  • Counts: TP 454, FP 152, TN 2206, FN 152

Threshold sweep reference on the same all-recording Core ML benchmark:

  • Best F1: threshold 0.384910, sensitivity 0.715, specificity 0.955, F1 0.756
  • Specificity >= 0.95: threshold 0.377398, sensitivity 0.719, specificity 0.952, F1 0.755

Core ML export parity check:

  • max absolute logit diff: 7.6e-04

Caveats

This remains an experimental model trained on public CirCor data, not a clinically validated detector. The held-out validation result is the selection metric; the all-recording benchmark is a sanity check for the exported Core ML package and app-side aggregation rule, not an independent clinical estimate.

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

Choose a tag to compare

@ShaneBreazeale ShaneBreazeale released this 19 May 02:31

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.

openstetho v0.1.0-circor

Choose a tag to compare

@ShaneBreazeale ShaneBreazeale released this 16 May 14:31

Initial Core ML model release. Trained on CirCor 2022 public PCG dataset. Asset: MurmurCNN.mlpackage.zip (zipped Core ML .mlpackage). UI auto-downloads via OPENSTETHO_MODEL_DOWNLOAD_URL default.