Skip to content

Selected work

Business constraints, research questions, shipped systems.

Each case starts with an outcome that matters, works down through the technical uncertainty, and ends with something measurable, reliable, and useful in a real workflow.

These case studies deliberately describe the technical decisions and outcomes without exposing proprietary data, customer material, or internal system details.

Drake rejecting one option and approving another in a two-panel reaction meme.
Benchmarks
Production
Results

Benchmarks are polite. Production data is more honest.

The benchmark gets the system out the door. The anomaly decides what I investigate next.

Agent evaluation

Making agent failures diagnosable

2025 – Present

Core question

How do you tell whether an agent failed at perception, generation, evaluation, or verification?

The constraint

Aggregate scores could show that an agent failed, but not which component or behavior caused the failure. The evaluation system needed to catch weaknesses before release and turn failures observed in production into specific, actionable diagnoses.

What shipped

Built the team’s evaluation harness for pre-production quality gates and post-production diagnosis, making failed runs easier to reproduce, classify, and route toward the right system improvement.

Investigation → system

  1. 01 Built automated grading, adversarial probing, and red-teaming workflows with Promptfoo, Garak, and DeepEval.
  2. 02 Implemented a custom BinEval-style decomposition that separates perception, generation, evaluation, and verification failures.
  3. 03 Adapted Genie into a synthetic document Q&A pipeline tuned to generate questions that resemble real user intent.

Paper → implementation

Turning documents into evaluation data

Genie provides the data-generation loop. The implementation adapts it to produce source-grounded questions that behave more like the questions people actually ask.

Genie · arXiv ↗

In the paper

Clean and transform source material into content that can support task-specific examples.

In this implementation

Engineering documents become bounded source contexts, so every generated example begins with evidence rather than a free-form prompt.

Output

Grounded content units

Select a stage to inspect the handoff. The 100 → 65 → 35 → 15 gate counts illustrate progressive filtering, not reported production metrics; source documents and evaluation data are not shown.

Evidence

Pre-production quality gates Post-production diagnosis Failure-mode decomposition Human-like synthetic Q&A

Tools

Promptfoo · Garak · DeepEval · BinEval · Genie · Arize Phoenix · Sonar Cube

Document intelligence

Turning difficult documents into reliable structured data

2025 – 2026

Core question

How do you extract schema-constrained data from difficult engineering documents without allowing silent errors to propagate?

The constraint

The document mix included handwriting, low-resolution scans, complex layouts, and domain-specific symbols. Outputs also had to conform to a downstream schema, so a plausible answer wasn't enough when silent errors could propagate through the workflow.

What shipped

On a held-out set of 100 documents spanning handwriting, low-resolution scans, and complex layouts, field-level extraction accuracy went from 32% with the previous LLM-based pipeline to 80%, at 2.1 pages per second on an L40S with schema-valid JSON on 100% of runs. The verification database changed the reviewer’s job from transcribing fields to correcting them.

First attempt, and why it did not hold

The pipeline started as a single multimodal LLM: PDF in, structured output out, one pass.

It reached 32% field-level accuracy, and the number was the smaller problem. Reading and extraction happened in the same pass, so a wrong field could mean the model misread the handwriting, or read it correctly and assigned it to the wrong key — with no way to tell which. It also failed quietly, returning fluent, schema-shaped, confidently wrong values. Splitting the stages apart, OCR first and then a constrained LLM, made every failure attributable to one of them. That is what turned an accuracy problem into a fixable one.

Investigation → system

  1. 01 Benchmarked open-source vision-language models and paired LightOnOCR2 with a prompt-engineered LLM stage.
  2. 02 Produced schema-constrained JSON with validation designed around the downstream application workflow.
  3. 03 Built a verification database that captures human corrections and feeds them back into the extraction loop.

Evidence

32% → 80% field-level accuracy 100 held-out documents 2.1 pages / sec on an L40S 100% schema validity

Tools

LightOnOCR2 · vLLM · llama.cpp · Schema-constrained JSON · Verification database

3D perception

Learning from severely imbalanced point clouds

2025

Core question

How do you improve minority-class learning without sacrificing the rest of a large outdoor scene?

The constraint

The enterprise dataset contained approximately 3 million labeled points, including transmission towers and conductors. Utility point clouds are dominated by common classes while operationally important classes can be rare, so overall accuracy can hide the failures that matter.

What shipped

On held-out validation data, the operationally important minority class reached 92% IoU, against 98% IoU on the majority class. Overall accuracy also reads 98%, but on a point cloud this imbalanced that number is close to what predicting the majority class alone would score — the minority-class IoU is what the model was tuned and judged on. The work also shortened the iteration loop, and I mentored an intern through the modeling and data-pipeline work.

Investigation → system

  1. 01 Built on RandLA-Net and KPConvNeXt with focal loss and class-balanced re-weighting.
  2. 02 Combined farthest-point and inverse-frequency sampling with targeted oversampling, tile-level rebalancing, and minority-class augmentation.
  3. 03 Improved the training, preprocessing, and annotation loops through caching, batched I/O, and a redesigned labeling workflow.

Those ~3 million points did not label themselves. The intern and I spent two months annotating them, running on our last two brain cells.

Three point-cloud segmentation views of transmission towers, with two structures highlighted in yellow and one in blue.
Qualitative segmentation Transmission-tower geometries

Evidence

92% minority-class IoU 98% majority-class IoU ~3M labeled points Held-out validation

Tools

RandLA-Net · KPConvNeXt · PDAL · PyTorch · Focal Loss

Research to production

From reconstruction papers to a production pipeline

2024 – 2025

Core question

What has to change when a promising 3D reconstruction method meets real images, runtime constraints, and deployment infrastructure?

The constraint

High-fidelity reconstruction from hundreds of high-resolution indoor images was useful only if processing time and rendering speed fit the operational workflow.

What shipped

On comparable scenes, enabled 30 FPS rendering and reduced processing for complex scenes to under 60 minutes—an 80% speed improvement over the earlier architecture.

Investigation → system

  1. 01 Built a structure-from-motion pipeline with COLMAP and OpenSFM for 500+ image scenes.
  2. 02 Integrated Gaussian Splatting and 2DGS for photorealistic real-time rendering.
  3. 03 Moved to a GLOMAP-based architecture and containerized the pipeline for repeatable deployment.

Evidence

500+ image scenes 30 FPS rendering <60 min processing 80% faster on comparable scenes

Tools

COLMAP · GLOMAP · OpenSFM · Gaussian Splatting · Docker

Active experiment

In progress

On-device 3D capture with LiDAR priors

2024 – Present

Core question

Can mobile depth and pose estimates make field capture simpler while improving downstream reconstruction?

The constraint

Manual survey workflows are cumbersome, while image-only reconstruction can struggle without useful geometric priors.

What shipped

The app is still in development. The current goal is a usable capture workflow and better depth priors—not a polished demo claim before the system has earned it.

Investigation → system

  1. 01 Fuse ARKit SLAM with iPad LiDAR depth for in-field point-cloud capture.
  2. 02 Explore on-device and cloud-based Gaussian Splatting reconstruction paths.
  3. 03 Design the capture flow around the constraints of the person collecting the data.

Evidence

ARKit pose LiDAR depth On-device + cloud paths

Tools

Swift · ARKit · LiDAR · SLAM · Gaussian Splatting

Earlier work

Coursework and foundations

University projects from 2021–22. Kept partly because the fundamentals hold up, mostly because deleting them sounded like work.

Computer Vision

Sparse 3D point cloud and estimated camera poses recovered by bundle adjustment.

Structure from Motion

2022

A from-scratch SfM pipeline covering geometry, triangulation, and bundle adjustment.

GitHub ↗
Rectified stereo pair beside the computed disparity and depth maps.

Stereo Vision

2022

Calibration, rectification, correspondence, and metric depth from stereo imagery.

GitHub ↗

Lane Detection & Guidance

2022

Lane-boundary detection and turn guidance using perspective warping and polynomial fitting.

GitHub ↗

AR Tag Detection

2022

Homography-based tag decoding with real-time image and 3D cube overlays.

GitHub ↗
Probability-weighted boundary map produced by the PB-lite detector.

Probability-Based Boundary Detection

2021

A simplified PB detector combining texture, color, and intensity gradients.

GitHub ↗
Multiple photographs warped and blended into a single panorama.

Panorama Stitching

2021

Automatic multi-image stitching with feature matching and homography-based warping.

GitHub ↗
Two faces swapped using Delaunay triangulation and thin plate spline warping.

Face Swap

2021

Face warping and blending with Delaunay triangulation and Thin Plate Splines.

GitHub ↗
Checkerboard target with detected corners used to solve for camera intrinsics.

Camera Calibration

2021

Automatic intrinsic and extrinsic calibration from checkerboard imagery.

GitHub ↗

Deep Learning

Gesture-Operated Robot

2022

A Jetson Nano robot controlled by gestures from a lightweight OpenPose model at 20 FPS.

GitHub ↗
Low-resolution MRI slice beside the super-resolved reconstruction.

3D MRI CNN Super-Resolution

2022

Reproduced and extended CNN-IL, improving SSIM and PSNR with a custom architecture.

GitHub ↗
Monocular frame and the depth map predicted by the self-supervised network.

SfMLearner

2022

Extended monocular depth and ego-motion learning with a ResNet backbone and SSIM loss.

GitHub ↗

Machine Learning

Handwritten digit samples with predicted labels.

Handwritten Digit Recognition

2022

Implemented classical classifiers and LeNet-5 from scratch.

GitHub ↗
Face dataset samples used to compare classical classifiers.

Face & Expression Recognition

2022

Compared Bayes, kNN, Kernel SVM, and Boosted SVM with PCA/MDA.

GitHub ↗
Monkey species samples with predictions from the transfer-learned model.

Monkey Species Classification

2022

Transfer-learned ResNet-34 and ResNet-50 after building a custom CNN baseline.

GitHub ↗

Robotics & Planning

RRT* search tree expanding around obstacles toward a moving goal.

Real-Time RRT*

2022

Continuous replanning for a holonomic robot with dynamic obstacles and a moving goal.

GitHub ↗
A* path through an inflated-obstacle occupancy map in Gazebo.

A* on TurtleBot 3

2022

Path planning with obstacle inflation and real-time replanning in Gazebo.

GitHub ↗
Explored nodes and final paths from the compared planning algorithms.

Planning Algorithms Benchmark

2022

Compared BFS, Dijkstra, A*, and RT-RRT* on differential-drive robots.

GitHub ↗
Two TurtleBots locating AprilTag markers in a simulated disaster arena.

Urban Search & Rescue Robot

2021

Coordinated two TurtleBots using AprilTags, transforms, and MoveBase.

GitHub ↗
State response plots for the LQR and LQG controlled double pendulum.

LQR / LQG Crane Control

2021

Modeled and controlled a nonlinear crane double pendulum in MATLAB.

GitHub ↗

Want the chronological version?

The experience page contains the full role-by-role record.

View experience →