pub enum SynthSegInference {
FullVolume,
SlidingWindow {
patch: usize,
overlap: usize,
},
}Expand description
How the network is applied to the preprocessed (1 mm, RAS, padded) volume.
Variants§
FullVolume
One network pass over the whole padded volume, as the SynthSeg CLI runs it; the output
matches FreeSurfer’s mri_synthseg (every label Dice ≥ 0.9999). Peak memory grows with the
volume (about 0.95 KB per padded voxel): 6–12 GB on 1 mm head scans, so it does not fit a
4 GB WASM heap even with the head crop and half-precision posteriors.
SlidingWindow
Gaussian-weighted sliding window: the network runs on cubes of patch voxels (at least
64, rounded up to a multiple of 16) that overlap their neighbours by at least overlap
voxels, and each voxel’s posteriors are the Gaussian-weighted (σ = patch/8) mean over the
windows that cover it. Peak memory for the network follows the patch. An axis the volume
does not exceed is covered by one window; a volume one window covers runs as FullVolume
does.
Window origins are on the network’s max-pooling lattice (multiples of 16 voxels from the
whole-volume input’s origin), so every window pools the same voxels together that the
whole-volume pass does; the step between windows is a multiple of 16 no larger than
patch − overlap, spread evenly over the axis. Against windows at a step of half a patch
this gave no measurable gain on three 1 mm scans: at 128³ those steps were already on the
lattice, and at 96³ the lowest label rose on one scan (Dice 0.948 → 0.963) and fell on
another (0.937 → 0.928). The error at 96³ comes from the window’s limited context, not
from pooling phase. The lattice is kept because it costs nothing and is the placement
under which a window sees exactly what the whole-volume pass sees.
The overlap is a minimum in voxels, so the window count is explicit. At 96³, an overlap of 64 instead of 48 raised mean Dice by up to 0.003 on two of the three scans and cut the worst label’s volume error (9.8 → 6.1 %), but needs 1.5–2× the windows and about 1.6× the time. At 128³ the two give the same windows on 192- and 256-voxel axes.
Implementations§
Source§impl SynthSegInference
impl SynthSegInference
Sourcepub const LOW_MEMORY: Self
pub const LOW_MEMORY: Self
The memory-bounded window, for a 32-bit WASM heap (see SynthSegParams::low_memory):
96³ patches overlapping by at least 48. Against FreeSurfer’s mri_synthseg (which the
whole volume matches) on three 1 mm scans: mean Dice over the labels 0.984–0.988, lowest
label 0.93–0.96, single labels’ volumes off by up to 6–10 % (the inferior lateral
ventricles and the cerebellum). 128³ windows reach 0.993–0.996 (lowest 0.98, volumes
within 3 %) but, even with half-precision posteriors and the head crop, took a 184×256×128
scan (padded to 192×256×128) to 3.83 GB of the 4 GB heap; a larger grid does not fit, so
128³ is an option only for grids up to about 192×256×128. Overlap 48 rather than 64: on
192- and 256-voxel axes it places as many windows as a step of half a patch, where 64
needs 1.5–2× as many (see SynthSegInference::SlidingWindow).
Trait Implementations§
Source§impl Clone for SynthSegInference
impl Clone for SynthSegInference
Source§fn clone(&self) -> SynthSegInference
fn clone(&self) -> SynthSegInference
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for SynthSegInference
Source§impl Debug for SynthSegInference
impl Debug for SynthSegInference
Source§impl PartialEq for SynthSegInference
impl PartialEq for SynthSegInference
Source§impl Serialize for SynthSegInference
impl Serialize for SynthSegInference
impl StructuralPartialEq for SynthSegInference
Auto Trait Implementations§
impl Freeze for SynthSegInference
impl RefUnwindSafe for SynthSegInference
impl Send for SynthSegInference
impl Sync for SynthSegInference
impl Unpin for SynthSegInference
impl UnsafeUnpin for SynthSegInference
impl UnwindSafe for SynthSegInference
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<T> CloneAny for T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSend for T
impl<T> DowncastSend for T
§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more