ITK v5.0.a02 Release Notes

Release Date: 2018-05-28 // almost 6 years ago
  • 🐎 Major improvements in ITK 5.0 include a switch to C++11 language standard, improved performance, and cleanup of legacy code. More information about the C++11 transition, spearheaded by Hans Johnson, can be read in the ITK 5.0 Alpha 1 announcement.

    🐎 ITK 5.0 Alpha 2 emphasizes performance improvements: 1) A refactored multithreading infrastructure, 2) in ITK 5, a thread pool is available by default, 3) an Intel Threading Building Blocks (TBB) threading backend with dynamic region splitting, 4) improved image iterator performance, 5) simple APIs to execute functions in parallel, 6) simple construction of unary and binary generator image filters filters, and 7) new, experimental C++11 range classes for iteration in range-based for loops.

    There are now two multi-threaded "GenerateData" method signatures. The classic one, ThreadedGenerateData, is kept when a filter needs to know in advance the number of pieces into which the requested region will be split. This information was previously used by some filters to allocate intermediate, thread-local data. The new dynamic signature, DynamicThreadedGenerateData, allows the region to be split dynamically in response to data content and multi-processor load to achieve load balancing. Presently, only the TBB backend performs dynamic splitting. More information can be found in the Multi-Threading section of in The ITK Software Guide. Instructions that describe changes required to leverage dynamic parallelism in external filters can be found in the migration guide. Most existing ITK-based codes will build with minimal to no modifications required.

    An itk::PoolMultiThreader is the default in ITK 5, which provides a thread pool for platform native threads. The itk::PlatformMultiThreader is also available, which behaves like the previous itk::MultiThreader class.

    Our multi-threading refactoring enables better load balancing for filters with variable per-pixel computation cost. As TBB is one of the best open source libraries for load-balanced threading, it was an easy choice. The itk::TBBMultiThreader can be enabled by setting Module_ITKTBB to ON in ITK's CMake configuration.

    🐎 Most methods in neighborhood iterators were virtual, but this was a rarely-used feature. That virtualization is now a configure-time parameter, and it is off by default. This significantly improves performance of filters which utilize neighborhood iterators. More information can be found in the Discourse discussion.

    📚 A ParallelizeImageRegion method allows multi-threaded processing without writing a full-blown filter class. As evident in this example, multiple parallelized operations of arbitrary complexity can now be concisely specified and executed with C++11 lamda's or std::function's.

    The new itk::UnaryGeneratorImageFilter and itk::BinaryGeneratorImageFilter's allow per-pixel operations to be specified in several ways: 1) traditional "Functor", with operator(), 2) C++11 lambda functions, with closures, 3) C++11 std::function 4) C-style function pointers.

    New, experimental classes for C++11 iteration in range-based for loops, e.g. itk::Experimental::ShapedImageNeighborhoodRange, provide a modern, convenient syntax for image pixel iteration, and dramatic performance improvements.

    Furthmore, ITK 5 improves performance by leveraging Rvalue references to implement move semantics and perfect forwarding.

    🐎 ITK 5 Performance Benchmarks
    🐎 ITK 5 Performance Benchmark Improvements ITK Performance Benchmarks, lower is better, for ITK 4.13.0, ITK 5.0 Alpha 2 with the platform thread pool, and ITK 5.0 Alpha 2 with TBB. ITK 5.0 advances performance in general, especially with the TBB threading backend.

    Thanks to everyone who contributed to the major advancements made in the ITK 5 performance refactoring. Special recognition goes to Dženan Zukić, Kitware, who lead the refactoring effort. Contributions were also made by Jared Vicory, Robert Maynard, Francois Budin, Matt McCormick, Pablo Hernandez-Cerdan, Kitware, Jonathan Lefman, formerly of Intel, Bradley Lowekamp, associated with the National Library of Medicine, Hans Johnson, the University of Iowa, Simon Warfield, Benoit Scherrer, Rene-Paul Debroize, Amir Jaberzadeh, and Etienne St-Onge, Boston's Children's Hospital. The TBB-refactoring was inspired by the TBBImageToImageFilter, which was supported in part by the Intel Parallel Computing Center at the Computational Radiology Laboratory, Boston Children's Hospital. Bradley Lowekamp contributed the itk::UnaryGeneratorImageFilter and itk::BinaryGeneratorImageFilter filters. Neils Dekker, Leiden University Medical Center, contributed the new range classes.

    🛠 There were many other improvements and bug fixes since 5.0 Alpha 1. For example, addition of .editorconfig, prominent placement of .clang-format, addition of ITK-specific debug visualizers for Visual Studio versions 2012-2017 improve editing and debugging experience in Visual Studio.

    📦 To test the ITK 5.0 Alpha 2 Python packages, run

    python -m pip install --upgrade pip python -m pip install --upgrade --pre itk
    

    🚀 Note: there are a few warnings that appear when using the wrapping. These will be addressed with the next release.

    🚀 The next planned release, ITK 5.0 RC1, will focus on the transition of code review process to GitHub.

    Changes from v5.0 Alpha 1 to v5.0 Alpha 2
    -----------------------------------------------------------
    
    Bradley Lowekamp (22):
          PERF: remove virtual methods in neighborhood iterators
          ENH: Add ITK_ITERATOR_FINAL
          ENH: Use named inputs for the PasteImageFilter
          PERF: Remove iterators stored as member variables
          BUG: Add specification of OutputImage Type for TobogganImageFilter
          BUG: Add specification of OutputImage Type for TobogganImageFilter
          ENH: Improve numerics of resampling for linear transform
          COMP: Fix gcc 4.8 initialize warning
          ENH: Add baseline image to sporadically failing test
          ENH: Adding Unary and Binary GeneratorImageFilter
          ENH: Convert functor based filters to generator
          ENH: Update internal filters to use BinaryGereratorImageFilter
          ENH: Updating Functor filter with parameters to the new Generator
          COMP: Address Generator filters destructors warning
          DOC: Fix BSplineDecompositionImageFilter Doxygen see also link
          ENH: reuse default splitter
          BUG: revert thread update to BSplineScatteredDataPointSetToImageFilter
          ENH: Update CircleCI CMake version to 3.11.2
          BUG: Correct detection of most recent data file
          ENH: Improve numeric computation of linear interpolation for Resample
          ENH: Update baseline image for ResampleImageFilter3Test1
          BUG: Add 4 pixel tolerance to ResampleImageFilter3Test1
    
    Dženan Zukić (37):
          ENH: start migration guide document
          STYLE: increasing initial size of the debug window
          BUG: fixing null pointer dereference at the end of iteration
          COMP: reducing direct usage of MultiThreader
          BUG: remove observations in FilterWatcher's destructor
          ENH: support Unicode characters in class documentation
          BUG: fixing index computation in resample filter
          ENH: reducing code duplication in FilterWatcher
          ENH: refactoring MultiThreader infrastructure
          ENH: deciding which filters can use the new threading model
          ENH: reporting progress
          ENH: simplifying Canny filter by using new threading infrastructure
          STYLE: Renaming MultiThreader to PlatformMultiThreader
          ENH: use C++11 thread primitives instead of SpawnThread
          COMP: improve backwards compatibility by retaining the renamed header
          ENH: Add TBB-based multi-threader
          ENH: refactoring filters to avoid use of memory barrier
          ENH: reworking logic for determining default multi-threader
          COMP: fixing compile error on GCC 4.8.5 20150623 (Red Hat 4.8.5-28)
          STYLE: remove outdated and useless comments from VectorExpandImageFilter
          ENH: add a baseline for QuickViewTest.png (Win7x64+VS2017+VTK8.1OpenGL2)
          STYLE: reduce number of lines by removing unnecessary empty lines
          DOC: document FilterWatcher removal
          ENH: adding an .editorconfig file to aid IDE's code formatting options
          BUG: forgotten #ifdefs for ITK_LEGACY_REMOVE
          ENH: adding debugger help files for Visual Studio 2017
          ENH: moving .clang-format file into the root folder,
          ENH: using the new threading mechanism for FFT module
          ENH: explicitly setting threading model in each multi-threaded filter
          ENH: support classic ThreadedGenerateData via ITK_CLASSIC_THREADING_MODEL
          BUG: fixing a test which has been failing since multi-threading refactoring
          ENH: updating baselines for itkBSplineScatteredDataPointSetToImageFilterTest*
          COMP: fixing 2 compile warnings
          STYLE: renaming migration guide document
          ENH: extending migration guide with threading refactoring instructions
          ENH: reducing redundancy in itkLandmarkBasedTransformInitializerTest
          ENH: eliminate CMake option ITK_CLASSIC_THREADING_MODEL
    
    Hans Johnson (5):
          STYLE: Use C++11 override keyword directly
          STYLE: Use C++11 override keyword directly
          ENH: Add compression option for Transform files
          COMP: Address type mis-match compiler warning
          COMP: Remove unused variable warning
    
    Jon Haitz Legarreta Gorroño (10):
          COMP: Use and move ITK_DISALLOW_COPY_AND_ASSIGN calls to public section.
          ENH: Update the WikiExamples remote module commit hash.
          COMP: Bump the remote modules' versions.
          DOC: Fix miscellaneous typos.
          DOC: Update the ITK logo files in `Documentation` folder.
          DOC: Remove PSD files containing old ITK logo.
          BUG: Address use of CMake variables in CMakeLists.txt.
          COMP: Set the minimum required CMake version to 3.10.2.
          STYLE: Stick to the ITK style guidelines.
          COMP: Bump the remote modules' versions after the CMake ver update.
    
    Lucas Gandel (2):
          ENH: include WrapITKConfig for external module
          ENH: Allow for itk::ImageSource wrapping override
    
    Matthew McCormick (17):
          ENH: Support Python snake case keyword arguments in object initializion
          PERF: Avoid extra condition check in itkBase.py
          COMP: Detect Linux in itkMemoryUsageObserver.h on Alpine Linux
          COMP: Define ITK_DELETE_FUNCTION for backwards compatibility
          BUG: Fix bugs in ITKV4_COMPATIBILITY definition
          COMP: Wrap MultiResolutionPDEDeformableRegistration for Pyramid filter types
          COMP: Do not disallow constructors in Python classes
          DOC: Add Mathieu Malaterre to GDCM copyright holders in NOTICE
          COMP: Address array initialization in itkShapedImageNeighborhoodRangeGTest
          COMP: ShapeImageNeighborhoodRange signed unsigned comparison
          COMP: Add missing itkViewImage.h include to itkViewImage.hxx
          COMP: Initialize CovariantVector in DeformableSimplexMesh3DFilter
          COMP: Update Unary and Binary filters for new generator class base
          COMP: Initialize DeformableSimpleMesh3DFilter displacement
          COMP: Suppress maybe-uninitialized in SimpleDataObjectDecorator Component
          COMP: Do not include itkMultiThreader.h in the header tests
          COMP: Fix Python wrapping of MultiThreaderBase
    
    Niels Dekker (11):
          ENH: Added Compute member functions to NeighborhoodInnerProduct
          STYLE: Added DISALLOW_COPY_AND_ASSIGN(GaussianDerivativeImageFunction), etc.
          ENH: Added ShapedImageNeighborhoodRange for modern C++ style iteration
          STYLE: Removed '&' from pixelPointer param of NeighborhoodAccessorFunctor::Set
          PERF: Removed virtual ~NeighborhoodAccessorFunctor() and made class final
          COMP: Fixed ShapedImageNeighborhoodRange doxygen + signed/unsigned warning
          BUG: Dropped OffsetTable assumptions from ShapedImageNeighborhoodRange
          PERF: Made HoughTransform2DCircles GaussianDerivative call non-virtual
          COMP: Workaround Clang range-loop-analysis warning NeigborhoodRange test
          ENH: Added class to create offsets for a hyperrectangular neighborhood shape
          ENH: Random access support for ShapedImageNeighborhoodRange iterators
    
    Pablo Hernandez-Cerdan (4):
          ENH: Add stateless viewer ViewImage with Python wrap.
          DOC: Add docs to ViewImage.
          COMP: Fix catch by value warning in SpatialObject.
          COMP: Fix VNL to compile with gcc8.
    
    Rashad Kanavath (1):
          COMP: fix linking on OpenBSD
    
    Sean McBride (4):
          COMP: -Wunused-template & -Winconsistent-missing-destructor-override warnings
          BUG: removed illegal int to enum conversion
          COMP: fix warning about implicit double to bool conversion
          COMP: fix warning about implicit double to bool conversion
    
    Simon Rit (1):
          COMP: missing include path for FFTW
    
    Taylor Braun-Jones (1):
          COMP: Fix clang diagnostic: case value cannot be narrowed
    
    VXL Maintainers (1):
          VNL 2018-05-16 (26628604)
    

    Enjoy ITK!