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, 凭据扫描, 嵌入式开发, 智慧医疗, 机器学习, 物联网硬件, 逆向工具, 音频信号处理