9.9 KiB
9.9 KiB
Project Report: Multimodal Driver State Analysis
1) Project Scope
This repository implements an end-to-end workflow for multimodal driver-state analysis in a simulator setup.
The system combines:
- Facial Action Units (AUs)
- Eye-tracking features (fixations, saccades, blinks, pupil behavior)
Apart from this, several machine learning model architectures are presented and evaluated.
Content:
- Dataset generation
- Exploratory data analysis
- Model training experiments
- Real-time inference with SQlite, systemd and MQTT
- Repository file inventory
- Additional nformation
2) Dataset generation
2.1 Data Access, Filtering, and Data Conversion
Main scripts:
dataset_creation/create_parquet_files_from_owncloud.pydataset_creation/parquet_file_creation.py
Purpose:
- Download and/or access dataset files (either download first via
EDA/owncloud_file_access.ipynbor all in one withdataset_creation/create_parquet_files_from_owncloud.py - Keep relevant columns (FACE_AUs and eye-tracking raw values)
- Filter invalid samples (e.g., invalid level segments): Make sure not to drop rows where NaN is necessary for later feature creation, therefore use subset argument in dropNa()!
- Export subject-level parquet files
- Before running the scripts: be aware that the whole dataset contains 30 files with around 900 Mbytes each, provide enough storage and expect this to take a while.
2.2 Feature Engineering (Offline)
Main script:
dataset_creation/combined_feature_creation.py
Behavior:
- Builds fixed-size sliding windows over subject time series (window size and step size can be adjusted)
- Uses prepared parquet files from 2.1
- Aggregates AU statistics per window (e.g.,
FACE_AUxx_mean) - Computes eye-feature aggregates (fix/sacc/blink/pupil metrics)
- Produces training-ready feature tables = dataset
- Parameter
MIN_DUR_BLINKScan be adjusted, although this value needs to make sense in combination with your sampling frequency - With low videostream rates, consider to reevaluate the meaningfulness of some eye-tracking features, especially the fixations
- running the script requires a manual installation of pygaze Analyser library from github
2.3 Online Camera + Eye + AU Feature Extraction
Main scripts:
dataset_creation/camera_handling/camera_stream_AU_and_ET_new.pydataset_creation/camera_handling/eyeFeature_new.pydataset_creation/camera_handling/db_helper.py
Runtime behavior:
- Captures webcam stream with OpenCV
- Extracts gaze/iris-based signals via MediaPipe
- Records overlapping windows (
VIDEO_DURATION=50s,START_INTERVAL=5s,FPS=25) - Runs AU extraction (
py-feat) from recorded video segments - Computes eye-feature summary from generated gaze parquet
- Writes merged rows to SQLite table
feature_table
Operational note:
DB_PATHand other paths are currently code-configured and must be adapted per deployment.
3) EDA
TO DO
EDA/EDA.ipynb- main EDA notebookEDA/distribution_plots.ipynb- distribution visualizationEDA/histogramms.ipynb- histogram analysisEDA/researchOnSubjectPerformance.ipynb- subject-level analysisEDA/owncloud_file_access.ipynb- ownCloud exploration/access notebookEDA/calculate_replacement_values.ipynb- fallback/median computation notebookEDA/login.yaml- local auth/config artifact for EDA workflows
4) Model Training
Location:
model_training/(primarily notebook-driven)
Included model families:
- CNN variants (different fusion strategies)
- XGBoost
- Isolation Forest
- OCSVM
- DeepSVDD
Supporting utilities:
model_training/tools/scaler.pymodel_training/tools/performance_split.pymodel_training/tools/mad_outlier_removal.pymodel_training/tools/evaluation_tools.py
5) Real-Time Prediction and Messaging
Main script:
predict_pipeline/predict_sample.py
Pipeline:
- Loads runtime config (
predict_pipeline/config.yaml) - Pulls latest row from SQLite (
database.path/table/key) - Replaces missing values using
fallbackmap - Optionally applies scaler (
.pkl/.joblib) - Loads model (
.keras,.pkl,.joblib) and predicts - Publishes JSON payload to MQTT topic
Expected payload form:
{
"valid": true,
"_id": 123,
"prediction": 0
}
5.1 Scheduled Prediction (Linux)
Files:
predict_pipeline/predict.servicepredict_pipeline/predict.timerpredict_pipeline/predict_service_timer_documentation.md
Role:
- Run inference repeatedly without manual execution
- Timer/service configuration can be customized per target machine
5.2 Runtime Configuration
Primary config file:
predict_pipeline/config.yaml
Sections:
database: SQLite location + table + sort keymodel: model pathscaler: scaler usage + pathmqtt: broker and publish formatsample.columns: expected feature orderfallback: default values for NaN replacement
Important:
- The repository currently uses environment-specific absolute paths in some scripts/configs.
- Paths should be normalized before deployment to a new machine.
5.3) Data and Feature Expectations
Prediction expects SQLite rows containing:
_Idstart_time- All configured model features (AUs + eye metrics)
Common feature groups:
FACE_AUxx_meancolumns- Fixation counters and duration statistics
- Saccade count/amplitude/duration statistics
- Blink count/duration statistics
- Pupil mean and IPA
6) Installation and Dependencies
Due to unsolvable dependency conflicts, several environemnts need to be used in the same time.
6.1 Environemnt for camera handling
TO DO
6.2 Environment for predictions
Install base requirements:
pip install -r requirements.txt
Typical key packages in this project:
numpy,pandas,scikit-learn,scipy,pyarrow,pyyaml,joblibopencv-python,mediapipe,torch,py-feat,pygazeanalyserpaho-mqtt- optional data access stack (
pyocclient,h5py,tables)
7) Repository File Inventory
Root
.gitignore- Git ignore rulesreadme.md- minimal quickstart documentationproject_report.md- full technical documentation (this file)requirements.txt- Python dependencies
Dataset Creation
dataset_creation/parquet_file_creation.py- local source to parquet conversiondataset_creation/create_parquet_files_from_owncloud.py- ownCloud download + parquet conversiondataset_creation/combined_feature_creation.py- sliding-window multimodal feature generationdataset_creation/maxDist.py- helper/statistical utility script
AU Creation
dataset_creation/AU_creation/AU_creation_service.py- AU extraction service workflowdataset_creation/AU_creation/pyfeat_docu.ipynb- py-feat exploratory notes
Camera Handling
dataset_creation/camera_handling/camera_stream_AU_and_ET_new.py- current camera + AU + eye online pipelinedataset_creation/camera_handling/eyeFeature_new.py- eye-feature extraction from gaze parquetdataset_creation/camera_handling/db_helper.py- SQLite helper functions (camera pipeline)dataset_creation/camera_handling/camera_stream_AU_and_ET.py- older pipeline variantdataset_creation/camera_handling/camera_stream.py- baseline camera streaming scriptdataset_creation/camera_handling/db_test.py- DB test utility
EDA
EDA/EDA.ipynb- main EDA notebookEDA/distribution_plots.ipynb- distribution visualizationEDA/histogramms.ipynb- histogram analysisEDA/researchOnSubjectPerformance.ipynb- subject-level analysisEDA/owncloud_file_access.ipynb- ownCloud exploration/access notebookEDA/calculate_replacement_values.ipynb- fallback/median computation notebookEDA/login.yaml- local auth/config artifact for EDA workflows
Model Training
CNN
model_training/CNN/CNN_simple.ipynbmodel_training/CNN/CNN_crossVal.ipynbmodel_training/CNN/CNN_crossVal_EarlyFusion.ipynbmodel_training/CNN/CNN_crossVal_EarlyFusion_Filter.ipynbmodel_training/CNN/CNN_crossVal_EarlyFusion_Test_Eval.ipynbmodel_training/CNN/CNN_crossVal_faceAUs.ipynbmodel_training/CNN/CNN_crossVal_faceAUs_eyeFeatures.ipynbmodel_training/CNN/CNN_crossVal_HybridFusion.ipynbmodel_training/CNN/CNN_crossVal_HybridFusion_Test_Eval.ipynbmodel_training/CNN/deployment_pipeline.ipynb
XGBoost
model_training/xgboost/xgboost.ipynbmodel_training/xgboost/xgboost_groupfold.ipynbmodel_training/xgboost/xgboost_new_dataset.ipynbmodel_training/xgboost/xgboost_regulated.ipynbmodel_training/xgboost/xgboost_with_AE.ipynbmodel_training/xgboost/xgboost_with_MAD.ipynb
Isolation Forest
model_training/IsolationForest/iforest_training.ipynb
OCSVM
model_training/OCSVM/ocsvm_with_AE.ipynb
DeepSVDD
model_training/DeepSVDD/deepSVDD.ipynb
MAD Outlier Removal
model_training/MAD_outlier_removal/mad_outlier_removal.ipynbmodel_training/MAD_outlier_removal/mad_outlier_removal_median.ipynb
Shared Training Tools
model_training/tools/scaler.pymodel_training/tools/performance_split.pymodel_training/tools/mad_outlier_removal.pymodel_training/tools/evaluation_tools.py
Prediction Pipeline
predict_pipeline/predict_sample.py- runtime prediction + MQTT publishpredict_pipeline/config.yaml- runtime database/model/scaler/mqtt configpredict_pipeline/fill_db.ipynb- helper notebook for DB setup/testingpredict_pipeline/predict.service- systemd service unitpredict_pipeline/predict.timer- systemd timer unitpredict_pipeline/predict_service_timer_documentation.md- Linux service/timer guide
Generic Tools
tools/db_helpers.py- common SQLite utilities used to get newest sample for prediction
8) Additional Information
- Several paths are hardcoded on purpose to ensure compability with the jetsonboard at the OHM-UX driving simulator.
- Camera and AU processing are resource-intensive; version pinning and hardware validation are recommended.