下面是一個 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 和實驗室裡可行,眼鏡上還缺測光、注視點取亮度和近反射修正的驗證。
- 為什麼拿不到? 消費級眼鏡因為重量、續航沒裝;裝了的頭顯出於隱私不開放;能拿到資料的裝置都在研究者手裡。
參考資料
參考資料
-
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 ↩