I'm a Mechatronics Engineering student at the University of Waterloo. My work spans both software and hardware, from programming autonomous robots to training and deploying machine learning models.
I gravitate toward problems that require learning something new to solve. Past projects include a hospital navigation robot, a RAG-based resume analysis tool, and a real-time computer vision system for fluoroscopic video at The Hospital for Sick Children.
Watch a live, low-contrast grayscale video stream and detect the moment an injected dark fluid spreads into a user-defined region of the image. Almost no labeled data, extreme class imbalance, and a tight latency and precision budget.
What I tried
Straight pixel thresholding on a 3D-printed flow simulator. It worked as a proof of concept.
On Simone(Pulsatile Flow Model Mimicing Heart's Pump) under X-ray, the motors and metallic hardware swamped the frame, so the detector had to explicitly reject metal-like pixels, and I moved to a third simulator with no metal.
A five-stage false-positive cascade, each stage aimed at a specific, observed failure mode. It worked, but it was hand-tuned, and every threshold would need re-tuning for a new setup.
Replaced it with a U-Net with a ResNet-34 encoder, ImageNet-pretrained, trained on 19 hand-annotated frames with BCE + Dice loss.
Automatic region proposal: YOLO performed poorly at Dice 0.41. A U-Net/ResNet-34 fine-tuned on retinal vessel data roughly doubled that to Dice 0.82.
Result
Latency went from roughly 350ms to roughly 45ms, running 1–2 frames behind the live feed.
Trained entirely on simulated frames, Dice fell only from 0.85 to 0.80 on real-world imaging, and recall held at 0.88.
Precision dropped from 0.82 to 0.73, which is the honest limitation.