noelplacencia/Smart_Stethoscope_CCNY_SD

GitHub: noelplacencia/Smart_Stethoscope_CCNY_SD

一款基于ESP32和树莓派的无线AI辅助智能听诊器,利用机器学习模型对呼吸音和心音进行实时异常检测与分类。

Stars: 0 | Forks: 0

# 智能听诊器 用于实时呼吸和心脏异常检测的无线 AI 辅助听诊器。音频由 MEMS 麦克风采集,通过 BLE 从 ESP32 传输至 Raspberry Pi 4,并使用在 ICBHI 2017、HF_Lung_V1 和 CirCor DigiScope 数据集上训练的机器学习模型进行分类。 专为 EE 59866/59868 毕业设计 — 纽约市立学院 (The City College of New York) 构建。 ## 工作原理 ``` SPH0645 MEMS mic (heart/lung audio) → ESP32 (DSP filtering, BLE transmission) → Raspberry Pi 4 (ML inference) → Dashboard (waveforms, anomaly flags, patient records) ``` **两种推理模式:** - **肺部模式** — 将呼吸音分类为正常、啰音、哮鸣音或两者兼有 - **心脏模式** — 检测是否存在心脏杂音 ## 仓库结构 ``` smart-stethoscope/ ├── firmware/ # Saqlain Warrris — DSP/filtering on ESP32 │ └── main/ │ └── main.ino ├── rpi/ # Jason Corona — RPi inference engine │ ├── ble_receiver.py │ ├── app.py │ ├── ai_alerts.py │ ├── config.py │ ├── requirements.txt │ ├── run.sh │ ├── static/ │ └── templates/ # Puran Chaudharry — dashboard & patient logging ├── ml/ # Noel Placencia — ML pipeline │ ├── heart/ │ │ ├── extract_features.py # CirCor feature extraction (53 features) │ │ ├── train.py # RF+HGB Ensemble — murmur detection │ │ ├── train_cnn.py # MobileNetV2 CNN — murmur detection │ │ └── evaluate_ensemble.py # Patient-level RF+CNN soft ensemble evaluation │ ├── lung/ │ │ ├── extract_features.py # ICBHI feature extraction (38 features) │ │ ├── extract_features_hf.py # HF_Lung_V1 feature extraction │ │ ├── extract_mels_hf.py # HF_Lung_V1 mel spectrogram extraction │ │ ├── train.py # Random Forest — lung sound classification │ │ ├── train_cnn.py # MobileNetV2 CNN — lung sound classification │ │ └── evaluate_ensemble.py # Patient-level RF+CNN soft ensemble evaluation │ ├── piezo/ │ │ ├── extract_features.py │ │ ├── train.py │ │ └── train_cnn.py │ ├── data/ # not committed (models, caches, plots) │ ├── datasets/ # not committed (raw audio datasets) │ └── show_metrics.py ├── docs/ # Ulash Kundu Joy — hardware diagrams, reports ├── .gitignore ├── LICENSE └── README.md ``` ## 设置 ### ESP32(固件) 1. 安装 [Arduino IDE](https://www.arduino.cc/en/software) 并添加 ESP32 开发板支持 2. 通过 Arduino Library Manager 安装所需的库: - `NimBLE-Arduino` - `Adafruit MAX3010x` - `BMI270` 3. 打开 `firmware/main/main.ino` 并上传至 ESP32 ### Raspberry Pi(推理) ``` pip install bleak scikit-learn numpy joblib python rpi/inference.py ``` 在 `inference.py` 中将 `ESP32_ADDRESS` 更新为您设备的 BLE MAC 地址(使用 `python -m bleak scan` 查找)。 ### ML 训练 ``` # 创建并激活 virtual environment python3 -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate pip install torch torchvision librosa scipy scikit-learn imbalanced-learn \ numpy pandas matplotlib joblib ``` **肺部声音模型**(MEMS 麦克风 — ICBHI 2017 + HF_Lung_V1,4 分类): ``` # Random Forest python ml/lung/extract_features.py # → ml/data/features_lung.csv python ml/lung/extract_features_hf.py # → ml/data/features_hf_lung.csv python ml/lung/train.py # → ml/data/rf_model_lung.joblib # CNN (MobileNetV2 transfer learning) python ml/lung/extract_mels_hf.py # → ml/data/mel_cache_hf.npz python ml/lung/train_cnn.py # → ml/data/cnn_model_lung.pth ``` **心脏声音模型**(MEMS 麦克风 — CirCor DigiScope,二分类杂音检测): ``` python ml/heart/extract_features.py # → ml/data/features_heart.csv python ml/heart/train.py # → ml/data/rf_model_heart.joblib (RF+HGB ensemble) # CNN (MobileNetV2 transfer learning) python ml/heart/train_cnn.py # → ml/data/cnn_model_heart.pth ``` 在运行推理之前,将 `.joblib` / `.pth` 模型文件复制到 Pi 上。 ## 模型结果 **窗口级**(每个 3–5 秒的音频片段独立评分 — 主要训练指标): | Pipeline | 模型 | 数据集 | 准确率 | ROC-AUC | Macro F1 | |----------|-------|---------|----------|---------|----------| | 心脏 | RF+HGB Ensemble | CirCor DigiScope | 79.5% | 0.696 | 0.634 | | 心脏 | MobileNetV2 CNN | CirCor DigiScope | 70.0% | 0.765 | 0.620 | | 肺部 | Random Forest | ICBHI + HF_Lung_V1 | 48.1% | 0.671 | — | | 肺部 | MobileNetV2 CNN | ICBHI + HF_Lung_V1 | 43.1% | 0.680 | 0.350 | **患者级**(患者的所有窗口概率在分类前被平均为一个分数): | Pipeline | 模型 | 数据集 | 准确率 | ROC-AUC | Macro F1 | |----------|-------|---------|----------|---------|----------| | 心脏 | RF+HGB Ensemble | CirCor DigiScope | 97.7% | 0.979 | 0.963 | | 心脏 | MobileNetV2 CNN | CirCor DigiScope | 90.9% | 0.857 | 0.835 | | 心脏 | RF+HGB + CNN Ensemble | CirCor DigiScope | 97.1% | 0.971 | 0.954 | | 肺部 | Random Forest | ICBHI + HF_Lung_V1 | 64.2% | 0.736 | 0.374 | | 肺部 | MobileNetV2 CNN | ICBHI + HF_Lung_V1 | 58.5% | 0.779 | 0.471 | | 肺部 | RF + CNN Ensemble | ICBHI + HF_Lung_V1 | 69.8% | 0.789 | 0.516 | 肺部分类是一个针对高度不平衡数据集的 4 分类问题(正常 / 啰音 / 哮鸣音 / 两者兼有)— ROC-AUC 是主要的窗口级指标。患者级 AUC 是作为在多数投票聚合后存在的 3 个分类(正常、啰音、哮鸣音)上的 macro OvR 计算得出的;“两者兼有”分类在患者级完全消失(53 名患者中为 0),因此被排除在 AUC 计算之外。 ## 数据集 由于文件大小原因,数据集**未提交**至本仓库。下载并放置在 `ml/datasets/` 中: | 数据集 | 用途 | 链接 | |---------|-----|------| | ICBHI 2017 | 肺部声音分类 | [bhichallenge.med.auth.gr](https://bhichallenge.med.auth.gr) | | HF_Lung_V1 | 额外的肺部声音(171 名患者) | [Hugging Face](https://huggingface.co/datasets/Stethoscope/HF_Lung_V1) | | CirCor DigiScope | 心脏杂音检测 | [physionet.org/content/circor-heart-sound](https://physionet.org/content/circor-heart-sound/1.0.3/) | ## 硬件 | 组件 | 作用 | 接口 | |-----------|------|-----------| | SPH0645LM4H-B (MEMS 麦克风) | 主要的心脏/肺部音频采集 | I²S | | INMP441 (环境麦克风) | 噪声参考 | I²S | | Murata 7BB-27-4L0 (压电 ×2) | 胸壁振动 | ADC | | AD8232 | ECG / 心脏计时的 | ADC | | MAX30102 | 血氧饱和度 (SpO₂) 和脉率 | I²C | | BMI270 | 运动伪影检测 | I²C | | DS18B20 | 体温 | 1-Wire | | SEN0297 | 胸部压力 | ADC | | ESP32 | Edge DSP + BLE 传输 | — | | Raspberry Pi 4 | ML 推理 + 仪表板 | — | ## 团队 | 姓名 | 角色 | |------|------| | Noel Placencia | 团队负责人 | | Ulash Kundu Joy | 硬件负责人 | | Jason Corona | 滤波负责人 | | Saqlain Warrris | AI 负责人 | | Puran Chaudharry | 数据负责人 | ## 许可证 仅供学术使用。不适用于临床部署。
标签:Apex, ESP32, 凭据扫描, 嵌入式开发, 智慧医疗, 机器学习, 物联网硬件, 逆向工具, 音频信号处理