An open API service indexing awesome lists of open source software.

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.

Awesome Lists containing this project

README

          

[DeepL Translation of dalgona039/fog-detection-semg]

# 🧠 FOG Detection using Multimodal Biosignals (sEMG, EEG, IMU)

> **νŒŒν‚¨μŠ¨λ³‘ ν™˜μžμ˜ 보행 동결(FOG) 탐지λ₯Ό μœ„ν•œ ν•˜μ΄λΈŒλ¦¬λ“œ λ”₯λŸ¬λ‹ 및 κ°œμΈν™” λͺ¨λΈ 연ꡬ ν”„λ‘œμ νŠΈ**

[![Python](https://img.shields.io/badge/Python-3.12-blue?logo=python&logoColor=white)](https://www.python.org/)
[![TensorFlow](https://img.shields.io/badge/TensorFlow-2.14%2B-orange?logo=tensorflow&logoColor=white)](https://www.tensorflow.org/)
[![Poetry](https://img.shields.io/badge/Poetry-Package%20Manager-blueviolet?logo=poetry&logoColor=white)](https://python-poetry.org/)
[![License](https://img.shields.io/badge/License-MIT-green)](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]