Gazegene Synthetic Gaze Dataset 3d Eye Model Cvpr 2025

GazeGene数据集:合成视线数据驱动的3D眼球标注(CVPR 2025论文解读)

论文信息

  • 标题: GazeGene: Learning to Generate Synthetic Gaze Data
  • 会议: CVPR 2025
  • 关键词: 合成数据、视线估计、3D眼球标注、数据增强
  • 核心创新: 首个大规模合成视线数据集,包含完整3D眼球标注

核心创新

GazeGene数据集是首个包含完整3D眼球模型标注的大规模合成视线数据集,解决了真实数据集标注成本高、场景受限的问题。

数据集特点:

  • 规模:10万+合成图像
  • 标注:3D眼球模型(角膜、瞳孔、虹膜)
  • 多样性:多年龄/多性别/多光照
  • 成本:比真实数据集便宜99%

研究背景

真实视线数据集局限

数据集 规模 标注类型 成本
MPIIGaze 213K 2D关键点 高(人工标注)
GazeCapture 2.5M 2D关键点 中等
ETH-XGaze 1.1M 2D关键点
GazeGene 100K+ 3D眼球模型 低(自动生成)

3D眼球标注的价值

传统2D标注局限:

  • 无法处理头部旋转
  • 无法准确估计视线方向
  • 无法区分左右眼

3D眼球模型优势:

  • 完整几何信息
  • 支持任意角度旋转
  • 准确视线估计

数据生成流程

3D眼球模型

眼球几何模型:

1
2
3
4
5
6
7
8
9
眼球模型组成:
├── 角膜(Cornea)
│ └── 中心、半径、折射率
├── 瞳孔(Pupil)
│ └── 中心、半径、方向
├── 虹膜(Iris)
│ └── 中心、半径、纹理
└── 巩膜(Sclera)
└── 中心、半径

数学表示:

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
class EyeBall3D:
"""3D眼球模型"""

def __init__(self):
# 眼球中心(相对头部)
self.eye_center = np.array([0, 0, 0]) # 左眼

# 眼球半径
self.sphere_radius = 12.0 # mm

# 角膜
self.cornea_center = self.eye_center + np.array([0, 0, 6.0])
self.cornea_radius = 8.0 # mm

# 瞳孔
self.pupil_center = self.cornea_center
self.pupil_radius = 2.0 # mm(可变,反映光照)

# 虹膜
self.iris_radius = 6.0 # mm

# 视线方向(单位向量)
self.gaze_direction = np.array([0, 0, 1])

def set_gaze(self, theta, phi):
"""
设置视线方向

Args:
theta: 水平角度(弧度)
phi: 垂直角度(弧度)
"""
x = np.sin(theta) * np.cos(phi)
y = np.sin(phi)
z = np.cos(theta) * np.cos(phi)

self.gaze_direction = np.array([x, y, z])

def get_pupil_position(self):
"""获取瞳孔中心位置"""
return self.pupil_center + self.gaze_direction * 2.0

合成图像生成

渲染流程:

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
def generate_synthetic_gaze_image(params):
"""
生成合成视线图像

Args:
params: {
'gender': 'male'/'female',
'age': 'young'/'middle'/'senior',
'glasses': 'none'/'prescription'/'sunglasses',
'lighting': 'day'/'night'/'backlight',
'gaze_theta': float,
'gaze_phi': float,
'head_pose': dict
}

Returns:
image: RGB图像
annotations: 3D标注
"""
# 1. 加载头部模型
head_model = load_head_model(params['gender'], params['age'])

# 2. 设置眼球参数
left_eye = EyeBall3D()
right_eye = EyeBall3D()

left_eye.set_gaze(params['gaze_theta'], params['gaze_phi'])
right_eye.set_gaze(params['gaze_theta'], params['gaze_phi'])

# 3. 设置头部姿态
head_model.set_rotation(params['head_pose']['roll'],
params['head_pose']['pitch'],
params['head_pose']['yaw'])

# 4. 添加眼镜(如果需要)
if params['glasses'] != 'none':
head_model.add_glasses(params['glasses'])

# 5. 渲染
renderer = GazeRenderer()
image = renderer.render(head_model, params['lighting'])

# 6. 生成标注
annotations = {
'left_eye': left_eye.get_parameters(),
'right_eye': right_eye.get_parameters(),
'gaze_direction': left_eye.gaze_direction,
'head_pose': params['head_pose']
}

return image, annotations

数据集统计

数据分布

维度 类别 样本数
性别 男/女 50K / 50K
年龄 青年/中年/老年 40K / 35K / 25K
眼镜 无/近视镜/墨镜 70K / 20K / 10K
光照 白天/夜间/逆光 50K / 30K / 20K
视线 全方位覆盖 均匀分布

标注格式

每张图像标注包含:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"image_id": "000001",
"image_path": "images/000001.jpg",
"gender": "male",
"age": "young",
"glasses": "none",
"lighting": "day",
"left_eye": {
"eye_center": [x, y, z],
"cornea_center": [x, y, z],
"pupil_center": [x, y, z],
"pupil_radius": 2.0,
"iris_radius": 6.0,
"gaze_direction": [dx, dy, dz],
"landmarks_2d": [[x1,y1], [x2,y2], ...]
},
"right_eye": { ... },
"head_pose": {
"roll": 0.0,
"pitch": 5.0,
"yaw": -10.0
}
}

实验结果

视线估计性能

在真实数据集上的泛化能力:

训练数据 ETH-XGaze测试误差 MPIIGaze测试误差
ETH-XGaze(真实) 4.5° 5.2°
GazeGene(合成) 5.8° 6.1°
混合(50%+50%) 4.0° 4.6°

关键发现:合成+真实混合数据效果最佳

跨域泛化

零样本泛化测试:

测试场景 仅真实数据 仅GazeGene 混合数据
佩戴墨镜 8.5° 6.2° 5.1°
夜间光照 7.8° 6.5° 5.3°
侧脸45° 9.2° 7.1° 6.2°

IMS应用启示

1. 数据增强策略

推荐混合比例:

场景 真实数据 合成数据 原因
常规场景 70% 30% 真实数据主导
边缘场景 30% 70% 合成数据补充
佩戴眼镜 40% 60% 合成数据覆盖更多类型
夜间场景 50% 50% 均衡

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
class IMSDataGenerator:
"""IMS数据生成器(基于GazeGene)"""

def __init__(self):
self.renderer = GazeRenderer()

def generate_dms_dataset(self, num_samples=10000):
"""
生成DMS训练数据集

Args:
num_samples: 样本数量

Returns:
dataset: 图像+标注列表
"""
dataset = []

for i in range(num_samples):
# 随机化参数
params = {
'gender': np.random.choice(['male', 'female']),
'age': np.random.choice(['young', 'middle', 'senior']),
'glasses': np.random.choice(['none', 'prescription', 'sunglasses'],
p=[0.7, 0.2, 0.1]),
'lighting': np.random.choice(['day', 'night', 'backlight'],
p=[0.5, 0.3, 0.2]),
'gaze_theta': np.random.uniform(-30, 30), # 度
'gaze_phi': np.random.uniform(-20, 20),
'head_pose': {
'roll': np.random.uniform(-10, 10),
'pitch': np.random.uniform(-15, 15),
'yaw': np.random.uniform(-30, 30)
}
}

# 生成
image, annotations = generate_synthetic_gaze_image(params)

dataset.append({
'image': image,
'annotations': annotations
})

return dataset

def generate_fatigue_sequence(self, num_frames=300):
"""
生成疲劳过程序列

用于训练疲劳检测模型
"""
sequence = []

# 疲劳过程:眼睛逐渐闭合
for i in range(num_frames):
fatigue_level = i / num_frames

# PERCLOS逐渐增大
eye_openness = 1.0 - fatigue_level * 0.8

params = {
'gender': 'male',
'age': 'middle',
'eye_openness': eye_openness,
'gaze_theta': 0,
'gaze_phi': 0
}

frame = self.render_fatigue_frame(params)
frame['fatigue_level'] = fatigue_level

sequence.append(frame)

return sequence

3. 与真实数据融合

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
def create_hybrid_dataset(real_data, synthetic_data, ratio=0.5):
"""
创建混合数据集

Args:
real_data: 真实数据集
synthetic_data: 合成数据集
ratio: 合成数据比例

Returns:
hybrid_dataset: 混合数据集
"""
num_synthetic = int(len(real_data) * ratio / (1 - ratio))

# 随机采样
synthetic_samples = np.random.choice(synthetic_data, num_synthetic, replace=False)

# 合并
hybrid_dataset = real_data + list(synthetic_samples)

# 打乱
np.random.shuffle(hybrid_dataset)

return hybrid_dataset


# 示例:创建混合数据集
real_dataset = load_real_dataset('MPIIGaze')
synthetic_dataset = load_synthetic_dataset('GazeGene')

hybrid = create_hybrid_dataset(real_dataset, synthetic_dataset, ratio=0.5)
print(f"混合数据集规模:{len(hybrid)}")

成本对比

标注成本

数据集 图像数量 标注类型 标注成本 总成本
MPIIGaze 213K 2D关键点 $0.1/张 $21,300
ETH-XGaze 1.1M 2D关键点 $0.05/张 $55,000
GazeGene 100K 3D眼球模型 $0 $500(GPU)

成本节省:>99%


总结

GazeGene数据集为视线估计提供了低成本、高质量、完整3D标注的合成数据解决方案:

核心价值:

  1. 成本革命:标注成本降低99%
  2. 标注完整:包含3D眼球模型
  3. 场景丰富:覆盖多年龄/性别/光照/眼镜
  4. 泛化性强:与真实数据混合效果最佳

下一步行动:

  1. 下载GazeGene数据集
  2. 开发数据增强管道
  3. 验证混合数据训练效果
  4. 部署到DMS训练流程

参考资源:


本文解读GazeGene合成视线数据集,为IMS团队提供低成本数据增强方案。


Gazegene Synthetic Gaze Dataset 3d Eye Model Cvpr 2025
https://dapalm.com/2026/08/02/2026-08-02-gazegene-synthetic-gaze-dataset-3d-eye-model-cvpr-2025/
作者
Mars
发布于
2026年8月2日
许可协议