Gaze-LLE:Foundation Model驱动的零样本视线估计

引言:Foundation Model改写视线估计

传统视线估计需要:

  • 大规模标注数据(ETH-XGaze: 110万张图)
  • 特定域训练(车内环境)
  • 耗时调参(学习率、数据增强)

Foundation Model的颠覆

  • 零样本能力:无需标注数据
  • 跨域泛化:无需重新训练
  • 即插即用:冻结预训练模型

Gaze-LLE(CVPR 2025 Highlight)是首个将Foundation Model应用于视线估计的工作,实现了零样本跨域泛化


一、DINOv2:视觉Foundation Model

1.1 DINOv2核心思想

自监督学习

  • 无需标签,从海量图像中学习通用特征
  • 通过掩码图像建模(MIM)和对比学习
  • 学到的特征具有语义性空间性

DINOv2 vs DINO v1

特性 DINO v1 DINOv2
训练数据 1.4B图像 14.2B图像
模型规模 ViT-B/16 ViT-g/14
特征质量 中等 SOTA
零样本能力

1.2 DINOv2特征可视化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import torch
from transformers import AutoModel, AutoImageProcessor

# 加载DINOv2
model = AutoModel.from_pretrained('facebook/dinov2-base')
processor = AutoImageProcessor.from_pretrained('facebook/dinov2-base')

def extract_features(image):
"""
提取DINOv2特征
"""
inputs = processor(images=image, return_tensors="pt")

with torch.no_grad():
outputs = model(**inputs)
features = outputs.last_hidden_state # [B, 257, 768]
# 257 = 256 patches + 1 CLS token
# 768 = feature dimension

return features

# 特征可视化
image = load_image('driver.jpg')
features = extract_features(image)

# CLS token - 全局特征
global_feature = features[0, 0, :] # [768]

# Patch tokens - 局部特征
patch_features = features[0, 1:, :] # [256, 768]

1.3 为什么DINOv2适合视线估计?

特性 说明
空间感知 Patch tokens保留空间位置信息
语义理解 自动识别眼睛、鼻子、嘴巴等关键部位
跨域鲁棒 在各种光照、姿态下表现稳定
零样本泛化 无需微调即可在新场景工作

二、Gaze-LLE架构

2.1 整体设计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
输入图像 + 头部位置

┌─────────────────────────────────┐
│ Frozen DINOv2 Encoder │
│ - 无需训练 │
│ - 输出: [B, 257, 768] │
└─────────────────────────────────┘

┌─────────────────────────────────┐
│ Feature Projection │
│ - Linear: 768 → 256 │
│ - 降低维度 │
└─────────────────────────────────┘

┌─────────────────────────────────┐
│ Head Position Embedding │
│ - 编码头部位置 │
│ - 与图像特征融合 │
└─────────────────────────────────┘

┌─────────────────────────────────┐
│ Lightweight Gaze Decoder │
│ - 仅需训练这部分 │
│ - 2层Transformer │
│ - 参数量: <1M │
└─────────────────────────────────┘

┌─────────────────────────────────┐
│ Gaze Heatmap │
│ - 预测视线落点 │
│ - 分辨率: 64×64 │
└─────────────────────────────────┘

2.2 核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import torch
import torch.nn as nn
from transformers import AutoModel

class GazeLLE(nn.Module):
def __init__(self, dino_dim=768, proj_dim=256, num_heads=8):
super().__init__()

# Frozen DINOv2 Encoder
self.dino = AutoModel.from_pretrained('facebook/dinov2-base')
for param in self.dino.parameters():
param.requires_grad = False # 冻结

# Feature Projection
self.proj = nn.Linear(dino_dim, proj_dim)

# Head Position Embedding
self.head_embed = nn.Sequential(
nn.Linear(4, proj_dim), # [x, y, w, h]
nn.ReLU(),
nn.Linear(proj_dim, proj_dim)
)

# Lightweight Gaze Decoder
decoder_layer = nn.TransformerDecoderLayer(
d_model=proj_dim,
nhead=num_heads,
dim_feedforward=proj_dim * 2,
dropout=0.1
)
self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=2)

# Gaze Heatmap Head
self.heatmap_head = nn.Sequential(
nn.Linear(proj_dim, 512),
nn.ReLU(),
nn.Linear(512, 64 * 64)
)

def forward(self, image, head_bbox):
"""
image: [B, 3, 224, 224]
head_bbox: [B, 4] - [x, y, w, h] normalized
"""
B = image.size(0)

# 1. DINOv2特征提取(冻结)
with torch.no_grad():
dino_features = self.dino(image).last_hidden_state
# [B, 257, 768]

# 2. 特征投影
features = self.proj(dino_features) # [B, 257, 256]

# 3. 头部位置编码
head_features = self.head_embed(head_bbox) # [B, 256]
head_features = head_features.unsqueeze(1) # [B, 1, 256]

# 4. 融合头部位置与图像特征
features = torch.cat([head_features, features], dim=1)
# [B, 258, 256]

# 5. Lightweight Decoder
# 使用head token作为query
query = features[:, 0:1, :].transpose(0, 1) # [1, B, 256]
memory = features[:, 1:, :].transpose(0, 1) # [257, B, 256]

decoded = self.decoder(query, memory) # [1, B, 256]
decoded = decoded.transpose(0, 1) # [B, 1, 256]

# 6. Gaze Heatmap
heatmap = self.heatmap_head(decoded.squeeze(1)) # [B, 4096]
heatmap = heatmap.view(B, 1, 64, 64) # [B, 1, 64, 64]

return heatmap

# 使用示例
model = GazeLLE()
image = load_image('driver.jpg')
head_bbox = torch.tensor([[0.3, 0.2, 0.4, 0.5]]) # normalized bbox

heatmap = model(image, head_bbox)
gaze_point = heatmap.argmax(dim=-1) # 预测的视线落点

2.3 参数量分析

组件 参数量 是否训练
DINOv2 Encoder 86M ❌ 冻结
Feature Projection 0.2M ✅ 训练
Head Position Embedding 0.13M ✅ 训练
Lightweight Decoder 0.53M ✅ 训练
Heatmap Head 0.26M ✅ 训练
可训练总计 1.1M -

对比:传统方法需要训练10-80M参数。


三、零样本跨域实验

3.1 实验设置

训练数据:仅使用GazeFollow数据集(训练集)

测试数据

  • GazeFollow(同域)
  • VideoAttentionTarget(跨域视频)
  • ChildPlay(跨域儿童)

3.2 跨域性能对比

方法 GazeFollow VideoAttentionTarget ChildPlay
Traditional 0.89 0.71 0.62
GazeTR-Hybrid 0.91 0.76 0.68
Gaze-LLE 0.92 0.83 0.78

结论:Gaze-LLE在跨域场景下显著优于传统方法。

3.3 Foundation Model对比

Foundation Model GazeFollow MAE
CLIP 0.87
MAE 0.89
DINO v1 0.90
DINOv2 0.92

结论:DINOv2特征最适合视线估计。


四、对车载DMS的启示

4.1 零样本泛化的重要性

传统方法的困境

  • 训练数据采集成本高(需要车内环境)
  • 标注精度要求高(角度误差<3°)
  • 不同车型需要重新训练

Gaze-LLE的突破

  • 无需车内数据:DINOv2已学到通用特征
  • 自动适应:零样本迁移到车内场景
  • 快速部署:只需训练1.1M参数

4.2 与传统方法对比

维度 传统方法 Gaze-LLE
训练数据需求 100万+ 几千张
训练时间 数天 数小时
跨域性能
部署复杂度
精度 高(同域) 中等

4.3 实施建议

场景一:快速原型验证

1
Gaze-LLE(零样本)→ 验证可行性 → 再决定是否训练传统模型

场景二:跨车型部署

1
Gaze-LLE(微调)→ 适应新车型的少量数据 → 部署

场景三:高精度需求

1
Gaze-LLE(特征提取器)→ 传统回归头 → 混合架构

五、局限性分析

5.1 当前局限

局限 原因 解决方案
精度不如传统方法 冻结特征非最优 微调部分DINOv2层
推理速度慢 DINOv2模型大 蒸馏到小模型
头部位置依赖 需要准确检测 集成鲁棒检测器

5.2 改进方向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class GazeLLE_Improved(nn.Module):
"""
改进版:部分微调DINOv2
"""
def __init__(self):
super().__init__()

self.dino = AutoModel.from_pretrained('facebook/dinov2-base')

# 只微调最后几层
for param in self.dino.parameters():
param.requires_grad = False

# 解冻最后2层
for param in self.dino.encoder.layer[-2:].parameters():
param.requires_grad = True

# 其他组件...

六、实验复现

6.1 环境配置

1
2
3
4
5
6
7
# 安装依赖
pip install torch torchvision transformers
pip install opencv-python matplotlib

# 下载预训练模型
git clone https://github.com/fkryan/gazelle
cd gazelle

6.2 零样本推理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from PIL import Image
import torch
from gazelle import GazeLLE

# 加载模型
model = GazeLLE.from_pretrained('fkryan/gazelle-dinov2')
model.eval()

# 加载图像
image = Image.open('driver.jpg')

# 检测头部(使用预训练检测器)
head_bbox = detect_head(image) # [x, y, w, h]

# 零样本推理
with torch.no_grad():
heatmap = model(image, head_bbox)

# 可视化
visualize_gaze(image, heatmap)

七、总结

7.1 核心贡献

贡献 说明
Foundation Model应用 首次将DINOv2用于视线估计
零样本泛化 无需目标域数据即可工作
轻量级训练 仅需训练1.1M参数
跨域SOTA 在多个跨域基准上最优

7.2 对IMS开发的启示

  1. 快速验证:使用Gaze-LLE快速验证DMS可行性
  2. 数据增强:利用DINOv2特征增强传统方法
  3. 跨域迁移:新车型的快速适应
  4. 持续学习:在线微调Foundation Model

参考文献

  1. Ryan, F., et al. “Gaze-LLE: Gaze Target Estimation via Large-Scale Learned Encoders.” CVPR, 2025.
  2. Oquab, M., et al. “DINOv2: Learning Robust Visual Features without Supervision.” 2024.
  3. Caron, M., et al. “Emerging Properties in Self-Supervised Vision Transformers.” ICCV, 2021.

本文是IMS视线估计算法系列文章之一,上一篇:GazeTR详解


Gaze-LLE:Foundation Model驱动的零样本视线估计
https://dapalm.com/2026/03/13/2026-03-13-Gaze-LLE-Foundation-Model零样本视线估计/
作者
Mars
发布于
2026年3月13日
许可协议