| # Project Memory: LIPE V2 Gaze Estimation |
|
|
| ## 1. Accomplishments |
| ### Architectural Design |
| - Defined the **Dual-State Asymmetric Pipeline** (State A: 10 FPS Appearance, State B: 20 FPS Geometry). |
| - Adopted **Knowledge Distillation** strategy using **L2CS-Net** as the teacher and **LIPE V2** as the student. |
| - Integrated **Adaptive Wing Loss (AW Loss)** to handle low-resolution optical aliasing. |
|
|
| ### Implementation - Core Components |
| - **Teacher Model (`src/models/teacher.py`)**: Robust wrapper for L2CS-Net (ResNet-18/34/50) with separate Pitch/Yaw branches. |
| - **Preprocessing Utility (`src/utils/preprocess.py`)**: |
| - Integrated MediaPipe Tasks API (`face_landmarker.task`) with 478 points. |
| - Implemented Unified Affine Transformation with standardized corner selection (viewer's left/right). |
| - Added 3D gaze rotation logic to match rotated patches. |
| - **MPIIGaze Preprocessing (`src/data/preprocess_mpii.py`)**: |
| - Developed an HDF5 streaming pipeline with GZIP compression. |
| - Implemented Landmark Zero-Centering (pose-relative features). |
| - **Student Model (`src/models/student.py`)**: |
| - Implemented `LIPEV2Student` with Shared CNN Backbone and Valid Padding (p=0). |
| - Integrated LayerNorm in Geometric MLP for stability. |
| - Achieved **~0.001 GFLOPs** (Verified). |
| - **HDF5 DataLoader (`src/data/dataset.py`)**: Efficient `GazeDataset` with lazy-handle management. |
| |
| ### Integration & Verification (2026-05-30) |
| - **End-to-End Demo (`demo_integration.py`)**: Successfully integrated Phase 1 (Data) and Phase 2 (Model). |
| - **Data Integrity**: Verified `p03.h5` samples load with correct shapes: Patches `(4, 8, 8)` and Landmarks `(956)`. |
| - **Model Compatibility**: `LIPEV2Student` performed successful inference on real processed data. |
| - **Visual Check**: `demo_patch_p03.png` confirmed pupil-centered alignment after affine transform. |
| - **I/O Stability**: Resolved HDF5 file locking issues. |
| - **Phase 3 Initialization**: |
| - **Teacher Setup**: Secured pre-trained `resnet50.pt` weights and verified inference accuracy. |
| - **Offline Distillation**: Launched background batch label generation (`src/data/batch_generate_labels.py`) to pre-calculate teacher logits for all 15 participants. |
| - **Training Loop**: Implemented `src/train.py` with Subject-level WeightedRandomSampler and dynamic weighting (AW Loss + KL Divergence). |
| - **LOPO Completion**: Finished full 15-subject LOPO training. Mean MAE: 5.12°. Best fold (p11): 4.19°. |
| - **Study A-1 (Resolution Boost)**: |
| - **Objective**: Reach < 4.2° MAE by increasing patch size to 16x16. |
| - **Status**: IN PROGRESS. `src/data/prepare_study_a1.py` launched in background to generate `_v16.h5` files with teacher labels. |
| - **Pipeline Updates**: `src/data/dataset.py` and `src/train.py` updated to support `--version_suffix`. |
| - **Phase 4 Integration**: |
| - **Smoothing**: Implemented **One Euro Filter ($1€ Filter$)** in `src/utils/filters.py` for real-time jitter suppression. |
| - **Benchmarking**: Implemented 3D **Angular Error** formula in `src/utils/metrics.py`. |
| - **Profiling**: Verified **1.93 MFLOPs** and **~0.8ms latency** per frame on CPU (State A). |
| - **Live Demo**: Created `src/demo_live.py` with multi-threaded potential and dual-state switching. |
| - **Refinement**: Modified model and preprocessing to support variable resolutions (e.g., 16x16 study). |
| - **Cross-Dataset Validation (2026-06-03)**: |
| - **Strategy**: Established "Test first, Fine-tune later" approach for open datasets (Gaze360, GazeCapture). |
| - **Verification**: Successfully tested MediaPipe landmark recognition on "in-the-wild" samples (`test_gaze.jpg`) with 100% success rate. |
| - **Preprocessing**: Verified that the Affine Normalization and Patch Extraction pipeline is robust to non-laboratory samples. |
| - **Gaze360 Integrity & Baseline Reset (2026-06-04)**: |
| - **Subject Splitting**: Implemented strict isolation using `person_identity`. Group A (Train: 0, 1, 17, 25, 49, 61) vs Group B (Test: 60, 62). |
| - **Data Isolation**: Updated `src/data/preprocess_gaze360_robust.py` to output separate `_train_A.h5` and `_test_B.h5` files. |
| - **Official Baseline**: Established **10.69° MAE** on clean Group B subset (Frontal +/- 45°) using coordinate correction (-1, -1). |
| - **Fair Comparison**: All future domain adaptation results will be measured against this 10.69° reference point. |
|
|
| ## 2. Technical Decisions |
| - **MediaPipe Tasks API**: Chosen for modern compatibility and 478-point landmark support. |
| - **Grayscale Normalization**: Minimizes computational load (< 45 MB target). |
| - **Residual Addition Fusion**: Replaced concatenation with feature addition (`App + Geo`) to ensure tensor shape stability across State A/B. |
| - **Zero-Centering Geometry**: Encourages the Coarse MLP to learn eye-shape rather than absolute positioning. |
| - **Adaptive Wing Loss**: Chosen to resolve optical aliasing in low-resolution (8x8) conditions. |
| - **Offline Label Caching**: Decided to store Teacher logits in HDF5 files during preprocessing to eliminate Teacher inference overhead during Student training. |
| - **Resolution Agnostic Architecture**: Updated `LIPEV2Student` to handle varying patch sizes (8x8, 16x16) automatically via Adaptive Pooling. |
| - **Gaze360 Evaluation Strategy**: Focus on "Frontal 20" subset to ensure fair comparison with MPIIGaze and minimize "Out-of-Distribution" noise. |
|
|
| ## 3. Pending Tasks |
| - **Teacher Label Generation**: Wait for background process (p07-p14) to complete. |
| - **Phase 3 Training**: Execute full LOPO training on the complete distilled dataset. |
| - **Hardware Optimization**: Implement cycle-specific weight freezing to hit the 45MB RAM target. |
| - **Gaze360 Subset Acquisition**: Find a manageable mirror for Gaze360 metadata and images (avoiding 28GB overhead). |
| - **Zero-shot Cross-Dataset Test**: Evaluate LIPE V2 on Gaze360 without re-training to benchmark generalization. |
|
|
| ## 4. Current State |
| - **Phase 1 (Preprocessing)**: COMPLETED. |
| - **Phase 2 (Model Implementation)**: COMPLETED & VERIFIED. |
| - **Phase 3 (Training)**: IN PROGRESS (Label generation background task). |
| - **Phase 4 (Post-Processing)**: INITIALIZED (Filters and metrics implemented). |
|
|