Level Sets Framework Refactoring Arnaud Gelas, Kishore Mosaliganti, Nicolas Rannou, Lydie Souhait, Sean Megason Boston 02/03/2011 Outline • Goals • Principles • Status o Traits o Fast Marching Image / Mesh Stopping Criterion Constrained Topology Shortest Path Computation Isotropic / Anisotropic o Level Sets / GPU • Plan • Requirements Goal: Generic Level Set Framework • Multi-level set support • simultaneous evolution of level sets • Multi-channel support • Vector or tensor data segmentation • Level set representation • Mesh-based (unstructured), image, or parametric • Terms used in the PDE • Add/delete terms in the update equation • Topological constraints • Stopping criterion • RMS, Iterations, target points Discrete Level Set STATUS Traits • TInputDomain • TNode • TOutputDomain • TSuperclass Traits - Base Class template< class TInputDomain, class TNode, class TOutputDomain, class TSuperclass > class LevelSetTraits { public: typedef [...] class NodePair : public std::pair< NodeType, OutputPixelType > [...] }; Traits - Image Specialization template<unsigned int VDimension, class TInputPixel, typename TOutputPixel > class ImageLevelSetTraits : public LevelSetTraits< Image< TInputPixel, VDimension >, Index< VDimension >, Image< TOutputPixel, VDimension >, ImageToImageFilter< Image< TInputPixel, VDimension >, Image< TOutputPixel, VDimension > > > Traits - Mesh Specialization template< unsigned int VDimension, typename TInputPixel, class TInputMeshTraits, typename TOutputPixel, class TOutputMeshTraits > class MeshLevelSetTraits : public LevelSetTraits< Mesh< TInputPixel, VDimension, TInputMeshTraits >, typename TInputMeshTraits::PointIdentifier, Mesh< TOutputPixel, VDimension, TOutputMeshTraits >, MeshToMeshFilter< Mesh< TInputPixel, VDimension, TInputMeshTraits >, Mesh< TOutputPixel, VDimension, TOutputMeshTraits > > Fast Marching • Code available at the following address: https://github.com/arnaudgelas/itkFastMarching • Numbers: o 36 tests o Tested Fedora 13, 14 (64 bits) Ubuntu 10.10 (64 bits) Mac OS-X 10.5, 10.6 o Coverage: 80.49% Stopping Criterion - Base Class class StoppingCriterionBase : public Object { public: virtual bool IsStatisfied() const = 0; virtual const std::string GetDescription() const = 0; }; Stopping Criterion - Examples • Threshold on the current value o Equivalent to the current implementation of itk::FastMarchingImageFilter<> • Reached Target Nodes (One, Some, All), with possible overshoot offset o Equivalent to the current implementation of itk::FastMarchingUpWindGradientImageFilter<> Constrained Topology [Tustisson'10 - Insight Journal 778] Escher's Ants as Metaphor: Topological Marching for the Well-Composed, Genus Zero Crowd Minimal Path Extraction [Mueller'08 - Insight Journal 213] Fast Marching Minimal Path Extraction in ITK Isotropic / Anisotropic Isotropic • Can be solved using current implementation Anisotropic • Several possible schemes • which one the best? • make it easy to implement any of these methods Requirements Possible performance improvement UpdateNeighbors() calls 2 * ImageDimension UpdateValue() Thread Pool ? Fast Marching - Process ? • Integration Process? o Should we struggle for its integration (backward compatibility) ? o Should we struggle a second time when integrating new level sets framework? Fast Marching - Process ? • update software guide? o When ? o How ? o Any constraint? FUTURE WORK Plan • Git repository • Discrete Representations o o o Domain Traits Iterators Dense Term container Propagation Advection Curvature Chan & Vese energy Multithread Reinitialization Stopping Criterion Plan • Discrete Representations • Sparse – Constrained Topology – Multithread • Real time algorithm [Shi] • Parametric Representations • Splines • RBF Discrete Level Sets - simplified view (a) while( ! m_StoppingCriterion->IsSatisfied() ) (b) { (c) for each level set ls_i in the level set container (d) { (e) for each nodes n_j in the domain of ls_i (f) { (g) for each term t_k in the term container (h) { (i) Compute Term Value t_k( n_j, ls_i ) (j) Compute Term Contribution for time step computation (k) } (l) Evaluate the updated level set function ( delta( ls_i( n_j) ) ) (m) } (n) } (o) Compute time step from CFL Condition (p) for each level set ls_i in the level set container (q) { (r) Update the level set function ls_i (s) Reinitialize to signed distance function (if requested by user) (t) } (u) } GPU Involvement - 1 (a) while( !m_StoppingCriterion->IsSatisfied() ) (b) { (c) for each level set ls_i in the level set container (d) { (e) for each nodes in the domain of ls_i (f) { (g) for each term t_k in the term container (h) { (i) Compute Term Value t_k( n_j, ls_i ) GPU implementation during pixel updates at (i): • Pixel neighborhood in image and level set is copied to GPU memory • Terms are evaluated in the GPU function • Each term will have a CPU and GPU implementation • A term factory will call the GPU implementation • Advantages: • Minimal changes in the current proposed design • Drawbacks: • very bad according to performance GPU Involvement -2 (a) while ( !m_StoppingCriterion->IsSatisfied() ) (b) { (c) for each level set ls_i in the level set container (d) { (e) for each nodes in the domain of ls_i (f) { (g) for each term t_k in the term container (h) { (i) Compute Term Value t_k( n_j, ls_i ) • Entire while loop iteration (a) in GPU • Everything is copied inside the GPU memory • Advantages: • Fastest solution in terms of performance • Downside: • memory limitation of the GPU (<2 Gb) • Code duplication: CPU and GPU • Note: Copy b/w memory 4Gb/s GPU Involvement -3 In the last scenario, the code nesting is different: (a) while( !m_StoppingCriterion->IsSatisfied() ) (b) { (c) for each level set ls_i in the level set container (d) { (e) for each term in the term container (f) { (g) for each nodes in the domain of ls_i (h) { (i) Evaluate the updated level set function [ ... ] In this one the GPU Implementation will occur for the most nested for loop (g) • Keep copying the level set and image in each iteration in the GPU • Second most optimal implementation for GPU • No code duplication Questions and Comments ?