Dermoscopy, tumour slides, a ball crossing a padel court, a painting's brushwork. Different worlds, one problem. I build the models that find the signal, and I tell you honestly when there isn't one.
Field Whole slide
Tiles 0
Weighting Attention
Most of my work here is oncology: melanoma prognosis, molecular subtyping from whole slide images, and the interpretability methods needed before any of it goes near a clinician.
Research collaboration
Imperial College London
Imperial College London
An algorithm to predict pressure ulcers, built on a dataset of more than five million entries, in close collaboration with the Department of Computing.
Risk prediction · Large-scale clinical records
Clinical clients
Athena Tech
Consultant and researcher building precision medicine models for cutaneous melanoma patients.
Kenko
An automated pipeline for detecting biomarker expression in histopathological images, in conjunction with AMLo, to test new staining strategies.
Two sports, the same underlying problem: something happens too fast for a person to catch reliably, and the footage that proves it is unlabelled. Padel pays the bills. Slackline is the one I do for love.
LookAtMe Sport
Court analytics from two fixed cameras, one behind each short side. I built the production vision pipeline: calibration from court lines, player tracking and pose estimation, ball trajectories reconstructed in metric space, and the shot-level events derived from them.
2026 · Data tooling
Human-in-the-loop tools for building the dataset
Sports footage arrives unlabelled and enormous, and the bottleneck is almost never the model. It's getting enough correctly labelled frames to train on. I build the annotation and cleaning tools around that: the model proposes, a human corrects only what it got wrong, and the corrections feed straight back into the next round.
Reviewing the model's mistakes is far cheaper than labelling from scratch, and the labels come out better. A corrected prediction is more consistent than a box drawn by hand at 3pm on a Friday.
Active learning · Pre-labelling · Consistency checks · Dataset versioning
2026 · Production pipeline
Real-time dual-source inference on GPU
A DeepStream pipeline running two synchronised camera feeds through pose estimation on an L4, with custom parsers and half-precision inference to hold frame rate.
The geometry is weakest along the long axis of the court, which is exactly the direction that determines shot depth. That constraint drove more of the design than the choice of detector did.
Side project · with the Catalan Slackline Association
Naming a trick that lasts a third of a second
Trickline is slackline's aerial discipline: you bounce on a stretched, trampoline-like line and throw flips between the bounces. A trick is over in a fraction of a second, which makes it brutal to judge live. The pipeline finds which athlete is bouncing, where each trick starts and ends, and which trick it was. The point is to take load off the judges, not replace them.
Pose tracking follows the athlete, and a custom association layer stitches the 500-plus shattered track IDs a single video produces back into one person. The Hilbert transform of the vertical centroid gives the bounce phase, so segments get cut on real bounce boundaries rather than a fixed window.
The turning point wasn't a better model. It was a review UI that let us fix a bad cut, relabel it and add trick classes on the spot. 0.66 out-of-sample accuracy on the ten best-supported classes of forty; the rest is a labelling problem, not a modelling one.
AI is reshaping how images get made. I'm interested in the part where the artist keeps authorship and the model stays a tool rather than the author.
Diffusion · ControlNet
The movement is mine. The creature is the model's.
That's me spinning fire. A diffusion model re-renders each frame with ControlNet conditioning on my pose, so the imagery is generated but the choreography is not. Every position the creature holds is a position I held first.
This is the arrangement I actually want from these tools. The model has no idea what the performance was; it only knows where the body was, frame by frame, and paints into that constraint.
Source performanceDiffusion + ControlNet
Neural style transfer
Lending one image the hand of another
A photograph re-rendered with the brushwork, palette and texture statistics of a painting.
Here a region of each frame is regenerated by an inpainting model rather than restyled. The difficulty is temporal coherence: a model inpainting each frame independently has no memory of the one before, so the filled region drifts between frames and the result flickers even when every still, examined on its own, looks correct.
SourceProcessed
Data strategy and one-off engagements that don't sit under a single domain.
ServiZurich
Worked out how to store and structure their data so it could be used for machine learning at all, then built solutions for problems across several departments.
How engagements run
You get a private page, not a monthly slide deck.
Every project gets its own credentialed URL. Results, plots, tracked video and current status live there and update as the work does, so you can see where things stand on a Tuesday morning without asking me.
Work is scoped in phases with a defined output at the end of each. If a phase shows the approach doesn't work, that is the output, and we stop there rather than spending your budget proving it twice.
Tell me what you have, whether that's data, video, or a model that already misbehaves, and what decision it needs to support. I'll tell you honestly whether it's tractable.