Analysis of EEG Signals and Facial Expressions for Continuous Emotion Detection using LSTM neural networks.
This codebase implements multimodal emotion detection combining EEG signals and facial expressions, with support for feature-level and decision-level fusion strategies.
Note: This repository is an implementation based on the methodology described in the paper. It is not the original code used to produce the results in the published paper. This is a modernized, refactored version with updated dependencies and best practices.
- Multimodal Learning: Combines EEG and facial expression features
- LSTM-based Architecture: Handles variable-length time series data
- Multiple Fusion Strategies:
- EEG-only model
- Face-only model
- Feature-level fusion (FLF)
- Decision-level fusion (DLF)
- 10-Fold Cross-Validation: Robust evaluation with statistical measures
- Modern TensorFlow 2.x: Updated for compatibility with latest deep learning frameworks
- Modular Design: Clean, maintainable code structure following Python best practices
- Type Hints & Docstrings: Comprehensive documentation for all functions
- Python 3.8+
- TensorFlow 2.8+
- NumPy 1.21+
- SciPy 1.7+
- scikit-learn 1.0+
- Clone the repository:
git clone https://github.com/soheilrayatdoost/ContinuousEmotionDetection.git
cd ContinuousEmotionDetection- Install dependencies:
pip install -r requirements.txtContinuousEmotionDetection/
βββ config.py # Configuration and hyperparameters
βββ data_loader.py # Data loading utilities
βββ preprocessing.py # Data preprocessing and normalization
βββ model.py # Neural network architectures
βββ training.py # Training utilities
βββ evaluation.py # Evaluation metrics
βββ cross_validation.py # Cross-validation utilities
βββ main.py # Single train/test split (quick testing)
βββ main_cv.py # 10-fold cross-validation (recommended)
βββ requirements.txt # Project dependencies
βββ README.md # This file
βββ CROSS_VALIDATION_README.md # Cross-validation guide
β
βββ data/ # Data directory
βββ Features/ # Feature .mat files
βββ lable_continous_Mahnob.mat # Annotations
For rapid prototyping and testing (runs in ~10-15 minutes):
python main.pyThis uses a single 60/30/10 train/validation/test split.
For reliable results and research purposes:
python main_cv.pyThis performs 10-fold cross-validation and reports mean Β± standard deviation for all metrics. See CROSS_VALIDATION_README.md for details.
Edit config.py to modify:
- Network hyperparameters (LSTM sizes, dropout rates)
- Training parameters (epochs: 100, batch size: 20)
- File paths
You can import and use individual modules:
import config
from data_loader import load_data
from preprocessing import normalize_data_subject
from model import network_seq
from training import train_network_seq
# Load your data
features_label, data_num = load_data(config.DATA_FOLDER, annotated_trial)
# Create and train a model
model = network_seq(input_tensor, output_tensor, max_len,
lstm_size1=64, lstm_size2=32, dense_size1=32)
model = train_network_seq(model, train_data, val_data,
label_train, label_val,
epochs=25, batch_size=20)- Input: 128 EEG band features
- LSTM Layer 1: 64 units
- LSTM Layer 2: 32 units
- Dense Layer: 32 units
- Output: Continuous emotion values
- Input: 38 facial features
- LSTM Layer 1: 19 units
- LSTM Layer 2: 10 units
- Dense Layer: 10 units
- Output: Continuous emotion values
- Input: 166 features (38 face + 128 EEG)
- LSTM Layer 1: 83 units
- LSTM Layer 2: 42 units
- Dense Layer: 42 units
- Output: Continuous emotion values
The system evaluates models using:
- MSE (Mean Squared Error)
- RMSE (Root Mean Squared Error)
- Pearson Correlation Coefficient
When using main_cv.py, results are reported as mean Β± standard deviation across 10 folds:
EEG:
MSE = 0.012345 Β± 0.001234
RMSE = 0.111111 Β± 0.011111
Pearson = 0.456789 Β± 0.045678
If you use this code, please cite:
@article{soleymani2016analysis,
title={Analysis of EEG Signals and Facial Expressions for Continuous Emotion Detection},
author={Soleymani, M. and Asghari-Esfeden, S. and Fu, Y. and Pantic, M.},
journal={IEEE Transactions on Affective Computing},
volume={7},
number={1},
pages={17--28},
year={2016},
publisher={IEEE},
doi={10.1109/TAFFC.2015.2436926}
}Paper URL: http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7112127&isnumber=7420758
- β 10-Fold Cross-Validation: Implemented rigorous CV for reliable evaluation
- β Increased Training: Updated to 100 epochs for better convergence
- β
Cross-Validation Module: Added
cross_validation.pyutility module - β Comprehensive Documentation: Added CV guide and comparison results
- β Complete Refactoring: Modular structure with 8 separate modules
- β TensorFlow 2.x Migration: Updated from deprecated Keras imports
- β Type Hints & Docstrings: Full type annotations and documentation
- β Bug Fixes: Fixed global variable issues and deprecated APIs
- β PEP 8 Compliance: Consistent snake_case naming conventions
- β
Modern Format: Using
.kerasmodel format (TF 2.x standard) - β GPU Support: Added GPU detection and setup guide
- β Validation: Compared old vs new implementations for equivalence
See LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request.
- CROSS_VALIDATION_README.md - Complete guide to 10-fold CV
Use main.py for quick iterations:
- Faster execution (~10-15 minutes)
- Good for debugging and hyperparameter exploration
- Single train/validation/test split
Use main_cv.py for final evaluation:
- More reliable results (~3-4 hours)
- 10-fold cross-validation with statistical measures
- Standard practice for machine learning research
- Reports mean Β± standard deviation
This repository contains multiple implementations:
main_cv.pyβ - Recommended: Refactored code with 10-fold CVmain.py- Refactored code with single split (quick testing)ContinousEmotionDetection_cv.py- Original code with 10-fold CVContinousEmotionDetection.py- Original monolithic code (reference)
All implementations produce functionally equivalent results. See COMPARISON_RESULTS.md for validation.
- Not Original Paper Code: This is a reimplementation of the paper's methodology, not the exact code used for the published results
- Data Format: Ensure your data files are in the correct format (.mat files)
- Variable-Length Sequences: Code handles variable-length sequences using masking
- Model Format: Models are saved in
.kerasformat (TensorFlow 2.x standard) - Normalization: Subject-wise normalization is applied to features
- Training Time: 10-fold CV takes ~3-4 hours on CPU; use GPU for faster training
- Reproducibility: Use fixed random seeds for reproducible results