Hi, I’m Laia.

I like building things

Portrait of Laia Lehmann

Selected Engineering Work

Computer Vision & Accessibility September 2026

Signwise: ASL Alphabet Practice with Camera Feedback

I built an ASL alphabet coach that uses a webcam to check handshapes and suggest specific corrections. It tracks 21 hand landmarks with MediaPipe and uses geometric rules to check finger placement and movement for J and Z. All video processing stays in the browser; nothing is recorded or uploaded.

21 3D Hand Landmarks
100% Client-Side (Zero Video Upload)
A–Z + ILY Static & Dynamic Signs
A / S · J / Z Refined with Community Feedback
Details

The problem & background

I wanted to learn the ASL alphabet, so I built a tool to help me practice. Static diagrams show what a handshape should look like, but they cannot check your fingers or thumb placement. A webcam lets the tool give feedback as you practice.

How it works

Google MediaPipe Hand Landmarker estimates 21 hand landmarks as (x, y, z) coordinates in each camera frame. My geometric rules check joint straightness, fingertip reach, finger spacing, thumb position, crossed fingers, and hand orientation. Distances are measured relative to palm size to reduce the effect of hand size and camera distance.

Key features & feedback engine

  • Handshape scoring: The tool compares each measurement with the letter’s requirements. A static letter passes when its score stays at or above 88/100 for just over a second. The rules balance accepting natural variation with catching incorrect shapes.
  • Movement tracking: J and Z require both a starting handshape and a fingertip path. For J, the tool checks the I handshape, then follows the pinky fingertip across frames. It waits about 350 milliseconds for the starting shape to settle and tolerates brief tracking interruptions.
  • Specific corrections: The weakest geometric match determines the feedback, such as “curl index finger” or “index and middle finger should touch.”
  • Practice modes: Timed challenges hide hints, name spelling requires a hand release between letters, and review queues revisit missed signs.
  • Privacy: Camera frames are processed in browser memory. They are never recorded or uploaded.

Feedback & limitations

Feedback from Erin Wilkinson helped me refine handshape recognition, especially for A and S. Feedback from Raja Kushalnagar helped me improve movement tracking for J and Z. Their input helped improve the tool, but it is still experimental and can make mistakes. It supports alphabet and fingerspelling practice, not learning ASL as a whole. Try Signwise.

MediaPipe Computer Vision JavaScript / HTML5 Geometric Handshape Analysis Privacy-First
Simulation & Wireframe Art August 2026

2D Physics Engine & Wireframe Art

I built a 2D physics engine in C++17 to simulate collisions, springs, and force fields. It uses impulse-based collision response and a uniform grid to find nearby objects. Spring networks follow Hooke’s law and can tear under strain. A separate visualizer projects 3D surfaces as wireframe art.

120 Hz Fixed-Step Simulation
From Scratch 0 External Physics Engines
10 Suites Automated Tests & Benchmarks
3D Surfaces Torus, Mobius & Wireframe City
Details

The problem & background

Most 2D physics libraries act as opaque black boxes. I wanted to understand motion, spatial indexing, collision resolution, and constraint solving from mathematical first principles, while also exploring how 3D mathematical surfaces can be projected onto a 2D canvas.

How it works

SFML handles the window and drawing. I wrote the physics in C++17: numerical integration updates motion, a uniform grid finds potential collisions, and impulses resolve circle collisions based on mass. Springs follow Hooke’s law and break when strain exceeds a limit. The simulation runs at a fixed 120 Hz, independently of the rendering frame rate.

Key features & interactive systems

  • Forces & fields: Gravity, aerodynamic wind, electrostatics, attractors, repulsors, vortices, and temporary force pulses.
  • Deformable systems: Pinned particles, spring meshes, distance constraints, and strain-based tearing.
  • Wireframe art: Particles move along the vertices of 3D surfaces, including a torus, Möbius strip, spherical harmonics, waves, and a wireframe city.
  • Testing: 10 automated test suites and repeatable performance benchmarks.

How to download and run the macOS app

If you want to experiment with the engine directly, you can download Particle Physics Laboratory v1.0.0 for Apple-silicon Macs.

Unzip the download, then move Particle Physics Laboratory.app to your Applications folder. Because this portfolio build is ad-hoc signed rather than Apple-notarized:

  1. Right-click (or Control-click) Particle Physics Laboratory.app in Finder.
  2. Select Open from the menu.
  3. Click Open in the security prompt.
C++17 Physics Simulation Spatial Partitioning Wireframe Art SFML CI / Automated Testing
Machine Learning & Remote Sensing July 2026

Forest Loss Detection from Satellite Imagery

I trained a Siamese U-Net to detect forest loss by comparing Sentinel-2 images from 2018 and 2025. A shared encoder processes both images, and the model uses differences between their features to predict where forest was lost. This approach addresses changes that a classifier using one date often misses.

6 Bands RGB + NIR + SWIR1/2
10,303 Training Patches (30 Regions)
16× F1 Gain on Complex Terrain
0.919 Deforestation Precision
Details

The problem & background

My first model was a ResNet18 classifier trained on 27,000 EuroSAT RGB tiles. It reached 94.72% test accuracy for land-use classification, but missed many forest-loss areas when checked against Hansen Global Forest Change data (mean F1: 0.42). Classifying one image at a time made it difficult to distinguish seasonal vegetation changes from canopy loss.

How it works

I switched to a Siamese U-Net with a shared encoder. It compares spatially aligned Sentinel-2 images from 2018 and 2025 using six bands: RGB, NIR, SWIR1, and SWIR2. The model takes absolute differences between feature maps at several depths. A U-Net decoder uses those differences to estimate the probability of forest loss at each pixel.

Key improvements & training setup

  • Loss function: I combined binary cross-entropy with Tversky loss (α = 0.4, β = 0.6). Forest-loss pixels are rare, so the loss gives missed detections more weight.
  • Sampling & augmentation: Training samples are balanced across regions and patches with low, medium, and high forest loss. Both images receive the same geometric transformations to keep them aligned.
  • Decision threshold: I selected a probability threshold of 0.15 using the validation data.

Dataset scaling & regional results

The first Siamese model used 1,734 patches from six regions and struggled with new landscapes. I expanded training to 10,303 patches from 30 regions, a 5.9× increase. On the Greece test area, F1 improved by 16× and IoU by 20×. Precision reached 0.919, with recall of 0.254 and F1 of 0.399, so missed forest loss remains a limitation.

PyTorch Computer Vision Sentinel-2 (Copernicus) Siamese U-Net Tversky Loss Python

About Me

I’m a Systems Design Engineering student at the University of Waterloo, seeking co-op opportunities in software development, applied machine learning, and data analysis. I build software that helps people explore ideas and address practical problems. I’m currently working with WARG, which develops autonomous aircraft; MedTechResolve, which builds technology to improve medical diagnosis and care; and Waterloo Reality Labs, which focuses on developing immersive virtual reality experiences.

Beyond engineering, I organized two donation drives that redistributed approximately $50,000 in goods to community organizations and families. With volunteers, I collected and sorted donated items and gave families the opportunity to choose what they needed for free.

Technical Skills

Languages & Core Tools

  • Languages: C++, Python, JavaScript, HTML5 / CSS3
  • Systems & Graphics: Simulation solvers, SFML, numerical integration, uniform-grid spatial partitioning
  • Version Control: Git, GitHub, GitHub Actions CI/CD
  • Platforms: macOS, Linux/Unix development environments

Machine Learning & Vision

  • Frameworks: PyTorch, MediaPipe, NumPy, SciPy
  • Architectures: Siamese networks, U-Net, ResNet, feature differencing
  • Geospatial: Sentinel-2 multi-spectral imagery (Copernicus), change detection
  • Loss & Optimization: BCE + Tversky loss, class imbalance, synchronized data augmentation

Systems Design & Engineering

  • Relevant Coursework: Fall 2026 · In progress
    • SYDE 151 — Intro Systems Thinking
    • SYDE 161 — Intro Design
    • SYDE 121 — Digital Computation
    • MATH 115 — Linear Algebra (Eng)
    • MATH 117 — Calculus 1 (Eng)
    • SYDE 101 — Communications: Written & Oral

happy to connect:)

LinkedIn GitHub