注意
转到末尾下载完整示例代码。
导入眼动追踪设备数据#
眼动追踪设备记录人的注视点,通常相对于屏幕而言。通常,注视位置(也称为眼睛或瞳孔位置)与瞳孔大小会被记录为独立的通道。本节介绍如何读取受支持的眼动追踪厂商的数据。
MNE-Python 提供了读取眼动追踪数据的函数。在可能的情况下,MNE-Python 会在内部按照国际单位制(SI)转换并存储眼动追踪数据(例如位置数据使用弧度,瞳孔大小使用米)。
注意
如果你的眼动追踪数据格式尚不受 MNE 支持,可以尝试使用其他工具读取,并从 numpy 数组创建 MNE 对象。然后可以使用 mne.preprocessing.eyetracking.set_channel_types_eyetrack() 分配正确的眼动通道类型。
另请参阅
某些 MNE 函数可能无法用于眼动追踪及其他生理数据,因为 MNE 不将它们视为数据通道。更多信息请参阅 Glossary of Common Terms and API Elements。
SR Research(Eyelink)(.asc)#
注意
MNE-Python 目前仅支持读取以 ASCII(.asc)格式存储的 Eyelink 眼动追踪数据。
Eyelink 记录以 Eyelink Data Format(EDF;.edf)存储,这些是二进制文件,因此支持起来相对复杂。为了便于访问 EDF 文件中的数据,Eyelink 提供了 EDF2ASC 应用程序,可将 EDF 文件转换为纯文本 ASCII 格式(.asc)。可以使用 mne.io.read_raw_eyelink() 将这些文件导入 MNE。
注意
Eyelink Data Format(EDF)不应与 European Data Format 混淆,后者是常见的 EEG 数据格式,同样使用 .edf 扩展名。
Eyelink 文件支持的测量类型包括眼位、瞳孔大小、扫视速度、分辨率和头部位置(针对远程模式采集的记录)。Eyelink 文件通常会报告眼部事件(眨眼、扫视和注视),MNE 会将这些事件存储为 mne.Annotations。眨眼注释的描述为 'BAD_blink'。有关 Eyelink 文件中可能出现的各种测量类型的更多信息,请阅读下文。
眼位数据#
Eyelink 采样可以以像素、视角单位或原始瞳孔坐标报告眼位数据。采样以 (x, y) 坐标对的形式写入(双眼数据则为两对)。MNE 会自动检测 ASCII 文件中存在的眼位数据类型。下面解释三种眼位数据类型。
注视位置#
注视位置数据报告参与者在刺激屏幕上的估计 (x, y) 像素坐标,并补偿头部位置变化以及与屏幕的距离。如果你关心参与者在刺激屏幕上看向何处,这种数据类型可能更合适。Eyelink 系统的默认 (0, 0) 位置位于屏幕左上角。
用示例来说明最为清楚。在下面绘制的文件中,眼动追踪数据是在参与者阅读显示器上的文本时记录的。在该文件中,当参与者从左到右阅读每一行时,x 坐标增大。当参与者向下移动注视以阅读新的一行时,y 坐标增大,这就是下图中 ypos_right 通道随时间增大的原因(例如在约 4 秒和约 8 秒处)。
import mne
fpath = mne.datasets.misc.data_path() / "eyetracking" / "eyelink"
fname = fpath / "px_textpage_ws.asc"
raw = mne.io.read_raw_eyelink(fname, create_annotations=["blinks"])
cal = mne.preprocessing.eyetracking.read_eyelink_calibration(
fname,
screen_distance=0.7,
screen_size=(0.53, 0.3),
screen_resolution=(1920, 1080),
)[0]
mne.preprocessing.eyetracking.convert_units(raw, calibration=cal, to="radians")
Loading /home/circleci/mne_data/MNE-misc-data/eyetracking/eyelink/px_textpage_ws.asc
Pixel coordinate data detected. Pass `scalings=dict(eyegaze=1e3)` when using plot method to make traces more legible.
Pupil-size area detected.
No button events found in this file.
No button events found in this file.
No button events found in this file.
No button events found in this file.
There are 4 recording blocks in this file. Times between blocks will be annotated with BAD_ACQ_SKIP.
Reading calibration data from /home/circleci/mne_data/MNE-misc-data/eyetracking/eyelink/px_textpage_ws.asc
Converted ['xpos_right', 'ypos_right'] to radians.
数据可视化#
cal.plot()
custom_scalings = dict(pupil=1e3)
raw.pick(picks="eyetrack").plot(scalings=custom_scalings)
请注意,我们向 mne.io.Raw.plot 的 scalings 参数传递了自定义字典。这是因为 MNE 期望数据采用 SI 单位(眼动数据使用弧度,瞳孔大小数据使用米),但本示例中的瞳孔大小数据未进行转换。
头部参考眼角(HREF)#
HREF 眼位数据测量相对于头部的眼球旋转角度。它不考虑受试者头部位置和角度的变化,也不考虑与刺激屏幕的距离。对于关注眼动速度和幅度的分析,或者需要同时记录 EEG/MEG 并使用眼位数据识别 EOG 伪迹的眼动追踪记录,这种数据类型可能更合适。
HREF 坐标在 ASCII 文件中以整数值存储,每视角度数有 260 个或更多单位,但 MNE 会将这些坐标转换并以弧度存储。HREF 数据的 (0, 0) 点是任意的,因为屏幕位置与坐标之间的关系会随受试者头部移动而变化。
下面是上面绘制的同一段文本阅读记录,只不过生成了新的 ASCII 文件,这次使用 HREF 眼位数据。
fpath = mne.datasets.misc.data_path() / "eyetracking" / "eyelink"
fname_href = fpath / "HREF_textpage_ws.asc"
raw = mne.io.read_raw_eyelink(fname_href, create_annotations=["blinks"])
custom_scalings = dict(pupil=1e3)
raw.pick(picks="eyetrack").plot(scalings=custom_scalings)
Loading /home/circleci/mne_data/MNE-misc-data/eyetracking/eyelink/HREF_textpage_ws.asc
Head-referenced eye-angle (HREF) data detected.
Pupil-size area detected.
No button events found in this file.
No button events found in this file.
No button events found in this file.
No button events found in this file.
There are 4 recording blocks in this file. Times between blocks will be annotated with BAD_ACQ_SKIP.
瞳孔位置#
瞳孔位置数据包含来自眼部相机的 (x, y) 坐标对。它尚未转换为像素(注视位置)或眼角(HREF)。大多数用例不需要此数据类型,分析原始瞳孔位置时应谨慎。请注意,绘制包含原始瞳孔位置数据的 Raw 对象时,绘图缩放比例很可能不正确。你可以将自定义缩放比例传入 mne.io.Raw.plot 的 scalings 参数,以便绘图时信号清晰可读。
警告
如果在数据采集前未执行校准,EyeLink 系统无法将原始瞳孔位置数据转换为像素(注视位置)或眼角(HREF)。
瞳孔大小数据#
EyeLink 系统以最高每秒 500 个采样测量瞳孔大小。它可能报告为瞳孔面积,或瞳孔直径(即拟合到瞳孔区域的圆/椭圆模型的直径)。具体获得哪种数据类型由记录设置和/或 EDF2ASC 设置决定。瞳孔大小数据未经校准,以任意单位报告。典型的瞳孔面积数据范围为 800 至 2000 单位,精度为 1 单位,而瞳孔直径数据范围为 1800 至 3000 单位。
速度、分辨率和头部位置数据#
Eyelink 文件可以生成文件中每个采样的扫视速度、分辨率和头部位置数据。如果文件中存在这些数据,MNE 会读取它们,但会将其通道类型标记为 'misc'。
警告
Eyelink 的 EDF2ASC API 允许修改转换到 ASCII 的数据和格式。然而,MNE-Python 假定了一种特定结构,EDF2ASC 的默认参数遵循该结构。ASCII 文件应为制表符分隔,并且应同时输出 Samples 和 Events。如果数据以 2000Hz 记录,时间戳应为浮点数。不建议通过 EDF2ASC 手动修改 ASCII 转换。
脚本总运行时间:(0 分钟 1.095 秒)