Computer vision platform · 2026
Multi-camera computer-vision inspection for a rail fleet
A major Japanese rail operator inspects train roofs for defects. Six cameras record every carriage as a train passes, which produces far more footage than anyone can watch. I built the platform that turns those raw camera feeds into reviewable, annotatable inspection tasks.
- My role
- Frontend and platform engineer
- Stack
- Angular 19
- TypeScript
- FastAPI
- Python
- Redis
- CVAT
- ffmpeg
- S3
- Docker
The problem
Six cameras record each passing train. For an eight-carriage train that is a large pile of video per run, and a defect might be a single bolt in one frame. Reviewing it by scrubbing raw video files is not workable at fleet scale.
The operator needed the footage organised by train and carriage, synchronised so all six angles move together, and wired into an annotation workflow where a reviewer can mark a defect and have that decision tracked to a verdict.
How it fits together
Architecture
6 cameras x N carriages
|
v
+------------------------+ +----------------+
| recording service |----->| Redis |
| (FastAPI) | | coordination |
+------------------------+ +----------------+
|
| ffmpeg concat
v
+------------------------+
| S3 object storage |
+------------------------+
|
v
+------------------------+ +----------------+
| task registry |<---->| CVAT |
| labels, verdicts, | | annotation |
| audit trail | | backend |
+------------------------+ +----------------+
|
v
+------------------------------------------+
| Angular 19 review UI |
| synchronised 6-up player, per-carriage |
| navigation, dashboard, scheduler |
+------------------------------------------+What I built
Ingest, stitch, and register as tasks
A FastAPI recording service pulls the raw camera output, concatenates segments with ffmpeg, uploads the result to S3, and registers an annotation task against it. Redis coordinates the pipeline. What lands on the reviewer's screen is a single addressable inspection task rather than a directory of video files.
Six cameras that move as one
The reviewer UI is Angular 19 using standalone components and signals. The core of it is a synchronised player: six feeds scrub together, step frame by frame together, and stay locked when you zoom. Carriage selection moves all six angles at once, so a reviewer can follow one defect down the length of a train without losing their place.
Annotation on top of CVAT
Rather than building an annotation tool, the platform sits on CVAT and extends it: a managed label taxonomy that syncs to CVAT projects, an admin console with an audit trail, and organisation-scoped permissions. Frames hand off to CVAT for labelling and the verdicts come back into the dashboard.
Scheduling the fleet
Trains are grouped and inspected on a rotation. The scheduler models that rotation as a piecewise timeline, maps 144 trains onto named groups, versions each mapping with an audit comment, and shows the operator which group is due today.
The product
Screenshots are from the real application. Client identifiers and any personal data have been redacted.




Where it landed
- Raw multi-camera footage became a reviewable queue of inspection tasks with tracked verdicts.
- Twenty pull requests merged across the frontend, the CVAT extension, and the on-premise services.
- Delivered as on-premise infrastructure, which the operator's security posture required.
