下面是一个 CSV 文件的表头,来自 Pupil Labs 的眼动眼镜 Neon1:
timestamp [ns], pupil diameter left [mm], pupil diameter right [mm],eye ball center left x [mm], ..., eyelid aperture left [mm], eyelid aperture right [mm]戴上它走一圈,导出的 3d_eye_states.csv 里每秒有 200 行,每一行都有左右两只眼的瞳孔直径,单位是毫米。
这让人有点意外。一副眼镜上的摄像头离眼睛只有两三厘米,还是从镜框边上斜着拍的,它怎么量得出毫米?我们平时说的“智能眼镜”,比如能拍照、能和 AI 说话的 Ray-Ban Meta,也能做到吗?就算量出来了,走在街上忽明忽暗,这个数又能说明什么?
上一篇讲注意力的文章最后提到,想像 HRV 一样戴着就测注意力,瞳孔是最好的候选,只是光照干扰让它离日常使用还远(见《心跳越不规律越健康,那注意力呢》)。这一次我们就拿着这副眼镜,看看“远”到底远在哪里。
先交代几个后文反复用到的词。瞳孔是虹膜(眼睛里有颜色的那一圈)中间的圆孔,光从这里进入眼睛;它的大小由两块肌肉控制,一块收缩、一块扩张,都不受意识支配。眼动追踪是用摄像头算出眼睛在看哪里,瞳孔测量(pupillometry)则是量瞳孔有多大。两件事用的是同一套摄像头,但难度不一样。
一、眼镜怎样看见瞳孔
现象:大多数智能眼镜根本没有看眼睛的摄像头
先回答最直接的问题。Ray-Ban Meta 这一类 AI 眼镜,摄像头都朝外,用来拍照和让 AI “看见”你面前的东西。2025 年发布的 Meta Ray-Ban Display 加了一块单眼显示屏,公开的规格里仍然只有一颗朝外的 1200 万像素摄像头,操控靠手腕上读肌电的 Neural Band,而不是眼睛2。没有朝内的摄像头,就谈不上看瞳孔。
能看瞳孔的,是另一类设备:研究用的眼动眼镜(Pupil Labs Neon、Tobii Pro Glasses 3、Meta 的 Aria Gen 2),以及带眼动追踪的头显(Apple Vision Pro、HTC Vive Pro Eye)。它们的共同点是,镜框或镜片周围装着朝内的红外摄像头和红外 LED。
原理:在红外图像里找最暗的一块
为什么用红外?一是人眼看不见红外光,LED 一直亮着也不晃眼,暗处也能拍;二是在红外下,虹膜不管是什么颜色都比较亮,而瞳孔是一个通往眼底的洞,光照进去几乎不反射出来,于是成了整张图里最暗的一块。算法要做的,就是把这块暗区分割出来,沿边缘拟合一个椭圆。图像里另外还有一两个小亮点,那是 LED 在角膜表面的反光,追踪视线时会用到。
以 Neon 为例,每只眼一个红外摄像头,分辨率只有 192×192 像素,每秒 200 帧,每只眼配一个红外 LED3。
注意摄像头的位置:它装在镜框下沿,从下往上斜着拍。眼镜不可能把摄像头放在眼睛正前方,否则会挡住视线。所以即使我们平视前方,摄像头拍到的瞳孔也不是正圆,而是一个椭圆。
拍到的是一个几十像素宽的椭圆,那它是怎么变成“4.6 毫米”的?
二、从像素到毫米
现象:瞳孔没变,图像里的大小却变了
最直觉的办法是数像素:椭圆越大,瞳孔越大。可是同一个瞳孔,在图像里的大小会因为跟瞳孔无关的原因而变化。
- 眼球一转,瞳孔这个圆片相对摄像头倾斜,投影出来的椭圆变扁。只按几何算,视线偏离摄像头轴 40° 时,短轴缩到 cos 40° ≈ 0.77 倍。
- 眼镜一滑,摄像头离眼睛远了一点,整个瞳孔看上去就小了一圈。Neon 白皮书里,镜架沿视线方向移开 5 毫米,按像素算的瞳孔大小就下降了一成以上3。
- 角膜是一块透镜。我们从外面看到的瞳孔,其实是隔着角膜看到的放大像,放大多少又跟观察角度有关。
这几种效应合称瞳孔投影缩短(pupil foreshortening)。它在桌面眼动仪上就已经很明显4,在眼镜上更麻烦:摄像头离眼睛近、角度斜,人又在走动,眼镜会顺着鼻梁慢慢往下滑。白皮书举了一个例子:做一个持续几小时的疲劳实验,眼镜慢慢滑下去,表观瞳孔跟着变小,很容易被误读成“人疲劳了”3。
第一次尝试:量椭圆的长轴
既然眼球转动只会把圆压扁,那么取椭圆的长轴,不就绕开了吗?圆片倾斜时,和转轴平行的那条直径长度不变。
可惜这只在没有角膜、摄像头离得很远的理想情况下成立。Pupil Labs 的 Petersch 和 Dierkes 用光线追踪模拟了头戴式眼动仪的成像:视线偏离到约 50° 时,长轴法会把瞳孔低估最多 7.5%5。
第二次尝试:先重建眼球,再求瞳孔
更进一步的办法是3D 眼球模型。眼球在转,但眼球中心在眼眶里基本不动;从一段视频里的许多个椭圆,可以反推出眼球中心的位置,再把每一帧的椭圆还原成三维空间里一个真实的圆,它的直径就是瞳孔大小。这是 Świrski 提出的方法,开源的 Pupil Core 一直在用。
但它忽略了角膜折射,结果反而高估,视角越大高估越多。把角膜折射也算进去(用标准眼模型的四个参数:眼球半径、虹膜半径、角膜曲率半径和折射率),人群平均的误差能压到 ±1%;落到具体某个人身上,仍然有 2.5%–4% 的偏差,因为每个人的眼睛和“标准眼”不完全一样5。
| 算法 | 怎么算 | 视线偏到约 50° 时 |
|---|---|---|
| 椭圆长轴 | 直接取图像里椭圆的长轴 | 低估,最多 7.5% |
| 3D 眼球模型 | 从多帧椭圆反推眼球中心,再还原成三维的圆 | 高估,个体 3%–7.5% |
| 3D 模型 + 角膜折射 | 再用标准眼的四个参数修正折射 | 人群平均 ±1%,个体仍差 2.5%–4% |
数据来自 Petersch 与 Dierkes 2022,视角用瞳孔椭圆的圆度 0.4 换算。
解决:让网络直接学一个“个人化”的眼球
Neon 在这条路上又走了一步:用一个叫 NeonNet 的神经网络直接从眼图估计三维眼球状态,并约束它和一个个人化的、带光学参数的眼球模型一致,不需要用户先校准3。按白皮书的测试,水平方向 ±40° 内,人群平均的视角误差小于 5%;垂直方向 ±15° 内也小于 5%;镜架移开 5 毫米,几乎没有影响。
这也解释了为什么上一代产品 Pupil Invisible 干脆不输出瞳孔大小。它的摄像头装在镜腿根部,角度更斜,Pupil Labs 的工作人员在社区里的答复是:“因为摄像头角度,2D 瞳孔检测不够稳定,建不出好的 3D 眼模型”6。同一家公司、同样是眼镜,测视线可以,测瞳孔不行,难点就在这一步。
需要说明的是,Neon 的数字来自厂商自己的白皮书,没有经过同行评审。Tobii Pro Glasses 3 也说自己报告的是瞳孔的物理大小(毫米),而不是从外面看到的表观大小7,但没有公开同样细的误差数据。
误差压到 5% 以内,对 4.6 毫米的瞳孔来说约是 0.2 毫米。这够不够用?要看我们想测的那个变化有多大。
三、瞳孔为什么会变
光照:瞳孔最主要的工作
瞳孔首先是一个光圈。它的直径大约在 2 到 8 毫米之间变化,进光量相差十几倍8。从暗处走到太阳下,瞳孔会在一秒左右缩到很小,这叫瞳孔光反射。光照能带来的变化最大约 6 毫米9。
除此之外还有两种跟“想事”无关的变化。一是近反射:看近处时,双眼向内聚、晶状体变凸,瞳孔也会跟着缩小,让近处的东西看得更清楚。二是自发波动:即使光照不变、人不动,瞳孔也在一直轻微地变,其中有一个约每 3–5 秒一次的节律,叫瞳孔震颤(hippus)。
想事:小,但很稳定
在光照不变的条件下,瞳孔还会随“心里的事”变化。Kahneman 在 1973 年的《注意与努力》里就拿瞳孔扩张当作“心理努力”的主要指标:记的数字越多,瞳孔越大10。上一篇文章里讲过,这背后是脑干里的蓝斑:它释放去甲肾上腺素调节警觉程度,瞳孔大小和它的活动同步。
但这个变化很小。做心算这类费脑的任务时,瞳孔最多扩张约 0.5 毫米9。把几种变化放在同一把尺子上,就能看出问题在哪:
暗室里,眼镜已经测得出来
所以第二节的问题有了答案:在光照不变的暗室里,约 0.2 毫米的误差比 0.5 毫米的信号小,眼镜够用。Neon 白皮书在暗室里复现了三个经典结果:瞳孔震颤的频率在 0.18–0.26 Hz 之间;屏幕闪亮后约 0.22–0.27 秒瞳孔开始收缩;做 n-back 记忆任务(看一串字母,判断当前字母是否和 N 个之前的相同,N 越大越费脑)时,8 名受试者全都在最难的 2-back 时瞳孔最大3。
可是,一旦走出暗室,光照的变化就是这个信号的十几倍。走过一片树荫、抬头看一眼窗外、手机屏幕亮一下,都足以淹没“想事”带来的那一点扩张。
那能不能把光照的那一部分算出来,从测得的瞳孔里减掉?
四、扣除光照的影响
第一次尝试:只在光照稳定时用
最简单的办法是绕开问题:只在光照不变的时候看瞳孔。实验室就是这么做的,暗室、固定屏幕亮度、下巴托。可如果只能在暗室里用,眼镜就失去了“戴着就测”的意义。
第二次尝试:先预测光照该让瞳孔多大
更积极的思路是:既然光照对瞳孔的影响有规律,就先根据看到的亮度预测一个瞳孔大小,再看实际测得的比它大了多少。
预测的公式早就有人总结过。Watson 和 Yellott 2012 年综合了七个旧公式,给出一个统一公式,输入亮度、视野里亮区的大小、年龄、单眼还是双眼受光,输出瞳孔直径11。问题在于眼镜上怎么知道“看到的亮度”。
- 用场景摄像头和亮度传感器。 挪威的 Pignoni 等人在眼动仪上加了一个头戴亮度传感器,结合第一视角视频和注视点,估计“光照下应有的瞳孔”,把它当作认知负荷的基线12。这套方法在实验室的受控画面里验证过,后来被同一团队用在直升机驾驶和舰船航行演练中。
- 用渲染出来的画面。 在 VR 头显里,画面每个像素有多亮是已知的。Eckert 等人在 VR 里给每个人做一条“亮度→瞳孔”的个人曲线:先用 6 秒一档、顺序打乱的灰屏校准,再用注视区和背景的加权亮度去查这条曲线,效果最好13。
把这些拼起来,就是眼镜上扣除光照的大致流程:
眼镜上难在哪里
这条流程在 VR 里比在眼镜上容易,原因是 VR 的光源完全由程序控制。换到眼镜上,至少有三处麻烦(下面三条是根据上述研究推断的,没有找到专门的验证):
- 场景摄像头不是测光表。 它会自动调曝光,拍出来的明暗不等于真实亮度;要么锁定曝光、做亮度标定,要么另加一个校准过的环境光传感器。Aria Gen 2 就带了这样一个传感器,还能用紫外通道分辨室内和室外14。
- 瞳孔看的是注视点附近。 同一个场景,盯着窗户和盯着桌面,进眼的光差得很远,所以必须用眼动追踪的注视点去取亮度,而不是整张画面的平均值。
- 看远近也要扣。 近反射会让瞳孔缩小,需要用两只眼的视线交点(辐辏点)估出注视距离再修正。Aria Gen 2 的眼动输出里正好有辐辏点14,但还没见到有人把它用于瞳孔校正。
所以这个问题目前只有一个保守的答案:技术路线是清楚的,从暗室走到真实街道的那一步,目前还停在实验室和 VR 里。
就算这些都能做,为什么我们手上的眼镜还是拿不到这个数?
五、手上的眼镜为什么拿不到这个数
把前面提到的设备排在一起,答案分成两类:要么没有看眼睛的摄像头,要么有,但数据不给你。
| 设备 | 朝内的眼摄像头 | 瞳孔直径 | 谁能拿到 |
|---|---|---|---|
| 消费级 AI 眼镜 | |||
| Ray-Ban Meta、Meta Ray-Ban Display | 没有 | 无从谈起 | |
| 研究用眼动眼镜 | |||
| Pupil Labs Neon | 每只眼 1 个,200 Hz | 毫米 | 买设备的研究者 |
| Pupil Labs Invisible | 有,角度很斜 | 不输出 | — |
| Tobii Pro Glasses 3 | 有 | 毫米 | 买设备的研究者 |
| Meta Aria Gen 2 | 有 | 输出 | 申请通过的研究者 |
| 头显 | |||
| HTC Vive Pro Eye | 有 | 毫米 | 开发者(SDK 接口) |
| Apple Vision Pro | 有 | 系统内部使用 | 不给 App |
Ray-Ban 两款按公开规格整理,规格里只有朝外的摄像头。
为什么消费级眼镜不装? 公开资料里没有厂商的解释,以下是推断。一副要整天戴的眼镜,重量、续航和外观都很紧张;朝内的摄像头和 LED 要一直工作,还要实时跑眼模型,耗电不小。对这类眼镜现在的主要用途(拍照、听歌、问 AI),看视线和瞳孔的收益不足以抵消这些成本。
为什么装了也不给? Vision Pro 有一整套 LED 和红外摄像头盯着眼睛,但 Apple 的隐私说明写得很直白:“你的眼睛输入不会分享给 App、网站或 Apple”15,App 只知道你最后用手指捏合选中了什么。这和本文讲的瞳孔直接相关:如果瞳孔能反映认知负荷和唤醒程度,那么一个能实时读瞳孔的广告或应用,就能知道你看到什么时心里一动。反过来,Vive Pro Eye 这类面向开发者的头显,SDK 里直接有返回瞳孔直径的接口16。
六、回到注意力
现在可以回答上一篇留下的那个“远”了。想用眼镜像 HRV 一样被动地看注意力,要过三关:
- 有没有摄像头。 消费级 AI 眼镜现在没有,研究用眼镜有。
- 量不量得准。 带角膜折射的 3D 眼模型已经能把误差压到 5% 以内,暗室里足以测出 n-back 级别的认知负荷。这一关基本过了。
- 能不能扣掉光照。 这是真正的距离。光照带来的变化是认知信号的十几倍,扣除的方法在 VR 和受控实验里可行,在真实街道上还没有被验证。
一个折中的想法是,像 HRV 的晨测一样,不追求全天连续,而是每天在同一个光照稳定的场景(比如固定的书桌前)测几分钟,比较自己不同日子、不同时段的变化。上一篇提到的瞳孔困倦测试就是这样做的:暗室里盯着看 11 分钟,困了以后瞳孔会出现缓慢的大幅波动。这只是推断,还没有见到有人用眼镜这样做。
小结
- 智能眼镜能看到瞳孔吗? 要有朝内的红外摄像头。研究用眼动眼镜和部分头显有,Ray-Ban Meta 这类消费级 AI 眼镜没有。
- 斜着拍的像素怎么变毫米? 眼球转动、眼镜滑动和角膜折射都会改变图像里的瞳孔大小。量长轴、3D 眼球模型都不够,要把角膜折射算进去,人群平均误差才压到约 ±1%,Neon 在真实佩戴下做到 5% 以内。
- 瞳孔为什么会变? 主要是光照(最多约 6 mm),还有看远近和自发波动;想事带来的扩张最多约 0.5 mm。暗室里误差比它小,眼镜已经测得出来。
- 街上能不能扣掉光照? 思路是先按注视点亮度预测光照该有的瞳孔,再看残差。VR 和实验室里可行,眼镜上还缺测光、注视点取亮度和近反射修正的验证。
- 为什么拿不到? 消费级眼镜因为重量、续航没装;装了的头显出于隐私不开放;能拿到数据的设备都在研究者手里。
参考资料
Footnotes
-
Neon Data Format收藏docs.pupil-labs.com
3d_eye_states.csv的字段:瞳孔直径、眼球中心、光轴方向、眼睑开度https://docs.pupil-labs.com/neon/data-collection/data-format/ ↩ -
Meta's new smart glasses come with a screen and AI收藏ubergizmo.comMeta Ray-Ban Display:单眼显示、一颗朝外的 12MP 摄像头、Neural Band 腕带操控https://www.ubergizmo.com/2025/09/meta-smart-glasses-screen-ai ↩
-
Neon Pupillometry Test Report: an evaluation of Neon's pupillometry feature收藏zenodo.org厂商白皮书,未经同行评审。每只眼 192×192 像素、200 Hz 红外摄像头;视角依赖 <5%,镜架位移 5 mm 几乎无影响https://zenodo.org/records/10057185 ↩ ↩2 ↩3 ↩4 ↩5
-
Mapping and correcting the influence of gaze position on pupil size measurements收藏pmc.ncbi.nlm.nih.gov桌面眼动仪 + 人造眼:注视位置带来的瞳孔大小误差,用余弦几何模型修正https://pmc.ncbi.nlm.nih.gov/articles/PMC4637269/ ↩
-
Gaze-angle dependency of pupil-size measurements in head-mounted eye tracking收藏pmc.ncbi.nlm.nih.gov长轴法、Świrski 3D 模型、带角膜折射的 3D 模型三种算法的视角误差对比https://pmc.ncbi.nlm.nih.gov/articles/PMC9046372/ ↩ ↩2
-
Pupil Labs community chat: #invisible, September 2022收藏chat-archive.pupil-labs.com工作人员答复:Pupil Invisible 不输出瞳孔数据,因为摄像头角度太斜,2D 瞳孔检测不够稳定https://chat-archive.pupil-labs.com/logs/invisible/2022/09/ ↩
-
Pupil diameter收藏developer.tobiipro.comTobii 报告的是瞳孔的物理大小(毫米),不是从外面看到的表观大小https://developer.tobiipro.com/commonconcepts/pupildiameter.html ↩
-
Pupillometry: psychology, physiology, and function收藏journalofcognition.orghttps://journalofcognition.org/articles/10.5334/joc.18 ↩
-
Workload assessment for mental arithmetic tasks using the task-evoked pupillary response收藏peerj.com引言:认知任务让瞳孔扩张最多约 0.5 mm,光照引起的最大变化约 6 mm(引自 Beatty & Lucero-Wagoner 2000)https://peerj.com/articles/cs-16/ ↩ ↩2
-
Attention and Effort ↩
-
A unified formula for light-adapted pupil size综合七个旧公式,输入亮度、视场大小、年龄、单眼或双眼 ↩
-
Accounting for effects of variation in luminance in pupillometry for field measurements of cognitive workload场景视频 + 头戴亮度传感器 + 注视点,预测光照下的瞳孔,作为认知负荷的基线 ↩
-
Pupillary light reflex correction for robust pupillometry in virtual realityVR 里的个人亮度→瞳孔映射;注视区与背景加权最好,6 秒一档的校准序列最稳 ↩
-
Inside Aria Gen 2: explore the cutting-edge tech behind the device收藏meta.comhttps://www.meta.com/blog/aria-gen-2-research-glasses-under-the-hood-reality-labs/ ↩ ↩2
-
Eyes, Hands & Privacy收藏apple.comhttps://www.apple.com/legal/privacy/data/en/eyes-hands/ ↩
-
Vizard reference: Vive Pro收藏docs.worldviz.comVive Pro Eye 的
getPupilDiameter()返回每只眼的瞳孔直径(毫米)https://docs.worldviz.com/vizard/latest/VivePro.htm ↩