과제: 안구를 촬영하여 사용자가 응시하는 곳의 3차원 시점 좌표를 구한다.
시선벡터 파이프라인:
- 제약: 하나의 eye카메라로 양 안의 시선벡터를 구해야 함
- 모델: MediaPipe FaceMesh
- 1. MediaPipe FaceMesh로 양쪽 홍채 4점을 얻는다.
- 2. 각 홍채 4점으로 홍채 평면을 추정하고 법선(= 시선방향 근사)을 구한다.
- 3. 홍 채 반지름으로 눈알(구형) 중심을 근사한 후 시선벡터를 구한다.
- 4. 좌/우 눈에서 나온 두 시선벡터의 최근접점 중점(P_mid)을 3D 응시점으로 사용.

이론적 배경:
1. 안구(eye)의 기본 구조
- 각막(Cornea) : 눈의 가장 바깥 투명한 막, 카메라 렌즈와 비슷한 역할. 빛을 굴절시켜 망막에 초점을 맞춤.
- 홍채(Iris) : 눈의 색 부분. 카메라의 조리개처럼, 동공의 크기를 조절하여 빛의 양을 조절함.
- 동공(Pupil) : 홍채 중앙의 까만 구멍. 실제로는 구멍이며, 카메라의 조리개 구멍 역할.
2. 모델에서 홍채와 동공의 역할
- 동공/홍채의 중심 위치를 기준으로 시선 방향을 추정한다.
3. 시선(Gaze) 개념
- 시선 벡터(Gaze vector): 눈의 중심(안구 중심)에서 동공(또는 홍채 평면) 방향으로 뻗어나가는 직선.
- 쉽게 말해:
- 카메라가 안구를 본다 → 홍채와 동공 위치를 찾는다.
- 그 중심점 + 눈의 기하학 모델 → 사용자가 “어디를 보고 있는지” 추정.
4. 시선추적(Gaze Tracking)의 두 가지 방식
- 기하학적(Geometry-based) 방식
- 홍채/동공의 중심을 찾아서 눈의 3D 모델(구형 eyeball)을 맞춤.
- 눈의 중심에서 법선 벡터(normal)를 뻗어서 “시선 방향”으로 정의.
- 장점: 수학적으로 명확, 적은 데이터로 가능.
- 단점: 카메라 보정(캘리브레이션) 필요, 조명/노이즈에 민감.
- 학습 기반(Appearance-based) 방식
- 눈 이미지 → CNN/Transformer 같은 AI 모델 → 직접 시선 좌표 예측.
- 마치 “사진만 보고 사람이 어디 보는지” 학습하는 것.
- 장점: 복잡한 광학모델 없이도 가능, 로버스트.
- 단점: 큰 학습 데이터 필요, 범용성 문제 있음.
5. 시선추적이 어려운 이유
- 개인차: 눈의 크기, 홍채 색, 눈꺼풀 모양이 사람마다 다름.
- 조명: 밝은 곳/어두운 곳에 따라 동공 크기가 달라져 탐지 어려움.
- 머리 움직임: 머리를 돌리면 같은 동공 위치라도 실제 시선은 달라짐.
- 2D vs 3D 문제: 카메라는 2D 영상만 찍는데, 시선은 3D 방향이라 매핑이 까다로움.
6. AI CV에서의 활용
- 동공 검출 (Pupil Detection): 가장 기본 단계. YOLO, MediaPipe 등으로 동공 중심점 좌표 추출.
- 홍채 분할 (Iris Segmentation): Segmentation으로 홍채 전체 영역을 찾아 중심/크기 계산.
- 시선 추정 (Gaze Estimation):
- 단순 방식: 동공 중심 + 얼굴 방향으로 시선 추정.
- 고급 방식: 학습된 모델(CNN, LSTM, Transformer)이 직접 시선 좌표 예측.
- 응용 분야:
- AR/VR 헤드셋 (시선 기반 UI, foveated rendering)
- 의료 (눈 운동 검사, 안과 진단)
- UX 분석 (웹사이트에서 어디를 보는지 Heatmap)
- 보안 (거짓말 탐지, 피로 감지, 주의 산만 탐지)
파이프라인 단계별 분류
- 입력 & 전처리
- 카메라 프레임 캡처 → (옵션) 좌우반전/CLAHE(대비 향상).
- BGR → RGB 변환 후 FaceMesh(refine_landmarks=True)로 추론.
- 랜드마크 추출
- 왼/오른 홍채 4점(왼: 468–471, 오른: 473–476)과 눈 윤곽점(디버그 폴리라인용)을 얻음.
- MediaPipe 좌표(정규화)를 픽셀 스케일 3D로 변환:
X = x * W, Y = y * H, Z = z * W (절대 mm가 아니라 “프레임 기반 3D” 스케일)
- iris 평면 추정 → 시선 방향
- 각 눈의 홍채 4점(3D)에 대해 SVD로 평면 적합: 중심 C_iris, 법선 n.
- 법선 방향을 카메라 쪽을 향하도록 통일 (orient_normal_to_camera) → 부호 안정화.
- 이 법선 n을 **시선벡터(gaze direction)**의 근사로 사용.
(프레임 지터 억제를 위해 EMA(지수평활)를 적용해 매 프레임 부드럽게 갱신)
- 눈알(eyeball) 중심 근사
- 화면에서 구한 홍채 반지름 r(px) × iris_to_eyeball_ratio(기본 2.1) = 눈알 반지름 R_e(px) 근사.
- 눈알 중심 O = C_iris − n * R_e
(법선은 대체로 카메라 바깥쪽이므로, 눈알 중심은 그 반대방향으로 이동)
- 양눈 시선의 최근접점 → 3D 응시점
- 왼/오른 눈에서 반직선(ray) 정의:
L_left(t) = O_L + t * d_L
L_right(s) = O_R + s * d_R (여기서 d_*는 정규화된 시선벡터) - 두 직선의 최근접점 쌍 (P_L, P_R)를 닫힌형식으로 계산하고, 그 중점 P_mid = (P_L + P_R)/2를 3D 응시점으로 사용.
- denom 값을 함께 표시하는데, 이 값이 0에 가까우면 두 시선이 거의 평행(교차 불안정)이라는 의미.
- 왼/오른 눈에서 반직선(ray) 정의:
'Projects > AI 아이트래킹 모델 프로젝트' 카테고리의 다른 글
| [프로젝트] 4. 시선벡터 - 월드맵 정합 (0) | 2025.09.16 |
|---|---|
| [프로젝트 A-EYE] 3. 시선추적_월드 깊이맵 구현 (0) | 2025.09.16 |
| [프로젝트 A-EYE] 1. 개요 (0) | 2025.09.16 |
| [도메인 공부 ] 8. 홍채 세그맨테이션 경량 CNN 모델 (0) | 2025.09.15 |
| [도메인 공부 ] 7. PLY(Point Cloud Data format) (0) | 2025.09.14 |