Inspiration

A missed branch artery during aortic stent grafting can cut off blood to a kidney. Surgeons find these branches by manually scrolling CT scans and estimating by eye. Arbor gives a complete, measured inventory of every branch in seconds, so the surgical team walks in with every vessel accounted for.

What it does

Given a CT angiogram and a binary mask of the abdominal aorta, Arbor finds every artery that leaves that aorta, reporting each as a separate instance with the centre of its opening in physical millimetres, a seed point 5 mm along the vessel, its initial direction, and its lumen radius. It runs in about ten seconds per case on a single laptop core. Furthermore, every detection is drawn on a flattened map of the aortic wall, so a surgeon can see and audit exactly how each decision was made.

How we built it

Arbor is built entirely with classical image processing in Python (NumPy, SciPy, scikit-image), not machine learning in the pipeline. The aortic wall is cut open and flattened into a 2D map, depth down the aorta on one axis and clock position around the wall on the other, which turns branch detection into reading marks on a map.

Since aortic brightness runs from ~85 to 580 HU across patients, a threshold ladder walks down from the supplied lumen until the most separate, plausible openings resolve, and each bright patch touching the wall becomes one branch ostium. Labels then grow outward in strict distance order, keeping branches separate and leaks contained; patches that split into two vessels a few millimetres out are divided and traced back to the wall; and each branch is followed 10 mm to its first bifurcation to measure its seed, direction, and radius. Physiological filters remove implausible candidates, with every refusal carrying a logged reason.

Challenges we ran into

With images that were low resolution that with more noise (i.e. having low contrast), our algorithm had a difficult time in identifying the daughter branches, and often overestimated. We solved this by changing the filter for low contrast images, to add nuance and improve accuracy. We validated against the development set of 25 cases, checking our detections against the provided reference annotations where available. Most misses came from small or low-contrast branches near the ostium size cutoff, which is what pushed us to tune the threshold ladder rather than just lower it uniformly.

Accomplishments that we're proud of

A fully classical pipeline with no GPU, no training data, and no external dependencies beyond NumPy/SciPy/scikit-image, running in about 10 seconds per case on a single laptop core, well under the 60 second per-case target. Every accepted or rejected branch comes with a logged reason instead of a black-box score.

What's next for Arbor

Testing against a larger set of annotated cases to tighten ostium localization accuracy, improving detection on lower-resolution and low-contrast scans, and extending the flattened wall map into an interactive tool so a surgeon can review or override individual branch calls before surgery.

Built With

Share this project:

Updates

Submission history