Skip to main content

A package for processing and extracting eye-tracking data.

Project description

SPEED v4 - Desktop App & Analysis Package

An Advanced Eye-Tracking Data Analysis Software

SPEED is a Python-based project for processing, analyzing, and visualizing eye-tracking data. Version 4 introduces a major restructuring, offering two distinct components:

  1. SPEED Desktop App: A user-friendly GUI application for running a full analysis pipeline, designed for end-users and researchers.
  2. speed-analyzerPyPI version: A Python package for developers who want to integrate the analysis logic into their own scripts.

This version supports GPU acceleration for YOLO analysis and also offers three powerful AOI definition methods:

  1. Static AOI: A fixed rectangle for stationary scenes.
  2. Dynamic AOI (Object Tracking): An AOI that automatically follows a selected object detected by YOLO.
  3. Dynamic AOI (Manual Keyframes): A user-defined AOI path created by setting its position and size at key moments in the video.
  4. Real-time visualization: A real-time visualization of external and internal camera with YOLO AOI and manual multiple AOI, allowing the visualization of blink, pupillometry, fragmentation and events management.

1. SPEED Desktop Application (For End Users)

An application with a graphical user interface (GUI) for a complete, visually-driven analysis workflow.

How to Use the Application

  1. Download the latest version: Go to the Releases page and download the .zip file for your operating system (Windows or macOS).
  2. Extract and Run: Unzip the file and run the SpeedApp executable.
  3. Follow the Instructions:
    • Use the interface to select your data folders (RAW, Un-enriched).
    • If you do not provide an "Enriched" data folder, a "Define AOI..." button will become active.
    • Click it to choose your preferred AOI method (Static, Dynamic Auto, or Dynamic Manual) and follow the on-screen instructions in the interactive editor.
    • Manage events, run the analysis, and generate outputs as before.

2. speed-analyzer (Python Package for Developers)

The core analysis engine of SPEED, now available as a reusable package. It's designed for automation and integration into custom data pipelines.

Installation from PyPI

You can install the package directly from the Python Package Index (PyPI) using pip:

pip install speed-analyzer==4

How to Use the Package

The package exposes a main function, run_full_analysis, that takes paths and options as arguments. See the example_usage.py file for a complete demonstration.

Here is a basic snippet:

import pandas as pd
from speed_analyzer import run_full_analysis

 Define input and output paths
raw_path = "./data/raw"
unenriched_path = "./data/unenriched"
output_path = "./analysis_results"
subject_name = "participant_01"

2. Choose Your AOI Strategy

The speed-analyzer package allows you to define Areas of Interest (AOIs) on-the-fly, directly in your code. This is the recommended workflow when you do not have a pre-existing enriched_data_path. The system is designed to handle a list of multiple, mixed-type AOIs in a single analysis run.

When you provide the defined_aois parameter, the software will automatically generate new enriched data files (gaze_enriched.csv, fixations_enriched.csv) where each gaze point and fixation is mapped to the name of the AOI it falls into. It will also compute the Normalized Switching Index (SI) based on the sequence of transitions between these AOIs.

General Structure

You define AOIs by creating a list of Python dictionaries. Each dictionary must have three keys: name, type, and data.

General structure for defining AOIs

my_aois = [
    { "name": "AOI_Name_1", "type": "...", "data": ... },
    { "name": "AOI_Name_2", "type": "...", "data": ... },
]

AOI Type 1: Static AOI

Use this for a fixed rectangular region that does not move throughout the video. The data is a dictionary containing the pixel coordinates of the rectangle's corners.

static_aoi = {
    "name": "Control_Panel",
    "type": "static",
    "data": {'x1': 100, 'y1': 150, 'x2': 800, 'y2': 600}
}

AOI Type 2: Dynamic AOI (Automatic Object Tracking)

Use this to have an AOI automatically follow an object detected by YOLO. This requires setting run_yolo=True. The data is the integer track_id of the object you want to follow.

You would typically get the track_id from a preliminary YOLO analysis

object_id_to_track = 1 

dynamic_auto_aoi = {
    "name": "Tracked_Ball",
    "type": "dynamic_auto",
    "data": object_id_to_track
}

AOI Type 3: Dynamic AOI (Manual Keyframes)

Use this to define a custom path for a moving and resizing AOI. You set the AOI's position and size at specific frames (keyframes), and the software will interpolate its position for all frames in between. The data is a dictionary where keys are frame indices and values are tuples of coordinates (x1, y1, x2, y2).

manual_keyframes_aoi = {
    "name": "Animated_Focus_Area",
    "type": "dynamic_manual",
    "data": {
        0: (50, 50, 250, 250),      # Position at the start (frame 0)
        1000: (400, 300, 600, 500), # Position at frame 1000
        2000: (50, 50, 250, 250)     # Return to the start position at frame 2000
    }
}

Putting It All Together: Example with Multiple AOIs

You can combine any number of AOIs of any type into a single list and pass it to the analysis function.

import pandas as pd
from speed_analyzer import run_full_analysis

# 1. Define paths
raw_path = "./data/raw"
unenriched_path = "./data/unenriched"
output_path = "./analysis_results_multi_aoi"
subject_name = "participant_02"

# 2. Define multiple, mixed-type AOIs
my_aois = [
    { "name": "Left_Monitor", "type": "static", "data": {'x1': 0, 'y1': 0, 'x2': 960, 'y2': 1080}},
    { "name": "Right_Monitor", "type": "static", "data": {'x1': 961, 'y1': 0, 'x2': 1920, 'y2': 1080}},
    { "name": "Moving_Target", "type": "dynamic_auto", "data": 3 }
]

# 3. Run the analysis
run_full_analysis(
    raw_data_path=raw_path,
    unenriched_data_path=unenriched_path,
    output_path=output_path,
    subject_name=subject_name,
    run_yolo=True, # Required for the 'dynamic_auto' AOI
    defined_aois=my_aois # Pass the complete list of AOIs
)

Real-time

Trough the button in the GUI, is possible to visualize in real-time the data streamed by the device, managing events, pupillometry, fragmentation and the object detected by YOLO.


3. Docker Container (For Maximum Reproducibility)

To ensure maximum scientific reproducibility and to eliminate any issues with installation or dependencies, we provide a pre-configured Docker image that contains the exact environment to run the speed-analyzer package.

Prerequisites

You must have Docker Desktop installed on your computer. You can download it for free from the official Docker website.

How to Use the Docker Image

  1. Pull the Image (Download): Open a terminal and run this command to download the latest version of the image from the GitHub Container Registry (GHCR).

    docker pull ghcr.io/danielelozzi/speed:latest
    
  2. Run the Analysis: To launch an analysis, you need to use the docker run command. The most important part is to "mount" your local folders (containing the data and where to save the results) inside the container.

    Here is a complete example. Replace the /path/to/... placeholders with the actual absolute paths on your computer.

    docker run --rm \
      -v "/path/to/your/RAW/folder:/data/raw" \
      -v "/path/to/your/un-enriched/folder:/data/unenriched" \
      -v "/path/to/your/output/folder:/output" \
      ghcr.io/danielelozzi/speed:latest \
      python -c "from speed_analyzer import run_full_analysis; run_full_analysis(raw_data_path='/data/raw', unenriched_data_path='/data/unenriched', output_path='/output', subject_name='docker_test')"
    

    Command Explanation:

    • docker run --rm: Runs the container and automatically removes it when finished.
    • -v "/local/path:/container/path": The -v (volume) option creates a bridge between a folder on your computer and a folder inside the container. We are mapping your data folders into /data/ and your output folder into /output inside the container.
    • ghcr.io/danielelozzi/speed:latest: The name of the image to use.
    • python -c "...": The command that is executed inside the container. In this case, we launch a Python script that imports and runs your run_full_analysis function, using the paths internal to the container (/data/, /output/).

This approach guarantees that your analysis is always executed in the same controlled environment, regardless of the host computer.


The Modular Workflow (GUI)

SPEED v4 operates on a two-step workflow designed to save time and computational resources.

Step 1: Run Core Analysis

This is the main data processing stage. You run this step only once per participant for a given set of events. The software will:

  • Load all necessary files from the specified input folders (RAW, Un-enriched, Enriched).
  • If you don't have Enriched data, use the "Define AOI..." feature to create it dynamically. This is the new, recommended workflow for analyzing specific parts of a video. You can also combine several AOI (static, dynamic, and dynamic based on YOLO.)
  • Dynamically load events from events.csv into the GUI, allowing you to select which events to analyze.
  • Segment the data based on your selection.
  • Calculate all relevant statistics for each selected segment.
  • Optionally run YOLO object detection on the video frames, saving the results to a cache to speed up future runs.
  • Save the processed data (e.g., filtered dataframes for each event) and summary statistics into the output folder.

GUI 1

GUI event 1

GUI event 2

GUI aoi 1

GUI aoi 2

This step creates a processed_data directory containing intermediate files. Once this is complete, you do not need to run it again unless you want to analyze a different combination of events.

Step 2: Generate Outputs On-Demand

After the core analysis is complete, you can use the dedicated tabs in the GUI to generate as many plots and videos as you need, with any combination of settings, without re-processing the raw data.

  • Generate Plots: Select which categories of plots you want to create.
  • Generate Videos: Compose highly customized videos with various overlays.
  • View YOLO Results: Load and view the quantitative results from the object detection.
  • Normalized Switching Index (SI): Index for analyzing the switching component.
  • Generate enriched data on-the-fly if you defined a custom AOI.

GUI 2

GUI 3

GUI 4


Environment Setup (For Development) ⚙️

To run the project from source or contribute to development, you'll need Python 3 and several libraries.

  1. Install Anaconda: Link
  2. (Optional) Install CUDA Toolkit: For GPU acceleration with NVIDIA. Link
  3. Create a virtual environment:
conda create --name speed
conda activate speed
conda install pip
  1. Install the required libraries:
pip install -r requirements.txt

How to Use the Application from Source 🚀

Launch the GUI:

# Navigate to the desktop_app folder
cd desktop_app
python GUI.py

Setup and Analysis:

  • Fill in the Participant Name and select the Output Folder.
  • Select the required Input Folders: RAW and Un-enriched.
  • Use the Advanced Event Management section to load and edit events using the table or interactive video editor.
  • Click "RUN CORE ANALYSIS".
  • Use the other tabs to generate plots, videos, and view YOLO results.

🧪 Synthetic Data Generator (generate_synthetic_data.py)

Included in this project is a utility script to create a full set of dummy eye-tracking data. This is extremely useful for testing the SPEED software without needing Pupil Labs hardware or actual recordings.

How to Use

Run the script from your terminal:

python generate_synthetic_data.py

The script will create a new folder named synthetic_data_output in the current directory.

This folder will contain all the necessary files (gaze.csv, fixations.csv, external.mp4, etc.), ready to be used as input for the GUI application or the speed-analyzer package.


✍️ Authors & Citation

This tool is developed by the Cognitive and Behavioral Science Lab (LabSCoC), University of L'Aquila and Dr. Daniele Lozzi.

If you use this script in your research or work, please cite the following publications:

  • Lozzi, D.; Di Pompeo, I.; Marcaccio, M.; Ademaj, M.; Migliore, S.; Curcio, G. SPEED: A Graphical User Interface Software for Processing Eye Tracking Data. NeuroSci 2025, 6, 35. https://doi.org/10.3390/neurosci6020035
  • Lozzi, D.; Di Pompeo, I.; Marcaccio, M.; Alemanno, M.; Krüger, M.; Curcio, G.; Migliore, S. AI-Powered Analysis of Eye Tracker Data in Basketball Game. Sensors 2025, 25, 3572. https://doi.org/10.3390/s25113572

It is also requested to cite Pupil Labs publication, as requested on their website https://docs.pupil-labs.com/neon/data-collection/publication-and-citation/

If you also use the Computer Vision YOLO-based feature, please cite the following publication:

  • Redmon, J., Divvala, S., Girshick, R., & Farhadi, A. (2016). You only look once: Unified, real-time object detection. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 779-788). https://doi.org/10.1109/CVPR.2016.91

💻 Artificial Intelligence disclosure

This code is written in Vibe Coding Google Gemini 2.5 Pro

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

speed_analyzer-4.tar.gz (36.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

speed_analyzer-4-py3-none-any.whl (33.6 kB view details)

Uploaded Python 3

File details

Details for the file speed_analyzer-4.tar.gz.

File metadata

  • Download URL: speed_analyzer-4.tar.gz
  • Upload date:
  • Size: 36.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for speed_analyzer-4.tar.gz
Algorithm Hash digest
SHA256 a56838fb184e17f3da058ce7b8017068a1fe86fd7065ab12452f5cf300add8c3
MD5 d2e5875193e148ccb6eabf80d03f9f17
BLAKE2b-256 ea36e2f4141d1aa3b831798a1c165ffe598fef6c09ac317aa727dc2c2836df75

See more details on using hashes here.

File details

Details for the file speed_analyzer-4-py3-none-any.whl.

File metadata

  • Download URL: speed_analyzer-4-py3-none-any.whl
  • Upload date:
  • Size: 33.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for speed_analyzer-4-py3-none-any.whl
Algorithm Hash digest
SHA256 f88c9c2b68c6d5576b5f9c82ea8df3a0c4595a4e7dd546664ce8f2eca62f5678
MD5 2cad4f7d061d520430f3fa36eadac205
BLAKE2b-256 ba348a8631269ab7d6531e6672d6e541ce6ab9b2ac227acebca4164dd4127da9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page