Software Open Access
Jonas Adler; Holger Kohr; Axel Ringh; Julian Moosmann; sbanert; Matthias J. Ehrhardt; Gregory R. Lee; niinimaki; bgris; Olivier Verdier; Johan Karlsson; zickert; Willem Jan Palenstijn; Ozan Öktem; Chong Chen; Hector Andrade Loarca; Michael Lohmann
This release is a big one as it includes the cumulative work over a period of 1 1/2 years. It is planned to be the last release before version 1.0.0 where we expect to land a number of exciting new features.
What follows are the highlights of the release. For a more detailed list of all changes, please refer to the release notes in the documentation.Native multi-indexing of ODL space elements
Tensor (renamed from
FnBaseVector) data structures now natively support almost all kinds of Numpy "fancy" indexing.
At the same time, the spaces
Tensorspace (renamed from
FnBase) have more advanced indexing capabilities as well. Up to few exceptions,
elem[indices] in space[indices] is always fulfilled.
ProductSpace and its elements also support more advanced indexing, in particular in the case of power spaces.
Furthermore, integration with Numpy has been further improved with the implementation of the
__array_ufunc__ interface. This allows to transparently use ODL objects in calls to Numpy UFuncs, e.g.,
np.cos(odl_obj, out=odl_obj) or
np.add.reduce(odl_in, axis=0, out=odl_out) — both these examples were not possible with the
Unfortunately, this changeset makes the
odlcuda plugin unusable since it only supports linear indexing. A much more powerful replacement based on CuPy will be added in version 1.0.0.
ODL is now integrated with three major deep learning frameworks: TensorFlow, PyTorch and Theano. In particular, ODL
Functional objects can be used as layers in neural networks, with support for automatic differentiation and backpropagation. This makes a lot of (inverse) problems that ODL can handle well, e.g., tomography, accessible to the computation engines of the deep learning field, and opens up a wide range of possibilities to combine the two.
The core ODL library is intended to stay focused on general-purpose classes and data structures, and good code quality is a major goal. This implies that contributions need to undergo scrutiny in a review process, and that some contributions might not be a good fit if they are too specific for certain applications.
For this reason, we have created a new
contrib sub-package that is intended for exactly this kind of code. As of writing this,
contrib already contains a number of highly useful modules:
datasets: Loaders and utility code for publicly available datasets (currently FIPS CT, Mayo clinic human CT, Tu Graz MRI and some image data)
fom: Implementations of Figures-of-Merit for image quality assessment
mrc: Reader and writer for the MRC 2014 data format in electron microscopy
param_opt: Optimization strategies for method hyperparameters
pyshearlab: Integration of the
pyshearlabPython library for shearlet decomposition and analysis
shearlab: Integration of the
Shearlab.jlJulia shearlet library
solvers: More exotic functionals and optimization methods than in the core ODL library
tomo: Vendor- or application-specific geometries (currently Elekta ICON and XIV)
tensorflow: Integration of ODL with TensorFlow
theano: Integration of ODL with Theano
torch: Integration of ODL with PyTorch
The classes for representing tomographic geometries in
odl.tomo have undergone a major update, resulting in a consistent definition of coordinate systems across all cases, proper documentation, vectorization and broadcasting semantics in all methods that compute vectors, and significant speed-up of backprojection due to better axis handling.
Additionally, factory functions
helical_geometry have been added as a simpler and more accessible way to create cone beam geometries.