https://github.com/dalgona039/fog-detection-semg
Personalized FOG (Freezing of Gait) Detection System for Parkinson's Disease using Multimodal Biosignals (sEMG, EEG, IMU) and Hybrid Deep Learning.
https://github.com/dalgona039/fog-detection-semg
biosignals deep-learning eeg fog-detection healthcare-ai imu lstm parkinsons-disease semg tensorflow
Last synced: 14 days ago
JSON representation
Personalized FOG (Freezing of Gait) Detection System for Parkinson's Disease using Multimodal Biosignals (sEMG, EEG, IMU) and Hybrid Deep Learning.
- Host: GitHub
- URL: https://github.com/dalgona039/fog-detection-semg
- Owner: dalgona039
- License: mit
- Created: 2026-01-15T16:25:48.000Z (6 months ago)
- Default Branch: main
- Last Pushed: 2026-01-15T16:26:56.000Z (6 months ago)
- Last Synced: 2026-01-15T20:18:23.776Z (6 months ago)
- Topics: biosignals, deep-learning, eeg, fog-detection, healthcare-ai, imu, lstm, parkinsons-disease, semg, tensorflow
- Language: Jupyter Notebook
- Homepage:
- Size: 7.54 MB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[DeepL Translation of dalgona039/fog-detection-semg]
# π§ FOG Detection using Multimodal Biosignals (sEMG, EEG, IMU)
> **νν¨μ¨λ³ νμμ 보ν λκ²°(FOG) νμ§λ₯Ό μν νμ΄λΈλ¦¬λ λ₯λ¬λ λ° κ°μΈν λͺ¨λΈ μ°κ΅¬ νλ‘μ νΈ**
[](https://www.python.org/)
[](https://www.tensorflow.org/)
[](https://python-poetry.org/)
[](LICENSE)
## π νλ‘μ νΈ κ°μ (Overview)
**보ν λκ²°(Freezing of Gait, FOG)**μ νν¨μ¨λ³ νμκ° λ³΄νμ μμνκ±°λ λ°©ν₯μ μ νν λ λ°μ΄ λ°λ₯μ λΆμ κ²μ²λΌ μμ§μ΄μ§ λͺ»νλ νμμΌλ‘, λμ μ¬κ³ μ μ£ΌμμΈμ΄ λ©λλ€.
λ³Έ νλ‘μ νΈλ **58μ±λμ λ©ν°λͺ¨λ¬ μ체 μ νΈ(sEMG, EEG, IMU)**λ₯Ό μ΅ν©νμ¬ FOG μ΄λ²€νΈλ₯Ό μ€μκ°μΌλ‘ νμ§νλ λ₯λ¬λ μμ€ν
μ ꡬμΆν©λλ€. νΉν, νμ κ° μ체 μ νΈμ νΈμ°¨κ° μ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ **'μΌλ°ν λͺ¨λΈ(Generalized)'**κ³Ό **'κ°μΈν λͺ¨λΈ(Personalized)'**μ μ±λ₯μ λΉκ΅ λΆμνκ³ , μ΅μ μ νμ§ μ λ΅μ μ μν©λλ€.
### π― ν΅μ¬ λͺ©ν
- **Multimodal Fusion**: sEMG(κ·Όμ λ), EEG(λν), IMU(κ΄μ±) λ°μ΄ν°μ μ΅ν© λΆμ
- **Model Comparison**: CNN-LSTM(νμ΄λΈλ¦¬λ) vs LSTM vs Random Forest μ±λ₯ λΉκ΅
- **Personalization**: νμλ³ λ§μΆ€ν νμ΅μ ν΅ν FOG νμ§ μ νλ(Recall) κ·Ήλν (92.5% λ¬μ±)
---
## π λ°μ΄ν°μ
(Dataset)
λ³Έ νλ‘μ νΈλ **Mendeley Data**μ κ³΅κ° λ°μ΄ν°μ
μ νμ©νμμ΅λλ€.
- **λ°μ΄ν°μ
λͺ
**: Multimodal Dataset of Freezing of Gait in Parkinson's Disease
- **μΆμ² (DOI)**: [10.17632/r8gmbtv7w2.3](https://doi.org/10.17632/r8gmbtv7w2.3)
- **νΌνμ**: νν¨μ¨λ³ νμ 12λͺ
- **λ°μ΄ν° κ΅¬μ± (μ΄ 58μ±λ, 500Hz Sampling)**
- π§ **EEG (25 ch)**: λ νλ λͺ¨λν°λ§
- πͺ **sEMG (5 ch)**: λ€λ¦¬ κ·Όμ‘(Gastrocnemius, Tibialis Anterior λ±) νλ μΈ‘μ
- π **IMU (28 ch)**: κ°μλ(Acc), μμ΄λ‘(Gyro) - μλ°, λ€λ¦¬, κ³¨λ° λΆμ°©
---
## ποΈ νλ‘μ νΈ κ΅¬μ‘° (Directory Structure)
```
fog-detection-semg/
βββ data/
β βββ Labeled Data/ # λ μ΄λΈλ§λ μλ³Έ λ°μ΄ν° (.txt, .csv)
β βββ Preprocessed Data/ # μ μ²λ¦¬(μ κ·ν, λ€μ΄μνλ§) μλ£λ λ°μ΄ν°
β βββ Segmented Data/ # μκ³μ΄ μλμ°(Sliding Window)λ‘ λΆν λ λ°μ΄ν°
βββ notebooks/
β βββ 01_initial_data_exploration.ipynb # λ°μ΄ν° EDA, μκ°ν, ν΄λμ€ λΆκ· ν νμΈ
β βββ 02_deep_learning_models.ipynb # CNN-LSTM λ° LSTM λͺ¨λΈ νμ΅ λ° νκ°
β βββ Randon_forest_pakinsin.ipynb # Random Forest κΈ°λ° ML λΆλ₯ μ€ν
β βββ multimodal_fog_model.keras # νμ΅ μλ£λ λ₯λ¬λ λͺ¨λΈ νμΌ
β βββ model_history.npy # νμ΅ Loss/Accuracy νμ€ν 리
β βββ X_test_scaled.npy # ν
μ€νΈμ© μ
λ ₯ λ°μ΄ν° (μ μ²λ¦¬λ¨)
β βββ y_test.npy # ν
μ€νΈμ© μ λ΅ λ μ΄λΈ
βββ src/
β βββ fog_detection_semg/ # λ°μ΄ν° λ‘λ λ° μ μ²λ¦¬ μ νΈλ¦¬ν° μμ€
βββ tests/ # μ λ ν
μ€νΈ μ½λ
βββ pyproject.toml # Poetry μμ‘΄μ± μ€μ νμΌ
βββ README.md # νλ‘μ νΈ λ¬Έμ
```
---
## π μμνκΈ° (Getting Started)
### νμ μꡬμ¬ν (Prerequisites)
- **Python**: >= 3.12
- **Package Manager**: Poetry
### μ€μΉ λ° μ€ν (Installation)
1. **μ μ₯μ ν΄λ‘ **
```bash
git clone
cd fog-detection-semg
```
2. **Poetryλ₯Ό μ΄μ©ν μμ‘΄μ± μ€μΉ**
```bash
poetry install
```
3. **κ°μνκ²½ νμ±ν**
```bash
poetry shell
```
4. **Jupyter Lab μ€ν**
```bash
jupyter lab
```
---
## π§ͺ μ°κ΅¬ λ°©λ² λ° μ€ν κ²°κ³Ό (Methodology & Results)
### 1. λ₯λ¬λ λͺ¨λΈ μν€ν
μ² (02_deep_learning_models.ipynb)
- **CNN-LSTM Hybrid**:
- **Conv1D**: λ€μ±λ μΌμ λ°μ΄ν°μ 곡κ°μ νΉμ§(Spatial Feature) μΆμΆ
- **LSTM**: μκ³μ΄ λ°μ΄ν°μ μκ°μ νλ¦(Temporal Feature) νμ΅
- **Dropout (0.3)**: κ³Όμ ν© λ°©μ§
- **Windowing**: 1μ΄ μλμ° (Window size 32 @ Downsampled 25Hz), 50% Overlap
### 2. μ€ν κ²°κ³Ό: μΌλ°ν vs κ°μΈν
FOG νμ§μ λμ μΈ 'νμ κ° κ°μΈμ°¨'λ₯Ό 극볡νκΈ° μν λΉκ΅ μ€ν κ²°κ³Όμ
λλ€.
| λͺ¨λΈ μ κ·Ό λ°©μ | μκ³ λ¦¬μ¦ | κ²°κ³Ό (Recall) | λΆμ |
|--------------|---------|--------------|------|
| **μΌλ°ν λͺ¨λΈ
(Generalized)** | CNN-LSTM | β **Failure**
(21 ~ 57%) | νμ Aμ λ°μ΄ν°λ‘ Bλ₯Ό μμΈ‘ν κ²½μ°, μ체 μ νΈ ν¨ν΄μ μ°¨μ΄λ‘ μΈν΄ μ¬κ°ν μ±λ₯ μ ν λ°μ |
| **κ°μΈν λͺ¨λΈ
(Personalized)** | LSTM | β
**Success**
(92.5%) | νΉμ νμ λ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ λ―ΈμΈ νλ(Fine-tuning) μ FOG μ΄λ²€νΈλ₯Ό μ ννκ² ν¬μ°© |
**κ²°λ‘ **: 볡μ‘ν λͺ¨λΈλ³΄λ€ νμ λ§μΆ€ν(Personalized) νμ΅ μ λ΅μ΄ μμ μ μ©μ ν¨μ¬ μ ν¨ν¨μ μ
μ¦νμ΅λλ€.
---
## π¦ κΈ°μ μ€ν (Tech Stack)
- **Language**: Python 3.12
- **Deep Learning**: TensorFlow, Keras (>= 2.14.0)
- **Machine Learning**: Scikit-learn, Imbalanced-learn (SMOTE λ±)
- **Data Analysis**: Pandas, NumPy, SciPy (Signal Processing)
- **Visualization**: Matplotlib, Seaborn
- **Environment**: Poetry, Jupyter Lab
---
## π¬ μ¬μ© μμ (Usage)
νμ΅λ `.keras` λͺ¨λΈμ λ‘λνμ¬ μλ‘μ΄ μΌμ λ°μ΄ν°μ λν μΆλ‘ μ μνν μ μμ΅λλ€.
```python
import numpy as np
from tensorflow.keras.models import load_model
# 1. λͺ¨λΈ λ‘λ
model = load_model('notebooks/multimodal_fog_model.keras')
# 2. ν
μ€νΈ λ°μ΄ν° λ‘λ (νμ: [samples, time_steps, features])
X_test = np.load('notebooks/X_test_scaled.npy')
# 3. μμΈ‘ μν
predictions = model.predict(X_test)
predicted_classes = (predictions > 0.5).astype(int)
print(f"Detected FOG Events: {np.sum(predicted_classes)}")
```
---
## π κ°λ° λ‘λλ§΅ (Roadmap)
- [x] λ©ν°λͺ¨λ¬ λ°μ΄ν° μ μ²λ¦¬ νμ΄νλΌμΈ ꡬμΆ
- [x] CNN-LSTM λ° Random Forest λͺ¨λΈ λΉκ΅ νκ°
- [x] κ°μΈν λͺ¨λΈμ μ ν¨μ± κ²μ¦ (Recall 92.5% λ¬μ±)
- [ ] μ€μκ° μ€νΈλ¦¬λ° λ°μ΄ν° μ²λ¦¬ (Real-time Inference)
- [ ] λͺ¨λ°μΌ/μλ² λλ νκ²½μ μν λͺ¨λΈ κ²½λν (TFLite)
- [ ] μΉ κΈ°λ° λ³΄ν λΆμ λμ보λ ꡬμΆ
---
## π€ κΈ°μ¬νκΈ° (Contributing)
1. Fork the Project
2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)
4. Push to the Branch (`git push origin feature/AmazingFeature`)
5. Open a Pull Request
---
## π λΌμ΄μΌμ€ (License)
This project is licensed under the MIT License.
---
## π¨βπ» μμ±μ (Author)
**Lee Won Seok**
- Dept. of Biomedical Engineering, Kyung Hee University
- Contact: [icpuff83@khu.ac.kr]