2026‐10‐26‐Meeting‐4 - Sajeev-D/driver-monitoring-team2026280 GitHub Wiki
Present: [Names] | Absent: [Names or "None"] | Scribe: [Name]
1. Member Outline
1.1 Sally — Data Processing
- Did: Developed a reusable MediaPipe-based pipeline for extracting EAR, PERCLOS, candidate blink statistics, prolonged eye-closure events, and tracking-quality metrics from video. Processed all 36 DROZY recordings across 14 participants, joined KSS and PVT data, and exported standardized CSV files. Reviewed participant-specific open/closed-eye calibration references and documented the scripts.
- Found: Processing 497,609 frames produced 1,946 complete 60-second windows with a 10-second stride and 82 output columns. Of these, 63 windows had insufficient valid-data coverage and were flagged. Personalized calibration enables PERCLOS estimation.
- Next: Review the extracted features, independently annotate selected video segments, and evaluate eye-closure and event-detection accuracy. Refine participant requirements, labeling procedures, collection conditions, and the experimental protocol for ethics approval. Apply this procedure to UTARLPD dataset.
- Needs: Team agreement on the validation and annotation procedure, acceptable tracking-quality criteria, and calibration methodology. Input on participant count, session duration, stopping criteria, and data handling before ethics submission and recruitment. Need to find more hard drive space to use the UTARLPD dataset (90gb).
1.2 Christopher — Hardware: IR Illumination Design, Power Budget
- Did: Followed up on last meeting's request for a model of IR brightness. Found a radiometric link-budget model that predicts whether the face is lit well enough:
LED output → irradiance at the face → skin reflectance at 940 nm → light reaching each pixel → electrons collected → image SNR. Built the LED illuminator prototype on a breadboard, set up the Raspberry Pi 5, and got the camera running with a capture program.
- Found:
- The model lets us test the worst case (darkest skin tone, weakest LEDs, driver farthest away) without needing that person in front of the camera. Skin reflectance differences between skin tones are smaller at 940 nm than in visible light.
- The model's biggest unknown is the camera's sensitivity at 940 nm.
- First-pass estimate: the current 4-LED illuminator gives a usable image in the typical case but may be too dim in the worst case.
- Next: Calibrate the model with the real camera at a measured distance, then plug the measured sensitivity back in to get a real worst-case prediction.
- Needs: Guidance on whether the truck temperature/power requirement stays a hard Constraint or becomes an Objective, since we're not deploying in a cab. https://github.com/user-attachments/assets/1b7f8c8f-8379-4090-97d1-b4a0d0923867
1.3 Sajeev — From-Scratch Random Forest Implementation & Model Evaluation
- Did:
- Implemented a modular Random Forest classifier and Decision Tree Classifier from scratch in Python (
node.py,criterion.py,decision_tree.py,random_forest.py) using Gini impurity information gain, random feature subsampling, and bootstrap sample bagging. - Successfully validated the from-scratch training (
fit) and inference (predict) pipeline on the synthetic driver monitoring dataset (359 test samples across 12 ocular and TPMA features). Link to the branch containing the implementation is here. - Designed the standalone evaluation framework (
metrics.py) to benchmark Accuracy, Precision, Recall, and F1-score. - Link to a slide deck of my updates is here.
- Implemented a modular Random Forest classifier and Decision Tree Classifier from scratch in Python (
- Found: The custom Random Forest achieved 0.95 accuracy, 0.96 precision, 0.89 recall, and 0.92 F1-score on 359 unseen test samples (108 TP, 233 TN, 5 FP, 13 FN). Hyperparameters used: number_of_trees = 10, max_tree_depth = 4 and subsampling 70% of features per split.
- Next: Profile per-sample inference latency on Raspberry Pi and observe how latency and performance vary with different hyperparameters.
- Needs: Access to labeled real-world driving data.
1.4 Apurva — MediaPipe Eye Feature Validation
- Did: Extended the eye feature extractor to output MediaPipe's per-eye blink scores alongside EAR and head pose, and wrote a script that runs it on any video or image folder and exports one CSV row per frame. Validated the pipeline at three levels: unit tests of our own code; a scripted webcam recording (winks, head turns, nods) to check left/right and the direction of each angle; and a comparison against human frame-by-frame eye-state and blink labels in DMD: all 13 drivers in its drowsiness set, 16 sessions, about 88,000 frames. The detection threshold was chosen leave-one-driver-out, so every driver is scored with a threshold tuned only on the other drivers.
- Found:
- The webcam test found and fixed a reversed pitch sign. Yaw and the left/right eye assignment were already correct. The face is lost beyond about 60° of head turn.
- MediaPipe's score separates closed from open eyes almost perfectly (AUC 0.998). It caught 96% of labelled blinks (1,574 of 1,635), and 83% of detections were real blinks.
- A threshold of 0.34 was chosen for 12 of 13 drivers. MediaPipe's own blink score and EAR performed about the same.
- Errors: blinks merging when a drowsy driver's eyes stay half closed, single blinks counted twice, false alarms during yawns, and slightly weaker results with glasses (blink F1 0.86 vs 0.90 without).
- Next: Measure head-pose accuracy in degrees against motion-capture ground truth (AutoPOSE), test the pipeline on infrared video, and build PERCLOS and blink-rate measures on the 60 s buffer.
- Needs: Team agreement to adopt the blink score with a 0.34 threshold as the standard eye-closure signal, and a decision on whether Sally's DROZY pipeline should be run through the same DMD evaluation, since DMD provides the independent eye-state annotations it needs.
2. Decisions
- N/A
3. Action Items
| # | Item | Owner | Due |
|---|---|---|---|
| 1 | Christopher | ||
| 2 | Sally | ||
| 3 | Sajeev | ||
| 4 | Apurva |