Ultrasound · Doppler angle · deep neural networks

Doppler Angle Estimation with Deep Neural Networks

The problem and the idea

Vascular ultrasound measures blood-flow velocity with spectral Doppler, and that measurement depends on the angle θ between the ultrasound beam and the vessel. The scanner cannot determine θ on its own. In current practice the sonographer reads it off the screen and sets it by hand, an operator-dependent step that is repeated on every exam.

This matters because the reported velocity scales with 1 / cos θ. At the steep angles used in practice, a few degrees of error in θ produce a large error in velocity, and velocity is the quantity a clinician acts on, for example when grading how narrowed a carotid artery is. Improper angle correction is a well-documented and recurring source of error in vascular labs.

This project tests whether θ can be estimated automatically from a single grayscale B-mode image, without color Doppler or manual segmentation, using a deep neural network in place of the hand-set angle. It reproduces and extends our EMBC 2019 study. The headline result is just below, and the Method, Results, and Clinical pages document the rest, with every number reproducible from code.

Why a few degrees of angle is a velocity problem

Spectral-Doppler velocity is recovered from the Doppler equation,

\[f_d = \frac{2\,f_0\,v\cos\theta}{c} \quad\Longrightarrow\quad v \propto \frac{1}{\cos\theta},\]

where \(f_d\) is the measured frequency shift, \(f_0\) the transmit frequency, \(c\) the speed of sound, and \(\theta\) the angle between the ultrasound beam and the vessel flow. Because velocity scales as \(1/\cos\theta\), an error in \(\theta\) propagates straight into the reported velocity, and the sensitivity \(\tan\theta\) grows sharply as \(\theta\) approaches the steep angles used in practice: near 60°, each additional degree of angle error moves the reported velocity by about three percent.

The angle is set manually by the sonographer, which makes it a leading, operator-dependent source of velocity error. Reading it automatically from the image removes that step from the human, which is the motivation for the whole estimator.

What the ~35% accreditation figure does and does not say Improper angle correction has been flagged in up to roughly 35% of vascular-lab accreditation applications (Saad 2009). That is a literature figure describing the field at large, not a measurement on this cohort, and it motivates the problem rather than quantifying anything this estimator was tested against.

Rotate the beam and watch the velocity move

The slider below sweeps the ultrasound beam across a real B-mode image to set an illustrative beam-to-vessel angle \(\theta\), and shows, live, the fractional velocity error a clinic would inherit from it. The beam overlay is a synthetic teaching tool for the \(1/\cos\theta\) relationship; it is not the rotation-augmentation grid the model was trained on.

Longitudinal grayscale B-mode image of a common carotid artery — the static fallback for the interactive Doppler-angle explainer.
Figure 1. The reported velocity is proportional to \( 1/\cos\theta \), so it rises slowly near small angles and steeply past 60°. The table below this figure shows the same relationship without scripting; the slider is an illustrative model, not the trained estimator.
Velocity multiplier \( 1/\cos\theta \) and the fractional velocity error relative to a 60° reference.
θ (degrees)Velocity multiplier ×Error vs 60°
451.41−29.3%
501.56−22.2%
551.74−12.8%
602.000.0%
652.37+18.3%
702.92+46.2%
753.86+93.2%
805.76+187.9%

Headline results

The tuned stacked ensemble reproduces and improves on the EMBC 2019 paper’s best single model (≈ 2.87° MAE / 4.03% MAPE, image-level) and additionally reports the previously-unmeasured patient-level number.

1.96°Image-level MAE
2.79%Image-level MAPE
5.93°Patient-level MAE
8.53%Patient-level MAPE
Headline accuracy under each sampling protocol, with MAPE and MAE shown separately. Image-level rows are five-fold cross-validation means or pooled out-of-fold; patient-level rows are pooled out-of-fold.
Estimator Image-level sampling Patient-level sampling
MAPE (%) MAE (°) MAPE (%) MAE (°)
Frozen DenseNet201 (grid pooling) 5.84 3.77
Tuned DenseNet201 4.03 3.00 10.80 8.62
Tuned stacked ensemble (5 backbones) 2.79 1.96 8.53 5.93

Two ways to be right

The same 2,100-image corpus is scored two complementary ways: an image-level protocol that splits the augmented images at random (the original study’s lens), and a patient-level protocol that splits by volunteer with GroupKFold so no subject appears in both folds. Neither is wrong — the image-level number measures accuracy across the full population of orientations, the patient-level number measures generalization to an unseen patient, and the Method and Results pages report both.

Why the patient-level number is the harder, more honest one The patient-level result rests on a small, single-center cohort (~10 volunteers, 84 base images, one scanner, carotid only), with only about two held-out subjects per fold, so its cross-subject variance is non-negligible and its external validity to other anatomies or scanners is untested. The roughly 3× spread between the two protocols quantifies how much of the within-population accuracy is anatomy-specific.

What this is not

This is a research re-implementation, not a clinical tool: nothing here is validated for diagnosis, deployment, or velocity or stenosis reporting, the backbones are frozen rather than fine-tuned, and a from-scratch CNN on this data fails outright. The 2,100 labelled examples are 25 rotated copies of 84 base images, not 2,100 independent samples, and the agreement analysis compares the model against a single reference reading per image rather than against a second observer. The full scope and limitations are on the Reproduce page.

Read on