A coronary segmentation model that scores well on its own test set often loses a lot when it meets angiograms from another hospital. Part of that is the scanner and the acquisition. Part of it, for anything trained on ARCADE, is the labels: ARCADE is the largest public set with 1,000 annotated training frames, but it only annotates the segments that count toward the SYNTAX score. Side branches and distal vessels are labelled as background, so a model trained on it learns to leave them out. In arXiv:2610.40302, Danial Moafi, Aida Moafi, Mostafa Aryafar, Ashkan Sami and Maryam Aryafar (APEC International Ltd, London, and Edinburgh Napier University) test a simple fix that needs no new annotation: let the model label the new site’s frames, and use a frame from the same run, taken before the contrast arrives, to find the vessels it missed.
We looked at coronary angiography from a different angle in TDBM, a model for vessel maps. This paper is about the step that comes after you have a model: getting it to work on a site you have no labels for.
What the method does
It is one round of self-training on a 2D nnU-Net, with two sources of pseudo-labels for each unlabelled frame.
- The model’s own mask. The baseline nnU-Net, trained on the ARCADE training frames, segments the contrast-filled frame. Its mask is the seed.
- A subtraction map from the same run. Most angiographic runs start before the contrast reaches the coronaries, and many continue after it washes out. A frame without coronary contrast is registered to the contrast frame with phase correlation (integer shift, at most 20 pixels, for breathing and table motion) and subtracted. What is left is mostly contrast-filled vessel, much like digital subtraction angiography, plus anything that moved between the two frames.
- Region growing. Because moving structures also show up in the subtraction map, it is not thresholded directly. Instead, the seed mask is grown along it: a neighbouring pixel is added if its contrast value is above 0.15 and it either looks tubular (Frangi vesselness) or sits within 3 pixels of the mask. Only regions connected to the seed are kept, and added structures wider than 12 pixels are dropped, which removes things like the diaphragm edge and contrast in the aortic root.
- A three-class label. Seed pixels become vessel. Pixels added only by region growing become ignore, not vessel. Everything else is background. Seed components with almost no contrast in the subtraction map (likely guidewires or collimator edges) also become ignore.
- Retraining. The student starts from the baseline weights and is fine-tuned for 100 epochs on ARCADE plus the pseudo-labelled frames, using nnU-Net’s built-in
ignore_labeloption so the ignore pixels do not count in the loss.
The ignore class is the part I find most useful. The grown pixels are the ones most likely to be vessels the baseline missed, but they are also where the subtraction noise lives. Labelling them as vessel would train the model on the noise, and labelling them as background would train it on ARCADE’s gaps again. Leaving them out of the loss avoids both.
Frame selection is automatic. XCAD ships a background frame for each angiogram (available for 1,610 of 1,621 training frames). For XACV the authors scored every frame of a run by mean vesselness, took the three strongest contrast frames and paired each with the nearest low-score frame in time. Frames where the seed was nearly empty or the grown region covered more than 8% of the image were dropped, which left 223 of 252 XACV frames.
Why a clinic or viewer shop would care
If you ship coronary segmentation for QCA or for vessel overlays, every new customer is a new domain, and complete vessel tracing on angiograms is slow, specialist work. This recipe uses only what the new site already has: unlabelled runs, which usually contain the pre-contrast frames anyway. It runs on a standard nnU-Net setup without changes to the network, so a team that already trains nnU-Net can reproduce it with tools it has.
What it hangs on the scan is the same thing as before: a 2D binary vessel mask per frame. The useful extra for a viewer is the subtraction map and the grown region. During a site rollout I would show those as a separate toggle layer, so the person checking the pseudo-labels can see where the model and the subtraction disagree before any retraining happens.
Results that matter
The authors trained six models and tested on ARCADE plus two fully annotated external sets, XCAD (another vendor and centre) and XACV (a third centre). The control matters here: fine-tuning the baseline for the same 100 extra epochs on ARCADE alone lowered macro Dice by 0.6 points, so the gain below does not come from longer training.
- One self-training round on the XCAD pool raised macro Dice over the three test sets by 2.7 points (95% CI 2.3 to 3.2), with gains on all three. Sensitivity went up by 2 to 5 points, and precision dropped by at most 1.3 points.
- Seeding the same pipeline with labels from DeepSA, an external model trained on 50 fully annotated frames, took XCAD Dice from 0.623 to 0.745 without any XCAD labels. On XACV it barely moved.
A second round did not help. The authors explain why: on XACV the baseline masks covered 3.9% of image pixels against 8.9% in the ground truth, and region growing added only 1.7%. Much of the vessel tree stayed labelled as background, so the student kept missing the same vessels as its teacher.
Where it fails
- It cannot beat a blind teacher by much. The gain is capped by how sensitive the starting model is. The authors’ own conclusion is that label completeness matters more than label count.
- The seed model’s failures get inherited. The DeepSA-seeded model missed large main vessels on XACV (Figure 2 of the paper). The authors link this to DeepSA’s top-hat preprocessing, which suppresses wide dark structures.
- It needs a contrast-free frame. Most runs have one, but a run that starts with contrast already in the vessels and stops before washout gives nothing to subtract.
- Hand-picked thresholds. The region-growing settings were chosen by looking at a few frames and were not tuned per dataset.
- Thin statistics. Each model was trained once with one seed, and XACV is 52 test frames from 14 cases, so the confidence intervals are probably too narrow.
- No clinical or QCA test. All three datasets are public, and nobody measured stenosis or diameter on the output. Better Dice on distal branches does not automatically mean better QCA numbers.
- Still far from supervised. The best XACV result here is 0.574 Dice. The authors cite another method at 0.844 with 16 labelled videos from that site.
Code, data and licence
There is no public repository. The paper says code is available from the corresponding author on reasonable request, and no weights are released. ARCADE, XCAD and XACV are public datasets from their original publications. The preprint was submitted on 29 October 2026 under the arXiv non-exclusive distribution licence, which is not a Creative Commons licence. The work was funded by a Scottish Enterprise SMART: SCOTLAND feasibility grant to APEC International. This is a research method, not a cleared product.
My take
The method is easy to reproduce: nnU-Net, phase correlation, a Frangi filter and an ignore label. It also uses a signal every angiographic run already contains to correct a known bias in the most popular training set. The numbers are modest, and the paper says so. If I were deploying coronary segmentation at a new hospital, I would not count on self-training alone. I would trace a few dozen frames completely at that site, which is what the authors plan next, use that model as the teacher, and then run this pipeline on the unlabelled archive.