news 2026/10/4 14:28:00

眼动追踪中的动态AOI分析:从静态画框到兴趣区跟随的完整实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
眼动追踪中的动态AOI分析:从静态画框到兴趣区跟随的完整实战指南

眼动数据分析里有一个很隐蔽的门槛:静态图片上的AOI分析,随便找个教程就能上手,画个矩形框,统计注视时长,完事。可一旦刺激物动起来——视频广告、驾驶模拟界面、人机交互操作过程,很多人立刻卡壳。为什么?因为AOI不是"画上去"就完了,它的边界会随着目标物体的移动、旋转、缩放甚至短暂遮挡而变化。你画的那个框跟不上物体,后边的数据就全是噪声。

我常跟人说,动态刺激物的AOI分析,本质上是"给会跑的兔子画圈",圈画慢了、画歪了,测出来的就不是兔子的运动轨迹,而是你自己手抖的轨迹。这篇我把动态AOI分析的思路、工具、计算流程和踩坑经验完整梳理一遍,适合刚入门眼动分析、打算做视频或交互场景研究的人参考。

1. 大多数人的第一个坑:画框简单,框随物动才是难点

先定义清楚问题。AOI(Area of Interest,兴趣区)是眼动分析里最常用的量化手段,核心思路就是把刺激画面划分出有意义的区域,然后统计注视点落进每个区域的次数、时长和顺序。静态刺激下,AOI是一次性划分的:一张网页截图,LOGO画一个框,导航栏画一个框,正文画一个框,算完收工。但刺激物一旦动态化,原来这套"一次划分、全程有效"的逻辑就崩了。

动态刺激物大致有三类,每一类对AOI的挑战都不一样。

第一类是目标物体本身在画面里运动,比如视频广告里的产品、体育比赛里的球员。你需要AOI跟着目标走,这在软件里叫动态AOI(Dynamic AOI)。难点在于目标的空间位置随时间变化,如果手动在每一帧画框,工作量巨大,而且不同帧之间框的位置和大小如果不一致,累出来的指标会有系统性偏差。

第二类是刺激物本身不动,但呈现内容随时间变化。典型例子是信息密集的界面操作流程,菜单展开、弹窗出现、内容滚动。这类场景里,AOI更多是"时间段相关"的,同一个屏幕区域在不同时间代表不同功能,你需要按时间段把AOI语义切出来。

第三类是观察者视角的变化,比如视频里镜头在移动、缩放,被试看的是动态场景。这类最麻烦,因为感兴趣的目标在屏幕坐标里可能完全不存在了——上一秒还在画面中央的物体,下一秒镜头切换后可能被移出画面,而你的AOI还在原来的像素位置等着它。

很多人做动态视频研究时,仍然沿用静态画的矩形框,哪怕目标已经跑到画面外了,AOI还留在原地。这样统计出来的落点率们有意义,但研究对象已经从"被试对产品的关注"变成了"被试对画面某一块固定区域的关注",完全是两码事。

理解了这个本质,你就会明白动态AOI分析的关键不是画框,而是建立"AOI与运动目标之间的持续对应关系"。框只是一个可视化表达,背后真正值钱的是每一帧里AOI的坐标序列、形状序列和有效性标记。

2. 动态AOI的三种做法与选型思路

动态AOI的具体实现方式并没有统一标准,不同研究目的、不同刺激特性,适合的方案完全不同。我把常见做法归纳成三类,你可以对照自己的需求选。

2.1 手工逐帧标注:精度最高,但代价巨大

这是最朴素的方式:用视频编辑思路,把刺激视频按帧或按关键帧切分,在每一帧(或每隔N帧)手动绘制AOI边界,软件自动在关键帧之间做插值。

优点很明显:完全不受目标运动复杂程度限制,目标变形、部分遮挡、自身角度旋转,人眼都能判断并画出合适的边界,精度是所有方法里最高的。缺点是体力活,一段60秒的视频按每秒5帧的关键帧密度做,就是300个关键帧,每个帧画2-3个AOI,光标注工作就是大半天。而且标注的一致性很难保证。同一段视频,同一批人在不同心情下标出来的框,边界可能差出几十个像素,这种标注者内/间信度问题在投稿时很容易被审稿人质疑。

建议只在以下场景使用:目标数量少(1-2个)、运动模式复杂且不可预测(比如野生动物跟踪)、你只需要分析某一小段关键时间窗口而不是全部视频。用 Wool 的时候可以做但不建议全程做。

2.2 几何跟随法:稳定场景下的高性价比方案

如果你研究的动态刺激物运动规律相对可预测,可以用几何跟随法。具体是在刺激物上选定若干个参考锚点(锚点可以是物体的中心点、角点或者特征点),通过程序或插件追踪锚点在每一帧的坐标,然后以锚点坐标驱动AOI的位置、大小甚至形状。

在真实研究中,最常见的是中心点追踪加固定尺寸。比如分析儿童观看动画片时的兴趣区域,你可以追踪动画主角的脸部中心,AOI就以脸部中心为中心、固定半径的圆或固定尺寸的矩形。脸部在画面中移动,AOI跟着平移,脸部靠近镜头变大,AOI却不放大——有误差,但只要误差远小于AOI本身的尺寸,对统计结果影响就可控。

这种方案的精度取决于目标特征是否稳定。人脸、高对比色块、带特征纹理的物体追踪相对靠谱。相反,如果目标快速运动导致运动模糊,或者目标频繁转角度、被遮挡,锚点追踪就会漂移,AOI也会跟着歪。

2.3 语义/模型驱动法:动态AOI的进阶形态

更高阶的做法是让AOI的生成跟目标的语义状态关联。举例来说,你不是先定义"画面坐标区域",而是定义"画面里那辆车的前挡风玻璃区域"。这需要借助外部视觉模型(比如目标检测、关键点检测模型)对刺激视频做后处理,输出目标的边界框或关键点,再把这些输出转化为AOI。

这种方法解决了两大痛点:一是显著降低标注工作量,模型自动给出每帧的物体边界框;二是可以处理目标形变,例如人体姿态变化导致"上半身"这个区域并不是一个规则矩形,模型输出的关键点序列可以驱动一个多边形AOI跟随人体姿态而变化。

代价是需要额外技术栈。你需要会跑目标检测模型(YOLO系列是入门的常见选择),需要处理模型输出,把检测框转换为你眼动分析软件能识别的AOI格式(通常是逐帧的坐标序列文件)。

三种方案的取舍我放在一起比较,你对照自己的项目情况做决定。

方法精度成本适用场景主要风险
手工逐帧标注最高人力极大目标少、运动复杂、短片段标注一致性问题
几何跟随法中高较低目标运动规律、特征稳定锚点漂移、遮挡失效
语义/模型驱动中/高需额外建模目标多、需批量处理模型检测误差传导

3. 实操流程:从数据采集到AOI跟随坐标导出的完整链路

动态AOI分析不是打开软件画框就行,它的完整链路包括采集端设计、刺激材料准备、AOI标注/生成、数据导出与清洗计算。每一环都会影响最终结果,我按实际操作的先后顺序展开。

3.1 数据采集阶段就要想好AOI怎么画

很多人是在数据采完之后才开始考虑AOI的问题,等到分析时才后悔:刺激视频的分辨率、呈现位置、甚至刺激本身的画面构图,都直接影响后续能不能准确画出动态AOI。

采集阶段有三件事需要提前规划。

第一,刺激视频的编码必须稳定。尽量用无损或高码率编码,避免压缩产生的运动模糊。眼动仪记录的是被试屏幕上的注视坐标,AOI需要跟刺激画面对齐,如果视频本身是压缩严重的低码率流,画面细节糊掉,标注时很难判断目标边界在哪。

第二,刺激呈现的位置必须固定。这里的固定不是指"放在屏幕中央就行",而是说所有被试看到的刺激必须具备完全一致的像素坐标。很多人用小窗口播放视频或者自适应缩放窗口,这就毁了。不同被试看到的画面大小、位置不同,AOI坐标就无法统一。严谨的做法是锁定刺激窗口尺寸,并用自己的测试眼动数据验证屏幕坐标系与刺激画面的对应关系。

第三,动态刺激的起始同步需要做标记。在实验编程软件(如Experiment Builder、PsychoPy)里,刺激开始播放时打一个stimulus_start事件标记,分析时拿这个标记对齐AOI时间序列和注视数据。没有这个标记同步,你花几小时画好动态AOI,最终对不上眼动数据的时间轴,一切白费。

3.2 AOI标注的操作要点:两个质量校验手段

如果你选择手工逐帧或关键帧标注,有一个操作细节值得留意:在逐帧标注时别只盯着目标物体的边界画框,要学会用"眼睛的感知"来验证。我见过不少新手把AOI画得很精细,贴着目标轮廓描,但回放时发现框在抖——每帧之间的框尺寸不一致,导致数据里出现大量"进入-离开-再进入"的噪声片段。

一个实用建议是:画完一段时间段的AOI后,把AOI叠加在原始刺激视频上,用注视点轨迹回放功能播放一遍。看到的效果要么是"框稳稳跟着目标走",要么是"框像心跳一样一鼓一鼓"。后者说明关键帧之间插值不合理或框大小标得不一致,需要返回去修正。

第二个校验手段是检查AOI覆盖率:计算每一帧上AOI的落点有效性(即该帧的AOI坐标是否在画面边界内),如果某个时间段的AOI大量落在画面外或画面边缘,大概率是目标运动太快、你的关键帧密度不够,插值跟不上目标实际位置。这时候适当加密关键帧,而不是强行靠后期平滑曲线补救。

3.3 把动态AOI导出成标准数据格式

不管用什么方式生成动态AOI,最终都必须落成标准化格式才能进入统计阶段。常见的格式是把AOI定义为一个"时间段坐标表":

时间戳(ms), AOI名称, 形状类型, 参数(x, y, w, h 或 多边形顶点序列)

Tobii Pro Lab生成的动态AOI导出就是这样的结构,SR Research的Data Viewer也支持按时间段定义AOI。如果你的工作流里有脚本参与,通常需要把这个表格解析为两个结构:一个是"时间段-空间区域"的查找表,一个是"逐帧坐标序列"用于和采样率匹配。

我个人强烈建议先把AOI的定义数据和眼动采样数据分开处理,在最后一步合入时再合并。原因很简单:AOI数据的粒度是按关键帧/时间段(毫秒-帧级别),而眼动数据是按采样率(比如250Hz,即4毫秒一个注视样本点)。两者直接合并会产生大量重复插值运算,而且在AOI定义边界处容易出现对齐误差。先保持独立,最后按时间戳做最近邻匹配,既清晰又稳定。

4. 数据分析阶段的高频错误与排查方法

动态AOI分析的数据处理阶段,坑比静态分析多得多。这里列出的几个问题是我在实际项目里反复遇到的,也是论文审稿时最容易挑出来的问题。

4.1 时间对齐:毫秒级的误差会被AOI边界放大

眼动跟踪在动态场景下的时间同步误差比静态更致命。静态图片里,注视点即使时间戳偏了50毫秒,落在的AOI大概率还是同一个;但在快速运动的动态刺激中,目标一秒可能移动上百像素,50毫秒就是5-10个像素的位置偏移,如果AOI边界很窄,一个真实的落点可能被判为落在AOI外,或者反过来。

所以分析前必须做时间对齐验证。最直接的办法是:用几个已知"被试一定在看目标"的时刻来做验证,比如刺激视频中目标突然出现或突然变亮的位置,检查这些时刻的注视点是否都落在对应AOI内。如果存在系统性的偏移(比如所有注视点都偏在目标右上方),优先检查眼动仪与屏幕的校准质量,其次检查刺激标记与眼动数据之间的延迟补偿设置。

4.2 眨眼与数据丢失:动态场景丢失率天然更高

被试眨眼、眼动仪跟踪丢失(特别是自由观看视频时头部移动),在动态实验里更频繁。静态实验里,丢失的样本一般直接当作无效剔除,损失不大,但动态场景里如果目标快速运动,丢失前的最后一个注视点很可能已经被外周视觉引导到目标即将到达的位置,直接剔除这一段会把目标接近效应的数据都丢光。

更稳妥的处理方式是分类型对待:眨眼导致的丢失(特征为瞳孔信号短暂消失后恢复)可以插值或剔除,但跟踪漂移导致的注视点大幅跳变则先做滤波再决定去留。Tobii等系统导出的数据里通常有有效性标记(validity code),建议按有效性标记分段处理,而不是一刀切。

4.3 AOI重叠:动态场景里的冲突规则要提前定

静态分析里如果两个AOI重叠了,实验者还能手动调一下边界,但动态AOI在运动过程中难免出现短暂重叠——两个目标擦肩而过时,它们的AOI一定会重叠一段时间。这时候落在重叠区域的注视点到底算谁?如果统计脚本不做规则约定,这些点会被重复计入两个AOI,导致总时长数据虚高。

我的做法是在分析脚本里明确设置优先级规则。最常见的规则是"重叠区域归先进入的目标"或"所有AOI不互斥,分别统计"。到底选哪种取决于研究问题:如果是比较两个竞品在画面中的受关注度,互斥归因更公平;如果只是想了解"是否注意到该区域",不互斥也无妨。关键是规则必须在处理脚本里写清楚,并在方法部分说明,别留到写论文时再糊弄。

4.4 动态AOI的插值平滑:别把人为误差做成"高精度"

当AOI由关键帧插值生成时,插值算法选择会影响最终结果。线性插值最常用,但如果目标物体的运动不是线性的(比如有加速、减速、拐弯),线性插值会让AOI在目标运动拐点处明显滞后或提前。解决思路是:在运动模式复杂的片段手工打关键帧,在平缓片段用插值。千万不要全片统一用一种参数然后祈祷效果良好。

我见过有人尝试用Savitzky-Golay滤波对AOI坐标序列做平滑,确实能让路径看起来顺畅很多,但平滑后的AOI位置和真实目标位置之间会产生系统偏移,追逐运动任务里,这种平滑会让"目标追踪的注视滞后"被虚假缩小。如果你要研究的是追踪表现或预期性注视,那就别做任何坐标平滑。

5. 动态AOI下的指标计算与解读逻辑

AOI体系下的核心指标:总注视时长、平均注视时长、首次注视进入时间、访问次数、访问顺序,在动态场景下的含义跟静态完全不同。按静态的默认理解去解读,很容易得出误导性结论。

5.1 时间归一化:总停留时长必须按有效时间算

静态实验里,刺激呈现时间对所有被试是固定的,计算AOI停留时长比例时,分母就是总刺激时间。动态场景下,由于每个被试的眼动数据质量不同(丢失段长短不一),"有效观看时间"因人而异。此时如果仍统一用刺激总时长做分母,会有误差。

正确做法是把每次AOI内停留时长除以该被试的有效样本时长(总样本数减去丢失/眨眼样本数),再乘以试验总时长,得到标准化的时长指标。严格一点的论文会报告有效数据比例,低于某个阈值(如70%)的被试数据应当被排除。

5.2 动态场景中"首次进入时间"的边界条件

静态场景里,首次进入时间(TTFF,Time to First Fixation)计算简单:从刺激开始到被试首次注视落入AOI的时刻。动态场景则有个新问题:如果一个AOI在视频一开始根本不在画面里(目标还没入场),那"首次进入时间"应该从目标出现那一刻算起,还是从视频开始算起?

这直接决定了结果的解释方向。如果研究的是广告中"产品出现后多久被试注意到它",那应该从产品出现时刻(AOI变为可见时刻)算TTFF;如果研究的是"被试在场景里是否能快速找到目标",则应从视频开始算。实操中,务必把AOI出现的时间点单独记录,并据此重设TTFF起点。很多商业软件不会自动处理这个问题,需要你在导出数据后自行重算。

5.3 访问顺序与转移矩阵:动态场景里更有信息量

动态刺激相比静态的一个优势是:你可以研究注视频次如何在不同动态目标间切换,以及这种切换是否与目标运动事件(如碰撞、变道、弹窗出现)密切相关。这个维度的分析在静态中做不出太多花样,动态场景却有大量文章可做。

实现思路是:先按时间把注视序列切分,然后统计连续两次注视落入的AOI对,形成转换矩阵。再进一步,可以针对特定事件(比如视频中产品突然变色的一瞬间)做事件前后对比,看转移模式是否显著改变。这也是动态AOI分析真正超过静态分析的学术价值所在。

5.4 动态场景凝视点与AOI匹配的延迟问题

最后一个需要注意的指标解读陷阱是"注视点与AOI的匹配时点"。眼动仪输出的注视点已经经过降噪处理,给出的通常是"注视片段"的起止和中心位置。有些人在分析时将整个注视片段归类到注视中心点所在的AOI,这在动态AOI下风险很大:一个持续300毫秒的长注视,期间目标可能已经移动了一段距离,用户从中心点来看确实在AOI A里,但注视的前半段处理的可能是AOI B的信息。

从目前主流软件习的做法来看,普遍还是用"注视点中心位置匹配单一AOI"。如果你的研究对时间敏感(比如驾驶中的分心研究),建议更细粒度地处理:把长注视拆成短片段,或者在计算每种指标时使用不同匹配口径(中心匹配vs.整体重叠匹配),并在论文里同时报告两者的结果。别小看这个细节,同一个数据集用两种口径算出的结论可能是相反的。

6. 动态AOI研究的通用工作流与经验工具选型

做动态AOI分析时,选择顺手的软件/工具会明显影响效率。我按工作流阶段把常用的方案列出来,帮你找到自己项目里最合适的路径。

6.1 眼动设备厂商自带工具:Tobii Pro Lab与Data Viewer

Tobii Pro Lab是目前做动态AOI最成熟的商业方案之一。它的动态AOI功能允许你逐帧调整AOI位置、形状,支持插值生成中间帧的AOI,还可以将动态AOI的时间轴与事件标记对齐,导出逐帧的AOI落点汇总表。缺点是不同版本的交互差异较大,且动态AOI功能不是所有许可都解锁,使用前确认版本权限。

SR Research的Data Viewer与EyeLink硬件配合,也提供类似的逐帧AOI定义功能。EyeLink的动态AOI方案偏向"时间段切分",需要你提前定义好时间段内的AOI坐标,适合用几何跟随法的场景。

6.2 半自动工作流:Python + OpenCV + 眼动软件输出

如果你愿意写一点脚本,可以大幅提升动态AOI生成效率。我的常见做法是:

  • 用OpenCV或相关视觉库对刺激视频做目标检测/特征点追踪,输出目标的逐帧边界框或关键点坐标;
  • 将坐标序列按实验定义的时间窗口缝合为AOI时间段表;
  • 把该表导入到眼动分析软件(或直接用Python读取眼动原始样本),按照前述的时间戳匹配规则计算AOI内指标。

这个流程最大的优势是:标注规则是代码化的,全程可复现,修改参数后重新跑一遍就能更新全部AOI数据,比手动重画一周高效得多。

6.3 开源/在线眼动分析工具:可用但要确认格式

开源工具里,OpenGaze、PyGaze适合刺激呈现和数据采集,但做动态AOI标注和管理都偏弱。有一些在线平台(如GazePoint分析平台)支持一定程度的动态AOI,但格式兼容性和指标算法透明度仍需逐一验证。我的建议是:如果你的项目不复杂,用商业工具省心;如果项目复杂、需要批量化处理,就把重心放在代码化流程上。

6.4 通用数据格式建议:为论文复现做好铺垫

无论是哪种工具,务必在分析最开始就确定统一的数据结构。我习惯用如下目录组织:

  • raw/:眼动原始数据、刺激视频、事件标记文件;
  • aoi/:AOI定义文件(逐帧坐标序列、时间段-区域表)、AOI生成脚本;
  • processed/:按被试/试验合并后的AOI指标数据;
  • analysis/:统计脚本和输出图表。

这样在几年后拿到数据集重跑分析时,你还能清楚还原每一步是怎么做的。很多人的动态AOI研究出现"结果无法复现"的悲剧,根源就是AOI定义和数据口径存在太多临时手动调整,过程完全没有脚本记录。

7. 项目落地中的几个实在建议

最后说点这几年做动态AOI研究攒下来的通用建议,不一定适用于所有场景,但值得你在开工前认真考虑。

第一,能用静态AOI讲清楚的问题,别硬上动态AOI。动态AOI在标注、分析、解释上增加的成本是隐性的,很容易低估。如果你的研究问题其实是"用户是否注意界面中的某个功能区域",而这个区域在交互过程中只是替换内容而位置不变,那静态AOI划分足以解决问题。动起来的是内容,不是区域,别把动态内容和动态AOI混淆。

第二,正式标注前先做预标注,并检查标注的重测信度。动态AOI尤其是手工标注的情况下,操作者疲劳后很容易出现框的抖动、大小漂移。建议选一段5秒的片段,隔天重复标注,对比两次标注的重合率(可以用IoU,即交并比来衡量),低于0.7就要警惕。这个步骤能在早期发现标注质量劣化,而不是等分析完才发现数据有问题。

第三,投稿前把AOI的定义规则写清楚。论文的方法部分至少包括:动态AOI生成方式(手工/几何跟随/模型)、AOI形状与大小定义依据、关键帧密度或插值策略、AOI重叠归属规则、时间对齐验证结果。审稿人看到这些细节,基本不会揪着"你怎么定义AOI"不放。

第四,如果做动态AOI是为了研究人类观看动态视频的底层机制,可以考虑把"动态视觉显著性模型"(利用深度学习预测注视显著性的模型)的输出也作为对照分析。虽然动态显著模型并不直接给出AOI,但它可以帮你验证:你的动态AOI划分和一般视觉注意力的预测是否吻合,避免AOI边界设置与人类注意机制明显冲突,凭空制造出一些"显著效应"或者掩盖真实的效应。

眼动数据分析动态刺激物这块的门槛不低,但也不是玄学。把AOI和时间对齐这两件事做扎实,你就已经超过了九成直接拿软件默认参数硬跑的人。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/4 14:27:57

npm install 安装慢?把 registry 改到 TaoToken 统一通道的配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/4 14:26:13

Android蓝牙底层开发:从Framework到HAL的13节核心解析

1. 蓝牙更新13节——这套Framework到HAL的内容到底在讲什么先说个背景。我们这个系列一直盯着Android系统底层,从Framework到HAL再到具体平台适配。标题里写"蓝牙更新13节"的时间是2019年6月5日,那个时间点恰好是Android 9已经大面积铺开、And…

作者头像 李华
网站建设 2026/10/4 14:26:08

打字侠邀请码tanjie实测:从40字到90字的提速方法与瓶颈突破

打字侠这个软件,我用邀请码 tanjie 注册了之后,前后练了差不多三个月,从每分钟 40 字左右提升到稳定 90 字,中间踩了不少坑,也摸出了一些门道。这篇就把我的实际使用过程、对邀请码机制的理解、以及练习时总结出来的技…

作者头像 李华
网站建设 2026/10/4 14:24:05

鸿蒙应用中的Flutter堆叠布局:从按钮、徽章到卡片叠加的实战拆解

1. 项目概述与方案选型我最近在做鸿蒙应用时被一类需求折腾得够呛:设计稿里满屏都是“不规矩”的 UI,带图标的渐变按钮、右上角挂红色数字的图标、好几张卡片叠在一起的效果。头两天用 ArkUI 的 Row、Column 去拼,嵌套特别深,页面…

作者头像 李华