I build systems that understand people through sensors and respond to them: computer vision and machine learning on one end, XR, robots and embedded hardware on the other. I take them from the raw signal to a working prototype people can use, and I measure where they fail before I report what they do.
MSc Interactive Media Technology at KTH, Stockholm · B.Eng. Mechatronics and Robotics · looking for a 2027 master's thesis in computer vision, human-centred AI, XR or perception for vehicles and robots.
EYE TRACKING · XR gaze-XR-training An infrared camera glued under a Quest 3 lens, a pupil tracker and a Unity gaze toolkit. Calibration fit 0.8°, independent grid about 5°, and a blueprint of which training metrics that accuracy supports. Unity · C# · Python · OpenCV · Quest 3 |
EYE TRACKING · DEEP LEARNING GazeMap A CNN trained from scratch on 427k eye images, tested on people it never saw: 3.98° after calibration, 1.55° in the live demo, with a full failure analysis. PyTorch · MediaPipe · OpenCV · MPIIGaze |
AUTOMOTIVE · GENERATIVE MODELS · TEAM Vehicle trajectory generation Flow Matching on drone recordings of an Aachen intersection (inD). Without road rules 28 % of generated futures leave the road; soft guidance fixes that at no cost in smoothness, while hard projection multiplies jerk up to 5×. PyTorch · Flow Matching · inD dataset |
ATTENTION · EMBEDDED · NORDICHI 2026 DEMO SUBMISSION Lumen Blink rate from a webcam drives a silicone light on the desk from white to amber to red. F1 0.92 with head turns up to ±45°. No frames saved, no cloud, failure envelope documented. MediaPipe · OpenCV · ESP32-S3 · C++ |
HUMAN-ROBOT INTERACTION · SDC-FUNDED Qonur A talking animatronic bear for anti-bullying theatre: AI conversation, human-operated choreography, ten servos. Deployed in a children's shelter and a rural village. Watch it perform. Python · Gemini API · ESP32 · Fusion 360 |
XR USER STUDY · HUMAN PERCEPTION · TEAM Perceived safety on a T-bana platform A within-subject VR study on a Quest 2: 16 randomised scenes, 7 participants, four factors (child or adult, crowd, caregiver, glass doors). Doors raised felt safety in every condition; a child alone at a crowded open edge scored lowest, about 1.9 of 5. Unity · Quest 2 · Likert survey · KTH DM2350 |
I build the whole loop, from the sensor to the model to the thing that moves or lights up. I measure under the ugly conditions first: unseen people, turned heads, a headset that slips. And I write the failure cases next to the headline number, because a calibration fit is not accuracy and a random split is not a test.
Before KTH I spent four years at Ritual Theater lab in Baku putting technology on stage: XR experiences 600 people walked through, a robot bear that talks back to children, projection and motion capture. The interesting problem kept being the same one, a camera trying to work out what a person is paying attention to.
Toolbox
| Eye tracking | pupil detection and ellipse fitting (RANSAC), appearance-based gaze estimation, polynomial and affine calibration, accuracy and precision grids, I-VT fixations, AOI analysis, blink detection (EAR) |
| Computer vision and ML | OpenCV, MediaPipe, PyTorch (CNNs, Flow Matching), scikit-learn, NumPy, pandas, Matplotlib |
| Evaluation | leave-one-person-out splits, leakage checks, angular error, per-condition failure analysis, seeded reproducible runs |
| XR | Unity 6 (C#, URP, OpenXR, XR Interaction Toolkit), Meta Quest, synced session recording |
| Hardware | IR camera modules, ESP32 / ESP32-S3, Arduino, servo control, USB serial, Fusion 360, 3D printing |
| Languages | Python, C#, C++ for firmware |
Two computer vision courses at KTH this autumn, including a vocabulary-tree image retrieval system built from scratch (SIFT, hierarchical k-means, TF-IDF). Next on the headset tracker: slip correction with corneal glints and gaze from commercial headsets through OpenXR.





