Senior ML developer, teaching machines where to look.
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.
Padel: court analytics
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. On top of that sit the statistics a player actually wants, things like court coverage, shot selection and where the errors cluster, and personalised training plans built from how someone is genuinely performing rather than how they think they are.
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.
The pipeline feeds into TJS, the event, judging and live-streaming platform that already runs a good share of the real competitions. That is also where the labelled footage comes from, which is the only reason any of this works.
Side project · with the Catalan Slackline Association
Naming a trick that lasts a third of a second
Trickline is slackline's aerial discipline: flips thrown between bounces on a stretched line. A trick is over in a fraction of a second, which makes it brutal to judge live.
Pose tracking follows the athlete, and an association layer stitches the 500-plus shattered track IDs from one video back into a single person. The Hilbert transform of the vertical centroid finds the bounce phase, so clips get cut on real bounce boundaries. Those labelled clips train the classifier that names each trick.
The turning point wasn't a better model. It was a review UI for fixing a bad cut, relabelling it and adding classes on the spot. 0.66 out-of-sample accuracy on the ten best-supported classes of forty; the rest is a labelling problem.
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 two things at once: my pose, and the depth of the scene. The imagery is generated, 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 and how far away everything sat, frame by frame, and it 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.
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.
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.
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.