Skip to content

image data reader and LoadImage transform refactoring #909

@wyli

Description

@wyli

This is a follow-up of #856 to track the progress of a preliminary IO refactoring.

Goal

The main goal of this ticket is to create a file format agnostic wrapper for the image inputs (LoadImage and LoadImaged).
A typical use case (enhancing the current NiftiDataset) is:

train_ds = ImageDataset(images, segs, transform=train_imtrans, seg_transform=train_segtrans)

where images and segs are filenames, ImageDataset internally invokes LoadImage.

Or using a generic monai Dataset API, specify the first component of train_imtrans as a LoadImage transform that extracts data array and meta data from the file.

More specifically:

Reader (file format-specific component)

  1. [format]reader are themselves monai data components (users can use the readers without going through the LoadImage logic), they call external package APIs
  2. [format]reader share the same superclass ImageReader interface (for handling physical/voxel resolution, orientation...)
class ImageReader:
    def get_data(self, ...):
        # return the data in the designated resolution, orientation, 
        # image channel selector, the relevant coordinates, datatype
    
    def read(self, ...):
        # create an IO object instance or a set of instances
  1. users can make customized MyReader by implementing the ImageReader interface
  2. the customized MyReader could be registered with the LoadImage factory
@register_reader(requires='my_external_library')
class MyReader(ImageReader):
    ...

LoadImage(file format agnostic component)

  1. LoadImage is a monai transform
  2. LoadImaged should return the same underlying data representation dictionary regardless of the image format.
  3. LoadImage may choose a suitable [format]reader dynamically at runtime based on the following rules (ordered from high to low priority):
  • user's selection of a specific reader, such as LoadImage(reader='ITkReader')
  • try any user-registered readers
  • try resources map based on a global property file and filename extensions:
MONAI.IO
{
    FOO LoadFOO
    PNG  ITK/5.1/LoadITK
    TIFF,TIF  ITK/5.1/LoadITK
    * ITK/5.1/LoadITK
}
  • fails early and preserves detailed error messages

additional requirements

  • should be able to specify versions of external reader to ensure reproducibility
  • need to have consistent coordinate systems, resolution conventions

tasks

  • implement interface ImageReader, factory (transforms) LoadImage LoadImaged
  • implement ITKReader, NibabelReader, NumpyReader, PILReader?
  • LoadImage selecting readers according to the preference list
  • new interfaces tutorial 17 Add load medical image notebook tutorials#19
  • deprecate NiftiDataset, add ImageDataset
  • deprecate LoadNifti, LoadPNG, LoadNumpy, LoadDatad
  • revise/check all examples demos

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions