Real-time blind X-ray image super-resolution
Super-resolution and denoising on live cath-lab X-ray feeds — owned end-to-end, from model R&D through INT8/FP16 quantization to TensorRT/C++ serving, at $200K+ ARR.
I built AIMAG — single-image blind super-resolution and denoising for live fluoroscopy — and carried it through to revenue: PyTorch → ONNX → TensorRT with INT8/FP16 quantization, served through FastAPI/C++ at 600+ FPS on an RTX 4090 with −70% latency and under 5% accuracy loss, alongside an automatic QCA pipeline (0.94 Dice, <4 s) that cardiologists use mid-procedure.
The system
Interventional cardiology runs on X-ray fluoroscopy: low-dose frames, real-time decisions. Radiation dose and image quality trade off directly — halve the dose and you roughly halve the signal. The product question: can a learned restoration model recover diagnostic quality from noisy, low-resolution live frames fast enough that the cath-lab never notices it is there? "Blind" means no paired high-resolution ground truth exists at inference time — the model must handle whatever noise and resolution the machine produces.
What I built
1. The restoration model
Single-image blind super-resolution and denoising trained for fluoroscopic statistics — R&D, data pipeline, and release all owned end-to-end. The segmentation side of the product (automatic QCA) uses a U-Net++ with a ResNet50 encoder at 0.94 Dice; the imbalance math behind that number is written up here.
2. The quantization pipeline
The model only matters if it keeps up with a live feed alongside the rest of the imaging stack on one workstation. The path was PyTorch → ONNX → TensorRT with INT8/FP16 quantization: 600+ FPS on an RTX 4090, −70% latency, under 5% accuracy loss. Quantization was the single highest-leverage change in making real-time possible — the derivation of why INT8 barely hurts is the subject of this post, and the stage-by-stage conversion walkthrough is open-sourced here.
3. Serving and the QCA pipeline
FastAPI fronting C++ inference so the restoration runs in the live loop, plus the automatic QCA (quantitative coronary analysis) pipeline that completes in under 4 seconds — measurements cardiologists previously traced by hand.
Measured outcome
| Metric | Result | Conditions |
|---|---|---|
| Throughput | 600+ FPS | RTX 4090, INT8/FP16, full pipeline |
| Latency | −70% | vs. the pre-optimization deployment |
| Accuracy loss | <5% | measured perceptual comparison vs FP32 |
| QCA segmentation | 0.94 Dice | U-Net++/ResNet50, coronary vessels |
| Commercial | $200K+ ARR | product line owned end-to-end |
Patents applied
- AI-powered X-ray image enhancement (202541071194) — single-image blind super-resolution & denoising.
- Enhancing body part from angiography loop (202441009957) — dynamic roadmap generation from DSA sequences.
- Image enhancement in X-ray fluoroscopy (202541041511) — real-time contrast enhancement & denoising.
What I learned
A medical AI product lives or dies on the inference budget, not the model paper. Every unit of latency removed on the deployment side was worth more than a point of PSNR on the research side — and owning R&D through serving is what made that trade visible at all.