Eyettention: An Attention-based Dual-Sequence Model for Predicting Human Scanpaths during Reading

In this paper, we develop Eyettention, the first dual-sequence model that simultaneously processes the sequence of words and the chronological sequence of fixations. The alignment of the two sequences is achieved by a cross-sequence attention mechanism. We show that Eyettention outperforms state-of-the-art models in predicting scanpaths. We provide an extensive within- and across-data set evaluation on different languages. An ablation study and qualitative analysis support an in-depth understanding of the model's behavior.

The overview above describes the original authors' work. This project uses the original Eyettention implementation, reorganized as the Eyettention package, with raw-text inference, scanpath-prefix replay, an endpoint handler, and a Gradio interface.

Setup

For this checkout, run setup and inference commands from the project root (the directory containing Eyettention/). Install dependencies:

python -m pip install -r Eyettention/requirements.txt

The requirements retain historical PyTorch and Transformers pins that may need adjustment for your Python version and platform. The local preprocessing code also requires LAC and a compatible PaddlePaddle installation; BSC Excel loading requires openpyxl. Install gradio if using the web interface. Use a separate environment from ScanDL2 because their dependency versions differ.

Dataset

For the CELER dataset, follow the instructions at the CELER repository. In order to run experiments, place the downloaded dataset in Eyettention/Data/celer/. The local loaders expect data_v2.0/sent_fix.tsv, data_v2.0/sent_ia.tsv, and metadata.tsv beneath that directory.

The Chinese Beijing Sentence Corpus (BSC) belongs in Eyettention/Data/beijing-sentence-corpus/, with BSC.Word.Info.v2.xlsx and BSC.EMD/BSC.EMD.txt. See utils.py for the dataset loaders.

Raw-text inference uses the trained checkpoints and normalization files already stored under results/ and Data/; it does not require the full training corpora.

Run Experiments

The experiment scripts use paths relative to Eyettention/. Starting at the project root:

cd Eyettention
mkdir -p results/BSC results/CELER

Keep the project root on PYTHONPATH when running the package modules.

For Chinese BSC dataset

PYTHONPATH=.. python -m Eyettention.main_BSC --test_mode text --gpu 0
PYTHONPATH=.. python -m Eyettention.main_BSC --test_mode subject --gpu 0
PYTHONPATH=.. python -m Eyettention.main_BSC_NRS_setting --gpu 0
PYTHONPATH=.. python -m Eyettention.main_BSC_reader_identifier --gpu 0

For English CELER dataset

PYTHONPATH=.. python -m Eyettention.main_celer --test_mode text --gpu 0
PYTHONPATH=.. python -m Eyettention.main_celer --test_mode subject --gpu 0
PYTHONPATH=.. python -m Eyettention.main_celer_NRS_setting --gpu 0
PYTHONPATH=.. python -m Eyettention.main_celer_reader_identifier --gpu 0

text evaluates new sentences; subject evaluates new readers. Select an available GPU with --gpu. Several historical experiment scripts call CUDA directly, so use a CUDA-enabled environment for these commands. Review output paths before running; --save_data_folder selects the results directory.

Raw-text inference

Run the following from the project root:

from Eyettention import EyettentionRawTextInference

model = EyettentionRawTextInference(
    checkpoint_path="Eyettention/results/CELER/Eyettention_english.pth",
    dataset="celer",
    device="cpu",
)
scanpath, density = model.generate_from_english_text(
    "The quick brown fox jumps.",
    max_pred_len=20,
    # Optional: replay observed fixation positions before sampling.
    # previous_scanpath=[0, 1, 2],
)
print(scanpath[0].tolist())

For Chinese, use dataset="BSC", checkpoint Eyettention/results/BSC/Eyettention_chinese.pth, and generate_from_chinese_text(...). Dataset names are case-sensitive. Use device="cuda" for GPU inference. BERT assets must be downloadable from Hugging Face or cached locally.

Keep Data/feature_norm_celer.pickle and Data/feature_norm_BSC.pickle alongside the package. The output contains fixation indices and per-step probability distributions, not fixation durations. Index 0 denotes CLS, positions 1..N refer to words or Chinese characters, and N+1 denotes SEP; stop at the first SEP when interpreting fixations. Use short sentences within the checkpoint's configured input limits. Prefix replay extends the generation loop, so max_pred_len is not a strict total-length cap when a prefix is provided.

Endpoint handler

The added handler.py wraps inference in a dictionary-based interface:

from Eyettention.handler import EndpointHandler

handler = EndpointHandler()
result = handler({
    "inputs": "The quick brown fox jumps.",
    "parameters": {
        "dataset": "celer",
        "device": "cpu",
        "max_pred_len": 20,
    },
})

It returns scanpath and density_steps. Optional parameters include checkpoint_path and previous_scanpath. The handler defaults to BSC on CPU and does not itself start an HTTP server.

Gradio interface

The added app.py provides a web interface. From the project root, point it to the local checkpoints and launch:

export EYETTENTION_BSC_CHECKPOINT="Eyettention/results/BSC/Eyettention_chinese.pth"
export EYETTENTION_CELER_CHECKPOINT="Eyettention/results/CELER/Eyettention_english.pth"
python -m Eyettention.app

Open http://localhost:7860, choose the dataset, enter text, and click Run. The interface also supports an observed scanpath prefix. It selects CUDA when available, otherwise CPU. Set PORT to change the default port; the app binds to 0.0.0.0.

Cite our work

If you use this code for your research, please consider citing the original authors' paper:

@article{deng2023eyettention,
  title={Eyettention: {A}n Attention-based Dual-Sequence Model for Predicting Human Scanpaths during Reading},
  author={Deng, Shuwen and Reich, David R and Prasse, Paul and Haller, Patrick and Scheffer, Tobias and J{\"a}ger, Lena A},
  journal={Proceedings of the {ACM} on Human-Computer Interaction},
  volume={7},
  number={ETRA},
  pages={1--24},
  year={2023},
  publisher={ACM New York, NY, USA}
}

License

The original code is provided under the MIT License, copyright © 2023 AEye. Include the copyright and permission notice when redistributing copies or substantial portions of the software. See the license file for the full terms and warranty disclaimer. Datasets and dependencies retain their own licenses.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Paper for DiLi-Lab/Eyettention